Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Подключение исполнительных устройств, датчиков, контроллеров.

Модератор: immortal

Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Вт июн 02, 2020 9:42 pm

Блин а можно прикрутит вот это сюда ?
https://github.com/aprosvetova/xiaomi-kettle
что скажете?
В этот скетч нет, он написан для чайника Redmond, но можно попробовать сделать это через WiFi-IoT. У WiFi-IoT BT HUB пока нет поддержки чайника.
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
tarasfrompir
Сообщения: 3216
Зарегистрирован: Ср мар 02, 2016 8:18 pm
Откуда: Украина Пирятин
Благодарил (а): 223 раза
Поблагодарили: 816 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение tarasfrompir » Вт июн 02, 2020 9:47 pm

Divan писал(а):
Вт июн 02, 2020 9:42 pm
Блин а можно прикрутит вот это сюда ?
https://github.com/aprosvetova/xiaomi-kettle
что скажете?
В этот скетч нет, он написан для чайника Redmond, но можно попробовать сделать это через WiFi-IoT. У WiFi-IoT BT HUB пока нет поддержки чайника.
ну это видел - но тоже пока глухо
а в этот скетч можно добавить по идее - потому что способ авторизации и передача данных не меняется, а только количество данных меняется... но уж нет так нет
Спасибо нам ПОМОЖЕТ..!
alutov
Сообщения: 44
Зарегистрирован: Пт июн 05, 2020 7:26 am
Благодарил (а): 1 раз
Поблагодарили: 18 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение alutov » Пт июн 05, 2020 6:20 pm

Тоже использую этот код для связи с чайником RK-M173S. Пробую прикрутить асинхронный MQTT, пока еще сыровато.
По зависаниям. Тоже есть эта проблема, но хотелось бы решить ее без костылей. Вчера пробовал рекомендацию из https://github.com/nkolban/esp32-snippets/issues/874 о правке файла FreeRTOS.cpp. У меня он лежит в папке "C:\Documents and Settings\Andrew\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\BLE\src\". Там нужно поправить 2 строки, 68 и 194. Файлик прилагается:
FreeRTOS.rar
(2.28 КБ) 142 скачивания
Вроде бы помогло пережить ночь. ;) Но есть и другая проблема, это утечка памяти. Для ее проверки я вставлял в тело цикла строку:
ESP_LOGW("TAG", "%d: - RAM left %d", __LINE__, esp_get_free_heap_size());
При работе шлюза наблюдал в дебаге постепенное уменьшение свободной памяти. Обнаружил 2 утечки. Первая это диагностический вывод по ключу #define R4S_LOG_EXCHANGE в файле r4scfg.h. При комментировании ключа и запрете вывода одна утечка уходит. Вторая проблема в процедуре r4sWrite в файле R4S.cpp. Уж не знаю почему и как, но при замене строки "uint8_t* buffer = new uint8_t[sz];" на "byte buffer[32];" уходит вторая утечка памяти. Продолжаю наблюдать.
За это сообщение автора alutov поблагодарили (всего 2):
Divan (Пт июн 05, 2020 6:36 pm) • exo (Сб июн 06, 2020 6:31 pm)
Рейтинг: 2.33%
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Пт июн 05, 2020 6:36 pm

alutov писал(а):
Пт июн 05, 2020 6:20 pm
Тоже использую этот код для связи с чайником RK-M173S. Пробую прикрутить асинхронный MQTT, пока еще сыровато.
По зависаниям. Тоже есть эта проблема, но хотелось бы решить ее без костылей. Вчера пробовал рекомендацию из https://github.com/nkolban/esp32-snippets/issues/874 о правке файла FreeRTOS.cpp. У меня он лежит в папке "C:\Documents and Settings\Andrew\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\BLE\src\". Там нужно поправить 2 строки, 68 и 194. Файлик прилагается: FreeRTOS.rar
Вроде бы помогло пережить ночь. ;) Но есть и другая проблема, это утечка памяти. Для ее проверки я вставлял в тело цикла строку:
ESP_LOGW("TAG", "%d: - RAM left %d", __LINE__, esp_get_free_heap_size());
При работе шлюза наблюдал в дебаге постепенное уменьшение свободной памяти. Обнаружил 2 утечки. Первая это диагностический вывод по ключу #define R4S_LOG_EXCHANGE в файле r4scfg.h. При комментировании ключа и запрете вывода одна утечка уходит. Вторая проблема в процедуре r4sWrite в файле R4S.cpp. Уж не знаю почему и как, но при замене строки "uint8_t* buffer = new uint8_t[sz];" на "byte buffer[32];" уходит вторая утечка памяти. Продолжаю наблюдать.
Спасибо за ваше участие, надо это попробовать, потому что вы правильно сказали, что память забивается логами, именно это и вызывает зависание платы + нестабильная связь. Два фактора нужно устранить. У меня 4 сутки проработало нормально и зависло. Попробую вашу рекомендацию.
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
exo
Сообщения: 40
Зарегистрирован: Вт апр 11, 2017 11:06 am
Благодарил (а): 3 раза
Поблагодарили: 1 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение exo » Сб июн 06, 2020 6:38 pm

