- PVSM.RU - https://www.pvsm.ru -

Вероятно, вы слышали о том, что сухость воздуха — одна из частых причин появления статического электричества. Вот и я решил обзавестись увлажнителем, когда заметил, что кошка бьется током почти при каждом прикосновении. И нет, ее зовут не Электро или Шторм Спирит. Знакомьтесь, Амидала (в честь персонажа вселенной «Звездных войн»).
Время шло, потребности в комфортном использовании техники росли, а вот ее функциональность и стабильность оставляли желать лучшего. После очередного сбоя серверов Xiaomi в октябре прошлого года [1] в голове окончательно закралась мысль: почему дом — мой, а серверы — чужие? Так я познакомился с Home Assistant, MQTT, zigbee2mqtt и селфхостингом, о чем расскажу под катом!
Любите детективы? Пройдите квест «В поисках пропавших ссылок»! Регистрируйтесь на сайте [2] и попробуйте себя в роли сыщика: найдите на страницах Selectel спрятанные ссылки и первыми дойдите до финала. Выиграйте эксклюзивный мерч и промокод на сервисы Selectel.
Если zigbee-устройства без проблем работают локально благодаря zigbee2mqtt (Z2M), то с увлажнителем возникли сложности. Казалось бы, у Xiaomi есть проприетарный протокол miIO для управления устройствами в локальной сети. Значит ли это, что можно обойтись без чужих серверов?
Home Assistant — это платформа с открытым исходным кодом для управления умным домом, создания сценариев автоматизации и т. д. Она позволяет интегрировать устройства разных производителей с разными типами подключения и не быть привязанным к одной экосисте.
Home Assistant (далее — HA) действительно умеет работать с протоколом miIO, но есть несколько нюансов.

А вдруг нашлись умельцы, разобрались, написали прошивку и выложили в открытый доступ? После недолгих поисков я нашел нужный репозиторий [3], кодом которого мы сегодня и воспользуемся.
Альтернативный сценарий — использование ESPHome [4] и написание несложных yaml-файлов. Вероятно, я займусь этим в будущем, когда влажность дома перестанет проседать ниже 50%.
На самом деле, указанный выше репозиторий подходит только для устройств, выпущенных в первые годы производства. После того, как производитель решил поменять протокол, по которому плата общалась с железом, появилось несколько форков (подробнее можете почитать в issue от декабря 2022 года [5]).
Я буду использовать форк другого форка [6], так как именно эта версия заработала c HA без написания лишних yaml-файлов для подписки на mqtt-топики. К слову, имя автора наталкивает на мысли о его происхождении. Быть может, он читает эту статью?
Итак, нам понадобятся:
Автор лишь делится своим опытом и не несет ответственности за манипуляции с техникой. Стоит помнить, что гарантия производителя может перестать действовать после внесения некоторых изменений. Однако представленная реализация достаточно проста и не предполагает особых вторжений в аппаратную часть.
Снимаем нижнюю крышку увлажнителя Xiaomi Deerma Air Humidifier 5L (ZNJSQ01DEM):

Нас интересует серая платка у стенки корпуса, к которой идет шлейф из белых проводов. Достаем и видим, что она действительно работает на популярной ESP8266:

Цепляем GND, VCC 3.3v (это важно!), TX и RX к программатору (RX в TX и наоборот). GPIO 0 тянем к земле (GND), он нужен для загрузки микроконтроллера в режим загрузки по UART.

Адаптер для прошивки впаянной в плату микросхемы.
Для прошивки и запуска понадобится дополнительное питание схемы, так как мощности программатора, скорее всего, не хватит. Я особо не заморачивался — подключил плату во включенный увлажнитель. Выглядело это так:

Со стороны железа у нас все готово, перейдем к софту.
Сперва ставим Arduino IDE любым удобным способом. Подойдет как привычная первая версия [7], так и обновленная вторая [8]. Следом необходимо добавить поддержку ESP8266. Открываем IDE, переходим в меню File ⟶ Preferences, вставляем ссылку arduino.esp8266.com/stable/package_esp8266com_index.json [9] в поле Additional Boards Manager URLs и нажимаем OK. С подробным описанием процесса вы можете ознакомиться в инструкции [10].

После этого можем скачать необходимые пакеты в Tools ⟶ Board ⟶ Board Manager:

