Недавно при странных обстоятельствах у меня появился вот такой зверь:

эублефар
эублефар

В целом он довольно неприхотлив, но хотелось обеспечить ему самые приятные условия для его хладнокровного существования. Не то чтобы это были какие-то нетривиальные задачи, мне просто показалось интересным, что у технологий есть ещё и такое внезапное применение.

Что нужно было сделать:

  1. Поддерживать ему минимальную температуру ночью, но так, чтобы он не перегрелся

  2. Поддерживать минимальную влажность

  3. Включать ему ультрафиолетовую лампу в 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: Залипание реле можно пролечить удалённой перезагрузкой микроконтроллера. Зависание микроконтроллера - вариантом с внешней умной розеткой. Но вообще это кажется пренебрежимо редким кейсом, с которым справится уведомление, сирена, и на худой конец - визит друга.

Итоги

  1. Мне определённо понравилось то, что получилось. Умный дом для геккона сделал жизнь приятнее и комфортнее и мне и ему.

  2. Вся эта машинерия определённо не стоит свеч, если у вас ничего дома нет из умного дома. Наверняка проще поставить готовое решение для террариума. Но если у вас уже есть экосистема - то получается хорошее решение по цене пары датчиков, одного-двух контроллеров и пищалки.

  3. Безусловно, ничего технически сложного в проделанной работе нет, и я предвижу вопросы "зачем это тут?". Однако, мне кажется интересным именно синергетический эффект простых вещей, которые вместе дают сделать довольно прикольные штуки. Раньше я уже описывал открытие ворот, полив цветочков, управление ёлкой и детские игры на умном доме. Кажется, что со временем будет появляться всё больше таких решений, причём не для бородатых нердов, а для нормальных людей, и они будут классно и красиво работать из коробки.

  4. Можно ли было сделать лучше и проще? Возможно, я что-то не учёл? Да наверняка. Надеюсь, вы подскажете мне в комментариях.

