Автоматическая система полива сада на Home Assistant, ESP8266 и MiFlora



Некоторое время назад у моей семьи появился дом с небольшим садом в очень теплом и засушливом месте, и перед нами встала проблема регулярного полива.

Хотелось, чтобы система полива была автоматической, при этом при ее выборе приходилось учитывать следующие условия:

  • очень дорогая вода, которую надо экономить всеми доступными способами
  • разные по потребностям во влаге растения в саду, от суккулентов до влаголюбивых
  • необходимость полностью автономного полива во время отсутствия людей в доме, желательно с возможностью удаленного контроля
  • засушливый климат, не прощающий ошибок с поливом

Оценив готовые решения, которые удалось найти в местных DIY сетях и на Amazon и почитав отзывы об их надежности (как правило, не самой высокой), решили попробовать сделать что-то самостоятельно.

Disclaimer: Автор не является IT-специалистом, и не претендует на профессиональное знание описываемой темы. Уровень исполнения проекта — хобби. Об уровне своих знаний в сфере программирования и электроники автор прекрасно осведомлен и будет очень признателен за предложения по улучшению и оптимизации использованных решений.

Принципиальная схема


Сад был разбит на 4 зоны полива, каждая из них снабжается индивидуальным датчиком влажности почвы и может поливаться по индивидуальному графику и разным количеством воды.
По земле проложены ПНД-трубки капельного полива с перфорацией, которые подключены к трубам сходящимся в водоразборном узле и подключенным через электромагнитные клапаны к водопроводу. Клапаны управляются реле подключенными к ESP8266 (Sonoff 4Ch).

Полив осуществляется по таймерам, в ночное время, чтобы увеличить количество воды, которое впитается в землю и не будет испарено солнцем.

При наступлении запланированного времени полива проверяется соответствие нескольким условиям:

  • влажность почвы ниже заданной величины
  • отсутствуют прогнозируемые осадки в достаточно большом количестве на ближайшие 2 дня
  • не превышен лимит воды по поливу заданного для этой линии

Использованное оборудование


Raspberry Pie с установленным HassIO (уже была)

ESP32 DevKit, прошитая ESPHome, выступающая bluetooth-гейтвеем для MiFlora и принимающая данные от проводных датчиков влажности. Расположена в саду

Проводные датчики влажности Capacitive Soil Moisture Sensor v1.2, измеряющие влажность в ближних к месту установки ESP32 зонам полива

Датчики MiFlora, подключены к ESP32 по BLE, измеряющие влажность в удаленных зонах полива.

SONOFF 4Ch, прошитый ESPHome, расположен в водоразборном узле, куда приходят трубы от всех зон полива

4 Нормально-закрытых электромагнитных клапана на 220В расположены в водоразборном узле и подключены к Sonoff 4Ch. Открывают подачу воды для полива. Выбрана нормально-закрытая модель, с тем чтобы вероятность «наводнения» в случае каких-либо сбоев электрики и электроники была минимальной, и чтобы минимизировать количество требуемых выходов реле.

Импульсный водосчетчик, стоящий на входе в систему полива в водоразборном узле и подключенный к Sonoff 4ch. Позволил полностью передать данные о расходе воды в Home Asssistant и реализовать функционал полива заданным количеством. Весьма удачным оказалось то, что на этой версии sonoff уже распаяны контакты для прошивки и даже есть один свободный GPIO02 – на него и был повешен импульсный счетчик.


Так выглядит коллектор с установленными клапанами и счетчиком воды. Контроллер (sonoff 4Ch) в кадр не попал, он установлен на расстоянии в полметра в щитке IP65

Настройки ESPHome и Home Assistant


Sonoff 4Ch
Код ESPHome для него максимально примитивен, но на всякий случай приведу:

switch:
  - platform: gpio
    name: "Система полива линия 1"
    pin: GPIO12
    id: sw1
    icon: mdi:water
  - platform: gpio
    name: "Система полива линия 2"
    pin: GPIO5
    id: sw2
    icon: mdi:water
  - platform: gpio
    name: "Система полива линия 3"
    pin: GPIO4
    id: sw3
    icon: mdi:water
  - platform: gpio
    name: "Система полива линия 4"
    pin: GPIO15
    id: sw4
    icon: mdi:water
binary_sensor:
  - platform: gpio
    name: "WaterCounter"
    id: button
    pin:
      number: GPIO2
      mode: INPUT_PULLUP


Capacitive Soil Moisture Sensor v1.2
Кусок кода для ESPHome:

