Ikea Fernbedienung als Universalfernbedienung mit ZHA und NodeRed in Homeassistant nutzen.

Ikea Fernbedienung als Universalfernbedienung mit ZHA und NodeRed in Homeassistant nutzen.

Ich hab mich ja zuletzt mit meiner händischen Recovery von meinem HomeAssistant beschäftigt und dann musste ich erstmal wieder lernen, wie alles so funktioniert. Dabei wollte ich die Gelegenheit nutzen und manche Sachen auch verbessern, wie beispielsweise unsere Lichtsteuerung. Meine Idee war nun eine Art Universalfernbedienung für die Lampen in der Wohnung zu machen. In diesem Guide zeige ich euch, wie das mit NodeRed und ZHA (Zigbee HomeAssistant) funktioniert!

TL;DR

Wer nicht alles lesen will, hier ist der Flow für NodeRed

[{"id":"4ec870661b41ea14","type":"tab","label":"ZHA Event Listener","disabled":false,"info":"","env":[]},{"id":"d340a9ea.3b59f8","type":"server-events","z":"4ec870661b41ea14","name":"Eventlistener","server":"c1eed9d5.7b0d28","version":3,"exposeAsEntityConfig":"","eventType":"zha_event","eventData":"","waitForRunning":true,"outputProperties":[{"property":"payload","propertyType":"msg","value":"","valueType":"eventData"},{"property":"topic","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"},{"property":"event_type","propertyType":"msg","value":"$outputData(\"eventData\").event_type","valueType":"jsonata"}],"x":130,"y":200,"wires":[["3d20fb45.e87794","7d782c2e5ede70a5"]]},{"id":"3d20fb45.e87794","type":"switch","z":"4ec870661b41ea14","name":"check which device","property":"payload.event.device_ieee","propertyType":"msg","rules":[{"t":"eq","v":"90:35:ea:ff:fe:2c:4a:38","vt":"str"},{"t":"eq","v":"84:2e:14:ff:fe:ba:47:f6","vt":"str"},{"t":"eq","v":"cc:cc:cc:ff:fe:ef:bb:73","vt":"str"}],"checkall":"true","repair":false,"outputs":3,"x":370,"y":200,"wires":[["7284548f.43bacc","630ff087.007ee"],["3c66f28566d66f4f","3a83a1cd9d39b813"],["d2ce8975e5a9d359","89221d88b36c3dc2"]]},{"id":"630ff087.007ee","type":"change","z":"4ec870661b41ea14","name":"fix different ways of command","rules":[{"t":"move","p":"payload.event.command","pt":"msg","to":"payload","tot":"msg"},{"t":"move","p":"payload.event.args[0]","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":950,"y":160,"wires":[["5298f49c.5af2fc","e1ee51c94604f95c"]]},{"id":"5298f49c.5af2fc","type":"switch","z":"4ec870661b41ea14","name":"interpret command to do stuff","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"},{"t":"eq","v":"move_with_on_off","vt":"str"},{"t":"eq","v":"step","vt":"str"},{"t":"eq","v":"move","vt":"str"},{"t":"eq","v":"256","vt":"str"},{"t":"eq","v":"257","vt":"str"}],"checkall":"true","repair":false,"outputs":7,"x":1240,"y":160,"wires":[["30ed8922eb6c14a9","87111b5d.423eb8"],["e3b269257c58eff7","87111b5d.423eb8"],[],[],[],["4f9ab3cec10931f0","87111b5d.423eb8"],["4f9ab3cec10931f0","87111b5d.423eb8"]]},{"id":"7d782c2e5ede70a5","type":"debug","z":"4ec870661b41ea14","name":"Event Debug","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":390,"y":80,"wires":[]},{"id":"e1ee51c94604f95c","type":"debug","z":"4ec870661b41ea14","name":"Event Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1190,"y":60,"wires":[]},{"id":"e896b3ce5cd62eb5","type":"debug","z":"4ec870661b41ea14","name":"Event Debug","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":2210,"y":280,"wires":[]},{"id":"87111b5d.423eb8","type":"ha-get-entities","z":"4ec870661b41ea14","name":"","server":"c1eed9d5.7b0d28","version":1,"rules":[{"property":"entity_id","logic":"starts_with","value":"light.","valueType":"str"}],"outputType":"array","outputEmptyResults":false,"outputLocationType":"msg","outputLocation":"payload","outputResultsCount":1,"x":1530,"y":240,"wires":[["901baa50ba6d5a1b"]]},{"id":"f1234263.eed69","type":"api-call-service","z":"4ec870661b41ea14","name":"Turn on Light","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"light","service":"turn_on","areaId":[],"deviceId":[],"entityId":["{{payload.entity_id}}"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","output_location":"","output_location_type":"none","x":2150,"y":60,"wires":[[]]},{"id":"fd05f4dca7ece053","type":"function","z":"4ec870661b41ea14","name":"Magic","func":"msg.headers = msg.originalHeaders;\nvar ID = msg.payload.ID;\nvar nr = msg.payload.Befehl;\nvar u = global.get('homeassistant.homeAssistant.states[\"input_number.current_light_id\"].state');\nvar newPayload = [];\n\nif (nr == 257){\n    u = parseInt(u) - 1;\n    if (u == -1){\n        u = parseInt(ID.length) -1; \n    }\n}\n\nif (nr == 256){\n    u = parseInt(u) + 1;\n    if (u == parseInt(ID.length)){\n        u = 0; \n    }\n}\n\nnewPayload.push(String(ID[u].entity_id.split(\".\")[1])); \n\nmsg.payload = {};\nmsg.payload.entity = newPayload;\nmsg.payload.currentID = u;\nmsg.topic = \"entity\";\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1970,"y":360,"wires":[["739a786e6b8c3e48","e896b3ce5cd62eb5","e943a6f1dc2a651f"]]},{"id":"8ea1dc6580d3e90a","type":"join","z":"4ec870661b41ea14","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"1","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":1910,"y":220,"wires":[["fd05f4dca7ece053","e896b3ce5cd62eb5"]]},{"id":"901baa50ba6d5a1b","type":"function","z":"4ec870661b41ea14","name":"add topic","func":"msg.headers = msg.originalHeaders;\nmsg.topic = \"ID\";\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1720,"y":240,"wires":[["8ea1dc6580d3e90a","b62bed284fbddb13"]]},{"id":"4f9ab3cec10931f0","type":"function","z":"4ec870661b41ea14","name":"add topic","func":"msg.headers = msg.originalHeaders;\nmsg.topic = \"Befehl\";\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1720,"y":200,"wires":[["8ea1dc6580d3e90a"]]},{"id":"739a786e6b8c3e48","type":"api-call-service","z":"4ec870661b41ea14","name":"","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"input_number","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_number.current_light_id"],"data":"{\"value\":payload.currentID}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":2158.4444580078125,"y":399.111083984375,"wires":[[]]},{"id":"30ed8922eb6c14a9","type":"function","z":"4ec870661b41ea14","name":"get entity id to turn on","func":"msg.headers = msg.originalHeaders;\nvar ID = global.get('homeassistant.homeAssistant.states[\"input_text.current_light_entity_id\"].state');\n\nmsg.payload = {};\nmsg.payload.entity_id = \"light.\" + ID;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1900,"y":60,"wires":[["f1234263.eed69"]]},{"id":"e3b269257c58eff7","type":"function","z":"4ec870661b41ea14","name":"get entity id to turn off","func":"msg.headers = msg.originalHeaders;\nvar ID = global.get('homeassistant.homeAssistant.states[\"input_text.current_light_entity_id\"].state');\n\nmsg.payload = {};\nmsg.payload.entity_id = \"light.\" + ID;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":1900,"y":100,"wires":[["d25d8e4755eb5a03"]]},{"id":"d25d8e4755eb5a03","type":"api-call-service","z":"4ec870661b41ea14","name":"Turn off Light","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"light","service":"turn_off","areaId":[],"deviceId":[],"entityId":["{{payload.entity_id}}"],"data":"","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","output_location":"","output_location_type":"none","x":2150,"y":120,"wires":[[]]},{"id":"3c66f28566d66f4f","type":"change","z":"4ec870661b41ea14","name":"convert to other message string","rules":[{"t":"move","p":"payload.event.args[0]","pt":"msg","to":"payload.event.command","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":650,"y":220,"wires":[["3a83a1cd9d39b813"]]},{"id":"3a83a1cd9d39b813","type":"change","z":"4ec870661b41ea14","name":"fix different ways of command","rules":[{"t":"move","p":"payload.event.command","pt":"msg","to":"payload","tot":"msg"},{"t":"move","p":"payload.event.args[0]","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":950,"y":220,"wires":[["d5f693e4ec2c9939"]]},{"id":"d5f693e4ec2c9939","type":"switch","z":"4ec870661b41ea14","name":"interpret command to do stuff","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"toggle","vt":"str"},{"t":"eq","v":"step_with_on_off","vt":"str"},{"t":"eq","v":"step","vt":"str"},{"t":"eq","v":"256","vt":"str"},{"t":"eq","v":"257","vt":"str"},{"t":"eq","v":"stop","vt":"str"},{"t":"eq","v":"move","vt":"str"},{"t":"eq","v":"move_with_on_off","vt":"str"},{"t":"eq","v":"stop_with_on_off","vt":"str"}],"checkall":"true","repair":false,"outputs":9,"x":1240,"y":340,"wires":[[],[],[],[],[],[],[],[],[]]},{"id":"d2ce8975e5a9d359","type":"change","z":"4ec870661b41ea14","name":"convert to other message string","rules":[{"t":"move","p":"payload.event.args[0]","pt":"msg","to":"payload.event.command","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":400,"wires":[["89221d88b36c3dc2"]]},{"id":"89221d88b36c3dc2","type":"change","z":"4ec870661b41ea14","name":"fix different ways of command","rules":[{"t":"move","p":"payload.event.command","pt":"msg","to":"payload","tot":"msg"},{"t":"move","p":"payload.event.args[0]","pt":"msg","to":"payload","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":930,"y":400,"wires":[["d9fdd78d040eb5c5"]]},{"id":"d9fdd78d040eb5c5","type":"switch","z":"4ec870661b41ea14","name":"interpret command to do stuff","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"on","vt":"str"},{"t":"eq","v":"off","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":1240,"y":520,"wires":[[],[]]},{"id":"7284548f.43bacc","type":"change","z":"4ec870661b41ea14","name":"convert to other message string","rules":[{"t":"move","p":"payload.event.args[0]","pt":"msg","to":"payload.event.command","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":650,"y":160,"wires":[["630ff087.007ee"]]},{"id":"b62bed284fbddb13","type":"debug","z":"4ec870661b41ea14","name":"Event Debug","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1750,"y":320,"wires":[]},{"id":"e943a6f1dc2a651f","type":"api-call-service","z":"4ec870661b41ea14","name":"","server":"c1eed9d5.7b0d28","version":5,"debugenabled":false,"domain":"input_text","service":"set_value","areaId":[],"deviceId":[],"entityId":["input_text.current_light_entity_id"],"data":"{\"value\":payload.entity[0]}","dataType":"jsonata","mergeContext":"","mustacheAltTags":false,"outputProperties":[],"queue":"none","x":2160,"y":460,"wires":[[]]},{"id":"c1eed9d5.7b0d28","type":"server","name":"Home Assistant","addon":true}]

Außerdem braucht ihr ein paar Helfer:

input_number:
current_light_id:
name: current light ID
initial: 5
min: 0
max: 999
step: 1
input_text:
current_light_entity_id:
name: current light entitiy id
initial: none

Ihr müsst dann im Flow die device_ieee entsprechend eurer Fernbedienung anpassen. Die Entitäten werden automatisch erkannt. Außerdem gibts noch eine kleine Automatisierung, ganz unten.

Fernbedienung

Ich nutze für meine Universalfernbedienung die Tradfri-Fernbedienung „Styrbar“ von Ikea. Diese hat vier Tasten, perfekt für meine Anwendung. Man kann aber auch die mit 5 Tasten nehmen. Die funktioniert in meiner Erfahrung aber etwas unzuverlässiger.

Früher hab ich die Tradfri Bridge benutzt, nun hab ich aber alle Ikea-Tradfri geräte direkt per ZHA eingebunden. Hier mal für Einsteiger die Kurzversion.

ZHA

ZHA ist die Home-Assistant eigene Zigbee-Integration. Ihr braucht hier einen entsprechenden Stick, hier sollte man nicht den billigsten nehmen, da es sonst keine Freude bereitet, wenn immer wieder das Zigbee-Mesh zusammenbricht oder Geräte nicht erreichbar werden. Ich nutze den <$> ConBee 2 </$>, es gibt aber auch schon den <$> ConBee 3 </$> oder eine alternative von <$> Sonoff </$>.

Den Stick steckt ihr einfach in den USB Port vom Raspi und müsst eigentlich nichts weiter machen, sofern dieser korrekt mit der Coordinator Firmware ausgeliefert wurde. Im Home Assistant müssen wir nur die ZHA Integration einrichten. Dazu gehen wir in die Einstellungen – Integrationen und wählen unter Integration Hinzufügen die Zigbee Home Automation:

Bei mir ist das schon aktiviert, daher steht hier Zigbee Gerät hinzufügen.

Wenn die Integration da ist, können wir diese in der Übersicht sehen:

Wenn wir auf die ZHA Kachel klicken, sehen wir nun rechts den Button „Konfigurieren“:

Da klicken wir drauf und danach auf den Button unten rechts „Gerät hinzufügen“

Nun wird nach neuen Geräten gesucht. Damit diese Gefunden werden können, müssen die im Kopplungsmodus sein. An der Ikea Styrbar Fernbedienung müssen wir daher einmal unten den Deckel abmachen und den Pairing Button 4 mal innerhalb von 5 Sekunden drücken. Das ganze sollte in der nähe vom Zigbee Stick passieren. Jetzt nicht direkt daneben, aber je näher, desto besser. Besonders wenn ihr noch kein Mesh etabliert habt.

Dann wird das neue Gerät hoffentlich direkt gefunden. Davon hab ich jetzt leider keinen Screenshot. Eine Übersicht über alle eure Zigbee Geräte findet ihr Wenn ihr auf der Zigbee Kachel auf Geräte geht. Hier findet man z.B. auch den Batterie Status.

NodeRed

Wenn ihr NodeRed noch nicht kennt, lest euch hier meinen NodeRed für Noobs Leitfaden durch.

Wir erstellen uns also einen neuen Flow. ZHA gibt leider nicht direkt sowas wie switch.tradfri-remote-up als Status aus, sondern triggert bei jedem der Buttons ein anderes Event. Daher müssen wir zunächst auf alle Events lauschen und uns dann die device_id (bzw. hier die device_ieee) für die korrekte Fernbedienung notieren. Wir suchen also den Node für Events: all und einen Debug Node:

Im Events Node können wir bei Event Type die Suche auf Zigbee Events mit zha_event beschränken. Server ist natürlich unser Home Assistant. Außerdem mach ich noch ein msg.topic und ein msg.event_type:

Bei beidem kommt der folgende JSONata Code rein:

$outputData("eventData").event_type

Wenn wir jetzt auf unserer Fernbedienung einen Button drücken, sollte rechts im Debug Fenster (Achtung, Debug-Node muss aktiv sein, kleine Flagge rechts) ein Event ausgegeben werden:

Ich hab hier mal die Blöcke ausgeklappt und man findet hier z.B. unter command: „press“. Bei mir ist es der Button nach rechts gewesen.

Das gleiche mache ich nun für den Button nach links:

Hier sehe ich schon das erste Problem: beide Buttons haben den gleichen Command. Das würde für unsere Universalfernbedienung ja in der gleichen Aktion enden. Schauen wir mal was der Button nach oben (mehr helligkeit) sagt:

Hier sehen wir also einen anderen command, was gut ist. Der Wortlaut des command kann bei euch natürlich abweichen, je nach eingesetzter Zigbee Fernbedienung. Ich schau mir noch den Button für nach unten (dimmen) an:

Man kann sich der Vollständigkeit halber auch mal Long-Presses anschauen und auch später was damit machen. Nutze ich hier aber nicht.

Gerät identifizieren

Mein erster Ansatz für meine Universalfernbedienung wäre nun, den einzelnen Button Commands je eigene Befehle zuzuordnen. Wir müssen auch die Fernbedienungen unterscheiden, falls wir mehrere Einsetzen, sonst machen die alle das gleiche. Dazu kann ich einen Switch (unter Funktion, nicht der HA Switch) nutzen.

Hier kann ich Regeln hinzufügen. In Pseudo-Code wäre das in etwa:

wenn ieee == ieee1, dann nimm ausgang 1,
wenn ieee == ieee2, dann nimm ausgang 2,
wenn ieee == ieee3, ...

Ich nutze für diese Unterscheidung die device_ieee die wir aus dem Debug Log rauslesen können. Alternativ würde die unique id oder device id wahrscheinlich auch klappen. Ich drücke also wieder einen Button und schau mal ob das Event am richtigen Ausgang durchkommt. Dazu können wir den Debug Node an verschiedene Ausgänge hängen und immer wieder mit deploy aktualisieren.

Mein Ansatz für die Unterscheidung von links und rechts ist nun Über die Event Arguments, da hier verschiedene Zahlen übertragen werden. Nun nutze ich einen Change Node um mein payload.event.args[0] (hier steht beim Button Links eine 256 und beim Button rechts eine 257) auf payload.event.command zu verschieben.

Hier sehen wir jetzt, dass args nur noch zwei statt 3 Objekte hat und unter event ist command überschrieben worden. So weit so gut. Jetzt haben wir aber das Problem, dass evtl. bei den anderen Buttons der command auch überschrieben wird und hier mit einer Zahl ersetzt wird, die wir garnicht brauchen. Das können wir leicht lösen, in dem wir Prüfen ob in den Args entweder 256 oder 257 steht und hier einen anderen Pfad einschlagen:

Im Hauptpfad wird „command“ auf den Payload verschoben. Im Seitenpfad wird nach der Prüfung „args[0]“ auf Payload verschoben. Damit ich das gut unterscheiden kann, hab ich hier zwei debug nodes mit unterschiedlichen Namen angelegt.

Commands zuordnen

Nun haben wir die nötigen Befehle und können diese nun unterschiedlich weiterverarbeiten. Dazu können wir einfach wieder einen Switch Node nehmen und Payload auf unsere Befehle prüfen.

Bei den Pfeiltasten möchte ich nun alle meine light Entities abrufen, damit ich diese später auswählen kann. Der Zweck meiner Universalfernbedienung ist ja, verschiedene Leuchten mit nur einer einzigen Fernbedienung zu steuern. Dazu gibt es direkt einen Node:

Wir suchen hier dann einfach nach den passenden ID mit dem Filter „starts with“:

So könntet ihr natürlich auch switches miteinbeziehen, oder what ever. Also noch Univeraler gehts nicht.

Befehle zusammensetzen

Nun wird es etwas komplizierter. Ich nutze hier verschiedene Nodes. Aber zuerst mein Ansatz: Ich baue mit einem Funktionsnode ein kleines Script, welches eine Hilfsvariable bei Button Links / Rechts entweder Schritt 1 oder -1 ändert. Dann wird mit einem Loop die entsprechende Position in einem Array rausgesucht und die passende Entity ID aus der vorherigen Liste weitergeschickt. So kann ich mich also durch eine Liste von Entities mit Tastendruck navigieren. Damit ich die ganzen Messages „zeitgleich“ im Funktionsnode haben kann, um diese zu verarbeiten muss ich diese mit einem Join Node zusammensetzen. Dazu brauche ich wiederum Topics. Da ich nichts besseres gefunden habe, um den messages Topics zu geben, nutze ich auch hier einfach den Funktionsnode.

msg.headers = msg.originalHeaders;
msg.topic = "ID";
return msg;

Rechts im Debug sieht man nun vor msg.payload die Bezeichnung ID – das ist das Topic. Außerdem sehen wir meine 20 light Entitäten.

Das gleiche machen wir nun für den Befehl für die Tasten Links/Rechts:

msg.headers = msg.originalHeaders;
msg.topic = "Befehl";
return msg;

Nun kommt ein Join Node, der die Befehle zusammenfügt und nach Topic gliedert. Achtet auch drauf nach der korrekten Anzahl an Nachrichten zu senden:

Im Debug Fenster rechts sehen wir nun auch die Zusammengebaute Message für unsere coole Universalfernbedienung.

Der nächste Node ist die eigentliche Magie, deshalb heißt der auch so. Magic!

msg.headers = msg.originalHeaders;
var ID = msg.payload.ID;
var nr = msg.payload.Befehl;
var u = global.get('homeassistant.homeAssistant.states["input_number.current_light_id"].state');
var newPayload = [];
if (nr == 257){
u = parseInt(u) - 1;
if (u == -1){
u = parseInt(ID.length) -1; 
}
}
if (nr == 256){
u = parseInt(u) + 1;
if (u == parseInt(ID.length)){
u = 0; 
}
}
newPayload.push(String(ID[u].entity_id.split(".")[1])); 
msg.payload = {};
msg.payload.entity = newPayload;
msg.payload.currentID = u;
msg.topic = "entity";
return msg;

Hier ist der Code, der nun die eigentliche Universalfernbedienung darstellt. Aus der Message können wir unsere Bausteine in Hilfsvariablen speichern. Ich lese mir außerdem die aktuelle Position in meiner Liste aus einer input Number ein. (Die legen wir gleich erst noch an, keine Sorge).

Wir löschen den Inhalt der Message, dann schauen wir, welche Taste gedrückt wurde, mit zwei If Funktionen. In diesen gibt es eine Zweite Funktion, um am Ende der Liste wieder am anderen Ende einzusteigen und nicht außerhalb der Liste zu landen.

Dann haben wir noch eine kleine String Manipulation um nur den Namen der Entität ohne den zusatz light. oder switch. dazu zu haben. Am Ende bauen wir unsere neue Nachricht zusammen.

Variablen zwischenspeichern

Im nächsten Schritt speichern wir die Nummer und die Entity-ID in Helfer. Diese legen wir im File-Editor oder in der GUI an.

Zum Speichern nutzen wir den call service Node:

Rechts im Debug sehen wir auch, dass das schon ganz gut funktioniert.

On / Off Button

Fehlt nur noch das eigentliche An und Aus schalten. Dazu starten wir wieder bei unserem switch node, wo wir die Buttons checken. Hier nutze ich einfach wieder einen Funktionsnode mit anschließendem call service Node um den jeweiligen Befehl auszuführen.

msg.headers = msg.originalHeaders;
var ID = global.get('homeassistant.homeAssistant.states["input_text.current_light_entity_id"].state');
msg.payload = {};
msg.payload.entity_id = "light." + ID;
return msg;

Hier lesen wir einfach wieder direkt im Funktionsnode den Wert unseres Helfers, um die gewählte Entität zu finden und basteln dann den String zusammen.

Und im call service node übergeben wir einfach den payload.entity_id als entität.

Das gleiche geht auch fürs ausschalten, nur dass wir den Service anpassen müssen.

Automation

Damit ich jetzt noch weiß, welche Leuchte ich aktuell steuere, hab ich eine kleine Automatisierung aufgebaut, die die aktuelle Leuchte aufblinken lässt. Dazu nutze ich toggle, damit das auch funktioniert, egal ob die Leuchte vorher an oder aus war.

Hier ist der YAML Code dazu:

alias: Mutliremote - blinken bei aktiv
description: Wenn man durch die aktiven Lampen toggelt, soll die aktive kurz blinken
trigger:
- platform: state
entity_id:
- input_text.current_light_entity_id
condition: []
action:
- service: homeassistant.toggle
target:
entity_id: light.{{states("input_text.current_light_entity_id")}}
data: {}
- delay:
hours: 0
minutes: 0
seconds: 0
milliseconds: 500
- service: homeassistant.toggle
target:
entity_id: light.{{states("input_text.current_light_entity_id")}}
data: {}
mode: single

Thats it! Viel Spaß beim weiterentwickeln und nutzen eurer neuen Universalfernbedienung.

$ Die mit einem $ gekennzeichneten Links, sind Affiliate Links. Wenn du über diese in den Shop gelangst und etwas kaufst, bekomme ich eine kleine Provision

Schreibe einen Kommentar

Geb mir einen aus :)

Wenn du das Zeug hier magst, denk doch über eine Spende nach um Server und Domain zu finanzieren.

$ Die mit einem $ gekennzeichneten Links, sind Affiliate Links. Wenn du über diese in den Shop gelangst und etwas kaufst, bekomme ich eine kleine Provision.

Suche & Filter