Как стать автором
Обновить

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

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

Проблема в дребезге контактов геркона.

Подбирал несколько месяцев фильтр в строке 72

#снятие показаний со счетчика через датчик импульсов IN-Z61
#коричневый ------------ GND
#зеленый    --+-- 10k -- VCC 3v3
#.            |
#.            +--------- GPIO14 (D5) ESP8266
# WeMos D1 ESP-Wroom-02 ESP8266 Nodemcu WiFi Module With 18650 Battery Charging

substitutions:
  pulse_pin: D2

esphome:
  name: gas-bk-g4t

esp8266:
  board: d1_mini
  restore_from_flash: true

preferences:
  flash_write_interval: 60min

# включаем отладку для поиска причины перезагрузки через лог
debug:

logger:

# Enable Home Assistant API
api:
  services:
# для устаноки начального значения счетчика

    - service: update_counter_pulses
      variables:
        counter_pulses: float
      then:
        - globals.set:
            id: pulses_sum
            value: !lambda 'return counter_pulses;'
  
  reboot_timeout: 0s # иначе перезагружается при отключении от hassio        

ota:
  - platform: esphome

wifi:
  ssid: !secret wifi_ssid
  password:  !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "GAS-BK-G4T Fallback Hotspot"
    password: !secret ota_pass
  reboot_timeout: 0s # иначе перезагружается при потере wifi
captive_portal:


globals:
  - id: pulses_sum
    type: int
    restore_value: yes
    initial_value: '1000000' 



binary_sensor:
  - platform: gpio
    id: internal_pulse_counter
    pin:
      number: ${pulse_pin}
      mode: INPUT
    name: "Live-Impuls"
    filters:
      - delayed_on_off: 200ms
    on_press:
      then:
        - lambda: id(pulses_sum) += 1;
        - lambda: id(gas_cons).publish_state(id(pulses_sum));

sensor:

  - platform: template
    name: "Gas consumption"
    id: gas_cons
    device_class: gas
    unit_of_measurement: "m³"
    state_class: "total_increasing"
    icon: "mdi:fire"
    accuracy_decimals: 2
    filters:
      lambda: |-
        return x * 0.01;



# для отслеживания времени работы esp
  - platform: uptime
    name: Uptime Sensor
    id: uptime_sensor
    update_interval: 60s
    internal: true
    on_raw_value:
      then:
        - text_sensor.template.publish:
            id: uptime_human
            state: !lambda |-
              int seconds = round(id(uptime_sensor).raw_state);
              int days = seconds / (24 * 3600);
              seconds = seconds % (24 * 3600);
              int hours = seconds / 3600;
              seconds = seconds % 3600;
              int minutes = seconds /  60;
              seconds = seconds % 60;
              return (
                (days ? to_string(days) + "d " : "") +
                (hours ? to_string(hours) + "h " : "") +
                (minutes ? to_string(minutes) + "m " : "") +
                (to_string(seconds) + "s")
              ).c_str();        

 

text_sensor:
  - platform: template
    name: Uptime Human Readable
    id: uptime_human
    icon: mdi:clock-start

RC фильтр не проще было впаять для устранения дребезга?

И обратите внимание на esp32-c3 mini:

для одного входа такой огромный боард.

Столкнулся с тем, что ESP32 Super mini имеет гораздо худший прием WiFi. У модуля компактные размеры - в т.ч. и антенны

В дальних углах лучше ставить "большие" варианты модулей на ESP32

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

И для счетчика наверно напрашивается Seeed Studio XIAO ESP32C3
с поддержкой батарейки, там и антенна внешняя подключается.

https://aliexpress.ru/item/1005005382287176.html?sku_id=12000037754252111&spm=a2g2w.productlist.search_results.0.5bc743d0jUypP7

Интересная штука (я про Seeed Studio XIAO ESP32C3). Спасибо за наводку.

Я тоже пробовал реализовать подсчет через binary_sensor, но добиться корректных показаний не смог. Казалось бы, какая разница через что писать в глобальные переменные.

А по поводу дребезга контактов - подтверждаю, тоже пришлось поиграться, но только параметром debounce. 10 мс в моем случае было достаточно.

А как обстоят дела при отключении электроэнергии? Насколько я понял, устройства не имеют автономного источника питания и, в случае сбоя в электропитании, придется обновлять начальные показания счётчиков.

Есть waterius, тоже тут на хабре пишут статьи и у них понадежнее решение для газа и воды.

Ватериус - это законченное решение. Но кому-то не хочется иметь зависимость от внешних сервисов. ESPhome позволяет таким людям сделать свое устройство внутри HomeAssistant.

Ватериус опенсорсный, исходники на гитхабе, отправляет в ваш HomeAssistant, собирается так же на esp. Про какую зависимость вы говорите? Может вы просто не в курсе про возможности?

