Статья

Переделываем китайский контроллер протечки для удаленного управления с помощью ESPHome

Задача

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

Комплект :

Контроллер был куплен на Авито, т.к. хотелось иметь автономное устройство для блокировки при протечках, но не дорогое. Цена за контроллер с двигателями, работающими от 6 В (4 батарейки АААА, от батареек работает до 3‐х лет), с блоком питания 12 В - 4500 р.

Если нет питания от 12 В, работает от батареек. Esp8266 работает примерно сутки на батарейках, т.к. свет очень редко пропадает и больше 15 минут в моей ситуации это нормально, также есть звуковая сигнализация, когда батарейки разряжены. Мокрая зона в квартире перенесена, поэтому было очень важно иметь контроллер для автоматизации. Планировался ремонт и хотелось сделать только пару лючков на магнитах для доступа к задвижкам. Один из каналов для датчиков продублирован на 4 проводных датчика. В качестве платформы для интеграции я выбрал esphome. Электроклапаны были установлены после обычных задвижек. Я забыл про отключения горячей воды на время ремонта теплотрассы, поэтому эта возможность не реализована. Возможно, в будущем доработаю.

Исследования работы платы

На плате есть дополнительный выход. Это выход с дополнительного реле NC CT NO. Реле можно использовать для оповещения момента открытия (очень странно, что только открытия), или повесить дополнительное оборудование для оповещения, например, внешней сигнализации. Выходы Маркируются как NC CT NO - это выходы реле, при открытии кранов размыкаются на 6 секунд. CT NO нормально разомкнутые, при открытии замыкаются на 6 секунд. То есть с дополнительного реле можно снять только состояние открытия!!!

Работа светодиодов. Слева направо светодиоды по порядку: сброс, открытие, закрытие. В спокойном состоянии раз в 50 секунд моргает первый светодиод. Можно определять как нормальный статус. При сбросе - все три по очереди моргают. Сброс нужен для сброса состояния при срабатывании протечки. При нажатии на открытие, срабатывает звуковой сигнал и горит второй светодиод 1 минуту и 12-25 секунд. При нажатии на закрытие, срабатывает звуковой сигнал и горит третий светодиод 1 минуту и 12-25 секунд. При обнаружении утечки воды, подается звуковая сигнализация и моргают первый и последний вместе (сброс и закрытие).

Плата esp должна знать 3 состояния: Открыто, Закрыто, Протечка (хранить состояние глобально нормально открыто, нормально закрыто). Управлять кнопками Открыть, Закрыть, Сброс. Кнопки управляются подачей земли. Механические кнопки на устройстве работают в штатном режиме. На плате присутствуют 5 выводов. Не разобрался как их использовать, кроме как взять землю с 3 контакта и питание 5 В со 2 контакта, для питания esp.

Монтируем esp. Понадобится разъем на 8 проводов. К сожалению, купив разъемы, я понял, что у меня нет кримпера для обжима (не стал дожидаться доставки), решил жестко припаять две платы. Как правильно подключить Esp на кнопки:

Кнопка 1 - подтягивается к земле (слева), паять провод справа.Кнопка 2 - подтягивается к земле (справа), паять провод слева.Кнопка 3 - подтягивается к земле (справа), паять провод слева.

Как правильно подключить бинарные сенсоры к светодиодам: к светодиодам паяемся справа. Питание на есп берем с разъема 5 пинов, второй контакт 5 В, третий контакт GND.

Питание ЕСП должно быть с контроллера, чтобы можно было считывать сигналы и была общая земля. Либо можно сделать обвязку на оптронах.

Подключение счетчиков

Счетчики фирмы itelma с импульсным выходом. Пины esp подтянуты к 3.3, на счетчики уходит земля, при замыкании геркона счетчика срабатывает бинарный сенсор и считает импульсы. Один импульс - это литр воды или 0.01 м3 (взято из документации). Сделаны глобальные переменные, которые хранятся в esp. Добавил вывод на корпус D1 - горячая вода и Земля. Холодная - D2 земля.

Вот так выглядит реализация в Home Assistant:

Схема подключения

В роли платы управления - esp8266 nodemcu, так как когда делал проект, еще не умел разводить свои платы, а сейчас переделывать лень.

Esphome yaml

