NEWS
Mehrere Befehle an Alexa und Hue - wie am besten?
-
Hi, ich habe immer mal wieder Probleme, wenn ich in meinen Skripten mehrere Befehle an Alexa oder Hue schicke und würde gerne mal wissen, was ich da besser machen kann.
Beispiel 1:
Ich habe mehrere Echos und möchte beispielsweise auf allen im 1. Stock ein Announcement machen. In meinem Skript habe ich dann:setState("alexa2.0.Echo-Devices.xxxxxxxx.Commands.announcement", "irgendein Text"); setState("alexa2.0.Echo-Devices.yyyyyyyy.Commands.announcement", "irgendein Text"); setState("alexa2.0.Echo-Devices.zzzzzzzz.Commands.announcement", "irgendein Text");
Manchmal kommt es dann vor, dass nur ein oder zwei der Befehle ausgeführt werden und nicht alle drei Echos das Announcement sprechen. (klar, ich könnte hier die drei Echos zu einer Gruppe zusammenfassen, aber mir geht es ums Prinzip.)
Beispiel 2:
Ich habe in drei verschiedenen Zimmern Hue-Strips und sie sollen bei einem bestimmten Ereignis 5 Sekunden lang in einer bestimmten Farbe blinken. Wenn sie vorher eingeschaltet werden, will ich mir das jeweilige Setting merken und nach dem Blinken wiederherstellen. Ich habe dazu eine Funktion geschrieben, die ich für die drei Zimmer aufrufe:function blinkHueStrip(room) { if (room == "wzVorne") { var stripID = "hue.0.Fernsehlicht"; } else if (room == "wzHinten") { var stripID = "hue.0.Wandlicht"; } else if (room == "büro") { var stripID = "hue.0.Schreibtisch"; } var stripOn = getState(stripID+".on").val; var stripColormode = getState(stripID+".colormode").val; var stripLevel = getState(stripID+".level").val; if (stripColormode == "ct") { var stripCT = getState(stripID+".ct").val; } else { var stripR = getState(stripID+".r").val; var stripB = getState(stripID+".b").val; var stripG = getState(stripID+".g").val; } setState(stripID+".command", '{"transitiontime": 0, "ct": 3200, "level":90}'); setStateDelayed(stripID+".alert", "lselect", 700, false); setStateDelayed(stripID+".alert", "none", 5700, false); if (stripOn == false) { setStateDelayed(stripID+".command", '{"transitiontime": 5, "on":false}', 5750, false); } else { if (stripColormode == "ct") { setStateDelayed(stripID+".command", '{"transitiontime": 25, "level":' + stripLevel + ', "ct":' + stripCT + '}', 5750, false); } else { setStateDelayed(stripID+".command", '{"transitiontime": 25, "level":' + stripLevel + ', "r":' + stripR +', "b":' + stripB +', "g":' + stripG + '}', 5750, false); } } }
In den meisten Fällen funktioniert das, aber immer wieder scheint es so, als werden manche Befehle verschluckt und nicht ausgeführt.
Ich habe auch schon mit
setStateDelayed
gearbeitet und die Funktion etwas zeitversetzt für die drei verschiedenen Zimmer aufgerufen, aber das hat nicht wirklich etwas gebracht.Wie kann ich das denn besser machen? Wie geht ihr damit um, wenn ihr mehrere Befehle an Alexa oder Hue senden wollt? Hab schon von den asynchronen Befehlen gelesen - kann das vielleicht helfen?
-
@markusmac
Ich habe das bei mir oft gelöst das ich eher viele kleine Skripte statt einem großen einsetze.Also hängt an einem Datenpunkt nicht ein Skript das bei einer Änderung 3 andere Geräte ansteuert sondern 3 Skripte, für jedes Gerät eines (on - Befehl)
Ja, das widerspricht auch meinem inneren Monk, dafür arbeiten die Skripte parallel. Die Pflege macht das natürlich nicht einfacher.
Unabhängig davon: Du setzt die Werte in deinen Beispielen nur, versuch es doch mal mit steuern (Acknowledge), eventuell bekommt die andere Seite es sonst nicht richtig mit.
setState("alexa2.0.Echo-Devices.xxxxxxxx.Commands.announcement", "irgendein Text", true);
So wie ich die Hilfe verstanden habe wird damit ein Adapter aktiv zur Ausführung/Beachtung aufgefordert.
-
@bananajoe Danke für den Hinweis, das probiere ich mal aus!