sensor:
  - platform: adc
    pin: GPIO34
    filters:
      - lambda: |-
          if (x > 3.22) {
            return 0;
          } else if (x < 1.65) {
            return 100;
          } else {
            return (3.22-x) / (3.22-1.65) * 100.0;
          }
    name: "Датчик влажности почвы 1 линия проводной"
    update_interval: 60s
    attenuation: 11db
    unit_of_measurement: "%"
    accuracy_decimals: 0
    icon: mdi:water-percent

Подключать датчик можно только к аналоговым входам (ADC) микроконтроллера
Датчик придется калибровать, задав предельные значения напряжения для сухого датчика (в моем случае 3.22 В) и погруженного в воду (1,65 В). Я это делал включив демонстрацию log'ов в плагине ESPHome для HassIO и записав показания датчика в сухом виде и при погружении в воду.



После перепрошивки ESP32 в Home Assistant ничего настраивать не надо, там автоматически появляется датчик влажности с правильными единицами измерения

Импульсный счетчик воды
Я использовал счетчик «Пульсар», но вообще должен подойти любой счетчик с импульсным выходом (идентифицируется по торчащему проводу). Принцип действия таких счетчиков очень простой — рядом с колесиками счетчика расположен геркон, который активируется магнитом, расположенном на одной из цифр колеса учета (у меня — цифра 3 на колесике 10 литров).
Соответственно, подключив провода от счетчика к GND и одному из GPIO мы можем получить простейший бинарный сенсор.

Код для ESPHome при этом примитивен:

binary_sensor:
  - platform: gpio
    name: "WaterCounter"
    id: counter
    pin:
      number: GPIO2
      mode: INPUT_PULLUP

В Home Assistant все немного сложнее:

Там я сделал несколько счетчиков (counter), сенсор и автоматизацию для работы с ними
При этом есть общий счетчик истраченной за все время воды (фактически, это виртуальный «двойник» механического счетчика). Он реализован в двух ипостасях — как counter, измеряемый в литрах и растущий в результате реакции на изменения бинарного сенсора из ESPHome, и как sensor, измеряемый в кубических метрах и берущий данные из предыдущего counter (для удобства сравнения цифр со счетами за воду).

Для целей управления поливом и сбора статистики были также созданы по 2 счетчика на каждую линию полива — один за все время, а второй за «сегодня». Так как физический счетчик у нас один, а линий четыре, для получения точных данных расхода по каждой линии полив каждой линии был разнесен по разным временным интервалам и запрещено одновременное их включение.

Кусок кода для автоматизации (внутри automations.yaml или отдельный файл)
- alias: Подсчет воды по общему счетчику
  trigger:
  - entity_id: binary_sensor.watercounter
    platform: state
    from: 'on'
    to: 'off'
  action:
  - data:
      entity_id:
      - counter.my_water_counter
    service: counter.increment
- alias: Подсчет воды по 1 линии
  trigger:
  - entity_id: binary_sensor.watercounter
    platform: state
    from: 'on'
    to: 'off'
  condition:
    - condition: state
      entity_id: switch.sistema_poliva_liniia_1
      state: 'on'
  action:
  - data:
      entity_id:
      - counter.my_water_line1, counter.my_water_line1t
    service: counter.increment    


Кусок кода configuration.yaml общий счетчик воды + два счетчика по одной линии полива

sensor:
  - platform: template
    sensors:
      water_counter:    
        unit_of_measurement: 'M3'
        value_template: "{{ (states('counter.my_water_counter')| float)/1000 }}"    
counter:
  my_water_counter:
    initial: 2.667
    step: 10
  my_water_line1:
    name: "Полив 1 линия за все время (л)"
    initial: 0
    step: 10
  my_water_line1t:
    name: "Полив 1 линия сегодня (л)"
    initial: 0
    step: 10



Датчик MiFlora
Датчик MiFlora при использовании ESPHome настраивается очень просто, инструкцию можно найти на сайте проекта esphome.io
В Home Assistant после такой настройки сразу появляются имеющиеся на датчике сенсоры — влажность, температура, освещенность и «фертильность» почвы. Единственный недостаток — странная работа сенсора заряда батареи, но для моих целей это не было критично.

Виртуальный сенсор прогнозируемых осадков
Смысл этого сенсора — выдавать в числовом виде прогноз осадков на ближайшие два дня. Эта цифра впоследствии используется в автоматизации и если она превышает заданный порог, полив не происходит.

