Считывание типов нажатий со входов реле (например MR6C) и передача их в HomeAssistant

Добрый день.
Хочу оптимизировать реализацию проброса типов нажатий выключателей в HomeAssistant.
В прошлый раз с участием @BrainRoot очень упростил функционал управления кондиционерами с помощью IR.
Опишу реализацию, как есть, основная проблема с которой я столкнулся заключается в том, что если настраивать триггер на изменения счетчика количества нажатий, то событие срабатывает при каждом изменении значения, т.е. если перезагрузить службу wb-mqtt-serial (в момент перезагрузки, в топике MQTT значение обновляется) триггер воспринимает это как изменение - событие активируется. Пытался бороться с этим использую костыли типа такого :

      - platform: state
        entity_id: sensor.wb_mr6c_78_i1_spc
        not_from:
          - "unknown"
          - "unavailable"
          - ""

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

  1. Под каждый тип нажатия создаю сенсор, который хранит количество нажатий:
mqtt:
 sensor:
      - name: "wb_mr6c_32_i0_spc"
        state_topic: "/devices/wb-mr6c_32/controls/Input 0 Single Press Counter"
      - name: "wb_mr6c_32_i0_lpc"
        state_topic: "/devices/wb-mr6c_32/controls/Input 0 Long Press Counter"
      - name: "wb_mr6c_32_i0_dpc"
        state_topic: "/devices/wb-mr6c_32/controls/Input 0 Double Press Counter"
      - name: "wb_mr6c_32_i0_slpc"
        state_topic: "/devices/wb-mr6c_32/controls/Input 0 Shortlong Press Counter"
  1. Создаю кастомные сенсор (пока MQTT, но думаю переделать на input_text), в который на следующих шагах буду писать автоматизацией тип нажатия (single, double, long, shortlong) и как раз его потом использовать во всех сценариях умного дома:
mqtt:
 sensor:
      - name: "btm_mr6c_32_i0_custom"
        state_topic: "states/tap_switch/mr6c_32_i0_custom"
  1. Создаю бинарный сенсор для определения факта нажатия выключателя, из топика реле:
mqtt:
    - binary_sensor:
    # cтатус нажатия кнопки
      - name: "wb_mr6c_32_i0"
        state_topic: "states/tap_switch/mr6c_32_i0"
        payload_on: "1"
        payload_off: "0"
  1. Создаю автоматизацию, которая пишет в бинарный сенсор именно факт нажатия кнопки, чтоб избежать ложных срабатываний (нужно тоже заменить на input_boolean, очень не хватает в HA задание задержки в миллисекундах, по документации минимум 1 секунда):
automation:
  - alias: tap_button_wb_mr6c_32_i0_payload_state
    initial_state: true

    trigger:
      - platform: mqtt
        topic: "/devices/wb-mr6c_32/controls/Input 0"
        payload: "1"

    condition:
      - condition: state
        entity_id: switch.control_mode
        state: 'on'

    action:   
      - service: mqtt.publish
        data_template:
          topic: "states/tap_switch/mr6c_32_i0"
          payload: "1"
          retain: true
      - delay: 00:00:01
      - service: mqtt.publish
        data_template:
          topic: "states/tap_switch/mr6c_32_i0"
          payload: "0"
          retain: true
  1. Автоматизация записывает в кастомный сенсор sensor.btm_mr6c_32_i0_custom тип нажатия (Single, double и т.д.), а через 1 сек (не хватает задержки в миллисекундах) записывает значение “off”, срабатывает на счетчиках нажатий по типам и с дополнительным условием, что кнопка физически нажата (бинарный сенсор из шага 3), для одиночного:
  - alias: payload_single_wb_mr6c_32_i0
    initial_state: true

    trigger:
    - platform: state
      entity_id: sensor.wb_mr6c_32_i0_spc
      not_from:
        - "unknown"
        - "unavailable"
        - "0"     

    condition:
    - condition: state
      entity_id: switch.control_mode
      state: 'on'
    - condition: state
      entity_id: binary_sensor.wb_mr6c_32_i0
      state: 'on'

    action:   
    - service: mqtt.publish
      data_template:
        topic: "states/tap_switch/mr6c_32_i0_custom"
        payload: "single"
        retain: true
    - delay: 00:00:01
    - service: mqtt.publish
      data_template:
        topic: "states/tap_switch/mr6c_32_i0_custom"
        payload: "off"
        retain: true

для двойного нажатия (опять счетчик + бинарник, чтоб избежать ложные срабатывали):

  - alias: payload_double_wb_mr6c_32_i0
    initial_state: true

    trigger:
    - platform: state
      entity_id: sensor.wb_mr6c_32_i0_dpc
      not_from:
        - "unknown"
        - "unavailable"
        - "0"     

    condition:
    - condition: state
      entity_id: switch.control_mode
      state: 'on'
    - condition: state
      entity_id: binary_sensor.wb_mr6c_32_i0
      state: 'on'

    action:   
    - service: mqtt.publish
      data_template:
        topic: "states/tap_switch/mr6c_32_i0_custom"
        payload: "double"
        retain: true
    - delay: 00:00:01
    - service: mqtt.publish
      data_template:
        topic: "states/tap_switch/mr6c_32_i0_custom"
        payload: "off"
        retain: true

и т.д. для других типов нажатий.

Поделитесь пожалуйста, своими реализцаями или идеями для упрощения.

Добрый день.
Предполагаю что в процессе запуска wb-mqtt-serial состояние топика меняется как number → NULL → number
Где number это текущее значение счетчика.
Соответственно - просто не обрабатывайте NULL…

Добрый день!
У меня получилась такая реализация
Перезапуск службы wb-mqtt-serial переживает штатно, как и самого HA.

Объявление сенсора:

mqtt:
  sensor:
    - unique_id: wb-mdm3_85_i1_spc
      object_id: wb-mdm3_85_i1_spc
      name: "I1 Single Press Counter"
      state_topic: "/devices/wb-mdm3_85/controls/Input 1 Single Press Counter"
      unit_of_measurement: "" # для графиков
      device:
        name: "WB-MDM3 85"
        identifiers: wb-mdm3_85
        manufacturer: "Wiren Board"
        model: "WB-MDM3"
        via_device: wb-7 # выше объявлен сам контроллер
        suggested_area: "Дом"

Автоматизация:

alias: Test push button
description: Балкон левый
trigger:
  - platform: state
    entity_id:
      - sensor.wb_mdm3_85_i1_spc
condition:
  - condition: template
    value_template: "{{states.sensor.wb_mdm3_85_i1_spc.state | int > 0}}"
    alias: Counter is int>0
  - condition: template
    value_template: "{{ trigger.to_state.state|int > trigger.from_state.state|int }}"
    alias: Counter increased
action:
  - service: light.toggle
    metadata: {}
    data: {}
    target:
      entity_id:
        - light.yeelight_screen_light_bar
        # - light.wb_mdm3_178_k3
mode: single
1 лайк