Добрый день.
Хочу оптимизировать реализацию проброса типов нажатий выключателей в HomeAssistant.
В прошлый раз с участием @BrainRoot очень упростил функционал управления кондиционерами с помощью IR.
Опишу реализацию, как есть, основная проблема с которой я столкнулся заключается в том, что если настраивать триггер на изменения счетчика количества нажатий, то событие срабатывает при каждом изменении значения, т.е. если перезагрузить службу wb-mqtt-serial (в момент перезагрузки, в топике MQTT значение обновляется) триггер воспринимает это как изменение - событие активируется. Пытался бороться с этим использую костыли типа такого :
- platform: state
entity_id: sensor.wb_mr6c_78_i1_spc
not_from:
- "unknown"
- "unavailable"
- ""
не помогает, возможно есть возможность как-то все это учесть, но я пришел к следующему.
Создаю кастомные сенсор, в который пишу тип нажатия, но это сильно все усложняет (уверен есть более простой способ):
- Под каждый тип нажатия создаю сенсор, который хранит количество нажатий:
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"
- Создаю кастомные сенсор (пока MQTT, но думаю переделать на input_text), в который на следующих шагах буду писать автоматизацией тип нажатия (single, double, long, shortlong) и как раз его потом использовать во всех сценариях умного дома:
mqtt:
sensor:
- name: "btm_mr6c_32_i0_custom"
state_topic: "states/tap_switch/mr6c_32_i0_custom"
- Создаю бинарный сенсор для определения факта нажатия выключателя, из топика реле:
mqtt:
- binary_sensor:
# cтатус нажатия кнопки
- name: "wb_mr6c_32_i0"
state_topic: "states/tap_switch/mr6c_32_i0"
payload_on: "1"
payload_off: "0"
- Создаю автоматизацию, которая пишет в бинарный сенсор именно факт нажатия кнопки, чтоб избежать ложных срабатываний (нужно тоже заменить на 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
- Автоматизация записывает в кастомный сенсор 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
и т.д. для других типов нажатий.
Поделитесь пожалуйста, своими реализцаями или идеями для упрощения.