Еще одна заметка про «умный дом». На этот раз я решил найти альтернативу датчикам температуры/влажности из комплекта Aqara на базе esp8266+stm8 (модуль esp-14s) с прошивкой esphome. В «родном» варианте меня не устраивало отсутствие датчика освещенности и давления, не очень хорошая точность датчиков температуры/влажности, а так же отсутствие возможности менять время между опросом датчика. И была мысль попроробовать заполучить все вышеуказанные хотелки в практически готовом виде, да еще практически без разницы в цене. Что из этого (не)получилось сейчас расскажу во всех деталях.
Собственно, что не так? И что с этим будем делать?
Итак, что меня не устраивало в датчиках температуры/влажности от Aqara? Ну, во-первых цена в 12 баксов с небольшим с алиэкспресса. Для такого простого устройства, что для такого простого было как-то на мой взгляд многовато. Во-вторых, для моей самопальной метеостанции, мне хотелось мерять освещенность и атмосферное давление, чего этот девайс не особенно умел, от слова никак.
Так как родным приложением Xiaomi для умного дома я не пользуюсь, предпочитая вместо этого HomeAssistant, то и выбор устройств у меня не был ограничен экосистемой хлаоми.
Да и тут же мне припомнилась старая добрая платформа esp8266, с которой я работал, когда она только появилась и даже разрабатывал свою (ныне правда подзаброшенную за ненадобностью) прошивку frankenstein, позже я ее даже цеплял ее к достаточно сырому NextCloud Sensorlogger. К сожалению, в те времена решения под названием HomeAssistant не было, разрабатывать свое с нуля я не потянул бы по времени, потому так оно и ушло в никуда.
Покопавшись в хламе на чердаке я также нашел отладочную плату на модуле ESP-14 (Это очень странная связка STM8 и ESP8266), где уже были все необходимые для меня датчики, а быстрая проверка алиэкспресса показала, что эти модули все еще в продаже по достаточно вкусным ценам. Цена немного выше термодатчика Aqara, если считать с доставкой, но зато больше датчиков!
Каков план действий?
Собственно, план действий был прост и нарисовался быстро практически сам собой:
- Готовим прошивку для этих плат подручными средствами
- Тестируем (И разгребаем потенциальные проблемы)
- Подключаем к HomeAssistant
- Если все взлетело, то изготовливаем корпус с батарейкой и заказываем несколько дополнительных штук с нашей люимой китайской помойки.
- PROFIT!
Прошиваем пациента (ESPHome)
Собственно, прошивать тут пришлось двух пациентов в одном. ESP8266, в который я залил прошивку на основе EspHome и STM8S, так как все датчики висели именно на нем. Что нам потребуется
- Переходник USB<—>UART TTL для пошива ESP8266
- STM8 Программатор
- Windows и демо версия IAR (Для сборки прошивки и пошива STM8)
На просторах сети я нашел проект для IAR, где было реализовано чтение данных со всех датчиков средствами STM8 и выдача их по ModBus. ModBus у меня под рукой не было, как и надобности в нем, потому я быстренько накостылил прошивку, которая отдает значения по UART’у. Для того, чтобы ее собрать, правда, потребуется Windows и IAR (сойдет и триальная версия, кода там немного. К сожалению, sdcc нам не поможет, ибо автор оригинальной прошивки для STM8 любитель плюсов, а переписывать нуля лениво). К слову сказать, за 10 с лишним лет, что прошло с тех пор, как я пользовался IAR мало что изменилось — он как был глючным и падучим, так им и остался. По счастью, долго с ним работать не пришлось. Собственно, для пошива потребовался программатор для STM32/STM8. Хорошо, что эта дешевая китайская поделка на STM32 у меня всегда под рукой 😉
Дальше дело было за пошивом ESP8266, и тут опять ждала засада от разработчиков платы: Для того, чтобы замкнуть GPIO0 на 0 и перевести оный в режим пошива, пришлось приделать небольшую кнопку на «технологические» контакты на обратной стороне платы.
Так как прошить это хозяйство?
Решил вынести инструкцию по пошиву отдельно. Начнем с STM8S. Подключаем к программатору:
- SWI <—> SWIM
- RST <—> RST
- GND <—> GND
- Vcc <—>5V
Открываем STM8 Programmer и шьем готовый образ, либо из IAR собираем проект и жмакаем кнопку Download.
Теперь ESP8266. Для этого нам потребуется переходник USB<—>UART. Подключение будет немного хитрее.
- Замыкаем RST на GND, чтобы STM8S молчал и не портил нам процесс
- TXD<—>RXD
- RXD <—>TXD
- GND <—> GND
- 5V <—> Vcc
Нажимаем на припаянную кнопку и втыкаем переходник в компьютер. Отпускаем кнопку. Дальше просто набираем esphome esp14.yaml run, выбираем наш порт (например, /dev/ttyUSB0).
После начальной прошивки модуля, обновлять можно «по воздуху», благо размер SPI флешки для этого достаточный.
Подключаем к HomeAssistant: MQTT vs Native
EspHome можно подключить двумя способами к HomeAssistant. Первый, это ‘api’, а второй это MQTT. В чем разница?
Если мы используем API, то HomeAssistant сам опрашивает наш модуль по API, напрямую. Обмен очень эффективен и если мы управляем реле или светом — у нас минимальные задержки. Aqara после этого кажется тормозной китайской поделкой.
MQTT — это более общее решение. Нам потребуется установленный MQTT брокер, например Mosquitto. Весь обмен будет вестись через него, что немного увеличит задержки. Ну и esp8266 будет сам подключаться к MQTT и сообщать о значениях датчиков.
Так когда использовать одно, а когда другое? Изучив матчасть, я пришел к следующему выводу:
- API имеет смысл использовать если наше умное устройство питается от сети, всегда подключено к WiFi и нам нужно минимум задержек (Выключатели, включение/выключение света и тому подобное)
- MQTT самое то использовать для датчиков, чья задача проснуться из глубокого сна, быстренько снять показания, выплюнуть их куда-нибудь и снова уснуть. Если мы будем исползовать api, HomeAssistant может просто не успеть их опросить.
Так же, чтобы когда датчик уходит в глубокий сон он не отображался, как оффлайн надо указывать пустой «will message» в конфиге:
mqtt:
broker: 192.168.1.254
will_message:
Побробнее можно почитать в багтрекере EspHome тут и тут.
Тестируем (И обламываемся!)
В ходе тестирования сразу вылез ряд проблем:
- ESP8266 ощутимо греется, потому греются и термодатчики, и они показывают что угодно, но не температуру воздуха
- Линейный стабилизатор, который используется для питания ESP8266, сидит на плате в нескольких миллиметрах от термодатчика и (сволочь такая) тоже греется
- Глубокий сон ESP8266 на этих платах не функционирует, как ожидалось
А ведь все так хорошо начиналось… Первое что я сделал, установил максимальное агрессивное энергосбережение WiFi. Но несмотря на это неудачно расположенный линейный стабилизатор разогревал термодатчики на несколько градусов выше той температуры, которой они должны были быть. Оставался только режим глубокого сна ESP8266. Почему бы и нет?
И вот тут меня опять ждал дикий облом. «Уснуть» железка смогла, а вот с выходом из сна у нее не сложилось. Она помигивала синим светодиодиком, но не грузилась. Судя по красному светодиоду — после выхода из сна она загружалась в режиме перепрошивки (?). Правильная работа режима глубокого сна в нашем зависит от разводки модуля ESP-14 (Наличии подтяжек на нужных ногах), и это значило что здесь китайцы опять налажали (либо решили сэкономить пару резисторов, в надежде что и так прокатит).
Пришлось шаманить. Я пробовал настраивать GPIO0/GPIO2 на выход, отключил красный светодиод (GPIO0) и притянул GPIO0 300-омной (Да, перебор, конечно) подтяжкой к единице. Аналогично сделал с синим светодиодом (GPIO2), заменив его на подтяжку. Видимо проблема крылась где-то под металлической крышкой ESP-14 и заключалась в том, как были соединен GPIO15 или схема сброса ESP8266. Судя по табличке
Если этот вывод GPIO15 в единице по какой-то причине, то он будет пытаться загрузиться с SDIO (которого у нас нет в модуле)
Собственно, собрав шишек я пришел к выводу, что чем заставить работать глубокий сон, проще выставить максимальное энергосбережение WiFi, и запитывать это чудо китайской техники сразу через вывод 3.3 вольта. Потребление при этом достаточно низкое, чтобы ESP8266 не сильно грелась, да и работала от 18650 батарейки достаточно долго.
wifi:
networks:
- ssid: SensorTower
password: XXXXXXX
power_save_mode: HIGH
При этом потребление стало в пределах миллиампера, а разогрев перестал быть фатальной проблемой. Как говорил мой дед, «сойдет для сельской местности».
Если кому удалось заставить это чудо китайской инженерной мысли нормально спать и просыпаться — напишите в комментариях как 😉
Корпусируем
Для этого девайса я решил попробовать комбинацию PLA+SBS. Из PLA делаем основной корпус, а вот из прозрачного SBS делаем крышку, которая засчет гибкости SBS плотно садится на ответную часть. И никаких винтов.
Профит (Или где он?)
Главным плюсом этого решения (если бы не приключения выше) было то, что не пришлось разводить отдельную плату и паять ее, вдыхая дивные пары канцерогенного китайского флюса. Да и плюс термодатчики/датчики давления паять руками то еще удовольствие, мелкие они и капризные. Фактически по цене, не сильно выше цены термодатчиков акары я бы получил больше датчиков в одном корпусе.
Итак, что выходит по цене?
- 11.25$ * N + 2.25$ доставка, за N отладочные платы
- 0.76$ * N за короб для 18650 батареи
- 2-3$ — 18650 аккумулятор.
А вот минусов вышло многовато. Самый первый и главный — нерабочий «глубокий сон» и саморазогрев, который перечеркивает точность термодатчиков и сокращает время работы от батарейки.
Туда же можно отнести невозможность измерить напряжение батарейки без серьезной модификации платы.
На и, наконец, габариты. Вышел самый настоящий кирпич. В свое оправдание скажу, что хоть и можно было использовать батарейку поменьше, что изрядно бы уменьшило размер копуса, но я хотел использовать дерьмовые китайские 18650 аккумуляторы, которых у меня было запасом.
P.S.
Изучая альтернативы на алиэкспрессе нашел вот такую вот плату от того же китайского школьника DIYMore:
Вариант с самым точным датчиком температуры и влажности стоит 4.5 бакса, что в два раза дешевле акаровских датчиков. Проблема только в том, что батарейки тут нет, опять линейный стабилизатор-кипятильник на 3.3 вольта, а ESP8266 модуль закрывает и подогревает вентиляцию датчкика. Впрочем, тут хоть его можно отогнуть.
По ходу придется таки делать свою плату с датчиками, преферансом и поэтессами, хоть и лениво это дело уже.
P.P.S. Где все это скачать?
- Мой вариант прошивки для STM8
- Конфигурация для EspHome
- Модель корпуса под 18650 и модуль с датчиками