Как обстоят дела прямо сейчас я не в курсе. Но какое-то время назад писал разработчику относительно зависимости функций от внешних (за пределами моей квартиры) сервисов. Тогда зависимость для меня была серьезная.

Поэтому свое устройство сделал на ESPhome.

Ну 3 года назад уже был mqtt, возможно когда вам надо было, этот функционал ещё не реализовали.

Я писал в поддержку ватериуса по поводу совместимости с выходом "открытый коллектор". Они сказали что не поддерживается.

Для счетчиков воды их можно рассмотреть, но для моего счетчика газа - не факт.

Купив плату ESP32 за 300 р я получил работающее решение.

Купить устройство в 10 раз дороже и потом его пытаться допилить? Избавляться от возможных некорректных измерений?

Вот когда они сделают устройство под ключ и под мой счетчик газа - тогда цена будет оправдана.

После пропажи питания (либо перезагрузки устройства) будет выводиться последнее записанное в глобальную переменную globals: значение. Да, возможны небольшие погрешности (например счетчик не записал импульс перед отключением), но тут выбирает каждый сам для себя. Если перебои с электроснабжением частые, то нужно организовывать независимое питание. Если как у меня - отключения крайне редкие, а когда нет света, то и воды тоже нет, то можно показания счетчиков раз в год и подкрутить к фактическим.

У меня для аналогичной задачи аналогично мало опыта, но очень хочется сделать счётчик в deep-sleep, отправляя по mqtt только изменения раз в час если они вообще говоря были и раз в сутки статус "я жив".

Deep sleep хочется чисто из-за возможности жить по полгода от одной батарейки

https://habr.com/ru/companies/timeweb/articles/827248/#comment_27062038

Как я выше писал в комментариях, то что вы хотите реализовано в waterius. Автор на хабре пишет через поиск можно найти.

Я использовал счётчик воды элехант. Он не имеет никаких выводов (даже экрана), но передаёт все показания по Bluetooth пакетами Advertising.

Предполагается получение показаний через их лагучее приложение на телефоне, но я пошел другим путём.

На Raspberry принимал пакеты и парсил, потом в influxDB, визуализировал графики в Grafana. Ещё встречал скрипт для HA на гитхабе (оттуда собственно и разобрался, что собственно посылает счётчик). Преимущество данной схемы в том, что кроме счётчика и Raspberry не нужно дополнительных устройств.

У элехант, кстати, есть и на газ счётчики.

Да, видел решения от Элеханта. Их счетчик газа мне по фланцам не подошел. А в остальном они молодцы. Можно рассмотреть к установке.

Оффтопно, у вас большие карточки, я у себя все сгруппировал более компактно с помощью room-card

картинка

Спасибо за совет! Давно интерфейс не менял. Как раз повод новую карточку заюзать.

@kuzhakhmetov

Расскажите, пожалуйста, подробнее про учет ресурса фильтров. Как ваша реализована карточка с фильтрами, отображается ли там остаточный ресурс, есть ли напоминание о замене?

Я воспользовался интеграцией из HACS Variables.

Потом создал переменные по каждому фильтру:

# Переменная показания счетчика фильтра к5 при его замене
  filter_counter_k5:
    initial_value: 0
    icon: mdi:air-filter
# Переменная дата замены фильтра к5  
  filter_k5_change_date:
    initial_value: '22.09.2021'

Ну а потом завел переменную расхода в template, где 4000 это принятый мной ресурс фильтра:

 - platform: template
   sensors:
    filter_k5:
       friendly_name: "Ресурс фильтра грубой очистки К5"  
       value_template: "{{ 4000 - states('sensor.water_count_saved_total_filter_water_consumption')|float + states('var.filter_counter_k5')|float }}"
       unit_of_measurement: 'л'
       unique_id: filter_k5

Код карточки ниже. В нем, я думаю, что все понятно:

type: entities
show_header_toggle: false
entities:
  - entity: sensor.filter_k5
    icon: mdi:numeric-5-box-multiple-outline
    double_tap_action:
      action: call-service
      confirmation:
        text: Ты уверен что хочешь сбросить ресурс фильтра к5?
      service: script.5
    type: custom:secondaryinfo-entity-row
    secondary_info: "Дата замены: [[ var.filter_k5_change_date ]]"

Напоминание о замене картриджей не делал - надобности нет, но есть куча других напоминалок, например оформление ОСАГО в Telegram.

alias: ОСАГО Sorento
description: ""
mode: single
triggers:
  - at: "08:00:00"
    trigger: time
conditions:
  - condition: numeric_state
    entity_id: sensor.day_sorento_insurance_remain
    below: 30
actions:
  - data:
      message: >-
        Необходимо оформить ОСАГО на Sorento. Страховка будет действовать еще
        {{     states('sensor.day_sorento_insurance_remain') }} дн.
      title: ОСАГО
    action: notify.group_notify

Большое спасибо за развернутый ответ!

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории