NEWS
[gelöst] Auf Alexa Routinen in Js "allgemein" reagieren
-
@alexi Direkt in Node Red kann man ein virtuelles Gerät von Alexa anlegen.
Dem Kann ich über die Routinen dann bspw. jeweils eine id senden. (Habe es mit einer Virtuellen Lampe gelöst, der ich 0-100% vorgebe.
Somit wären die Routinen völlig losgelöst vom Text in der Sofware handlebar.Geht sowas bei IO Broker auch?
Am besten wäre, wenn man in der Alexa Schnittstelle für die Routinen eine ID bekommt und welches Gerät diese verursacht hat.
Alternativ eben ein Virtuelles Gerät, aber auch hiermüsste man bestenfalls wissen, von wem das kommt,
denn stößt man bspw. routinen über die App an, dann steht dies leider nicht in der History. und eben auch kein Text. -
@ben1983
Ich verstehe ehrlich nicht so recht, was du vorhast ...
Ich nutze das so:- Routine mit Trigger Sprache in der Alexa App anlegen
Diese Routine kann dann auch schon Aktionen (ohne ioBroker) erledigen, muss sie aber nicht. - Nach obigem Beispiel den Text des Sprachtriggers abfragen und dort beliebige Aktionen und Sprachausgaben machen
Dabei kann man jetzt abhängig vom Gerätename (jsonObj.name) z.B. die Heizung raufregeln und abhängig von die aktuelle Raumtemperatur auf dem Echo mit der ID jsonObj.serialNumber sagen lassen.
Evtl. kannst du mal ein Beispiel geben, was du konkret vorhast bzw. schon umgesetzt hast.
- Routine mit Trigger Sprache in der Alexa App anlegen
-
@alexi Ja da hast Du recht.
Wenn ich allerdings in IO Broker den Text abfrage, dann kann ich diesen in der Alexa App nie mehr ändern.
Vielleicht passt mir ein Wort nicht, oder man möchte es doch mal mit einem anderen Satz erledigen.Wenn man hier einfach eine Routinen ID in IO broker abfragen könnte, dann wäre man freier und müsste nicht den Text genauso, wie er in der routine ist abfragen.
Das ist meine intention.
-
@ben1983 Du kannst auch auf Routinen triggern. Jede Routine hat eine fixe ID und aus der Objekt ID des Triggers kannst Du Dir die Serial Number des Alexa-Devices holen. Ich nutze das in Blockly, lege "Dummy" Routinen in Alexa an und scripte dann die Ausführung.
-
@ahnungsbefreit
Generisch würde das in JS so gehen:on(/alexa2.0.Echo-Devices.*.Routines.*/, function (obj) { log("--->"+obj.id); });
Aus der ID kann man dann die Serial Number gewinnen und die kryptische Routinen-ID.
Die kann man natürlich auswerten, aber dann müsste man ja mit der ID jeder Routine, die man behandeln will, vergleichen.Oder legst du dir für jede Routine und Gerät einen eigenen Trigger an?
-
@alexi die Routine hat auf jedem Device die gleiche ID, deswegen ersetzt Du den zweiten Stern gegen die ID der Routine, auf die Du triggern willst
-
@ahnungsbefreit
Ja, das würde gehen. Mir persönlich ist aber der Weg über die History lieber, da muss ich mich nicht mit den kryptischen Routine-Namen rumschlagen. In meinem Fall hätte ich außerdem etwa 70 Trigger, die ich anlegen müsste. Da ist mir der Textvergleich innehalb des Registry Triggers sympatischer.
Aber evtl. hat @Ben1983 ja damit eine Lösung, die für ihn passt. -
@alexi ich habe auch erst über den Text-Vergleich mit History gearbeitet aber bei mir zumindest hat das nicht immer funktioniert, manchmal wurde in der History das Device erst zu spät aktualisiert und dann kommt die Antwort am falschen Device raus. Ich meine mich übrigens zu erinnern, dass auch der Entwickler des Alexa2 Adapters den Weg über Routinen empfohlen hat und von History abrät. Aber wenn es funktioniert, warum nicht?
-
@ahnungsbefreit said in Auf Alexa Routinen in Js "allgemein" reagieren:
History das Device erst zu spät aktualisiert und dann kommt die Antwort am falschen Device raus.
Hast du da die States history.summary und history.serialNumber ausgewertet? Ich nehme ja den state history.json, der beides (und zusätzlich noch den Device-Namen) beinhaltet. Hatte noch nie den Fall, dass im Trigger ein Attribut nicht aktuell war.
-
@alexi Ja, vielleicht lag's daran.
-
@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\..*/