NEWS
Jalousien mit Alexa bedienen
-
Ich habe einen State definiert, den ich per Alexa als Signal für das Hoch- und Runterfahren meiner Jalousien benutzen möchte.
Damit der State als Jalousie erkannt wird, habe ich das JSON (RAW) von einer Homematic Jalousie genommen und in den State kopiert.
Außerdem natürlich den entsprechenden Namen und den Parameter _id geändert. So sieht die Definition aus.
{ "from": "system.adapter.javascript.0", "ts": 1532358240973, "common": { "name": "Jalousien", "type": "number", "unit": "%", "role": "level.blind", "workingID": "WORKING", "def": 0, "min": 0, "max": 100, "read": true, "write": true, "smartName": { "de": "Jalousien" } }, "native": { "CONTROL": "BLIND.LEVEL", "ID": "LEVEL", "TYPE": "FLOAT", "UNIT": "100%", "DEFAULT": 0, "FLAGS": 1, "MAX": 1, "MIN": 0, "OPERATIONS": 7, "TAB_ORDER": 0 }, "acl": { "object": 1636, "owner": "system.user.admin", "ownerGroup": "system.group.administrator", "state": 1636 }, "_id": "javascript.0.Jalousien", "type": "state" }
Damit kann ich in dem cloud Adapter auch ein Smart Device definieren, dass sich wie eine Jalousie verhält. Auch Alexa erkennt den State als Jalousie und ich kann das Kommando sprechen "Jalousien hoch" bzw. "Jalousien runter".
Jetzt ist mir aufgefallen, dass die Kommandos den Wert von dem State um 25 erhöhen bzw. erniedrigen und nicht auf 0 bzw. 100 setzen.
Das Erhöhen bzw. Erniedrigen wird nicht gemacht, wenn jeweils 0 oder 100 erreicht wurde.
Dieses Verhalten macht im Detail Probleme, weil das Kommando "hoch" bzw. "runter" von Natur absolut ist und nicht relativ. Wenn ich z.B. 100 erreicht habe, also alle Jalousien hoch sind, und ich dann nochmal "hoch" sage, verändert sich der Wert nicht. Jetzt könnte man sagen, wenn die Jalousien hoch sind, dann sind sie hoch, was willst Du denn. Der Use Case ist, dass wenn eine Jalousie manuell heruntergefahren wurde, dann möchte ich trotzdem, dass nochmal hoch gesendet wurde.
Wenn nicht dagegen spricht, würde ich bitten, dass man die Werte 0 und 100 überträgt und nicht Inkremente um 25.
-
Ok. Ich habe jetzt in meinem Script einen Workarround eingebaut, mit dem es geht.
var Jalousien_block = false; on({id: "Jalousien",change: "any"}, function(obj) { if (!Jalousien_block) { Jalousien_block = true; log("Jalousien hat den Wert " + getState("Jalousien").val); if (getState("Jalousien").val > 50) { log("Jalousien im Untergeschoss werden hochgefahren"); setState(KU_Jal_Nord,100); setState(WZ_Jal_West,100); setState(WZ_Jal_Sued,100); } else { log("Jalousien in Untergeschoss werden heruntergefahren"); setState(KU_Jal_Nord,0); setState(WZ_Jal_West,0); setState(WZ_Jal_Sued,0); } setTimeout( function() {Jalousien_block = false;}, 1000); setState("Jalousien",50); } });