Изначально сенсор построен на базе данных сервиса darksky. К сожалению, за время настройки системы этот сервис успела купить компания Apple и объявила о постепенном сворачивании работы сервиса «на сторону». API пока работает, но, судя по всему, скоро потребуется искать альтеранативу этому решению, благо в HA довольно много других сервисов погоды. Здесь я привожу настройки для darksky, думаю, что даже с другим сервисом большая их часть сохранит актуальность.

Сначала создаем 2 сенсора по количеству осадков на завтра и послезавтра:

Кусок кода configuration.yaml или sensors.yaml для сенсоров прогноза

sensor:
  - platform: darksky
    api_key: xxxx_your_API_key_xxxx
    forecast:
      - 1
      - 2
    monitored_conditions:
      - precip_intensity

В результате в HA появляются два сенсора: sensor.dark_sky_precip_intensity_1d и sensor.dark_sky_precip_intensity_2d, которые выдают цифры интенсивности осадков на завтра и послезавтра измеряемые в мм в час.

Затем делаем на основе трех прогнозов один template-sensor:

Кусок кода configuration.yaml или sensors.yaml для обобщенного сенсора осадков

sensor:
  - platform: template
    sensors:
       rain2days:    
        unit_of_measurement: 'mm'
        value_template: "{{ (((states('sensor.dark_sky_precip_intensity_2d')| float)+(states('sensor.dark_sky_precip_intensity_1d')| float))*24)| round(3) }}"    

В HA появляется sensor.rain2days который уже выдает общие осадки в мм на ближайшие 2 дня.
По опыту использования, прогноз от Darksky не особо точен если речь идет о слабеньком дождике, но сильные ливни он предсказывает очень неплохо и для моих целей этого вполне достаточно


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

Вот так у меня выглядит кусок интерфейса с одной из зон в Home Assistant:



Здесь можно задать количество воды для полива (ползунком) и посмотреть значения основных сенсоров и счетчиков. Я привел интерфейс для одной из линий, для остальных все аналогично, только на линиях с проводными датчиками данных несколько меньше.

В интерфейсе можно заметить одну «лишнюю» деталь — вспомогательный сенсор «Достигнута норма». Его пришлось ввести, т.к. мне не удалось заставить работать condition:template для остановки автоматизации при достижении нормы по количеству воды, и в результате автоматизация просто проверяет значение этого сенсора. Уверен, что эту часть автоматизации можно сделать проще и элегантней, но моего уровня для этого не хватило.

Ниже код получившегося «костыльного» темплейт-сенсора:

Сенсор достаточности полива (внутри configuration.yaml или отдельный файл)
  - platform: template
    sensors:
      line4_status:
        friendly_name: "Линия 4 - достигнута норма"
        value_template: >-
          {% if states('counter.my_water_line4t')|float > states('input_number.slider4')|float %}
            yes
          {% elif states('counter.my_water_line4t')|float == states('input_number.slider4')|float  %}
            yes
          {% else %}
            no
          {% endif %}


Автоматизация для запуска полива в конечном итоге выглядит так:

Запуск полива (внутри automations.yaml или отдельный файл)
- alias: Включение полива 4я линия в 23.01
  trigger:
    platform: time
    at: "23:01:00"
  condition:
   condition: and
   conditions:
# ПРОВЕРЯЕМ НОРМУ ПО ОСАДКАМ
    - condition: numeric_state
      entity_id: sensor.rainfor2days
      below: 5
# ПРОВЕРЯЕМ НОРМУ ПО ПОКАЗАНИЮ ДАТЧИКА ВЛАЖНОСТИ
    - condition: numeric_state
      entity_id: sensor.miflora_1_moisture
      below: 50
# ПРОВЕРЯЕМ, НАДО ЛИ ЕЩЕ ПОЛИВАТЬ СЕГОДНЯ ПО КОЛИЧЕСТВУ
    - condition: state
      entity_id: 'sensor.line4_status'
      state: 'no'
  action:
   - service: switch.turn_on
     entity_id: switch.sistema_poliva_liniia_4


Полив запускается поздно вечером, при этом каждая линия запускается в свой временной интервал. Разделение по времени запуска позволяет использовать один счетчик воды на входе для получения данных по 4 линиям.

При запуске проверяются три условия:

  • не превышен ли лимит по количеству воды на сегодня (если, например, включали полив вручную)
  • не превышает ли влажность 50% (по наблюдениям в наших условиях свежеполитая почва имеет влажность не более 60%)
  • не ожидается ли осадков более 5 мм в ближайшие два дня.