Наконец, выбираем нашего красавца Generic ESP8266 Module в том же меню.
На данном этапе мы можем «послушать» UART. Подключаем программатор к ПК (GPIO 0 нужно отцепить от земли), выбираем его в Tools ⟶ Port, открываем консоль Serial Monitor в правом верхнем углу.
Если все получилось, мы должны увидеть сообщения о событиях (снятие крышки, включение увлажнителя и т. д.):
properties_changed 2 1 true
properties_changed 2 1 false
properties_changed 7 1 false
Если же в консоли что-то другое, быть может, ваш увлажнитель из первых ревизий, либо нужно «поиграться» со скоростью передачи данных.
Скачиваем необходимые пакеты в Sketch ⟶ Include Library ⟶ Manage Libraries:
Клонируем нужный репозиторий и открываем в IDE. Теперь мы готовы прошивать.
git clone https://github.com/yobushka/esp8266-deerma-humidifier
cd esp8266-deerma-humidifier/src/esp8266-deerma-humidifier
arduino esp8266-deerma-humidifier.ino
Пробуем собрать проект, нажав на галочку в левом верхнем углу. Ждем некоторое время, и, если все прошло успешно, получаем информацию о скомпилированной прошивке:
. Variables and constants in RAM (global, static), used 50420 / 80192 bytes (62%)
║ SEGMENT BYTES DESCRIPTION
╠══ DATA 1648 initialized variables
╠══ RODATA 11100 constants
╚══ BSS 37672 zeroed variables
. Instruction RAM (IRAM_ATTR, ICACHE_RAM_ATTR), used 62440 / 65536 bytes (95%)
║ SEGMENT BYTES DESCRIPTION
╠══ ICACHE 32768 reserved space for flash instruction cache
╚══ IRAM 29672 code in IRAM
. Code in flash (default, ICACHE_FLASH_ATTR), used 385796 / 1048576 bytes (36%)
║ SEGMENT BYTES DESCRIPTION
╚══ IROM 385796 code in flash
По-хорошему, конечно же, стоит сделать дамп существующей прошивки, иначе пути обратно не будет (подробнее можете узнать из официальной документации esp8266 [11]). Ну а я нажимаю Upload, не забыв подцепить упомянутый GPIO 0 к земле. Так прошивка заливается на контроллер, после чего он перезагружается:
esptool.py v3.0
Serial port /dev/ttyUSB0
Connecting....
Chip is ESP8266EX
Features: WiFi
Crystal is 26MHz
MAC: b4:60:ed:4a:93:52
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 2MB
Flash params set to 0x0330
Compressed 432368 bytes to 304004...
Writing at 0x00000000... (5 %)
Writing at 0x00004000... (10 %)
Writing at 0x00008000... (15 %)
Writing at 0x0000c000... (21 %)
Writing at 0x00010000... (26 %)
Writing at 0x00014000... (31 %)
Writing at 0x00018000... (36 %)
Writing at 0x0001c000... (42 %)
Writing at 0x00020000... (47 %)
Writing at 0x00024000... (52 %)
Writing at 0x00028000... (57 %)
Writing at 0x0002c000... (63 %)
Writing at 0x00030000... (68 %)
Writing at 0x00034000... (73 %)
Writing at 0x00038000... (78 %)
Writing at 0x0003c000... (84 %)
Writing at 0x00040000... (89 %)
Writing at 0x00044000... (94 %)
Writing at 0x00048000... (100 %)
Wrote 432368 bytes (304004 compressed) at 0x00000000 in 26.5 seconds (effective 130.4 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting via RTS pin...
Отсоединяем GPIO от земли и перезагружаем увлажнитель.
Через какое-то время после перезагрузки у вас должна появиться открытая Wi-Fi сеть «SETUPME». Подключаемся к ней и переходим к настройке:

Обязательно вводим Hostname и Location, они нужны для формирования сообщений в MQTT-брокер. Выбираем нашу домашнюю сеть, вводим пароль и нажимаем Submit. Увлажнитель подключается к нашей точке, получает ip-адрес, а мы переходим по нему в браузере.
Далее нужно подключить увлажнитель к MQTT-брокеру (предполагается, что он есть). Я использую Mosquitto [12], де-факто стандарт в IoT. При желании этот брокер можно поставить даже на роутер, однако в HA для этого уже есть соответствующий аддон [13].

Сохраняем настройки и ждем подключения. HA сам нашел увлажнитель и добавил его:

У нас получилось простое и бюджетное решение для «вызволения» увлажнителя воздуха из недоверенных серверов Xiaomi. Стоимость может варьироваться от небольшой до нулевой, ведь мы не интегрируем новые компоненты в систему, а перепрошиваем уже имеющуюся плату. В моем случае реализация вышла бесплатной, так как получилось одолжить паяльник и программатор у коллег.
Решение работает уже несколько месяцев, никаких проблем замечено не было. И теперь почти все, что происходит в моем доме, остается в моем доме. В дальнейшем я бы хотел вызволить из внешних облаков еще несколько устройств.
Например, робота-пылесоса при помощи программы Valetudo [14]. Возможно, вы сталкивались с ней или подобными реализациями? Поделитесь опытом в комментариях, будет интересно узнать.
Автор: Инсаф
Источник [15]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/news/390868
Ссылки в тексте:
[1] очередного сбоя серверов Xiaomi в октябре прошлого года: https://habr.com/ru/news/765426/
[2] на сайте: https://promo.selectel.ru/quest/?utm_source=habr.com&utm_medium=referral&utm_campaign=quest_article_promo_030424_banner
[3] репозиторий: https://github.com/Hypfer/esp8266-deerma-humidifier
[4] ESPHome: https://esphome.io/index.html
[5] в issue от декабря 2022 года: https://github.com/Hypfer/esp8266-deerma-humidifier/issues/6
[6] форк другого форка: https://github.com/yobushka/esp8266-deerma-humidifier
[7] первая версия: https://github.com/arduino/Arduino
[8] вторая: https://github.com/arduino/arduino-ide
[9] arduino.esp8266.com/stable/package_esp8266com_index.json: https://arduino.esp8266.com/stable/package_esp8266com_index.json
[10] в инструкции: https://github.com/esp8266/Arduino
[11] из официальной документации esp8266: https://docs.espressif.com/projects/esptool/en/latest/esp32/esptool/basic-commands.html
[12] Mosquitto: https://mosquitto.org/
[13] соответствующий аддон: https://github.com/home-assistant/addons/blob/master/mosquitto/DOCS.md
[14] программы Valetudo: https://github.com/Hypfer/Valetudo
[15] Источник: https://habr.com/ru/companies/selectel/articles/804867/?utm_source=habrahabr&utm_medium=rss&utm_campaign=804867
Нажмите здесь для печати.