Подошел срок очередной поверки газового счетчика и было принято решение заменить его на счетчик с импульсным выходом. Задача оказалась нетривиальная, так как было жесткое ограничение по параметрам присоединения. Но, слава маркетплейсам, не проходит и недели как заветный гаджет попадает мне в руки.
Умный счетчик природного газа
В руководстве по эксплуатации имеем следующую информацию:
Спасибо производителю — теперь у нас есть все, чтобы подобрать подходящий счетчик импульсов.
Обустройством DIY умного дома я занимаюсь уже не первый год. Сейчас имею такую конфигурацию:
-
Raspberry Pi 4 (4GB RAM) с Home Assistant OS на борту;
-
Zig Star LAN в качестве координатора для Zigbee сети;
-
Порядка 90 Zigbee и 10 Wifi устройств.
У меня уже был реализован подсчет потребления холодной воды посредством счетчика импульсов Zigbee (Счетчик импульсов Zigbee — modkam.ru). В последнее время этот счетчик стал отваливаться от сети, но проблема не в самом устройстве, а в его расположении, но об этом чуть позже.
Подключив это счетчик импульсов к новому газовому счетчику я (вот сюрприз!) не получил адекватных показаний. Причина — он считывает, как мне ответил в комментариях разработчик устройства, ~1 имп/сек. Мы же имеем в даташите и на устройстве — 1 импульс = 0,000125 м3.
Нехитрая математика:
-
8000 импульсов за один куб;
-
2,73 м3/час максимальный расход газа у котла;
-
8000 х 2,73 / 3600 получаем около 6 импульсов в секунду.
Дальнейший поиск решения естественно привел меня к ESPHome. По железу выбор пал на ESP32 DEVKIT V1.
На плате уже есть все что нужно, и разъем питания MicroUSB, и Wifi, и торчащие пины — можно “наколхозить” на коленке без паяльника что угодно.
Изучив документацию на сайте по Pulse Counter Sensor (Pulse Counter Sensor — ESPHome) и помучив Chat GPT получилась такая конфигурация:
esphome: name: gas-count friendly_name: gas_count esp32: board: esp32dev framework: type: arduino # Enable logging logger: # Enable Home Assistant API api: encryption: key: ****** # Блок для ввода фактических значений показаний из интерфейса HA actions: - service: set_pulse_total_gas variables: new_pulse_total: float then: - lambda: |- id(saved_total_gas_consumption) = new_total; ESP_LOGD("custom", "Set total gas consumption to: %f", id(saved_total_gas_consumption)); ota: - platform: esphome password: ******* wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Gas-Count Fallback Hotspot" password: ******** captive_portal: globals: - id: saved_total_gas_consumption # Глобальная переменная для сохранения данных при перезагрузке устройства type: float restore_value: true initial_value: '0.0' sensor: - platform: pulse_counter pin: GPIO04 id: gas_meter_counter name: "Gas Meter Pulse Count" unit_of_measurement: "pulses" accuracy_decimals: 1 filters: - debounce: 10ms # Игнорировать сигналы, которые длятся менее 10 мс. По даташиту длительность импульса от 2 до 6 мс. - multiply: 0.000125 # Применение коэффициента для пересчета импульсов в м³ - lambda: |- id(saved_total_gas_consumption) += x; return id(saved_total_gas_consumption); # Выводим значения глобальной переменной в HA - platform: template name: "Saved Total Gas Consumption" device_class: gas lambda: |- return id(saved_total_gas_consumption); unit_of_measurement: "m³" accuracy_decimals: 6
Конструктивные комментария/замечания категорически приветствуются, так как я далекий от программирования человек и буду рад советам профессионального сообщества.
Согласно руководству по эксплуатации импульсный выход счетчика — открытый коллектор. Счетчик подключал по такой схеме:
Разъем для подключения импульсного счетчика — TRS 3.5 (мини джек)
Загрузив прошивку на ESP32 получил в интерфейсе HA такие сенсоры:
И такие красивые картинки на панели Энергия в HA:
Умный счетчик воды
Получив положительный опыт я решил заменить счетчик импульсов Zigbee холодной воды на ESP32. У Zigbee очень много плюсов, но в моем случае именно в месте расположения счетчика воды что-то пошло не так. Добиться стабильной работы устройства я не смог.
Помимо снятия показаний со счетчика холодной воды на вводе в квартиру я также снимаю показания со специально установленного счетчика перед фильтром обратного осмоса для корректного учета ресурсов мембраны и остальных картриджей.
Код для ESPHome:
esphome: name: water-count friendly_name: water_count esp32: board: esp32dev framework: type: arduino # Подключение к Wi-Fi сети wifi: ssid: !secret wifi_ssid password: !secret wifi_password # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Water-Count Fallback Hotspot" password: ******* captive_portal: # Enable Home Assistant API api: encryption: key: ******* # Блок для ввода фактических значений показаний из интерфейса HA services: - service: set_water_total variables: new_total: float then: - lambda: |- id(saved_total_water_consumption) = new_total; ESP_LOGD("custom", "Set total water consumption to: %f", id(saved_total_water_consumption)); - service: set_filter_water_total variables: new_total: float then: - lambda: |- id(saved_total_filter_water_consumption) = new_total; ESP_LOGD("custom", "Set total filter water consumption to: %f", id(saved_total_filter_water_consumption)); ota: - platform: esphome password: ******* # Веб-сервер для диагностики web_server: port: 80 # Логирование logger: # Глобальные переменные для хранения количества литров globals: - id: saved_total_water_consumption type: float restore_value: True initial_value: '0.0' - id: saved_total_filter_water_consumption type: float restore_value: True initial_value: '0.0' # Настройка для счетчика воды sensor: - platform: pulse_counter pin: number: GPIO14 # Пин счетчика воды mode: input: true pullup: true id: water_meter_counter # ID счетчика воды name: "Water Meter" unit_of_measurement: "pulses" accuracy_decimals: 1 filters: - multiply: 10 # Применение коэффициента для пересчета импульсов в литры. 1 импульс - 10 литров - lambda: |- id(saved_total_water_consumption) += x; return id(saved_total_water_consumption); # Настройка для счетчика перед фильтром - platform: pulse_counter pin: number: GPIO27 # Пин счетчика воды перед фильтром mode: input: true pullup: true id: filter_water_meter_counter # ID счетчика перед фильтром name: "Filter Water Meter" unit_of_measurement: "pulses" accuracy_decimals: 1 filters: # Для счетчика перед фильтром коэффициент не применяю, т.к. 1 импульс у него равен 1 литру. - lambda: |- id(saved_total_filter_water_consumption) += x; return id(saved_total_filter_water_consumption); # Выводим значения глобальных переменных в HA - platform: template name: "Saved Total Water Consumption" device_class: water lambda: |- return id(saved_total_water_consumption); unit_of_measurement: "L" accuracy_decimals: 1 - platform: template name: "Saved Total Filter Water Consumption" device_class: water lambda: |- return id(saved_total_filter_water_consumption); unit_of_measurement: "L" accuracy_decimals: 1
В документации ESPHome по поводу подключения выходов с геркона написано следующее:
inverted: true я ставить не стал, т.к. четкой информации на счетчики я не нашел. Решил оставить так и, в случае некорректных показаний я бы это исправил. Не потребовалось.
По итогу оба сенсора прекрасно залетели в HA и без проблем отображаются на панели Энергия:
Ну а учет ресурса фильтра обратного осмоса выглядит так:
При нажатии на иконку фильтра выскакивает окно и можно сбросить ресурс при замене картриджа:
Результатом я остался доволен. Теперь мой дом стал еще немного умнее, а 25 числа каждого месяца в телеграм приходят уведомления с показаниями всех счетчиков.
ссылка на оригинал статьи https://habr.com/ru/articles/849422/
Добавить комментарий