Спасибо за участие. Залил, наблюдаю
Тоже смотрел на FreeRTOS.rar с семафорами. Но так как нихрена не понимаю :) отложил. Но автор указал на проблему в этом направлении. Отлично что нашелся спец, который нашел хотя бы вариант. И целых 2 утечки.
exo
Сообщения: 40
Зарегистрирован: Вт апр 11, 2017 11:06 am
Благодарил (а): 3 раза
Поблагодарили: 1 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение exo » Пн июн 08, 2020 6:46 pm

Изображение
Только что заглох. Это график активности MQTT. Видно что к "кончине" работает все с большими паузами выкидывая инфо пачками, и никак не раз в 5 сек.
Чайник шевелил. Похоже плата уходит в зависон. Перегрузка помогает.
upd. Чтото сегодня беда. Проработало несколько мин и ушло в оффлайн. От компа до чайника не добивает, ставлю поближе к чайнику. Поэтому посмотреть в порт, че с ней происходит не могу.
alutov
Сообщения: 44
Зарегистрирован: Пт июн 05, 2020 7:26 am
Благодарил (а): 1 раз
Поблагодарили: 18 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение alutov » Вс июн 14, 2020 10:10 am

Тяжело сказать, что еще виснет. Вот мой вариант: https://yadi.sk/d/a1r3iUwplJqfkg, для однозначности в бинарном виде . Грязных костылей нет. Шьется одним файлом с адреса 0 на стертую есп. После чего в роутере нужно открыть гостевой wifi "r4s" с паролем "12345678" и в браузере настроить Wifi и Mqtt. Имя чайника лучше оставить пустым, тогда есп будет искать его по uuid. После оригинального скетча в браузере может остаться переадресация с ip на ip/r4s, и тогда в нем нужно почистить настройки сайта. Сам тестирую на RK-M173S. Интересует, в первую очередь, тест на зависание.
Последний раз редактировалось alutov Ср июн 17, 2020 8:05 am, всего редактировалось 12 раз.
За это сообщение автора alutov поблагодарил:
Divan (Вс июн 14, 2020 12:46 pm)
Рейтинг: 1.16%
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Вс июн 14, 2020 12:58 pm

Тяжело сказать, что еще виснет. Вот мой вариант https://yadi.sk/d/mQCfnzd-NJRLmA , для однозначности в бинарном виде . Грязных костылей нет. Шьется одним файлом с адреса 0 на стертую есп. После чего в роутере нужно открыть гостевой wifi "r4s" с паролем "12345678" и в браузере настроить Wifi и Mqtt. Имя чайника лучше оставить пустым, тогда есп будет искать его по uuid. После оригинального скетча в браузере может остаться переадресация с ip на ip/r4s, и тогда в нем нужно почистить настройки сайта. Сам тестирую на RK-M173S. Интересует, в первую очередь, тест на зависание.

Спасибо за ваше участие. Есть вопросы.

1) Почему нужно открывать гостевой доступ?
2) Можно ли подключить к имеющейся точке доступа?
3) Как прошивать, через flash download tool 3.8.5? Какой код нужно указывать при прошивке? Так вы делаете?
СпойлерПоказать
Безымянный.jpg
Безымянный.jpg (129.81 КБ) 3095 просмотров
4) Если есть другие устройства с BLE, он сможет связаться с чайником? - Ведь имя указывается для того, чтобы связь была только с чайником и отсекала другие устройства с BLE.
5) В вашем случае сколько дней была связь с чайником?
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
Аватара пользователя
Divan
Сообщения: 859
Зарегистрирован: Пн июл 08, 2019 5:04 pm
Благодарил (а): 117 раз
Поблагодарили: 280 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение Divan » Вс июн 14, 2020 1:21 pm

