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

30 мая 2021, 11:26

Задача

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

 Комплект :

  •  Моторизированный клапан 1/2" - 2 шт.
  •  Блок управления - 1 шт.
  •  Датчики протечки проводные - 2 шт ( 4 дополнительных).
  • Блок питания 220 В - 1 шт.

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

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

1600x_image.png?1621953593

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

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

1600x_image.png?1621953593

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

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

1600x_image.png?1621953594

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

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

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

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

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

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

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

1600x_image.png?1621953592
1600x_image.png?1622133312

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

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

1600x_image.png?1622133312

Esphome yaml

substitutions:
  plug_name: water_control
esphome:
  name: ${plug_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: ${plug_name}_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: "${plug_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: "${plug_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: ${plug_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: ${plug_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: ${plug_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_${plug_name}
    pin: GPIO16 #d0
    inverted: true
    id: button1
  - platform: gpio
    name: open_${plug_name}
    pin: GPIO0 #d3
    inverted: true
    id: button2
  - platform: gpio
    name: close_${plug_name}
    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: "${plug_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: "${plug_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: ${plug_name}_uptime
  - platform: wifi_signal
    name: ${plug_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: ${plug_name}_firmware_version

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

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

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

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

1600x_image.png?1622133312

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

Тут все просто - в 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: "Сработала сигнализция протечка воды"

Все новости мира умных домов - t.me/SprutAI_News или Instagram
Остались вопросы? Мы в Telegram - @SprutAI

Хочешь умный дом но нет времени разбираться?
Посмотри примеры работ и выбери себе интегратора.
  1. Илья Каратаев (karvet)
    Илья Каратаев (karvet) 15 дней назад

    Продавец дал добро на размещение ссылки на контроллер.

К списку статей

Устройства в материале

ESP8266 NodeMcu v3

Производитель: Espressif Systems
Заказать на:
JD

ESP8266

Производитель: Espressif Systems
Заказать на:

Скидки для сообщества

Neptun | Система Нептун

+7 926 701-58-58
Промокод:
Sprut
Размер скидки:
25%

Тематические чаты

DIY

Похожие статьи

17 декабря 2019, 17:49
Универсальный привод для автоматического удаленного открытия окон с простой интеграцией в умные дома.
04 сентября 2018, 12:14
Интеграция RGB ленты на ESP8266 с прошивкой tasmota в систему HomeBridge (HomeKit)
15 октября 2018, 09:05
Прошивка для Sonoff c нативным HomeKit
02 ноября 2018, 12:14
Кнопка звонка с уведомлениями в HomeKit
15 ноября 2018, 09:42
Способы автоматизации механических ворот
27 октября 2018, 12:20
Нативный Термостат для котла на ESP8266 с поддержкой Apple HomeKit
01 октября 2018, 07:43
Нативный HomeKit на ESP8266
20 октября 2018, 22:57
Теоретические основы протокола MQTT и описание того, как он работает и для чего используется
30 августа 2019, 07:28
Несколько нетривиальных способов использования датчика открытия окон/дверей от Xiaomi/Aqara.
24 августа 2018, 12:18
Пошаговая установка HomeAssistant