Недавно при странных обстоятельствах у меня появился вот такой зверь:
В целом он довольно неприхотлив, но хотелось обеспечить ему самые приятные условия для его хладнокровного существования. Не то чтобы это были какие-то нетривиальные задачи, мне просто показалось интересным, что у технологий есть ещё и такое внезапное применение.
Что нужно было сделать:
Поддерживать ему минимальную температуру ночью, но так, чтобы он не перегрелся
Поддерживать минимальную влажность
Включать ему ультрафиолетовую лампу в 5 утра, когда он любит выползать поваляться на камушке.
Вроде бы несложно. У меня был мешок реле, датчиков, Home Assistant и Arduino. Но если ты начал собирать умный дом, становится трудно остановиться. Единственное, что у меня вызывало опасение - это Arduino. Нет ничего более беспомощного, безответственного и испорченного, чем Arduino. Я знал, что рано или поздно я перейду и на эту дрянь.
Казалось бы, всё просто - засунь туда датчиков, подключи к ESP, да щёлкай релешками. Но хотелось точных датчиков, маленьких и автономных, и достаточно стабильной работы, чтобы не сварить и не заморозить животное. И тут оказался прям большой простор для разных вопросов и работы.
Дисклеймер
Прежде, чем читать дальше, давайте уточню, что я не герпетолог и не электрик. Я простой бекенд разработчик. И ни за что бы не доверил жизнь животного автоматике, если бы не мог её постоянно контролировать глазами. Пожалуйста, будьте осторожны, и не копируйте бездумно то, что я здесь написал. Я предупредил, и не буду чувствовать себя виноватым, если вы, например, сварите своих аквариумных рыбок.
Датчики
Итак, вернёмся к теме. Для измерения температуры и влажности я выбрал Aqara Temperature and Humidity Sensor на Zigbee - они маленькие, красивые, и автономно работают от батареек-таблеток. Да, именно "они" - поскольку температуру нужно мерять и в холодном и в горячем углу. Кроме этого у меня ещё был похожий датчик Mija, только с LCD и работающий по BLE, а не Zigbee. Он висел сверху, и я его там и оставил, как дублирующий - много датчиков не бывает!
Для того, чтобы всё это прокинуть в Home Assistant, я использовал Xiaomi Gateway 3, специально прикупленный для этих целей. Привязываем к нему датчики, ставим нужный custom component в Home Assistant, и получаем все нужные данные! Прям сказка.
Обогрев
Для обогрева мне приглянулась керамическая лампочка. Она не производит лишнего света и по идее живёт вечно. Правда, я погорячился и взял её на 100Вт. Даже через диммер она выдаёт слишком много тепла, так что сейчас я жду, пока мне придёт такая же на 50.
Увлажнение
Для этого я поставил обычный ультразвуковой увлажнитель, направив его носиком в террариум.
Ультрафиолет
Для этого ставят специальные лампы для рептилий. Не знаю, насколько это маркетинг, но несколько герпетологов порекомендовали поставить, и я решил поверить им на слово.
Реле
Девайсы подготовлены, датчики тоже. Теперь надо всё это чем-то включать. Навскидку у меня не получилось найти трёхканальных умных реле за вменяемые деньги, так что я просто взял стандартные пятивольтовые реле для ардуинок с али. Немного неудобно тем, что я не знаю, как с них снимать ток, а так же я подумываю о замене их на твердотельные... Но пока это не вызвало каких-то проблем, и я стараюсь вкладывать усилия по мере необходимости.
Контроллер
Дома лежит мешок NodeMCU, Wemos D1 R1 и Wemos 32, так что я взял старый добрый D1 R1 на ESP8266 и решил наконец пощупать ESPHome. До этого я прошивал контроллеры через Arduino IDE по USB и использовал руками настроенные MQTT топики, а тут решил, что хватит это терпеть - есть подходящий повод разобраться.
В общем, ESPHome оказался просто волшебной штукой. Пишешь простой YAML, всё прошивается по воздуху, все топики и прочее добро создаются за тебя, и девайс сам обнаруживается в Home Assistant. Просто магия! Фактически вся настойка реле выглядела вот так:
switch:
- platform: gpio
pin: D2
name: Relay1
id: relay1
inverted: true
- platform: gpio
pin: D3
name: Relay2
id: relay2
inverted: true
- platform: gpio
pin: D4
name: Relay3
id: relay3
inverted: true
Триггеры
Отлично, теперь есть всё железо и софт, можно включать и выключать всё через Home Assistant, однако... Ничего ещё не автоматизировано.
И в этом помогают Automations от Home Assistant. В целом они вышли довольно тривиальные:
Если температура ниже x, то включить обогрев
если температура выше x, то выключить обогрев
то же самое для влажности
в 5 утра включить лампу, в 17 выключить
если температура критически низкая или высокая, то послать уведомление в телеграмм
Ура, кажется, на этом наш MVP готов. Всё работает и рисует красивые полезные графики:
Но есть нюанс!
Однако... Пока это не выглядит достаточно безопасным. Что, если реле залипнет, пока я сплю и не услышу уведомление в телеграмм? Я совсем не хочу получить на завтрак жареного геккона!
Тогда я понял, что нужен дополнительный способ алертинга. Можно было бы для этого переиспользовать умные колонки с Алисой, но они стоят только у детей (жаба давит ставить в каждую комнату), и не хотелось бы их пугать по ночам, если что.
Ну что же. Если у тебя в руках ардуина, то всё вокруг кажется гвоздём. Берём её, втыкаем в неё пищалку, и настраиваем её как включаемую сирену с полифонической мелодией. Добавляем включение этой сирены как переключатель в Home Assistant. Попутно ещё я закинул туда сервис для Home Assistant, который даёт играть на ней любую мелодию. Ну, потому что мог. Наверное, это единственная штука, которая была не совсем тривиальной, поэтому даже закину код:
esphome:
name: alam
on_loop:
then:
if:
condition:
- switch.is_on: alarm_sensor
- not:
rtttl.is_playing
then:
- rtttl.play: 'MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d'
switch:
- platform: template
name: "Alarm Switch"
optimistic: true
id: alarm_sensor
internal: false
output:
- platform: ledc
pin: GPIO18
inverted: true
id: rtttl_out
rtttl:
output: rtttl_out
on_finished_playback:
- logger.log: 'Song ended!'
api:
services:
- service: play_rtttl
variables:
song_str: string
then:
- rtttl.play:
rtttl: !lambda 'return song_str;'
Вот так в 40 строчек программирования на ямлах получается вполне сносная сирена, которую слышно по всему дому.
Помимо этого, я подумал про случай, когда реле включилось, и на этом мой сервер Home Assistant умер и не выключил его. Я по прежнему не хочу жареного геккона, так что добавил туда простую проверку - реле обогревателя выключается через 20 минут после включения. А если вокруг правда мороз и оно всё ещё должно быть включено - не беда, Home Assistant включит его обратно!
Код такой проверки на ямлах написать у меня не получилось, и я запользовал так называемую лямбду в ESPHome. Фиг знает, почему она так называется - ведь выполняется она на контроллере...
on_loop:
then:
lambda: |-
static unsigned long last_update = 0;
static unsigned long enabledForTime = 0;
int iteration = 5000; // every 5 sec
if((last_update + iteration) < millis()){
last_update = millis();
if(id(relay2).state){
enabledForTime+=iteration;
}
else{
enabledForTime = 0;
}
ESP_LOGD("ERM", "Heat relay enabled for: %lu", enabledForTime);
if(enabledForTime> 1000*60*20){ // 20 min, safety measure
ESP_LOGD("ERM", "Turning off heat relay");
id(relay2).turn_off();
enabledForTime = 0; // avoid confusion when HA turns on relay back
}
}
Вот теперь, кажется, всё. Возникает мысль добавить перед реле ещё яндекс розетку (которая у меня тоже управляется локально, поскольку она туя), чтобы через неё перезапустить контроллер, если что... Но не хочется добавлять точек отказа без необходимости. Да и на крайний случай всегда можно призвать соседку проверить зверя. В конце концов, мне не нужны пять девяток в стабильности, я не Яндекс.геккона делаю.
Вопросики
В процессе я задавал себе вопросы, какие у меня могут выйти сценарии, и как их избежать. Возможно, это тоже будет интересно, так как помогает понять, как у меня в голове выстраивалась модель.
Q: А что если пропадёт интернет?
A: Ничего. Всё будет продолжать работать как работало. Только извне показания датчиков нельзя будет узнать и получить уведомления в телеграмм. Если бы интернет падал часто и это было бы супер критично, можно было бы настроить резервный канал. Но... И так сойдёт.
Q: А если пропадёт электричество?
A: Хуже, чем без умного дома, не будет. Как только электричество появится - всё восстановится. В целом дома тепло, но если бы хотелось гарантий обогрева - можно было бы поставить бесперебойник на роутер, сервер HA и реле с потребителями.
Q: А если сдохнет батарейка в датчике?
A: Триггеры опираются на показания трёх датчиков. Три одновременно - не сдохнут.
Q: И всё же. Что если залипнет реле или повиснет микроконтроллер?
A: Залипание реле можно пролечить удалённой перезагрузкой микроконтроллера. Зависание микроконтроллера - вариантом с внешней умной розеткой. Но вообще это кажется пренебрежимо редким кейсом, с которым справится уведомление, сирена, и на худой конец - визит друга.
Итоги
Мне определённо понравилось то, что получилось. Умный дом для геккона сделал жизнь приятнее и комфортнее и мне и ему.
Вся эта машинерия определённо не стоит свеч, если у вас ничего дома нет из умного дома. Наверняка проще поставить готовое решение для террариума. Но если у вас уже есть экосистема - то получается хорошее решение по цене пары датчиков, одного-двух контроллеров и пищалки.
Безусловно, ничего технически сложного в проделанной работе нет, и я предвижу вопросы "зачем это тут?". Однако, мне кажется интересным именно синергетический эффект простых вещей, которые вместе дают сделать довольно прикольные штуки. Раньше я уже описывал открытие ворот, полив цветочков, управление ёлкой и детские игры на умном доме. Кажется, что со временем будет появляться всё больше таких решений, причём не для бородатых нердов, а для нормальных людей, и они будут классно и красиво работать из коробки.
Можно ли было сделать лучше и проще? Возможно, я что-то не учёл? Да наверняка. Надеюсь, вы подскажете мне в комментариях.
Комментарии (19)
jehy Автор
21.05.2022 11:37Да, были у меня такие же мысли - но решил, что спалить не должен в любом случае, а димированные 50 Ватт не должны сварить зверя. И как раз две недели дома был, чтобы контролировать.
Melias
21.05.2022 12:36+10Спасибо за то, что поделились своим опытом!
Поделюсь парой моментов из собственного опыта:
если тригер автоматизации действительно настроен на "если температура выше x, то выключить обогрев" то может случится ситуация, что при перезагрузке ХА температура датчика уже выше и тригер на отключение обогрева/увлажнения не срабатывает. Я в последнее время пишу это условие не в тригер, а condition, а в тригеров ставлю несколько - старт ХА, time pattern каждые 5 мин, достижение пороговой температуры и т.д.
в термостатах и системах автоматизации их повторяющих обычно используют "hysteresis", т.е. отклонение от целевого значения температуры. Т.е. при целевой температуре 25 гр и гистерезисе 0,5 гр обогреватель выключается при 25,5 и включается на 24,5. Нужен он для того, чтобы реле не дергалось в обе стороны на пороговом значении, ну и для учета инертности системы. Практика показывает, что штука не лишняя
-
В принципе, вынесение автоматизаций в ХА тут не обязательно, и даже несет в себе лишние точки отказа. В EspHome есть возможность написать автоматизации внутри на lambda, а можно не заморачиваться и воспользоваться стандартным встроенным еспхоумным thermostat, который весьма продвинут и делает всё сам. Кстати, можно за несколько долларов купить и прикрутить дисплейчик типа SSD1306 или чуть побольше (пайки там четыре провода), и пару-троку кнопок для настройки температуры и влажности. Ну и датчики можно не zigbee, зависящие от ХА, сяоми гейтвей, WiFi сети, зигби-сети и батареек датчиков, а дешевые и простые проводные типа DS1820, DHT22 и т.п. воткнутые в ту же еспшку локально.
Вот тогда девайс станет совсем автономным и красивым, а overkill достигнет необходимых для этого хобби высот )))
А в целом, спасибо за живую статью и реальный опыт, геккону удачи, долгих лет жизни и вкусных сверчков!
jehy Автор
21.05.2022 13:05+1Толковые замечания! Не думал, что триггер может не сработать. Интересно. По поводу hysteresis - да, так и сделал. DHT22 у меня сначала там уже стоял, но по ощущениям он заметно хуже, чем aqara. Да и неудобно провода в террариум затаскивать. Так что вынул и поставил аквару и интегрировал через зигби и гейтвей именно поэтому. Хотя подумываю о том, чтобы сделать его в качестве ещё одного фоллбека.
Спасибо за пожелания :)
Melias
21.05.2022 13:25+1Если так нравится показания акары, можно купить конкретно ее датчик: SHT31. В EspHome для него все есть. А еще можно попробовать BMP280.
(но думаю вам просто не повезло с DHT22. Так-то они все вполне сопоставимы (вот можно посмотреть как человек очень заморочился сравнением)
Apucmokpamka
21.05.2022 14:28+1А я просто напишу, что эублефарам нужен нижний обогрев, лампы ставят другим видам чешуйчатых. Ну и про Д3 спорно, если это костыль для того, чтобы не давать кальций с Д3, то рекомендую запастись специальными карточками, которые как раз проверяют ресурс лампы у/ф.
jehy Автор
21.05.2022 14:36Есть хороший камушек для обогрева, лампа - для догрева ночью, когда температура дома может упасть ниже 20, и когда вдруг открыто окно или дверь.
Про Д3 правда спорно, но слышал несколько хороших источников, которые были "за", так что решил что как минимум не повредит.
Но в целом да, я специально добавил дисклеймер, чтобы мне не верили на слово.
Rumidu
22.05.2022 03:05"Увлажнение
Для этого я поставил обычный ультразвуковой увлажнитель, направив его носиком в террариум." Влажность в содержании земноводных не менее важна, чем температура. Здесь ровно наоборот, если в температуре главное - не превысить порог (перегреть), во влажности главное - не снизить порог (не пересушить). Близость ультразвукового излучателя (в уалажнителе) также под вопросом. Амфибии очень чувствительны к источникам любого звука (спектр их восприятия гораздо шире человеческого).
jehy Автор
22.05.2022 03:09Интересная тема, на которую тоже не нашёл однозначного ответа. Вроде как рептилии не слышат звуков. Но не факт, что не могут ощущать его как-то ещё. Скорее всего, ультразвук в увлажнителе глушится его корпусом. Но даже если это не так, то можете быть спокойны за геккона - по датчикам я понял, что ручного опрыскивания раз в день более чем хватает для поддержания уровня влажности. Так что увлажнитель оставил чисто на случай отъезда на несколько дней. И в этом случае, скорее всего, он будет включаться всего на несколько минут, что вряд ли нанесёт какой-либо ущерб.
Winnie_The_Pooh
22.05.2022 10:36+2Любопытно, мне понравилось. Однако покритикую:
Залипание реле есть процесс механический - подвижная часть механизма застревает. Обычно из-за низкого качества реле с Али для Ардуино. Перезагрузкой МК не лечится по определению. Вообще неплохо программно контролировать включение и выключение электроприборов, управляемых от Ардуино. Например по нагреву термодатчика рядом с нагревателем или датчиком ультрафиолета или замерами тока\напряжения в цепи и на нагревателе. На мой взгляд, для увеличения надежности таких оконечных устройств разумно применять промышленные контакторы для коммутации силовых цепей, а не игрушечные реле для Ардуино. Надежность промышленного контактора (по сути - то же реле) существенно выше и у них есть дополнительные контрольные контакты, по состоянию которых можно программно определить реальное состояние контактора.
На мой взгляд выбрана неверная концепция - при отказе железа и опасности перегрева объекта предупреждать человека. Правильно - автоматически реагировать на перегрев, например контактным биметаллическим прерывателем. на Али есть богатый ассортимент таких устройств на температуры срабатывания от 40 до 100+ градусов, как нормально замкнутых, так и нормально разомкнутых. Стоят копейки - типа 25 р штука. ПРимерно такие же, только одноразовые, стоят в утюгах, электрочайниках, нагревателях и т.д. Т.е. стратегия такая: автоматически предотвращать наступление нежелательного события и по мере возможности информировать человека.
jehy Автор
22.05.2022 12:59Иногда на другом девайсе у меня реле залипало по непонятной причине, и это лечилось обесточиванием. Возможно, реле просто неудачное было. Сейчас такого не случается. Контрольных контактов не хватает, да, поэтому всё же подумываю об установке полноценного умного реле. Пока просто не нашёл навскидку многоканальное.
Да, так выглядит лучше - но очень уж не хотелось тащить дополнительные провода в террариум. Пока сморю, насколько надёжная конструкция, возможно буду туда добавлять больше проверок. А алярм всё равно нужен - если мы автоматически выключились, то есть шансы не включиться и заморозить зверя... Да и в любом случае нужно, чтобы человек пришёл и разобрался в причинах произошедшего.
Winnie_The_Pooh
22.05.2022 15:10Как любит говорить мой сын - define "залипание" :))) У нас явно разное понимание этого слова. Если ваше залипание лечится сбросом и\или обесточиванием системы - то оно вызвано неотключением управляющего сигнала от МК. Определить это можно например повесив отладочный светодиод на управляющую ногу МК.
Если обнаружится, что есть ситуация "залипания" и сигнал на ноге есть - то реле не при чем, надо смотреть логику программы.
Хотя я думаю, что с этими реле более вероятная ситуация, когда реле перестанет включаться. Реле запитано через что-то умощняющее (транзистор или микросхему-буфер), в теории можно себе представить, что этот усилитель перегрелся и перестал выключаться, но это очень маловероятная ситуация :)
Что кстати для зверя опаснее: перегрев или переохлаждение? Я бы предположил, что перегрев опаснее, холоднокровные вроде приспособлены к охлаждению?
jehy Автор
22.05.2022 16:05Ну я писал, что я не настоящий сварщик :)
Да, перегрев опаснее. В целом, переохладить в условиях дома сложно - это нужно, чтобы зимой отключилось отопление надолго и температура пала ниже 18.
Soorin
23.05.2022 10:13+2Это Вы ещё не сталкивались с отвалом Zigbee. Когда удалённо видно только, что датчики и управление реле - умерли, а реле по косвенным признакам осталось включено и геккон - уже варится.. Тогда помогает только аварийный контактный термостат по питанию нагревателя.
У меня похожее было в умном доме на даче - зависла Raspberry и с ней - Zigbee-координатор, а с ним - отвалились почти все новые датчики и умнейшие розетки с энергомониторингом, и в сети остались только несколько "legacy" Sonoff на Tasmota, через веб-интерфейс которых я наблюдал, как неумолимо растёт температура... пока не отработал аварийный биметаллический термостат.
superconductor
А я для автоматического подогрева использую "программируемый" термостат для теплого пола, в который воткнут террариумные подогрев. А для освещения "программируемый" таймер, который в розетку втыкается. Точек отказа получается значительно меньше, чем с умным домом:)
Сначала тоже думал про всякий умный DIY, но если с этим DIY что-то пойдет не так, то можно не только животное убить, но и квартиру спалить.