substitutions: plug_name: water_control esphome: name: $ platform: ESP8266 board: nodemcuv2 esp8266_restore_from_flash: true on_boot: then: - switch.turn_off: button1 - switch.turn_off: button2 - switch.turn_off: button3 wifi: ssid: !secret wifi_ssid password: !secret wifi_pass fast_connect: true ap: ssid: $_Fallback_Hotspot password: !secret ap_pass # Можно указать статический ip # Optional manual IP # manual_ip: # static_ip: 192.168.1.15 # gateway: 192.168.1.1 # subnet: 255.255.255.0 logger: api: password: !secret ha_api_pass services: # Сервис для установки первоначальных значений хв - service: new_cold_water_counter variables: new_cold_water_counter: float then: - logger.log: "Call service 'new_cold_water_counter'" - lambda: |- id(cold_water_counter) = new_cold_water_counter; # Сервис для установки первоначальных значений гв - service: new_hot_water_counter variables: new_hot_water_counter: float then: - logger.log: "Call service 'new_hot_water_counter'" - lambda: |- id(hot_water_counter) = new_hot_water_counter; ota: password: !secret ha_api_pass web_server: globals: - id: hot_water_counter type: float restore_value: true - id: cold_water_counter type: float restore_value: true - id: tap_state type: int restore_value: true text_sensor: - platform: template name: "water_control_state" id: wcstate lambda: |- if (id(tap_state) == 2 && id(wcsn).state) { return {"Кран закрыт"}; } if (id(tap_state) == 1 && id(wcsn).state) { return {"Кран открыт"}; } if (id(wcswl).state) { return {"Протечка Кран Закрыт"}; } binary_sensor: - platform: gpio name: "$_cold" pin: number: D2 mode: INPUT_PULLUP filters: - delayed_on_off: 100ms on_release: then: - lambda: |- id(cold_water_counter) = 0.01; - platform: gpio name: "$_hot" pin: number: GPIO5 #D1 mode: INPUT_PULLUP filters: - delayed_on_off: 100ms on_release: then: - lambda: |- id(hot_water_counter) = 0.01; - platform: gpio name: $_binary_sensor_reset pin: number: GPIO14 #D5 inverted: true id: light_reset filters: - delayed_on: 50ms on_multi_click: - timing: - ON for 1s to 2s then: - binary_sensor.template.publish: id: wcswl state: ON - binary_sensor.template.publish: id: wcsc state: ON - binary_sensor.template.publish: id: wcsn state: OFF - binary_sensor.template.publish: id: wcso state: OFF - timing: - ON for 50s to 75s then: - binary_sensor.template.publish: id: wcsn state: ON - binary_sensor.template.publish: id: wcswl state: OFF - platform: gpio name: $_binary_sensor_open pin: number: GPIO12 #D6 id: light_open filters: - delayed_on: 8s on_state: then: - binary_sensor.template.publish: id: wcso state: ON - binary_sensor.template.publish: id: wcsc state: OFF - binary_sensor.template.publish: id: light_reset state: OFF - binary_sensor.template.publish: id: wcsn state: OFF - platform: gpio name: $_binary_sensor_close pin: number: GPIO13 #D7 id: light_close filters: - delayed_on: 8s on_state: then: - binary_sensor.template.publish: id: wcsc state: ON - binary_sensor.template.publish: id: wcso state: OFF - binary_sensor.template.publish: id: light_reset state: OFF - binary_sensor.template.publish: id: wcsn state: OFF - platform: template name: tap-state-close id: wcsc on_release: then: - lambda: |- id(tap_state)=1; - platform: template name: tap-state-open on_release: then: - lambda: |- id(tap_state)=2; id: wcso - platform: template name: water-control-state-water-leak id: wcswl - platform: template name: water-control-state-normal id: wcsn switch: - platform: gpio name: reset_$ pin: GPIO16 #d0 inverted: true id: button1 - platform: gpio name: open_$ pin: GPIO0 #d3 inverted: true id: button2 - platform: gpio name: close_$ pin: GPIO2 #d4 inverted: true id: button3 - platform: template name: "reset_button" icon: mdi:reload turn_on_action: - switch.turn_on: button1 - delay: 500ms - switch.turn_off: button1 - binary_sensor.template.publish: id: wcswl state: OFF - platform: template name: "open_button" icon: mdi:water-pump turn_on_action: - switch.turn_on: button2 - delay: 500ms - switch.turn_off: button2 - delay: 55s - switch.turn_on: button1 #сбрасываем reset - delay: 500ms - switch.turn_off: button1 - platform: template name: "close_button" icon: mdi:water-pump-off turn_on_action: - switch.turn_on: button3 - delay: 500ms - switch.turn_off: button3 - delay: 55s - switch.turn_on: button1 #сбрасываем reset - delay: 500ms - switch.turn_off: button1 sensor: - platform: template name: "$_cold_count" unit_of_measurement: "m3" accuracy_decimals: 2 icon: mdi:water lambda: |- return id(cold_water_counter); update_interval: 15s - platform: template name: "$_hot_count" unit_of_measurement: "m3" accuracy_decimals: 2 icon: mdi:water lambda: |- return id(hot_water_counter); update_interval: 15s - platform: uptime name: $_uptime - platform: wifi_signal name: $_wifi_signal update_interval: 60s - platform: template name: "tap_state_sensor" lambda: |- return id(tap_state); update_interval: 10s text_sensor: - platform: version name: $_firmware_version

Конечно, yaml не идеален и статус можно хранить иначе, но на сегодняшний момент меня устраивает, рад услышать, как можно улучшить.

Установка начальных показаний

В чате esphome, Леонид Голубцов подсказал мне, как можно из HA изменить показания счетчиков. В yaml секции api мы создали сервис, который изменяет глобальную переменную. Из HA мы можем вызвать этот сервис и передать текущие показания.

Вызываем сервис из HA. Указываем текущие показания.

Автоматизация оповещения о протечке

Тут все просто - в HA у меня есть автоматизация: если контроллер в состоянии протечки, то отправить push уведомление на телефон.

- alias: Water Leak trigger: platform: state entity_id: binary_sensor.water_control_state_water_leak to: 'on' action: - service: notify.mobile_your_mobile data: title: "Умный дом" message: "Сработала сигнализция протечка воды"

1

Продавец дал добро на размещение https://www.avito.ru/chelyabinsk/remont_i_stroitelstvo/zaschita_ot_protechek_352144477">ссылки на контроллер.


Вернуться назад

Устройства


Espressif Systems

ESP8266 NodeMcu v3

(16 отзывов)

Espressif Systems

ESP8266

(1 отзыв)

Вернуться назад