Sonntag - zuletzt bearbeitet Sonntag
Moin zusammen,
ich habe mich mal mit dem Universalschalter (Flex) in Home Assistant beschäftigt,
da ich mehr als nur 4 Belegungen (Oben kurz, Oben lang, Unten kurz, Unten Lang) verwenden wollte.
Mir hat immer der Doppelklick gefehlt.
Für den, der das auch gut gebrauchen kann, wollte ich es hier einmal zeigen:
Der Universalschalter (Flex) in Home Assistant sendet Befehle über den Event Bus.
event_type: bosch_shc.event
data:
device_id: 681ae0a745ab17600f518ab04c1c1078
id: hdm:HomeMaticIP:3014F711A000159BB85FDC8D
name: Schalter Bett
lastTimeTriggered: 1734291020811
event_subtype: UPPER_BUTTON
event_type: PRESS_SHORT
origin: LOCAL
time_fired: "2024-12-15T19:30:20.863539+00:00"
context:
id: 01JF5WSQ1ZNBWN6C9BQY247JA8
parent_id: null
user_id: null
Dort stehen die alle Infos drin, die man braucht.
Dazu kommt, das dieses Event ein zweites Event (State_Changed) auslöst.
event_type: state_changed
data:
entity_id: event.schalter_wohnzimmer_button_upper_button
old_state:
entity_id: event.schalter_wohnzimmer_button_upper_button
state: "2024-08-30T20:54:08.212+00:00"
attributes:
event_types:
- PRESS_SHORT
- PRESS_LONG
- PRESS_LONG_RELEASED
event_type: PRESS_SHORT
device_id: hdm:HomeMaticIP:3014F711A000159BB85FDC8D
id: hdm:HomeMaticIP:3014F711A000159BB85FDC8D
name: Schalter Wohnzimmer
lastTimeTriggered: 1725051248150
device_class: button
friendly_name: Schalter Wohnzimmer Button UPPER_BUTTON
last_changed: "2024-12-13T18:34:53.471439+00:00"
last_reported: "2024-12-13T18:34:53.471439+00:00"
last_updated: "2024-12-13T18:34:53.471439+00:00"
context:
id: 01JF0MTQMZ3X3W9SSYXCD9GH0K
parent_id: null
user_id: null
new_state:
entity_id: event.schalter_wohnzimmer_button_upper_button
state: "2024-12-15T19:30:20.866+00:00"
attributes:
event_types:
- PRESS_SHORT
- PRESS_LONG
- PRESS_LONG_RELEASED
event_type: PRESS_SHORT
device_id: hdm:HomeMaticIP:3014F711A000159BB85FDC8D
id: hdm:HomeMaticIP:3014F711A000159BB85FDC8D
name: Schalter Wohnzimmer
lastTimeTriggered: 1734291020811
device_class: button
friendly_name: Schalter Wohnzimmer Button UPPER_BUTTON
last_changed: "2024-12-15T19:30:20.878651+00:00"
last_reported: "2024-12-15T19:30:20.878651+00:00"
last_updated: "2024-12-15T19:30:20.878651+00:00"
context:
id: 01JF5WSQ2E9PCNWPKFAHF4HS6F
parent_id: null
user_id: null
origin: LOCAL
time_fired: "2024-12-15T19:30:20.878651+00:00"
context:
id: 01JF5WSQ2E9PCNWPKFAHF4HS6F
parent_id: null
user_id: null
Hier ist gut zu sehen, dass dort ein Alter und ein Neuer Status angezeigt wird. Das kann man für sich nutzten, um den Abstand des Tastendruckes zu ermitteln.
Als erstes erstellen ich eine neue Automation mit dem Trigger "Ereignis" (Event).
In diesem Ereignis-Trigger warten wir auf das Event "state_changed" mit dem Datenzusatz des Events vom Universalschalter. Und vergeben eine ID für später.
trigger: event
event_type: state_changed
event_data:
entity_id: event.schalter_wohnzimmer_button_upper_button
id: upper_press
Damit wird auf jeden Tastendruck des oberen Schalters des Universalschalters reagiert.
Unter Aktionen erstellen wir dann Variablen.
variables:
old_state: "{{ trigger.event.data.old_state }}"
last_trigger_time: "{{ old_state.split('=')[1].split(';')[0] | as_timestamp }}"
new_state: "{{ trigger.event.data.new_state }}"
trigger_time: "{{ new_state.split('=')[1].split(';')[0] | as_timestamp }}"
press: "{{ new_state.split('=')[3].split(',')[0] }}"
Old_State: beinhaltet den Datensatz von state_changed -> old_state
last_trigger_time: isoliert die Zeit des Auslösens als Zeitstempel aus dem Datensatz Old_State
New_State: beinhaltet den Datensatz von state_changed -> new_state
trigger_time: isoliert die Zeit des Auslösens als Zeitstempel aus dem Datensatz New_State
press: isoliert die Info ob PRESS_SHORT, PRESS_LONG oder PRESS_LONG_RELEASED aus dem Datensatz New_State
Als 2 Aktion führen wir dann etwas mit Bedingungen aus.
War hat Ausgelöst?: ID von oben (Hier upper_press)
Dann die Variablen von oben abfragen.
Ist "press" = "PRESS_SHORT"?
Ist "Neue Zeit" minus "Alte Zeit" kleiner als 2 (Sekunden)?
DANN mache Esstisch auf 100% Helligkeit.
- conditions:
- condition: trigger
id:
- upper_press
- condition: template
value_template: "{{ press == \"PRESS_SHORT\" }}"
- condition: template
value_template: "{{((trigger_time - last_trigger_time) | round(2) | float) < 2.0}}"
sequence:
- data:
brightness_pct: 100
target:
entity_id:
- light.ph_esstisch_1
- light.ph_esstisch_2
action: light.turn_on
Wenn man einen Einzelklick möchte, einfach statt kleiner 2, größer 2 eintragen.
Der Modus der Automation sollte auf "Warteschlange" mit max. 10 sein.
Ich nutzte es, um mit einmal drücken das Licht auf 1% zu stellen.
Mit dem zweiten drücken innerhalb 2 Sekunden auf 100%.
Ein weiter Einzelklick nach 2 Sekunden schaltet es wieder aus. (Bedingung Licht ist an)
Mit dem PRESS_LONG lasse ich jedes mal die Helligkeit um 5% ansteigen.
Damit ist die Obere Taste für Licht an/an 100%/aus und Dimmen zuständig.
Hier nochmal die ganze Automation:
alias: Universalschalter Wohnzimmer
description: ""
triggers:
- trigger: event
event_type: state_changed
event_data:
entity_id: event.schalter_wohnzimmer_button_upper_button
id: upper_press
conditions: []
actions:
- variables:
old_state: "{{ trigger.event.data.old_state }}"
last_trigger_time: "{{ old_state.split('=')[1].split(';')[0] | as_timestamp }}"
new_state: "{{ trigger.event.data.new_state }}"
trigger_time: "{{ new_state.split('=')[1].split(';')[0] | as_timestamp }}"
press: "{{ new_state.split('=')[3].split(',')[0] }}"
- choose:
- conditions:
- condition: trigger
id:
- upper_press
- condition: state
entity_id: light.ph_esstisch_1
state: "off"
- condition: template
value_template: "{{ press == \"PRESS_SHORT\" }}"
- condition: template
value_template: "{{((trigger_time - last_trigger_time) | round(2) | float) > 2.0}}"
sequence:
- data:
brightness_pct: 1
target:
entity_id:
- light.ph_esstisch_1
- light.ph_esstisch_2
action: light.turn_on
- conditions:
- condition: trigger
id:
- upper_press
- condition: state
entity_id: light.ph_esstisch_1
state: "on"
- condition: template
value_template: "{{ press == \"PRESS_SHORT\" }}"
- condition: template
value_template: "{{((trigger_time - last_trigger_time) | round(2) | float) > 2.0}}"
sequence:
- data:
transition: 5
target:
entity_id:
- light.ph_esstisch_1
- light.ph_esstisch_2
action: light.turn_off
- conditions:
- condition: trigger
id:
- upper_press
- condition: template
value_template: "{{ press == \"PRESS_SHORT\" }}"
- condition: template
value_template: "{{((trigger_time - last_trigger_time) | round(2) | float) < 2.0}}"
sequence:
- data:
brightness_pct: 100
target:
entity_id:
- light.ph_esstisch_1
- light.ph_esstisch_2
action: light.turn_on
- conditions:
- condition: trigger
id:
- upper_press
- condition: template
value_template: "{{ press == \"PRESS_LONG\" }}"
sequence:
- data:
brightness_step_pct: 5
target:
entity_id:
- light.ph_esstisch_1
- light.ph_esstisch_2
action: light.turn_on
mode: queued
max: 10