NEWS
[gelöst] Auf Alexa Routinen in Js "allgemein" reagieren
-
@ahnungsbefreit ich werde es mal die Tage versuchen.
Gibts denn auch noch ne Möglichkeit Text auf einem Mobilen Gerät wieder geben zu können?
Also bspw. Handy Alexa App. Die Stadt ja nicht als device im iobroker -
@ahnungsbefreit bekommt Man aus dem verlinkten Objekt nicht das Objekt der Routine?
Wie bekommt man nun das Device raus? -
@ben1983 Nur die Devices, die Du auch in den Objekten siehst.
-
@ben1983 sagte: Wie bekommt man nun das Device raus?
Wenn Du auf eine bestimmte Routine triggerst, dann sieht die Objekt ID so aus:
alexa2.0.Echo-Devices.<deviceSerNo>.Routines.<RoutineID>
Wenn Du diese Liste auseinandernimmst, kannst Du daraus die OID für die Ausgabe ermitteln. In Blockly sieht das dann z.B. so aus:
-
@ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:
Wie bekommt man nun das Device raus?
on(/alexa2.0.Echo-Devices.*.Routines.*/, function (obj) { log("--->"+obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length)); });
-
@alexi said in Auf Alexa Routinen in Js "allgemein" reagieren:
obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length)
Ich habe es jetzt mal so testweise implementiert.
Die Routine wird ausgelöst, aber er springt nicht in die Funktion. (Es wird nichts geloggt und es erfolgt keine Sprachausgabe.const IdRoutineAussentemperatur = 'alexa2.0.Echo-Devices.*.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e'; on(IdRoutineAussentemperatur,AbfrageAussentemperatur) function AbfrageAussentemperatur(obj) { let ActiveDevice = obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length); log(obj.id); setState("alexa2.0.Echo-Devices." + ActiveDevice + ".Commands.speak", "Das hat funktioniert"); }
-
@ben1983
Nimm's mir nicht übel, aber wenn du Beispiele änderst, dann könntest du den Fehler auch selbst suchen.
Doku: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.mdHinweis: Du definierst in Zeile 2 einen String, willst aber einen regulären Ausdruck:
const IdRoutineAussentemperatur = /alexa2.0.Echo-Devices.*.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e/;
-
@alexi said in Auf Alexa Routinen in Js "allgemein" reagieren:
/alexa2.0.Echo-Devices.*.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e/
Ich dachte das wäre gleich zu behandeln wie das hier... das funktioniert:
on('alexa2.0.History.json', AbfrageSpracheingabe); function AbfrageSpracheingabe(json) { let jsonObj = JSON.parse(json.state.val); let summary = jsonObj.summary; let deviceID = jsonObj.serialNumber; if(summary =="wie ist die aussentemperatur") { setState("alexa2.0.Echo-Devices." + deviceID + ".Commands.speak", "Testausgabe"); } }
Da nehme ich doch auch einen String? und übergebe so die funktion.
sehe den unterschied nicht, warumdas nicht genauso gehen sollte, oder übersehe ich etwas?
Ps. habe auch schon den Ausdruck direkt mit rein genommen und es klappt auch nicht.und beim Einsetzen des Beispiels:
on(/alexa2.0.Echo-Devices.*.Routines.*/, function (obj) { log("--->"+obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length)); });
erfolgt auch kein log
-
@alexi Habe das Problem gefunden. Wenn ich das Sternchen durch ein device ersetze geht es.
irgendwie klappt das mit dem Stern nichtEs funktioniert sogar so:
const IdRoutineAussentemperatur = "alexa2.0.Echo-Devices.G090L911751605VK.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e"; on(IdRoutineAussentemperatur,AbfrageAussentemperatur); function AbfrageAussentemperatur(obj) { setState(obj.deviceId + ".Commands.speak", "Das hat funktioniert"); }
Allerdings nur einmal. Wenn man durch eine Spracheingabe die Routine auslöst, dann wird diese auf true gesetzt.
Leider nicht zurück gesetzt.habe es so gelöst. kann man das so machen, oder spricht was dagegen?
const IdRoutineAussentemperatur = "alexa2.0.Echo-Devices.G090L911751605VK.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e"; on(IdRoutineAussentemperatur,AbfrageAussentemperatur); function AbfrageAussentemperatur(obj) { setState(obj.deviceId + ".Commands.speak", "Das hat funktioniert"); setState('alexa2.0.Echo-Devices.G090L911751605VK.Routines.3dbcea3f-e43c-4f41-a5a9-f724003c898e',false); }
Jetz müsste ich nur noch wissen, wie ich es generisch hin bekomme. Das mit dem Stern scheint ja nicht zu funktionieren.
-
@ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:
irgendwie klappt das mit dem Stern nicht
https://developer.mozilla.org/de/docs/Web/JavaScript/Guide/Regular_Expressions
.* steht in einer RegExp für eine beliebige Anzahl eines beliebigen Zeichens (der Punkt für ein beliebiges Zeichen und der Stern für beliebig viele davon). Warum das bei dir nicht funktioniert, wenn du den Ausdruck in / statt in " einschließt, kann ich dir nicht sagen.
Ganz korrekt müsste der Ausdruck so heißen, und in meinem Test funktioniert sowohl dieser, als auch der einganges genannte:
/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/
-
@ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:
habe es so gelöst. kann man das so machen, oder spricht was dagegen?
Ja. Erstens triggerst du den Trigger durch das Rücksetzen erneut und zweitens führt das auch die Routine ein weiteres Mal aus.
Ich würde das so lösen, bin aber kein Experte mit den Routinen. Wie gesagt, ich bevorzuge die History Variante.
on({id: /^alexa2\.0\.Echo-Devices\..*\.Routines\..*/, val:true}, function (obj) { log("--->"+obj.deviceId.substring(obj.deviceId.lastIndexOf(".")+1,obj.deviceId.length)); setState (obj.id, {val:false, ack:true}); });
Erklärung:
"val: true" im Trigger reagiert nur auf den Wert true
"ack: true" in setState verhindert ein erneutes Ausführen der Routine -
Ganz korrekt müsste es wohl so sein:
on(/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/, function (obj) {
Zufälligerweie funktioniert auch Deine Variante. Aber die würde auch bei einem Objekt mit der ID
alexa2A0BEcho-DevicesBaldistOsternRoutinesUndPfingsten
triggern. der Punbkt soll ja gefunden werden und müsste daher maskiert werden.Mann kann das prinzipiell auch die Namen der Alexa Routinen benutzen.
Irgendwie so:on(/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/, function (obj) { var routine = obj.common.name; log("--->"+routine); if (routine == 'Name einer Routine in Alexa App') { log ("----> zweig 1"); } else if (routine == 'Name einer anderen Routine in Alexa App') { log ("----> Zweig 2"); } else { log ("----> Diese Routine wird nicht in ioBroker behandelt"); } });
EDIT: Überlappt sich mit Alexis Post
-
@ostfrieseunterwegs said in Auf Alexa Routinen in Js "allgemein" reagieren:
Ganz korrekt müsste es wohl so sein:
Ja, ist mir auch aufgefallen, hatte ich in meinen letzten Beiträgen auch schon so geändert. Im ersten allerdings ohne Code Tag, weshalb die Hälfte nicht dargestellt wurde...
Hab jetzt die Code Tags drumrumgemacht. -
@ostfrieseunterwegs said in Auf Alexa Routinen in Js "allgemein" reagieren:
/^alexa2.0.Echo-Devices...Routines../
Danke habe es jetzt so realisiert und es funktioniert einwandfrei:
Danke das hatte erst nicht funktioniert, da es nur reagiert hat bei einem Zustandswechsel und wenn die Routine vorher schon auf true stand, dann ging es nicht mehr.on(/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/,RoutinesChanged); // Abfrage der einzelnen Routinen function RoutinesChanged(obj) { // Erzeugen der Routinen ID let CalledRoutine = obj.common.name; // Abfrage der Außentemperatur if(CalledRoutine == 'Aktuelle Außentemperatur') { // Lese aktuelle Außentemperatur let Aussentemperatur = getState(IdAussentemperatur).val; // Zahl runden Aussentemperatur = Math.round(Aussentemperatur); // Ausgabe der Nachricht an Alexa Device var Ausgabe = ""; Ausgabe = "Die aktuelle Außentemperatur beträgt " + Aussentemperatur + "°C."; setState(obj.deviceId + ".Commands.speak", Ausgabe); setState (obj.id, {val:false, ack:true}); } }
Jetz stellt sich mir nur die Frage, wo finde ich die Struktur, welche hinter dem objekt liegt, welches der Funktion übergeben wird.
--> Damit ich weiß was ich abrufen kann.Kann man auch die ID Abfragen, falls sich der Name der Routine ändert? (Oder ändert sich dann automatisch auch die ID)?
-
@alexi Müsste ich bei solch einer Funktion dann auch den "^/" Operator nutzen?
const IdWirkleistungGesamt = 'modbus.0.holdingRegisters.59027_Wirkleistung_gesamt' on(IdWirkleistungGesamt, WirkleistunGesamtChange);
-
@ostfrieseunterwegs said in Auf Alexa Routinen in Js "allgemein" reagieren:
var routine = obj.common.name;
Oh, das hab ich eben erst gesehen, war mir bisher entgangen. Damit wären die Routinen eine echte Alternative für mich, dachte bisher, ich müsse mit der kryptischen ID arbeiten. Danke!
@ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:
on(/^alexa2\.0\.Echo-Devices\..*\.Routines\..*/,RoutinesChanged);
Du solltest wie oben beschrieben hier noch val:true dazupacken, da der Trigger sonst auch beim Zurücksetzen auf false zieht und du im ungünstigsten Fall in einer Endlosschleife landest, also:
on({id: /^alexa2\.0\.Echo-Devices\..*\.Routines\..*/, val:true}, RoutinesChanged);
@ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:
Jetz stellt sich mir nur die Frage, wo finde ich die Struktur, welche hinter dem objekt liegt, welches der Funktion übergeben wird.
--> Damit ich weiß was ich abrufen kann.Ist in der Doku beschrieben. Außerdem hast du eine prima Hilfe direkt beim Eintippen, die dir alle Möglichkeiten vorschlägt.
@ben1983 said in Auf Alexa Routinen in Js "allgemein" reagieren:
Müsste ich bei solch einer Funktion dann auch den "^/" Operator nutzen?
Was meinst du mit "^/" operator? Wenn du genau auf ein Objekt triggern willst, kannst du das als String machen. Die regulären Ausdrücke kommen erst ins Spiel, wenn du Suchmuster verwenden willst.
-
@alexi said in Auf Alexa Routinen in Js "allgemein" reagieren:
on({id: /^alexa2.0.Echo-Devices...Routines../, val:true}, RoutinesChanged);
OK, danke. dann kann ich die Strings ja so lassen.
Ps. Die Autovervollständigung habe ich jetzt auch gefunden. Leider erscheint diese nicht schon beim „.“ eingeben, sondern erst nachdem ersten Buchstaben, sodass man ja schon wissen muss womit eine Variable anfängt.