ESP32-R4sGate-for-Redmond
ESP32-R4sGate-for-Redmond copied to clipboard
ESP32 Ready4Sky (R4S) Gateway for Redmond+ devices
ESP32 Ready4Sky (R4S) шлюз для устройств Redmond+
RUS | ENG
Прошу перед использованием данных из этого проекта для начала прочитать описание. Несколько раз уже были запросы на реализацию действующих возможностей.
В версиях, начиная где-то с июня 2022, несколько раз менялся формат записи данных в NVS. Иногда это может привести к искажению данных в настройках после обновления. В NVS также хранятся данные wifi и ble. После обновления на последние версии следует зайти в настройки, проверить данные , затем отметить пункт "Format NVS area" и далее "Save setting". Память NVS будет отформатирована и затем все данные заново перезаписаны.
Скрипт на базе PHP сервера в локальной сети с доступом к интернету для показа погоды на экране шлюза.
Текущая версия 2022.08.22.
- 2022.08.22. Увеличен размер таблицы BLE - монитора в NVS. После обновления нужно будет заново создать все устройства в мониторе, затем в настройках отметить пункт "Format NVS area" и далее "Save setting". Добавлена возможность отслеживания Samsung Smart Tag.
Последние версии...
- 2022.08.06. Исправлена ошибка отсутствия периодического обновления данных BLE монитора в Mqtt в версиях 2022.07.12-2022.07.29.
- 2022.07.29. Исправлена ошибка при соединении с Mikettle в версиях 2022.07.12-2022.07.25.
- 2022.07.25. Переделал сохранение параметров шлюза в NVS с целью уменьшения требуемой памяти. Нужно было место для сохранения сертификата. После обновления желательно в настройках отметить пункт "Format NVS area" и далее "Save setting" для удаления лишних записей. Добавлена поддержка Mqtt соединения с SSL/TLS. Авторизация по логину и паролю. Сертификат вводится в поле "Certificate" (я вводил копипастом из Notepad), можно и без строк "BEGIN CERTIFICATE" и "END CERTIFICATE". В NVS эти строки не сохраняются. Если поле "Use SSL/TLS" отмечено, а в поле сертификата пусто, соединение устанавливается без проверки сертификата сервера. Для более строгой проверки можно отметить "Hostname verify". При этом имя сервера Mqtt сравнивается с прописанным в сертификате. Эту опцию не тестировал. При тестировании выяснилось, что Mqtt Explorer имя сервера не проверяет. Проверял работу с Mosquitto / Home Assistant и самоподписанными сертификатами по описаниям Mosquitto SSL Configuration -MQTT TLS Security, и Mosquitto, SSL, certificates - how to?. Есть также возможность использования имеющихся в среде esp-idf корневых сертификатов. Для этого нужно отметить опцию "Use x509 Bundle". Если она включена содержимое поля "Certificate" игнорируется. Добавил соединение через WS(websocket, не проверял). Если строка сервера содержит номер порта не в конце, то в поле порт нужно вписать 0, а в строке сервера указать и порт через двоеточие. Проверена возможность сборки для esp32c3, пока только без опций экрана.
- 2022.07.17. Добавлены загрузка и отображение в текстовом виде погоды с сайта wttr.in. Размер буфера ссылки увеличен до 384 байт.
- 2022.07.12. Поддержка 5 одновременных BLE соединений и отслеживания 24 устройств в BLE мониторе. В сущность климата Home Assistant добавлены режимы auto и cool. Auto включает кипячение или кипячение с подогревом, cool включает подсветку. Это позволяет умному дому Яндекса только из климата управлять основными режимами работы. Добавлена также в ассистенте кнопка рестарта шлюза. В BLE мониторе MAC адрес во второй строке выводится без точек для быстрого копирования в настройки. В меню мультиварок русские буквы переведены в юникод. Добавлена возможность загрузки картинки по https. Проверка сертификата отключена. Добавлена возможность управления параметрами загрузки картинки по Mqtt, используя топики r4sx/jpg_url и r4sx/jpg_time. Если в Mqtt эти топики не прописаны, а также после сохранения настроек, эти параметры копируются из настроек в Mqtt. Установка нулевого интервала обновления возвращает кота на экран. Длина буфера ссылки пока 256 байт. Это 256 английских или 128 русских букв. Если ссылка не содержит строки "http://" или "https://", то шлюз считает это сообщение простым текстом и отображает на экране. Доступно 2 шрифта и пока 10 вариантов цветов. Управляющие символы: \ \ или \n - перевод строки, \F - шрифт 26 пикселей и перевод строки, \f - шрифт 16 пикселей и перевод строки, \0 ... \9 - цвета. Поддерживается кириллица, проверял, правда, только из mosquitto. Он поддерживает юникод по факту, как другие брокеры, не знаю. Пока шлюз не получит корректную дату, она на экране не отображается. Добавлен контроллер полива Galcon GL9001A. Восстановлена возможность сборки шлюза без опций экрана. В уже собранных бинарниках процессор теперь работает на 240MHz. Если же источник питания не имеет запаса по току, можно использовать сборку для работы на 160MHz из папки build/160. Много мелких исправлений, может, что-то забыл написать.
- 2022.06.07. Добавлен датчик дыма RSS-61S. Окно определения количества воды при нагреве 65-85°C. Добавлена конфигурация для сборки в среде Platformio, спасибо bvp, подробнее здесь.
- 2022.06.03. Добавлена возможность вычисления уровня воды в процентах. Выбирается в настройках, после чего нужна рекалибровка при полном заполнении чайника. Значения в диапазоне 100-120% принимаются за 100%. Во всех устройствах в шлюзе с нулевым номером изменен префикс в сущностях и Mqtt топиках с "r4s" на "r4s0". После прошивки нужно выбрать в настройках "Delete Mqtt topics" для удаления не используемых более топиков в брокере и конфигураций устройств в Ассистенте. После чего поправить устройства в автоматизациях, скриптах и т.п. Топик и сущность "r4s" теперь используются для определения лучшего уровня сигнала от метки(маяка) среди нескольких шлюзов и номера шлюза, принимающего самый сильный сигнал. После обновления нужно также повторно выставить значения Timeout для всех меток(маяков). Мелкие исправления.
- 2022.05.20. Защищенное шифрованное BLE соединение для всех устройств, кроме климатической станции, запрашивается после 3-х неуспешных попыток авторизации при незащищенном соединении. В Mqtt Discovery в поле "connections" шлюза добавлен MAC адрес. При неизвестном количестве воды в Mqtt вместо "?" выводится "-0.0".
- 2022.05.06. При изменении значений "Timeout" в BLE мониторе нажатие "Ok" сразу записывает все значения в энергонезависимую память, а Mqtt Discovery отправляет все новые устройства в Home Assistant. Мелкие исправления.
- 2022.04.29. Добавлена опция авторизации устройств с использованием MAC адреса шлюза. Позволяет при соответствующей настройке работать рядом двум и более шлюзам с одинаковыми параметрами. Для каждого шлюза придется заново перепривязать все подключенные к нему устройства, предварительно очистив на них все существующие привязки. Добавлена поддержка ATC_MiThermometer с прошивкой от atc1441 в режиме custom.
- 2022.04.28. Переделан еще раз вывод меток(маяков) в Mqtt и Home Assistant Discovery. Добавлена поддержка ATC_MiThermometer с прошивкой от pvvx в режиме custom. После обновления рекомендую выбрать в настройках Delete Mqtt Topics и Format NVS Area. Увеличено до 32 символов поле сервера Mqtt.
- 2022.04.27. Переделан вывод меток(маяков) в Mqtt и Home Assistant Discovery. Добавлена поддержка BLE меток(маяков) приложения Home Assistant на смартфонах. После обновления рекомендую выбрать в настройках Format NVS Area. Поправлено обновление прошивки для macos/ios устройств, проверено пока только на iPhone.
- 2022.04.26. Добавлена регулировка времени кипения чайника. Допустимые значения от -5 до 5. Регулировать можно только при выключенном чайнике.
- 2022.04.23. Добавлена авторизация из pull request #67, спасибо Raerten. Добавлена регулировка яркости экрана в топике screen. Допустимые значения от 0 до 255. Добавлена возможность вызова картинки пятой кнопкой, пункт jpg. При конфигурации входов в режиме кнопок включается pullup, если это возможно (номер пина меньше 34).
- 2022.04.20. Пересобрал проект на версии esp-idf 4.4. С этой версией метки(маяки) сканируются нормально и при установленных соединениях. Запрашивается защищенное шифрованное ble соединение для всех устройств. Добавлена климатическая станция RSC-51S.
- 2022.04.11. Переделан Hass Discovery для мультиварок.
- 2022.03.30. Добавлен вывод количества воды в чайнике на экран, сенсор количества воды после последнего кипячения. Добавлен BLE monitor.
- 2022.02.15. Добавлен конвектор Redmond SkyHeat RCH-7001S.
- 2022.01.20. Добавлено вычисление количества воды в чайнике. Подробнее в описании ниже.
- 2021.12.22. Добавлена отдельно мультиварка RMC-M92S. Оптимизация, мелкие исправления.
- 2021.11.21. Добавлена возможность поиска и подключения к устройствам как по имени, так и по MAC адресу. Пригодится при работе с устройствами с одинаковыми именами. MAC адрес вводится в поле имени устройства в виде строки из 12 символов большими или маленькими буквами без двоеточий и тире. Найти адрес можно в строке "BLE Last found name/address" на главной страничке.
- 2021.11.19. Добавлена мультиварка RMC-M961S.
- 2021.11.14. Увеличено до 19 символов поле Mqtt Server.
- 2021.11.06. Добавлены "configuration_url" и версия прошивки для шлюза. Первая опция работает только на 11 версии ХА, на 10 версии из-за ошибки в этой опции разбор discovery на ней тормозится и в итоге пропадает выключатель экрана. Добавлена опция чистки топиков Mqtt.
- 2021.11.05. Исправлена ошибка в версиях 2021.11.03 и 2021.11.04, не обновлялся статус 3-го устройства при локальном управлении.
- 2021.11.04. Переделан вывод на экран даты для освобождения места. На освободившееся место цветом выводится состояние устройств, 1 - первое устройство, 2- второе и 3 - третье. Серый - не на связи или не определено, синий - выключено, красный - включено, желтый - подогрев, белый - установлена программа. Стало удобней пользоваться кнопками включения - выключения.
- 2021.11.03. Добавлена мультиварка RMC-M224S. Добавлено 5 портов ввода-вывода (Port1-Port5). Порты программируются на вывод(от 0 до 33 пина) или ввод(от 0 до 39), с учетом ограничений esp32, разумеется. Жесткой проверки не производится, так что возможно зависание esp32 при старте при неверном выборе пинов. Для первых трех портов предусмотрен также режим sw(sw1-sw3), когда порт работает в режиме ввода с активным низким уровнем как кнопка локального включения-выключения соответствующего устройства. В этом режиме состояние кнопки в mqtt не выводится. При включенном Hass Discovery порты в Ассистенте привязываются к шлюзу. Отмечу, что выключение порта не удаляет его из шлюза в Ассистенте, для этого нужно удалить в Mqtt брокере все топики с r4s, выбрав в настройках Delete Mqtt topics. При работе порта на ввод подтягивающие резисторы (pullup, pulldown) программно не задействовал, да и для пинов 34-39 esp32 это нельзя сделать. Пока потестируем, может что-то и стоит поправить.
- 2021.10.29. Добавлена поддержка экрана на ili9342.
- 2021.10.27. Добавлен топик heat. Включает подогрев с последней установленной температурой с момента соединения с чайником. При старте шлюза температура подогрева берется из Heat temp вкладки Setting. Если и там температура < 30°C, то по умолчанию температура подогрева 40°C.
- В Hass Discovery добавлено поле "via_device".
- Потребленная энергия выводится в кВт/ч.
Еще версии...
Версия 2021.10.17.
- Во всех типах чайников топик "state" изменен на "boil". Буду изучать еще режим подогрева, возможно, добавлю топик "heat".
- В чайниках 200-240 добавлено включение и выключение цветовой индикации температуры воды, включение и выключение звуковой индикации, а также статистика.
- Включенная "offline Response" выводит offline в топиках состояний при отсутствии связи с устройством. Если она выключена, об отсутствии связи можно судить только по топику status. Если включена опция Hass Discovery, опции true/false и offline выключаются за ненадобностью.
Версия 2021.09.29.
- Добавлена лицензия.
- Mqtt топик state чайника Redmond теперь управляет только режимом кипячения, на режим подогрева не влияет.
- Увеличена длина пароля Mqtt до 19 символов. Работа с экраном теперь включается в настройках и по умолчанию выключена. Это нужно для запуска прошивки на esp32 с нестандартной разводкой пинов, например, на ESP32-PICO-D4 (m5atom lite).
- После кипячения чайник Mikettle переводится в режим поддержания температуры, что позволяет повторно включать кипячение без снятия с подставки.
- Добавлен чайник M170S.
- После обновления нужно проверить и при необходимости поправить тип чайника. При обновлении закрываются все BLE cоединения. Изменил параметры скана и добавил строку состояния BLE. При соединении показывает 2 этапа: open - установление соединения, auth - чтение характеристик устройства и авторизация.
- Немного поправил wifi, теперь пытается восстановить соединение 10 раз до рестарта.
- Уменьшил до 256 минут время сброса счетчика warming Mikettle.
- Вроде бы нашел в коде причину зависания BLE при сканировании. Зависаний BLE больше не замечал. Мониторинг состояния BLE сделан опцией "BLE monitoring" и по умолчанию выключен, сейчас я им не пользуюсь. Если он включен, поведение прошивки аналогично старой версии, то есть рестарт при потере соединения более минуты и ошибке скана.
- Добавлена поддержка мультиварки RMC-M903S и частично духового шкафа RO-5707S, за исключением режимов блокировки и автоподогрева.
- В RMC-M800S добавлена программа мультиповар. В режиме RMC-M903S можно попробовать и другие мультиварки.
- Отключена проверка состояния BLE соединений во время обновления.
- На экране вместо влажности в помещении выводится напряжение и ток из ZMAi-90.
1. Возможности
Шлюз ESP32 r4sGate в минимальной конфигурации (только esp32 с источником питания 3.3v) позволяет подключать BLE-совместимые устройства Redmond и чайники Xiaomi MiKettle к системе "умный дом" (Home Assistant, OpenHab, ioBroker, MajorDoMo и т.д.) по протоколу MQTT.
Почему MQTT...
- Это по факту стандартный протокол систем умного дома. Другое дело, как он реализован. От встроенного MQTT сервера в системе ioBroker, где все, что происходит в MQTT, сразу отображается в админ интерфейсе, до внешнего брокера в Home Assistant, где для настройки иногда приходится пользоваться сторонними утилитами. В последнем, правда, MQTT Discovery сильно упрощает интеграцию устройств в систему.
- В MQTT устройства могут обмениваться данными и между собой, а не только с сервером умного дома. В шлюзе можно настроить отображение на экране показаний основных датчиков в доме. На аргумент, что одни устройства могут бесконтрольно переписывать данные других замечу, что в нормальных брокерах существует система разделенного доступа (ACL). Хотя на вопрос, а зачем вообще заводить в систему устройства, которым нет доверия, у меня ответа нет.
- В MQTT могут обмениваться информацией устройства, вообще не знающие друг о друге ничего, кроме топика, где они должны встретиться. Это используется для определения максимального уровня сигнала от метки/маяка среди нескольких шлюзов, и шлюза, принимающего самый сильный сигнал.
- Поддержка MQTT включена в среду разработки esp-idf и не требует подключения сторонних библиотек. После неудачных попыток доработать очень неплохой проект olehs на arduino стал сторонником чистого esp-idf.
- Ну и немного imho, если кому интересно. Понятно, что встроенный сервер в принципе гибче, надежнее и быстрее внешнего, где сервер умного дома является лишь одним из клиентов. В Home Assistant не так давно тоже был встроенный сервер Mqtt, но потом он почему-то был убран из системы. Для сравнения, тот же ioBroker, Mqtt сервер там тоже не без проблем, но он там есть. Если уж в Home Assistant дело дошло до выпиливания встроенного Mqtt сервера (сейчас в документации на сайте не нашел даже упоминания о встроенном брокере), это означает только одно - не смогли. Особенно после их аргументов о лишней точке отказа, стабильности или же о больших задержках. Давайте тогда сделаем Native API на внешнем http сервере, а потом уже посмотрим, кто кого. Тем не менее многие считают, что в esp32 должна быть только esphome прошивка и общаться Home Assistant она должна по Native API. Но пока это не стандартный протокол и никем более не поддерживается, насколько мне известно. А привязываться к одной системе считаю неразумным. Спорить нет желания, каждый имеет право на свое мнение (и я тоже, как это ни странно!). Им нужно просто искать другие решения.
Список поддерживаемых устройств:
Электрочайники:
- Redmond SkyKettle RK-M170S / RK-M171S
- Redmond SkyKettle RK-M173S / RTP-M810S
- Redmond SkyKettle RK-G200S / RK-G204S / RK-G210S / RK-G211S / RK-G212S / RK-G214S / RK-M216S
- Redmond SkyKettle RK-G240S / RK-G204S / RK-G210S / RK-G211S / RK-G212S / RK-G214S / RK-M216S
- Xiaomi MiKettle YM-K1501(Int) - ProductId 275
- Xiaomi MiKettle YM-K1501(HK) - ProductId 131
- Xiaomi MiKettle V-SK152(Int) - ProductId 1116
Подробнее о Xiaomi MiKettle...
Управление Xiaomi MiKettle возможно только из режима "keep warm". В этом режиме чайник поддерживает заданную шлюзом минимальную температуру 40°C с гистерезисом примерно 4°C, то есть при 36°C подогрев включается, а при 44°C отключается. Доступно включение и выключение кипячения (state = ON/OFF), установка температуры подогрева (heat_temp = 40...95). Можно перевести чайник в режим Idle (heat_temp = 0). Последняя команда выполняется с задержкой. После выполнения команды дальнейшее управление чайником недоступно. В отличие от выключения сенсором "warm" на чайнике при дальнейшем выключении и включении чайник возвращается в режим "keep warm". Возможно, это особенность конкретной версии MCU 6.2.1.9. Пока оставил так и включил чайник через редмондовскую розетку. Если ее выключить и опять включить, чайник переходит в режим подогрева. Все необходимые параметры чайника шлюз устанавливает самостоятельно, а родное приложение пригодится для обновления прошивки. Время подогрева установлено на 12 часов (720 минут), после 256 минут шлюз сбрасывает счетчик кратковременно включая и выключая кипячение. И все равно управление ограниченное. Главная проблема в том, что при включении кипячения сенсором "boil" на чайнике выключается режим "keep warm" и вернуть его можно только кнопкой "warm" на чайнике. По этой же причине пока отложил работы по Mikettle Pro.Мультиварки
- Redmond SkyCooker RMC-M224S
- Redmond SkyCooker RMC-M800S
- Redmond SkyCooker RMC-M903S
- Redmond SkyCooker RMC-M92S
- Redmond SkyCooker RMC-M961S
Кофеварки
- Redmond SkyCoffee M1519S
Розетки
- Redmond SkyPort 103S
Конвекторы электрические
- Redmond SkyHeat RCH-7001S / RCH-7002S / RCH-7003S
- Redmond SkyHeat RCH-4529S (управляется как SkyPort 103S)
Климатические станции
- Redmond SkyClimate RSC-51S
Датчики дыма
- Redmond SkySmoke RSS-61S
Контроллеры полива
- Galcon GL9001A
Поддерживаются 5 одновременных BLE соединений. Поддерживается Home Assistant Mqtt Discovery. Для включения нужно отметить "Hass Discovery" в настройках. Предусмотрена возможность удаления всех созданных шлюзом данных в Mqtt и устройств в Home Assistant. Для этого нужно выбрать во вкладке "Setting" опцию "Delete Mqtt topics" и затем нажать "Save setting". После перезагрузки шлюза будут заново созданы только подключенные к шлюзу устройства. Рекомендуется при первом подключении шлюза и реконфигурации с удалением устройств.
Поддерживается вычисление количества воды в чайнике при нагреве в интервале 65-85°C и более 3°C с момента включения чайника.
Подробнее...
Вычисляется на основе затраченной энергии и разности температур. Вычисленное значение сбрасывается при снятии чайника с подставки. Опция работает только в чайниках со статистикой. КПД чайника изначально принят 80%. Точность так себе, у меня выходит где-то ~0.2 литра. Для повышения точности предусмотрен режим корректировки значения КПД. Для этого нужно залить в чайник 1л воды и выбрать в web-интерфейсе "Boil 1l on". Когда режим отработает, нужно зайти в режим настроек. Новое значение будет выведено сразу за типом устройства. Записать новое значение в nvram можно командой Save setting. Как мне думается, получить большую точность нереально, так как КПД чайника со временем меняется, например, с появлением накипи, и, что хуже, затраченная энергия скорее всего не измеряется, а просто вычисляется процессором чайника исходя из номинальной мощности нагревателя и времени его работы. Отклонение питающего напряжения при работе от значения при калибровке вносит заметную погрешность, зависимость там квадратичная. У меня при кипячении чайником RK-M216S 1.7 литра воды при напряжении на входе в дом 200-204V в итоге вычисляется 1.8 литра, при напряжении 210-214V выходит 1.6 литра. При калибровке очевидно было что-то среднее. Шлюз также можно использовать для отслеживания до 24 BLE устройств меток/(маяков) со статическим MAC адресом. Выводится наличие/отсутствие метки(маяка) и rssi. Поддерживаются BLE маяки приложения Home Assistant на смартфонах (привязка по uuid), термометры Xiaomi Mijia 2 с прошивкой от atc1441 в режиме custom и прошивкой от pvvx в режиме custom, а также Samsung Smart Tag.
Предусмотрено 5 портов ввода-вывода для управления внешними устройствами и чтения их состояния. Четыре порта можно настроить как кнопки для включения - выключения подключенных BLE устройств, пятый порт - как кнопку обновления картинки с камеры. При конфигурации входов в режиме кнопок включается pullup, если это возможно (номер пина меньше 34).
Управление устройствами возможно и из web интерфейса шлюза. Предусмотрена простая защита web интерфейса паролем от Raerten. Для этого строку виде login:password нужно зашифровать в Base 64 и затем вписать ее в поле "Basic Auth" в настройках. Строка пароля выводится в лог при старте шлюза.
С целью расширения возможностей шлюза возможно подключение TFT экрана 320 * 240 на чипах ili9341 и ili9342. На экран выводится текущее время, день и месяц, а также температура, напряжение и ток в доме (не помешает при питании от генератора), состояние (синий- выкл., красный - вкл.) и температура на выходе котла, температура и влажность на улице. Все берется с Mqtt. Рядом с датой цветом выводится состояние BLE устройств, 1 ... 5 - с первого по пятое. Серый - не на связи или не определено, синий - выключено, красный - включено, желтый - подогрев, белый - установлена программа. Подробнее состояние и некоторые параметры подключенных BLE устройств по очереди отображаются в нижней строке. Есть возможность периодического или по запросу кнопкой вывода на экран картинки в формате jpeg 320 * 176, например, с камеры. Большие размеры не поддерживаются из-за малого объема свободной оперативной памяти. Яркость экрана можно изменять по Mqtt. Можно также на экран выводить погоду в текстовом вида с сайта wttr.in или просто текст, записывая его в Mqtt топик r4sx/jpg_url. Получилось что-то похожее на часы с термометром. Достаточно глянуть на экран, чтобы убедиться, все ли в порядке в доме, что там сегодня на улице.
2. Комплектующие
Картинка 1. Комплектующие для сборки шлюза.
Если цель запустить шлюз с минимальными затратами, придется покупать запчасти, затем собирать из них шлюз. Я использовал ESP32 WROOM ESP-32 4 Мб с встроенной антенной (слева внизу) или ESP32 WROOM ESP-32U 4 Мб с внешней (правее первой). Цена вопроса $2.5. Потом паял микросхему на "адаптер-плату"($0.3) и далее на макетную плату. Источник питания на 3.3 Hi-Link($2-$4). Я их брал по цене $1.65. Можно обойтись без пайки, если использовать esp32-wroom-devkit(внизу в центре, $14). Правда, эта плата сильно избыточна для проекта, можно взять попроще за $3.54. В нем esp32 идет вместе с платой, на которой есть еще преобразователи с 5в на 3.3в, USB-RS232 и стандартный разъем мини-USB. Через него можно питать esp32, используя пятивольтовое зарядное устройство от смартфона, и программировать прямо с компьютера без всяких переходников. И справа на фото 3.2" 320 * 240 TFT экран($18), который я использовал в шлюзе. Можно использовать и совместимые готовые устройства как с экраном (TTGO T-Watcher BTC Ticker, M5Stack BASIC Kit), так и без (m5atom lite).
3. Настройка шлюза
Для запуска шлюза нужно запрограммировать ESP32. Файл fr4sGate.bin в папке build это уже собранный бинарник для esp32 @240MHz с памятью 4 Мбайт, DIO загрузчиком и прошивается одним файлом с адреса 0x0000. Вместо него также можно использовать три стандартных файла для перепрошивки: bootloader.bin (адрес 0x1000), partitions.bin (адрес 0x8000) и r4sGate.bin (адрес 0x10000). Но тогда нужно очистить память esp32 перед прошивкой. Файл r4sGate.bin можно также использовать для обновления прошивки через web интерфейс. Если же DIO загрузчик не стартует, можно использовать файл fqr4sGate.bin с загрузчиком QIO.
Затем нужно создать гостевую сеть Wi-Fi в роутере с ssid "r4s" и паролем "12345678", подождать, пока esp32 не подключится к нему, ввести esp32 IP-адрес в веб-браузере и во вкладке Setting установить остальные параметры. После чего гостевая сеть больше не нужна. Esp32 будет пытаться подключиться к сети "r4s" только при недоступности основной сети, например, при неправильном пароле. Если не удается подключиться и к гостевой сети, esp32 перезагружается. Вариант с гостевой сетью в отличие от общепринятой практики запуска точки доступа на esp32, как мне кажется, удобнее, так как позволяет настраивать все с компьютера не тыкая пальцами в смартфон, который при отсутствии инета так и норовит соскочить с esp32. Но, главное, в случае падения по каким-то причинам Wi-Fi роутера (а он может быть выделенным только для iot устройств) остальной Wi-Fi не засоряется дружно "вплывшими" esp32.
Далее нужно ввести имя Redmond устройства и привязать его к шлюзу. Поиск устройств запускается только тогда, когда есть хотя бы одно определенное, но не соединенное устройство. Если имя устройства точно не известно (а редмонды не всегда светятся по BLE как модель один в один), то для начала сканирования нужно ввести в поле "Name" в настройках любое имя, а потом заменить его найденным (строка "BLE Last found name/address") при сканировании и выбрать ближайший тип устройства. Есть возможность поиска и подключения к устройствам по MAC адресу. Пригодится при подключении нескольких устройств с одинаковыми именами. MAC адрес вводится в поле имени устройства в виде строки из 12 символов большими или маленькими буквами без двоеточий и тире. Найти и скопировать адрес можно также в строке "BLE Last found name/address" на главной страничке. Далее для привязки нужно нажать и удерживать кнопку "+" на чайнике или "таймер" на мультиварке до тех пор, пока устройство не войдет в режим привязки и через некоторое время соединится со шлюзом.
Предусмотрена возможность подключения к одному MQTT серверу нескольких шлюзов. Для этого нужно в каждом шлюзе установить свой r4sGate Number. Шлюз с номером 0 будет писать в топик r4s0/devaddr/..., шлюз с номером 1 - r4s1/devaddr/... и т.д. Нужно только учесть, что запрос на авторизацию при привязке зависит от номера шлюза и от номера соединения в шлюзе. Это позволяет привязать 2 одинаковых чайника или мультиварки к 2 разным шлюзам или к 2 разным соединениям в пределах одного шлюза. Если же рядом работают два шлюза с одинаковыми параметрами, подключенные к разным системам умного дома (например, сосед за стенкой), для исключения возможности подключения устройства к шлюзу соседа можно использовать опцию авторизации устройств с использованием MAC адреса шлюза, выбрав в настройках "Use MAC in BLE Authentication". После чего сбросить на устройствах все привязки и затем привязать их к шлюзу заново.
Для подключения к Mqtt брокеру нужно ввести его адрес и порт, а также логин и пароль. Если шлюз работает с Home Assistant в паре с mosquitto брокером, стоит использовать опцию Hass Discovery. Перед ее использованием рекомендую удалить в Mqtt брокере все топики с r4s, для чего выбрать в настройках Delete Mqtt topics. Если же система не поддерживает Mqtt Discovery, придется разбираться с Mqtt.
Подробнее по Mqtt...
У меня шлюз подключен к ioBroker. Мои настройки MQTT брокера ниже на картинке 2.
Картинка 2. Мои Mqtt настройки.
Снят флаг retain, чтобы брокер не запоминал, а считывал состояние устройств при соединении. В Home Assistant установленный в нем и/или Mqtt брокере флаг retain может приводить к самопроизвольному включению и выключению устройства. Также установлен флаг публикации при подписке, что позволяет не вводить все топики вручную. Иногда при публикации сразу большого числа подписок ioBroker почему-то делает некоторые из них с защитой от записи :-), есть у меня такой глюк. Приходится их удалять и перезапускать Mqtt адаптер, чтобы они появились опять.
Mqtt топики для чайника (см. картинку 3 ниже):
r4s0/devaddr/cmd/boil
<-- 0/off/false
- выключение кипячения, 1/on/true
- включение кипячения. Если перед этим был включен подогрев, включается кипячение с последующим подогревом;
r4s0/devaddr/cmd/heat
<-- 0/off/false
- выключение подогрева, 1/on/true
- включение подогрева с последней запомненной шлюзом температурой. При старте шлюза температура берется из поля Heat в настройках;
r4s0/devaddr/cmd/heat_temp
<-- 30...90
- включение подогрева, > 97
- выключение, < 30
- выключение, если подогрев был включен, последняя температура если был выключен;
r4s0/devaddr/cmd/boiltime
<-- -5...5
- время кипения чайника;
r4s0/devaddr/cmd/nightlight
<-- 0/off/false
- выключение ночника, 1/on/true
- включение ночника;
r4s0/devaddr/cmd/nightlight_red
<-- 0..255
Уровень красного в ночнике;
r4s0/devaddr/cmd/nightlight_green
<-- 0..255
Уровень зеленого в ночнике;
r4s0/devaddr/cmd/nightlight_blue
<-- 0..255
Уровень синего в ночнике;
r4s0/devaddr/rsp/
- текущее состояние, температура, rssi и т.д.;
Значения уровней запоминаются в шлюзе и передаются на чайник при включении подсветки.
Картинка 3. Мои Mqtt топики для чайника.
Mqtt топики для мультиварки (см. картинку 4 ниже):
r4s0/devaddr/cmd/state
<-- 0/off/false
- выключение, 1/on/true
- старт программы или подогрев, если программа не установлена;
r4s0/devaddr/cmd/prog
<-- номер программы 1-12, 0 - выключение;
Программы:
1 - Rice / Рис Крупы, 2 - Slow Cooking / Томление, 3 - Pilaf / Плов, 4 - Frying / Жарка;
5 - Stewing / Тушение, 6 - Pasta / Паста, 7 - Milk Porridge / Молочная каша, 8 - Soup / Суп;
9 - Yogurt / Йогурт, 10 - Baking / Выпечка, 11 - Steam / Пар, 12 - Hot / Варка Бобовые;
r4s0/devaddr/cmd/mode
<-- режим: 1 - овощи, 2 - рыба, 3 - мясо для программ 4,5,11
r4s0/devaddr/cmd/temp
<-- температура;
r4s0/devaddr/cmd/set_hour
<-- время работы программы, часы;
r4s0/devaddr/cmd/set_min
<-- время работы программы, минуты;
r4s0/devaddr/cmd/delay_hour
<-- время работы программы плюс задержка до старта программы, часы;
r4s0/devaddr/cmd/delay_min
<-- время работы программы плюс задержка до старта программы, минуты;
r4s0/devaddr/cmd/warm
<-- подогрев после завершения программы;
Параметры
delay_hour
иdelay_min
запоминаются в шлюзе и передаются при установке программы, режима или подогрева, а потому устанавливаются перед установкой программы, режима или автоподогрева. При выборе программы устанавливаются температура и время работы программы по умолчанию, после установки mode еще раз корректируются. После установки программы и режима можно при необходимости скорректировать время и температуру. Этот порядок установки параметров обусловлен тем, что по Mqtt нельзя сразу установить одной командой все параметры, если они находятся в разных топиках. При установке же через web все параметры ставятся одной командой. И значения температуры и времени по умолчанию для каждой программы и режима устанавливаются через web только если перед этим они были равны 0. Программа мультиповар пока не поддерживается, я не вижу смысла. При записи нуля в prog на мультиварку посылается команда выключения, что полезно для сброса программы.
Картинка 4. Мои Mqtt топики для мультиварки.
Mqtt топики для кофеварки:
r4s0/devaddr/cmd/state
<-- 0/off/false
- выключение, 1/on/true
- включение;
r4s0/devaddr/cmd/delay_hour
<-- время отложенного старта, часы;
r4s0/devaddr/cmd/delay_min
<-- время отложенного старта, минуты;
r4s0/devaddr/cmd/delay
<-- запуск отложенного старта, 0/off/false
- выключение, 1/on/true
- включение;
r4s0/devaddr/cmd/lock
<-- блокировка, 0/off/false
- выключение, 1/on/true
- включение;
r4s0/devaddr/cmd/strength
<-- крепость, 0/off/false
- выключение, 1/on/true
- включение;
r4s0/devaddr/rsp/
- текущее состояние, rssi и т.д.;
Значения времени отложенного старта запоминаются в шлюзе и передаются на кофеварку при включении этого режима.
Mqtt топики для розетки:
r4s0/devaddr/cmd/state
<-- 0/off/false
- выключение, 1/on/true
- включение;
r4s0/devaddr/cmd/lock
<-- блокировка, 0/off/false
- выключение, 1/on/true
- включение;
r4s0/devaddr/rsp/
- текущее состояние, rssi и т.д.;
Начиная с версии 2020.10.27 появилась возможность использовать совмещенные топики для команд и ответов. Опция включается в настройках. Мне это пригодилось при интеграции устройств в Google Home с помощью драйвера iot iobroker-а. Как я понял, этот драйвер не принимает раздельные топики команд/ответов. Кроме того, так как Google Home понимает true / false
вместо ON / OFF
, то нужно в настройках драйвера iot Conversation to Google Home = function (value) {}
ввести строку вида switch (value) {case "ON": return true ; break; default: return false;}
. Если же автозамена недоступна, то начиная с версии 2020.11.07 можно использовать опцию "true / false" Response
. Опция не работает совместно с Hass Discovery, там она не нужна.
Веб интерфейс
Устройствами можно управлять также и в веб интерфейсе шлюза. Примеры главной страницы и страницы настроек ниже на картинках 5 и 6.
Картинка 5. Главная страничка.
Картинка 6. Страничка настроек.
4. BLE Monitor
Дополнительная опция шлюза, нормально работающая в релизе esp-idf 4.4 совместно с установленными соединениями. Монитор может отслеживать метки(маяки) со статическими MAC адресами. Поддерживаются BLE маяки приложения Home Assistant на смартфонах (привязка по uuid, тайм-аут у меня 60 секунд), термометры Xiaomi Mijia 2 с прошивкой от atc1441 в режиме custom и прошивкой от pvvx в режиме custom(300 секунд), а также Samsung Smart Tag(90 секунд). Для активации нужно во вкладке "Setting" установить в опции "BLE Monitoring" значения "Active" или "Passive" для активного или пассивного сканирования и нажать "Save setting". Активный сканер работает быстрее и дает больше информации, но расходует больше энергии на сканируемых устройствах. Для сканирования меток рекомендуется пассивный режим. Нужно учитывать, что при поиске устройств перед соединением сканер всегда работает в активном режиме. Если какое-то из устройств не используется, для включения пассивного сканирования его нужно убирать из конфигурации, очистив поле имени в настройках.
После установки опции в меню появится вкладка "BLE Monitor", открыв которую, можно увидеть найденные устройства. В поле "Gap" выводится временной интервал между двумя последними пришедшими пакетами, в поле "Last" время с момента прихода последнего пакета. Тайм-аут по умолчанию (если в поле "Timeout" пусто) 300 секунд, после чего устройство считается потерянным, а его данные удаляются из таблицы. В дальнейшем эта строка может быть перезаписана данными с другого устройства. Хотя сканирование идет постоянно, но при установке значения "Timeout" нужно учитывать, что для поддержания соединений тоже нужно время, в течение которого возможны пропуски пакетов. Для вывода данных в Mqtt в поле "Timeout" нужно ввести ненулевое значение и подтвердить ввод, нажав "Ok". Все значения сохранятся в энергонезависимой памяти, а Mqtt Discovery передаст все в Home Assistant. Лишние данные в Mqtt и Home Assistant можно удалить, выбрав во вкладке "Setting" опцию "Delete Mqtt topics" и нажав "Save setting".
Не привязанные к аккаунту SmartThings Smart Tag для отслеживания не пригодны, так как через несколько минут отключаются. Для привязанных к аккаунту Smart Tag сначала нужно ввести ключ. После ввода ключ проверяется и, если все нормально, нужно ввести значение тайм-аута. Только после его ввода и нажатия "Ok" все данные запоминаются в NVS.
Как получить ключ...
Ключ представдяет собой строку из 64 символов, это 32 байта в hex-виде(16 байт ключа шифрования AES128CBC и 16 байт начального вектора). Используется для проверки цифровой подписи рекламного сообщения. Действует от момента привязки Smart Tag к аккаунту SmartThings и до момента отвязки от аккаунта или возврата устройства к заводским установкам. Первые 16 байт используются шлюзом как идентификатор устройства в системе умного дома. Для генерации ключа нужно записать лог Bluetooth HCI в момент привязки Smart Tag к аккаунту SmartThings. Если метка/(маяк) уже привязана, перед записью лога ее нужно удалить из аккаунта. Для привязки к аккаунту нужно устройство Galaxy c версией android не ниже 8.0. Я использовал Galaxy S7. Прежде всего нужно включить режим разработчика. Для этого идем в "Настройки/Сведения о телефоне/Сведения о ПО" и 8(кажется) раз нажимаем номер сборки. Может потребоваться ввести пин-код телефона. В настройках должно появиться меню "Параметры разработчика". Заходим в меню и включаем "Журнал отслеживания Bluetooth". Далее я на всякий случай выключал - включал Bluetooth и перегружал телефон. Затем заходим в приложение SmartThings и добавляем устройство Smart Tag. Затем опять идем в "Настройки/Параметры разработчика" и выбираем "Создать отчет об ошибках" и далее "Интерактивный отчет". Через некоторое время придет уведомление о созданном отчете. Далее его нужно сохранить на компьютере с windows. Я выбирал сохранить в телеграм в папке избранное, а затем уже в телеграме на компьютере сохранил архив с именем вроде "bugreport-2022-08-22-10-00-21.zip". Достаем из архива файлы btsnoop_hci.log и/или btsnoop_hci.log.last из папки "FS/data/log/bt/". В одном из этих файлов должен быть лог привязки. Далее в папку с этими файлами сохраняем архив с консольной утилитой stsk (https://github.com/alutov/ESP32-R4sGate-for-Redmond/raw/master/utils/stsk.zip) и достаем программу из архива. На всякий случай отмечу, что вирусов в архиве нет. Открываем командную сnроку windows, заходим в папку с файлами и набираем "stsk btsnoop_hci.log" или "stsk btsnoop_hci.log.last". Программа выведет найденные Smart Tag и сгенерирует ключи для них. Последний ключ будет скопирован в буфер обмена windows.
Картинка 7. Страничка BLE Monitor.
Добавлено определение лучшего сигнала от метки(маяка) среди нескольких шлюзов. Алгоритм работает так. Каждый шлюз мониторит топик "r4s/DevId/rssi". Если у него сигнал от метки(маяка) с большим уровнем, он прописывает свой уровень в этот топик, а также свой номер в топик "r4s/DevId/gtnum". После чего шлюз периодически, раз в 4 секунды сохраняет свой уровень сигнала в топике, то есть становится ведущим. Остальные шлюзы проверяют уровень и есть ли его обновление. Если какой-то шлюз обнаруживает отсутствие обновления уровня более 20 секунд, или же его уровень больше, он становится ведущим. Лучший уровень и номер шлюза можно увидеть во второй строчке RSSI на странице BLE монитора. В сущностях каждого устройства тоже есть лучший уровень и номер шлюза:
Картинка 8. Сущности метки(маяка) в Home Assistant.
5. Поддержка экрана
В первой версии шлюза оставался запас как оперативной (~100кБайт), так и программируемой (~400кБайт) свободной памяти, что позволяло расширить возможности прошивки, в частности, добавить поддержку экрана. К тому же у меня уже была собранная esp32 с экраном 3.2" 320x240 на чипе ili9341, работающая с прошивкой с сайта wifi-iot. Возможно и использование для шлюза уже готовых устройств на чипах ili9341 и ili9342. В шлюзе я использовал только необходимые процедуры из Bodmer, адаптированные не совсем хорошо, но как есть для esp-iot. Пины для поключения экрана по умолчанию: MOSI-23, MISO-25, CLK-19, CS-16, DC-17, RST-18, BACKLIGHT-21. TOUCH CS пока не используется, но подключен к 33 пину, на котором постоянно высокий уровень. Пины можно переназначить в настройках. Есть также опция поворота экрана на 180°, а также возможность регулировки яркости дисплея по Mqtt, иcпользуя топик r4s/screen. Программа проверяет наличие экрана на шине SPI при старте. Предусмотрена возможность вывода на экран и картинки в формате jpeg 320x176. Размер картинки будет около 20 кБайт. Для этого нужно указать url картинки. У моей камеры url такой: http://192.168.1.7/auto.jpg?usr=admin&pwd=admin. Картинка грузится в буфер размером 32768 байт в оперативной памяти. Время обновления можно установить в настройках. Есть возможность загрузки картинки по https. Проверка сертификата отключена. Есть возможность управления параметрами загрузки картинки по Mqtt, используя топики r4sx/jpg_url и r4sx/jpg_time. Если в Mqtt эти топики не прописаны, а также после сохранения настроек, эти параметры копируются из настроек в Mqtt. Установка нулевого интервала обновления возвращает кота на экран. Длина буфера ссылки пока 384 байта. Добавлены загрузка и отображение в текстовом виде погоды с сайта wttr.in. В принципе, это может любой сайт, отдающий текст и допускающий форматирование. Если ссылка не содержит строки "http://" или "https://", то шлюз считает это сообщение простым текстом и отображает на экране. Доступно 2 шрифта и 10 вариантов цветов. Управляющие символы: \ \ или \n - перевод строки, \F - шрифт 26 пикселей и перевод строки, \f - шрифт 16 пикселей и перевод строки, \0 ... \9 - цвета. Поддерживается кириллица, проверял, правда, только из mosquitto. Он поддерживает юникод по факту, как другие брокеры, не знаю. Пример вывода изображения на экран на картинке 9.
Картинка 9. Изображение.
На картинке 10 пример вывода на экран Mqtt погоды с сайта wttr.in:
Картинка 10. Погода.
На картинке 11 пример вывода на экран Mqtt строки (символ градуса можно вывести на экран используя обратный апостроф):
Картинка 11. Текст.
Стоит отметить, что сама TFT плата влияет на распространение как WiFi, так и BLE. И даже если антенна esp32 выглядывает из-под экрана, чувствительнось такого "бутерброда" заметно меньше обычной esp32. Рекомендую использовать с экраном вариант esp32 с внешней антенной. У меня в шлюзе с экраном замена esp32 на вариант с разъемом и установка внешней антенны дала прирост уровней WIFI и BLE примерно на 15-20dBm.
Если же экран не нужен, то нужно после программирования и настройки esp32 подсоединить ее к источнику питания и спрятать где-нибудь на кухне.
6. Совместимые устройства
Если хочется запустить шлюз максимально быстро, без пайки, да еще и с приличным корпусом, стоит присмотреться к совместимым устройствам. Их нужно только перепрограммировать. Ниже перечислены только проверенные мной устройства. Для прошивки использовалась программа flash_download_tools.
TTGO T-Watcher BTC Ticker
Картинка 12. TTGO T-Watcher BTC Ticker.
Я проверял работоспособность шлюза на TTGO T4 TFT BTC Ticker версии 1.3. Прошивается он через встроенный USB разъем, перед прошивкой устройства нужно соединить контакты 6 и 7 (gpio0 и gnd) в нижнем ряду разъема (картинка 13). Думаю, возможна прошивка и без установки перемычек, я этот момент пока не проверил. Настройки экрана для версии 1.3: 12-MISO, 23-MOSI, 18-CLK, 27-CS, 32-DC, 5-RES, 4-LED, 0-T_CS, и для версии 1.2: 12-MISO, 23-MOSI, 18-CLK, 27-CS, 26-DC, 5-RES, 4-LED, 0-T_CS. В версии 1.2 нет управления включением и выключением экрана. Кнопки сверху вниз 38-Port1, 37-Port2, 39-Port3.
Картинка 13. Соединить 6 и 7 пины разъема перед прошивкой TTGO T-Watcher BTC Ticker.
M5Stack BASIC Kit
Картинка 14. M5Stack BASIC Kit.
Как я понял, старые версии M5Stack Basic шли с экраном на ili9341, и на этих версиях работала и старая версия шлюза.
Настройки экрана для этой версии: 19-MISO, 23-MOSI, 18-CLK, 14-CS, 27-DC, 33-RES, 32-LED, 4-T_CS. Новые версии уже идут с экраном на ili9342. Начиная с версии 2021.10.29 добавлена поддержка экрана на ili9342. Я проверял работоспособность шлюза на новой версии M5Stack BASIC Kit. Прошивается он через встроенный USB разъем, перед прошивкой устройства нужно соединить последний контакт в верхнем ряду и 4 в нижнем ряду (gnd и gpio0) разъема (картинка 15). Думаю, возможна прошивка и без установки перемычек, я этот момент пока не проверил. Настройки экрана для новой версии: 23-MISO, 23-MOSI, 18-CLK, 14-CS, 27-DC, 33-RES, 32-LED, 4-T_CS. Кнопки слева направо 39-Port1, 38-Port2, 37-Port3.
Картинка 15. Соединить последний контакт в верхнем ряду и 4 в нижнем ряду (gnd и gpio0) перед прошивкой M5Stack BASIC Kit.
ATOM-LITE-ESP32-DEVELOPMENT-KIT
Картинка 16. ATOM-LITE-ESP32-DEVELOPMENT-KIT.
Прошивается атом по usb без установки перемычек. Кнопку использовал для включения-выключения одного из устройств (39-Port1), светодиод пока в прошивке не задействован. Устройство компактное (24 * 24 * 10 mm), devkit esp32 по размерам больше.
7. Сборка проекта и лицензия
Для сборки бинарных файлов использовал Espressif IoT Development Framework.. Добавлена лицензия MIT. Добавлена конфигурация для сборки в среде PlatformIO, спасибо bvp, его сообщение здесь.
подробнее...
PlatformIO
Это платформа для сборки прошивок для микроконтроллеров. Управляет инструментарием сборки, и зависимостями проекта. Всё нужное скачает сама. Со списком поддерживаемых платформ можно ознакомиться тут, а фреймворков - тут.
platformio.ini - файл конфигурации для PlatformIO
Собрать так - pio run -t build
или просто pio run
Загрузить прошивку - pio run -t upload
Потребуется только поправить upload_port
и monitor_port
.
Для Win32 значение будет вида COM4
(поставить свой номер порта, на котором находится прошивальщик).
Для Linux - будет /dev/ttyUSB0
(так же поставить свой номер порта, на котором находится прошивальщик).
Для macOS - как в прилагаемом примере.
Clang-format
В файле описываются правила форматирования кода, согласно которым код приводится к нужному стилю. Необходим установленный clang-format
.