Следующая автоматизация — отключение полива:

Отключение полива (внутри automations.yaml или отдельный файл)
- alias: Выключение полива 4й линии
  trigger:
#Отключение по достижению лимита воды на полив
  - entity_id: sensor.line4_status
    platform: state
    to: 'yes'
    for: 
      seconds: 5    
#Отключение по времени 
  - platform: time
    at: "23:59:00"
#Отключение по достижению предельной влажности 
  - platform: numeric_state
    entity_id: sensor.miflora_1_moisture
    above: 65
#Отключение по времени нахождения крана в открытом состоянии
  - platform: state
    entity_id: switch.sistema_poliva_liniia_4
    to: 'on'
    for: 
      minutes: 60
  action:
   - service: switch.turn_off
     entity_id: switch.sistema_poliva_liniia_4


В автоматизации использовано целых 4 варианта триггеров, но в большинстве случаев она срабатывает по первому — «костыльному» сенсору, который отслеживает превышение лимита по количеству воды. Остальные триггеры сделаны в большой степени для подстраховки.

Ну и последняя относящаяся к проблеме автоматизация — обнуление ежедневного счетчика

Обнуление ежедневного счетчика (внутри automations.yaml или отдельный файл)

- alias: Обнуление ежедневного таймера 4я линия
  trigger:
  - platform: time
    at: "00:00:01"
  action:
  - service: counter.reset
    entity_id: counter.my_water_line4t


Экономика проекта


Затраты на управляющую часть системы полива получились следующие:

(Raspberry PIE c HassIO на борту и WiFi router с покрытием в саду уже были до начала проекта, их я не учитываю)

Электромагнитный клапан UNIPUMP BCX-15 1/2" (нормально закрытый) 4*20 евро
Sonoff 4CH 17 евро
Счетчик импульсный Пульсар 8 евро
ESP32 DevKitC 3.5 евро
Capacitive Soil Moisture Sensor v1.2 2*0.67 евро
Датчики MiFlora 2*16 евро
Щитки, коллектор, провода, фиттинги все вместе около 50 евро

ИТОГО: около 190 евро

Затраты времени на настройку датчиков и МК — примерно 3-4 вечера по нескольку часов, но большая часть времени была потрачена на «изобретение велосипедов» и придумывание «костылей», в целом работы там немного. Физическая сборка системы заняла около 2 вечеров.
В целом, ожидается экономия воды примерно в 20-50% по сравнению с «глуповатой» системой на таймерах и при местных ценах на воду система должна окупиться за один-два сезона.

Недостатки и планы по доработке


По итогам выполнения проекта вскрылись некоторые нюансы и возможности для дальнейшего совершенствования.

В частности, я бы заменил электромагнитные клапана 220В на модель 24В — это напряжение являются стандартными для систем полива. В этом случае пришлось бы добавить в систему трансформатор на 24В и сменить Sonoff 4Ch на что-то с сухим контактом (например, Sonoff 4CH Pro или что-то самосборное). Сами клапана при этом стоят дешевле (от 8 евро) и снижают вероятность поражения электрическим током.

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

Еще немного расстроила невозможность учета количества воды для полива в объемах меньших чем 10 литров — именно этот объем является минимальной измеряемой величиной для такого счетчика. Эту проблему можно решить, разобрав счетчик и поменяв местами колесики, но пока до этого не дошли руки.
AdBlock похитил этот баннер, но баннеры не зубы — отрастут

Подробнее
Реклама