alutov писал(а):
Пт июн 05, 2020 6:20 pm
Тоже использую этот код для связи с чайником RK-M173S. Пробую прикрутить асинхронный MQTT, пока еще сыровато.
По зависаниям. Тоже есть эта проблема, но хотелось бы решить ее без костылей. Вчера пробовал рекомендацию из https://github.com/nkolban/esp32-snippets/issues/874 о правке файла FreeRTOS.cpp. У меня он лежит в папке "C:\Documents and Settings\Andrew\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\BLE\src\". Там нужно поправить 2 строки, 68 и 194. Файлик прилагается: FreeRTOS.rar
Вроде бы помогло пережить ночь. ;) Но есть и другая проблема, это утечка памяти. Для ее проверки я вставлял в тело цикла строку:
ESP_LOGW("TAG", "%d: - RAM left %d", __LINE__, esp_get_free_heap_size());
При работе шлюза наблюдал в дебаге постепенное уменьшение свободной памяти. Обнаружил 2 утечки. Первая это диагностический вывод по ключу #define R4S_LOG_EXCHANGE в файле r4scfg.h. При комментировании ключа и запрете вывода одна утечка уходит. Вторая проблема в процедуре r4sWrite в файле R4S.cpp. Уж не знаю почему и как, но при замене строки "uint8_t* buffer = new uint8_t[sz];" на "byte buffer[32];" уходит вторая утечка памяти. Продолжаю наблюдать.
Попробовал такой способ
У меня он лежит в папке "C:\Documents and Settings\Andrew\AppData\Local\Arduino15\packages\esp32\hardware\esp32\1.0.4\libraries\BLE\src\". Там нужно поправить 2 строки, 68 и 194. Файлик прилагается: FreeRTOS.rar
мой чайник SkyKettle G240S терял связь чаще, чем до этого.

Я не понял где именно нужно менять эти строки "uint8_t* buffer = new uint8_t[sz];" на "byte buffer[32];", может я не так меняю?
Если я меняю просто "byte buffer[32];", то при проверке скетча всплывает ошибка.
СпойлерПоказать
ошибка.jpg
ошибка.jpg (102.02 КБ) 3086 просмотров
Хотя тут size_t sz = 4 уже указан объем памяти в 4 МБ (это весь объем памяти ESP32), мне думается, что тут нет смысла копаться. Нужно добавить код, который бы чистил память ESP от логов каждые сутки, тогда память не будет забиваться и ESP не будет зависать
СпойлерПоказать
размер памяти.jpg
размер памяти.jpg (84.88 КБ) 3086 просмотров
Xpenology DSM 6.2.2 + Ubuntu Server 18.10 + Majordomo + MariaDB
alutov
Сообщения: 44
Зарегистрирован: Пт июн 05, 2020 7:26 am
Благодарил (а): 1 раз
Поблагодарили: 18 раз

Re: Шлюз на базе ESP32 для R4S-устройств (Ready for Sky/Nordic)

Сообщение alutov » Вс июн 14, 2020 1:28 pm

1) При старте есп ищет сеть wifi с параметрами ssid "r4s" и паролем "12345678". После подключения и установки параметров wifi эта сеть больше не нужна.
2) Да, после ввода ее параметров. Гостевая нужна только для первичной настройки.
3) Да, все так, адрес 0x0000.
4) Все как в оригинальном скетче. если имя пустое чайник соединяется по айдишнику. У меня это работает. Если не получается, пробуйте по имени. Имя еще, наверное, пригодится, если 2 разных чайника ;).
5) Пока 8 часов. Но файл вчерашний.
Бинарник сделан на 4МБ памяти,если что. Менял много и в разных местах. Исходники, если кому интересно, залил на гит https://github.com/alutov/r4sGate/, для сборки вместо PubSubClient нужны 2 библиотеки https://github.com/me-no-dev/AsyncTCP и https://github.com/marvinroger/async-mqtt-client. Но смысла особого в исходниках нет, кроме погремушек разве что, если виснуть будет так же.

Там выделяется буфер по размеру команды+ 4байта. Я выделяю всегда 32 байта. У меня так:
СпойлерПоказать
uint8_t r4sWrite(uint8_t cmd, uint8_t* data, size_t len) {
size_t sz = 4 + len; // 55, counter, cmd, AA
// uint8_t* buffer = new uint8_t[sz];
byte buffer[32];
buffer[0] = 0x55;
buffer[1] = r4scounter;
buffer[2] = cmd;
buffer[sz - 1] = 0xAA;
if (len > 0) {
memcpy(&buffer[3], data, len);
}

// try {
pRemoteTXCharacteristic->writeValue(buffer, sz);
#ifdef R4S_LOG_EXCHANGE
log_i(">> %s", BLEUtils::buildHexData(NULL, buffer, sz));
#endif
// } catch (...) {
// log_d("writeValue failed");
// }
return r4scounter++;
}
Ответить