Комментарии (19)


  1. superconductor
    21.05.2022 11:10
    +1

    А я для автоматического подогрева использую "программируемый" термостат для теплого пола, в который воткнут террариумные подогрев. А для освещения "программируемый" таймер, который в розетку втыкается. Точек отказа получается значительно меньше, чем с умным домом:)

    Сначала тоже думал про всякий умный DIY, но если с этим DIY что-то пойдет не так, то можно не только животное убить, но и квартиру спалить.


  1. jehy Автор
    21.05.2022 11:37

    Да, были у меня такие же мысли - но решил, что спалить не должен в любом случае, а димированные 50 Ватт не должны сварить зверя. И как раз две недели дома был, чтобы контролировать.


  1. 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 достигнет необходимых для этого хобби высот )))

      А в целом, спасибо за живую статью и реальный опыт, геккону удачи, долгих лет жизни и вкусных сверчков!


    1. jehy Автор
      21.05.2022 13:05
      +1

      Толковые замечания! Не думал, что триггер может не сработать. Интересно. По поводу hysteresis - да, так и сделал. DHT22 у меня сначала там уже стоял, но по ощущениям он заметно хуже, чем aqara. Да и неудобно провода в террариум затаскивать. Так что вынул и поставил аквару и интегрировал через зигби и гейтвей именно поэтому. Хотя подумываю о том, чтобы сделать его в качестве ещё одного фоллбека.

      Спасибо за пожелания :)


      1. Melias
        21.05.2022 13:25
        +1

        Если так нравится показания акары, можно купить конкретно ее датчик: SHT31. В EspHome для него все есть. А еще можно попробовать BMP280.

        (но думаю вам просто не повезло с DHT22. Так-то они все вполне сопоставимы (вот можно посмотреть как человек очень заморочился сравнением)


        1. Harwest
          21.05.2022 18:05

          Крайне не рекомендую DHT, дохнут они и глючат.


          1. jehy Автор
            21.05.2022 18:33

            Да нет, у меня датчик домашний уже лет восемь работает. Но точность у аквары явно лучше.


            1. Harwest
              21.05.2022 18:35

              Три датчика за два года ушли в утиль, влажность оыен 100%, но они на улице работали.


              1. dem0crypt
                23.05.2022 14:50

                DHT сразу летит на помойку из-за точности, размера корпуса, откровенно никакой надежности и кастомного протокола передачи данных. Берите BMP и забудьте про эти DHT.


  1. Apucmokpamka
    21.05.2022 14:28
    +1

    А я просто напишу, что эублефарам нужен нижний обогрев, лампы ставят другим видам чешуйчатых. Ну и про Д3 спорно, если это костыль для того, чтобы не давать кальций с Д3, то рекомендую запастись специальными карточками, которые как раз проверяют ресурс лампы у/ф.


    1. jehy Автор
      21.05.2022 14:36

      Есть хороший камушек для обогрева, лампа - для догрева ночью, когда температура дома может упасть ниже 20, и когда вдруг открыто окно или дверь.

      Про Д3 правда спорно, но слышал несколько хороших источников, которые были "за", так что решил что как минимум не повредит.

      Но в целом да, я специально добавил дисклеймер, чтобы мне не верили на слово.


      1. Rumidu
        22.05.2022 03:05

        "Увлажнение

        Для этого я поставил обычный ультразвуковой увлажнитель, направив его носиком в террариум." Влажность в содержании земноводных не менее важна, чем температура. Здесь ровно наоборот, если в температуре главное - не превысить порог (перегреть), во влажности главное - не снизить порог (не пересушить). Близость ультразвукового излучателя (в уалажнителе) также под вопросом. Амфибии очень чувствительны к источникам любого звука (спектр их восприятия гораздо шире человеческого).


        1. jehy Автор
          22.05.2022 03:09

          Интересная тема, на которую тоже не нашёл однозначного ответа. Вроде как рептилии не слышат звуков. Но не факт, что не могут ощущать его как-то ещё. Скорее всего, ультразвук в увлажнителе глушится его корпусом. Но даже если это не так, то можете быть спокойны за геккона - по датчикам я понял, что ручного опрыскивания раз в день более чем хватает для поддержания уровня влажности. Так что увлажнитель оставил чисто на случай отъезда на несколько дней. И в этом случае, скорее всего, он будет включаться всего на несколько минут, что вряд ли нанесёт какой-либо ущерб.


  1. Winnie_The_Pooh
    22.05.2022 10:36
    +2

    Любопытно, мне понравилось. Однако покритикую:

    1. Залипание реле есть процесс механический - подвижная часть механизма застревает. Обычно из-за низкого качества реле с Али для Ардуино. Перезагрузкой МК не лечится по определению. Вообще неплохо программно контролировать включение и выключение электроприборов, управляемых от Ардуино. Например по нагреву термодатчика рядом с нагревателем или датчиком ультрафиолета или замерами тока\напряжения в цепи и на нагревателе. На мой взгляд, для увеличения надежности таких оконечных устройств разумно применять промышленные контакторы для коммутации силовых цепей, а не игрушечные реле для Ардуино. Надежность промышленного контактора (по сути - то же реле) существенно выше и у них есть дополнительные контрольные контакты, по состоянию которых можно программно определить реальное состояние контактора.

    2. На мой взгляд выбрана неверная концепция - при отказе железа и опасности перегрева объекта предупреждать человека. Правильно - автоматически реагировать на перегрев, например контактным биметаллическим прерывателем. на Али есть богатый ассортимент таких устройств на температуры срабатывания от 40 до 100+ градусов, как нормально замкнутых, так и нормально разомкнутых. Стоят копейки - типа 25 р штука. ПРимерно такие же, только одноразовые, стоят в утюгах, электрочайниках, нагревателях и т.д. Т.е. стратегия такая: автоматически предотвращать наступление нежелательного события и по мере возможности информировать человека.


    1. jehy Автор
      22.05.2022 12:59

      1. Иногда на другом девайсе у меня реле залипало по непонятной причине, и это лечилось обесточиванием. Возможно, реле просто неудачное было. Сейчас такого не случается. Контрольных контактов не хватает, да, поэтому всё же подумываю об установке полноценного умного реле. Пока просто не нашёл навскидку многоканальное.

      2. Да, так выглядит лучше - но очень уж не хотелось тащить дополнительные провода в террариум. Пока сморю, насколько надёжная конструкция, возможно буду туда добавлять больше проверок. А алярм всё равно нужен - если мы автоматически выключились, то есть шансы не включиться и заморозить зверя... Да и в любом случае нужно, чтобы человек пришёл и разобрался в причинах произошедшего.


      1. Winnie_The_Pooh
        22.05.2022 15:10

        Как любит говорить мой сын - define "залипание" :))) У нас явно разное понимание этого слова. Если ваше залипание лечится сбросом и\или обесточиванием системы - то оно вызвано неотключением управляющего сигнала от МК. Определить это можно например повесив отладочный светодиод на управляющую ногу МК.

        Если обнаружится, что есть ситуация "залипания" и сигнал на ноге есть - то реле не при чем, надо смотреть логику программы.

        Хотя я думаю, что с этими реле более вероятная ситуация, когда реле перестанет включаться. Реле запитано через что-то умощняющее (транзистор или микросхему-буфер), в теории можно себе представить, что этот усилитель перегрелся и перестал выключаться, но это очень маловероятная ситуация :)

        Что кстати для зверя опаснее: перегрев или переохлаждение? Я бы предположил, что перегрев опаснее, холоднокровные вроде приспособлены к охлаждению?


        1. jehy Автор
          22.05.2022 16:05

          Ну я писал, что я не настоящий сварщик :)

          Да, перегрев опаснее. В целом, переохладить в условиях дома сложно - это нужно, чтобы зимой отключилось отопление надолго и температура пала ниже 18.


  1. Soorin
    23.05.2022 10:13
    +2

    Это Вы ещё не сталкивались с отвалом Zigbee. Когда удалённо видно только, что датчики и управление реле - умерли, а реле по косвенным признакам осталось включено и геккон - уже варится.. Тогда помогает только аварийный контактный термостат по питанию нагревателя.

    У меня похожее было в умном доме на даче - зависла Raspberry и с ней - Zigbee-координатор, а с ним - отвалились почти все новые датчики и умнейшие розетки с энергомониторингом, и в сети остались только несколько "legacy" Sonoff на Tasmota, через веб-интерфейс которых я наблюдал, как неумолимо растёт температура... пока не отработал аварийный биметаллический термостат.


    1. jehy Автор
      23.05.2022 10:15

      Понял, обязательно поставлю, спасибо!