Files
haos-blueprints/Zigbee/MQTT Button Control/blueprint.yaml
alexei.dolgolyov 7b00899903 Restructure repository: organize blueprints into folders
Each blueprint now has its own folder containing:
- blueprint.yaml: The automation code with a short header
- README.md: Detailed documentation extracted from headers

Updated CLAUDE.md with repository structure guidelines.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-01 02:38:52 +03:00

224 lines
7.7 KiB
YAML

# MQTT Button Control Blueprint
# Controls lights and switches using Zigbee2MQTT button devices.
# See README.md for detailed documentation.
#
# Author: Alexei Dolgolyov (dolgolyov.alexei@gmail.com)
blueprint:
name: "Custom: MQTT Button Control"
description: Control a Zigbee2MQTT device with multiple actions, that allows to toggle lights and switches and store entity identifier of last interacted switch/light.
domain: automation
input:
mqtt_group:
name: "MQTT"
collapsed: false
input:
mqtt_topic:
name: MQTT Topic
description: The MQTT topic for your Zigbee button (e.g., zigbee2mqtt/my_button1).
selector:
text:
mqtt_topic2:
name: MQTT Topic 2 (Optional)
description: >
Additional MQTT topic for a second button.
Leave as default placeholder if not using.
default: "blueprint/disabled/mqtt_button_control"
selector:
text:
devices:
name: "Primary"
collapsed: false
input:
action_ids:
name: Action IDs
description: The action IDs that must map to lights (action → light)
default: []
selector:
text:
multiple: true
switches:
name: Switches
description: "The list of switches to control. Next types are supported: `light`, `switch`, `input_boolean`"
default: []
selector:
entity:
domain:
- light
- switch
- input_boolean
multiple: true
outputs:
name: "Outputs"
collapsed: false
input:
last_interacted_text:
name: Last Interacted Entity Text Helper (optional)
description: "`input_text` entity that will store last enabled entity"
default: ""
selector:
entity:
domain: input_text
common:
name: "Common"
collapsed: false
input:
timeout_for_indication_blink:
name: "Timeout for indicator blink"
description: If not zero does blink when button with already enabled light is pressed to indicate that the light is active now if elapsed time from last action is greater then the specified value
default: 10
selector:
number:
min: 0
max: 100
step: 1
unit_of_measurement: "s"
blink_count:
name: Count of blinks
description: "Count of blinks to indicate active light"
default: 3
selector:
number:
min: 0
max: 5
step: 1
blink_interval:
name: Interval between blinks
description: "Interval between indicator blinks (in ms)"
default: 250
selector:
number:
min: 0
max: 1000
step: 50
unit_of_measurement: "ms"
trigger:
- platform: mqtt
topic: !input mqtt_topic
- platform: mqtt
topic: !input mqtt_topic2
enabled: "{{ mqtt_topic2 != '' }}"
mode: restart
condition:
- condition: template
value_template: "{{ 'action' in trigger.payload_json }}"
action:
- variables:
action_id: "{{ trigger.payload_json.action }}"
switches: !input switches
action_ids: !input action_ids
target_index: >
{% if action_id in action_ids %}
{{ action_ids.index(action_id) }}
{% else %}
-1
{% endif %}
target_entity: "{{ switches[target_index] if target_index != -1 else none }}"
last_interacted_text: !input last_interacted_text
is_debug: false
- choose:
- conditions:
- condition: template
value_template: "{{ target_entity is not none }}"
sequence:
- variables:
entity_type: "{{ target_entity.split('.')[0] }}"
- service: input_text.set_value
data:
entity_id: "{{ last_interacted_text }}"
value: "{{ target_entity }}"
- choose:
# Light
- conditions:
- condition: template
value_template: "{{ entity_type == 'light' }}"
sequence:
- variables:
timeout_for_indication_blink: !input timeout_for_indication_blink
seconds_elapsed: >
{{ (as_timestamp(now()) - as_timestamp(states[target_entity].last_changed)) | int }}
should_blink: "{{ timeout_for_indication_blink != 0 and seconds_elapsed > timeout_for_indication_blink }}"
blink_count: !input blink_count
blink_timeout: !input blink_interval
is_light_on: "{{ is_state(target_entity, 'on') }}"
# Debug
- choose:
- conditions:
- condition: template
value_template: "{{ is_debug }}"
sequence:
- service: persistent_notification.create
data:
title: "Debug Info"
message: >
seconds_elapsed = {{ seconds_elapsed }},
should_blink = {{ should_blink }}
- choose:
# Blink
- conditions:
- condition: template
value_template: "{{ should_blink and is_light_on }}"
sequence:
- repeat:
count: "{{ blink_count }}"
sequence:
- service: light.turn_off
target:
entity_id: "{{ target_entity }}"
data:
transition: 0
- delay:
milliseconds: "{{ blink_timeout }}"
- service: light.turn_on
target:
entity_id: "{{ target_entity }}"
data:
transition: 0
- delay:
milliseconds: "{{ blink_timeout }}"
# Actually toggle
default:
- service: light.toggle
target:
entity_id: "{{ target_entity }}"
# Switch
- conditions:
- condition: template
value_template: "{{ entity_type == 'switch' }}"
sequence:
- service: switch.toggle
target:
entity_id: "{{ target_entity }}"
# Input Boolean
- conditions:
- condition: template
value_template: "{{ entity_type == 'input_boolean' }}"
sequence:
- service: input_boolean.toggle
target:
entity_id: "{{ target_entity }}"