Комментарии 25

    0
    да, вот так и надо строить механику полива, чтобы знать сколько влил в каждую зону. Только я хочу 20 шт, в каждый горшок. Вот сейчас изобретаю как из сервы и крана для 1/4" трубок фильтров сделать дешёвые управляемые вентили.
      0
      Если это горшки, то может проще и дешевле микро-помпами? У них есть свои недостатки, но в целом для домашнего полива они вполне применимы
        0
        Уже валяется пачка. Очень сильно плавает расход от длины шланга. А у меня помпы погружные. Бывают с отдельным штуцером на вход, но если там будет пузырёк воздуха то они не прокачают никак. Если бы работали нормально те что со штуцером на вход, то да, свести всех на общий счётчик и по очереди запускать. Но ещё у них крайне малый угол подъёма водяного столба, сантиметров 30. Я вообще вижу вариант это перистальтический насос и куча клапанов. Вот клапана доделаю и будет огонь.
          0
          Если речь о горшках, могут ли Вам подойти керамические пористые конусы, которые сосут воду из резервуара по принципу сифона? Продаются на али, я так поливал целое лето горшок. Правда, к концу в трубке сифона выросли водоросли, так что пришлось продувать.
            0
            Конусы — пройденный этап. У меня есть несколько хороших, они более менее работают, но недостаточны для болотных и сильны для кактусов. А недавно покупал свежие из белой глины, те вообще при расположении банки с водой выше конуса слили всё в горшок.
              0
              Тогда да, не годятся. У меня тоже были из белой керамики, подтверждаю, надо, чтобы уровень воды был ниже горшка.
        0
        У меня для вас неожиданная рекомендация. Скупайте сломанные кофеварки Nescafe Dolce Gusto.

        В них отличная помпа итальянского производства и датчик потока с разрешающей способностью 20мл. Дохнет в кофеварках обычно нагреватель, а всё остальное — в идеале.

        Управляемые вентили делаются прекрасно из сервы — вы просто роликом на конце рычага сдавливаете силиконовую трубку и всё. Лучше всего — подпружинивать, чтобы в обесточенном состоянии трубка была всегда пережата.
          0
          Это вы про полив сада помпой от кофемашины Нескафе? Как вы себе это видите?
            0
            Я например делаю полив растений в домашнем зелёном уголке, там такой помпой вполне прокатит.
              0
              я отвечал не вам, а коллеге у которого в реплике было слово «горшки».
              0
              Настоящие итальянские помпы для кофеварок фирмы ULKA, конечно делаются в КНР, стоят от 4 до 20 евро на Али.
                0
                посмотрел — одна, и вправду, ULKA, а вторая — сделана швейцарцами из www.sysko.ch По виду — близнецы.

                А про «итальянскую» я понял, откуда в голове вертелось — менял похожую помпу на моющем пылесосе VAX, вот там она именно что оттуда.
                0
                Инетересно, в районе 500 рублей на авито их достаточно
                0

                На али полно пневматических клапанов по цене меньше $1
                Стоит ли городить самопал?

                  0

                  Можно ссылочку? И таки пневмо и водяной клапан это разные вещи.

                    0
                      0
                      Крутая штука, такую же для воды бы, но я не могу найти.
                        0

                        Оно скорее всего и для воды работать будет. Там наверняка только пластмасса и резина контактирует со средой. И расход маленький, так как проходное сечение мало.
                        Минус таких клапанов в том, что их нельзя подключать к водопроводу, так как рабочее давление маленькое, только бак накопитель ставить.

                +1
                переходите на аэропонику — куча плюсов, нет геморроя с землёй(болезни, паразиты, вредители), проще рассчитывать удобрения, быстрый рост, фермы разной конструкций — позволяет более эффективно использовать свободное пространство, ограниченно только вашей фантазией.
                  0
                  прикольно, не слышал про такое, спасибо за ещё интересную тему
                  0
                  Еще решение: скважина до грунтовых вод, стандартный насос на закачку грунтовой воды (давление как раз для поливки). И контроллер поливки (раньше был Orbit, сейчас B-Hyve), который управляет и насосом и клапанами. Все из ближайшего хозмага.
                  Насчет клапанов, уж 10+ лет стоят 12-вольтовые клапаны на 6 зон, из ближайшего хозмага.
                  Ничего не подтекает. Настроил на поливку 3 раза в день, через 8ч (жарко у нас).

                  Из хотелок: контроль давления зон и сверка с усредненным. Уведомление при отклонении.
                  Зачем?
                  Иногда повреждается контур поливки зоны. Узнаешь только когда растения начинают подсыхать.
                    0
                    Здесь такое решение неприменимо — через 20-30 см грунта упираешься в скалу, бурить ее очень дорого и, судя по всему, бессмысленно.
                    А по поводу датчика давления — его функции частично может выполнить датчик влажности — если вода постоянно не доходит и все сухо, значит что-то не так с контуром.
                    0
                    как раз вовремя, скоро сезон, готовиться пора бы
                      0
                      Не просчитывали сбор дождевой воды с крыши в резервуар кубов в 9, ну и полив из него? Всё-таки с неба вода падает пока что на халяву.
                        0
                        Просчитывали, экономически не целесообразно. Инвестировать в сбор воды надо столько, что отбиваться будет очень много лет. Здесь крайне мало осадков выпадает, экономический эффект от сбора будет крайне низким.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое