NEWS
Ohne Cloud: Alexa nur mittels Adapter steuern?
-
Hi,
mal eine Frage an Euch, ich stehe wahrscheinlich auf dem Schlauch.
Es wird ja hier vielfach im Forum diskutiert, wie man die Alexa auch ohne Cloud anbinden kann.
U.a. hier mit Lösung in NodeRed, was ich auch bislang so mache: Alexa Anbindung ohne Cloud und SkillAber geht es nicht viel einfacher?
Der Alexa-Adapter bietet ja unterhalbalexa2.0.History
Infos zum letzten Sprachbefehl, der an einer Alexa gegeben wurde.Hier mal ein Script als Beispiel.
Sobald "Drucker an" oder "Drucker einschalten" gesagt wird, kommt eine Ausgabe im ioBroker-Log und Alexa antwortet an dem Alexa-Gerät, auf dem der Befehl gegeben wurde. Hier könnte dann auch einfach ein Datenpunkt einer Steckdose etc. gesetzt werden.
Kann jeder im JavaScript-Adapter so mal testen.on({ id:'alexa2.0.History.json', change: 'any'}, function(stateObjHistory) { // Wir holen uns den Inhalt der Alexa-History JSON in ein Objekt let historyObject = JSON.parse(stateObjHistory.state.val); // == TODO== Noch zu prüfen, ob das überhaupt sinnvoll ist // Nur bei "Success" weitermachen. if(historyObject.status !== 'SUCCESS') return; if(historyObject.summary == 'drucker an' || historyObject.summary == 'drucker einschalten') { log('Der Drucker soll eingeschaltet werden.') // Hier nun beliebigen Code ausführen, z.B. eine smarte Steckdose einschalten. // setState('0_userdata.0.Steckdosen.Drucker', true); // Jetzt Sprachausgabe auf der Alexa, von der das Kommando kam. setState('alexa2.0.Echo-Devices.' + historyObject.serialNumber + '.Commands.speak', 'Hi von ei ow Broker. Ich habe den Drucker eingeschaltet.'); } });
Also warum so kompliziert mit Cloud-Adapter, NodeRed, usw., wenn es mit dem Alexa-Adapter viel einfacher geht?
Oder übersehe ich hier was? -
Hier noch ein Beispiel, wie man alle Sprachbefehle in einer Javascript-Konfig-Variable anlegen kann.
Das Script braucht sicherlich noch mehr Validierungen. Außerdem sollte es auch über die Konfig ermöglichen, Funktionen aufzurufen (statt Datenpunkt setzen). Außerdem sollte Sprachausgabe erst kommen, wenn der State acknowledge=true zurückgibt.Alles nur ein erster Test
/** * command: Sprach-Befehl, auf den reagiert werden soll. * setStateId: Dieser Datenpunkt wird gesetzt. Leer lassen '', falls kein Datenpunkt gesetzt werden soll. * setStateVal: Wert, der in setStateId gesetzt werden soll. Z.B.: true, false, 50, 100, usw. * confirmMessage: Die Alexa, von der der Sprachbefehl kam, gibt dann diesen Text per Sprache aus, sobald der Befehl abgesetzt und der Datenpunkt geschaltet wurde. * Leer lassen '', falls kein Text ausgegeben werden soll. */ const CONFIG = [ {command:'drucker an', setStateId:'hue.0.Plug_Drucker.on', setStateVal:true, confirmMessage:'Ich habe den Drucker eingeschaltet.'}, {command:'drucker einschalten', setStateId:'hue.0.Plug_Drucker.on', setStateVal:true, confirmMessage:'Hi von ei ow Broker. Ich habe den Drucker eingeschaltet.'}, {command:'drucker aus', setStateId:'hue.0.Plug_Drucker.on', setStateVal:false, confirmMessage:'Hi von ei ow Broker. Drucker ausgeschaltet.'}, {command:'drucker ausschalten', setStateId:'hue.0.Plug_Drucker.on', setStateVal:false, confirmMessage:'Hi von ei ow Broker. Drucker ausgeschaltet.'}, ]; // Ab hier nichts mehr ändern. on({ id:'alexa2.0.History.json', change: 'any'}, function(stateObjHistory) { // Wir holen uns den Inhalt der Alexa-History JSON in ein Objekt let historyObject = JSON.parse(stateObjHistory.state.val); // == TODO== Noch zu prüfen, ob das überhaupt sinnvoll ist // Nur bei "Success" weitermachen. if(historyObject.status !== 'SUCCESS') return; for (let lpConfig of CONFIG) { if(lpConfig.command.toLowerCase() == historyObject.summary.toLowerCase()) { // Setze Datenpunkt if(!isLikeEmpty(lpConfig.setStateId)) { setState(lpConfig.setStateId, lpConfig.setStateVal); } // Jetzt Sprachausgabe auf der Alexa, von der das Kommando kam. if(!isLikeEmpty(lpConfig.confirmMessage)) { setState('alexa2.0.Echo-Devices.' + historyObject.serialNumber + '.Commands.speak', lpConfig.confirmMessage); } } } }); /** * Checks if Array or String is not undefined, null or empty. * 08-Sep-2019: added check for [ and ] to also catch arrays with empty strings. * @param inputVar - Input Array or String, Number, etc. * @return true if it is undefined/null/empty, false if it contains value(s) * Array or String containing just whitespaces or >'< or >"< or >[< or >]< is considered empty */ function isLikeEmpty(inputVar) { if (typeof inputVar !== 'undefined' && inputVar !== null) { let strTemp = JSON.stringify(inputVar); strTemp = strTemp.replace(/\s+/g, ''); // remove all whitespaces strTemp = strTemp.replace(/\"+/g, ""); // remove all >"< strTemp = strTemp.replace(/\'+/g, ""); // remove all >'< strTemp = strTemp.replace(/[+/g, ""); // remove all >[< strTemp = strTemp.replace(/]+/g, ""); // remove all >]< if (strTemp !== '') { return false; } else { return true; } } else { return true; } }
-
@Mic Ich fange auch gerade damit an, mich in den iobroker in Verbindung mit dem Echo einzuarbeiten. Momentan setzte gerade die Steuerung des Staubsaugers über den von dir beschriebenen Weg über alexa2.0.History um, damit er z.B. einzelne Räume reinige.
Die ersten Tests klappen gut. Mich stört nur etwas, dass der angesprochene Echo immer erstmal sagt, dass er nicht weiß, was ich meine und dann die Ansage bringt, die ich ihm vom iobroker schicke. Weißt du, wie man das umgeht?
-
Über einen Dummy im IOT Adapter .
Steht hier im Forum schon irgendwo .
Meine, es war in einem Thread bezüglich Roborock oder Mi Home Vacuum. -
Ich hab mich mit dem Ganzen auch schon ne Weile auseinandergesetzt und versucht, für etwas komplexere Sachen als An-Aus ne elegante Lösung zu finden.
Das Problem ist aus meiner Sicht schlicht und ergreifend, dass man die Serverantworten von Amazon auf dem Echo nicht unterdrücken kann. Alexa wird dir also bei einem ihr unbekannten Gerät oder einer unbekannten Funktion immer zuerst antworten, dass sie nicht weiß, wie sie dir helfen soll. Ich hab auch nach mehreren Stunden rumprobieren nicht geschafft, dass sie nichts antwortet.
Eine möglicher Lösungsansatz, den ich versucht hatte war den Kurz-Antwort-Modus einzuschalten. Hab es nicht mit allen Szenarien ausprobiert, weil es für mich generell nicht so interessant war ihn auf Dauer zu aktivieren.
Lange Rede, kurzer Sinn: Schalten kannst du natürlich dein Smart Home über das Auslesen der Summary, aber letztlich werden die Antworten von Alexa halt nicht immer passen, wenn ihr was nicht passt.
Aber bitte korrigier mich jemand, sollte es doch eine Lösung dafür geben!
-
man kann doch eine Routine in der app anlegen bspw. wenn du sagst ich gehe duschen, Antwort OK.
Steuern dann über Summary
-
@Adnim sagte in Ohne Cloud: Alexa nur mittels Adapter steuern?:
man kann doch eine Routine in der app anlegen bspw. wenn du sagst ich gehe duschen, Antwort OK.
Steuern dann über Summary
Oh, stimmt, das könnte gehen. Werde ich heute Abend gleich mal probieren.
-
@Adnim Können kann man schon. Man kann auch einen Blueprint Skill "Frage & Antwort" machen. Für 2-3 Sachen hab ich das auch gemacht, aber zum einen musst du das dann ja für jeden einzelnen Befehl machen, denn du ausprogrammieren willst. Zum Anderen antwortet Sie dann immer "Ok" oder deinen gewünschten Antwortsatz, auch wenn etwas nicht funktioniert. Ist also auch nicht ganz ideal.
-
@Tictactoo sagte in Ohne Cloud: Alexa nur mittels Adapter steuern?:
Man kann auch einen Blueprint Skill "Frage & Antwort" machen.
Das ist auch eine Idee. Bisher hab ich mich immer gefragt, was man mit den Blueprints anfangen soll.
-
Also meine Erfahrungen sind genau die, wie von Einigen hier geschrieben.
Auch das mit den Routinen geht so, aber ich habe auch gelesen, das die Routinen so ca. auf 100 begrenzt sind. So viele hatte ich zwar noch nie, aber ein User hat schon mal genau das geschrieben, das er dann keine weiteren Routinen mehr anlegen konnte. -
Hier ist so ein Testbeispiel in Blockly, allerdings nicht über den JSON (Hier werden einige Datenpunkte unter 0_userdata.0 angelegt, mit Deinem Script)
So nutze ich dann über ssml verschiedene Stimmen. Wer das probieren möchte, einfach das Blockly importieren und starten. (Erlaube das Kommando "setObject" im Javascript Adapter muß ein Haken drinn sein, sonst werden keine Datenpunkte angelegt)Wenn das Blockly gestartet ist:
Alexa, testansage . (einfach das Wakeword und testansage sagen)
-
@dslraser Dein Blockly hat mir vor ein paar Tagen sehr geholfen! Allerdings habe ich mich erstmal auf den "speak"-Teil beschränkt, um mich einzuarbeiten. Wenn alles läuft, steige ich auf den ssml-Teil um. Die verschiedenen Stimmen sind schon ne feine Sache
-
@dslraser
"Setze Lautsprecher auf 100" ist ein wenig heftig, oder? -
@padrino
ist auch nur ein "Testbeispiel" -
@dslraser
Eben, gerade da könnte es den unbedarften Tester kalt erwischen...
Wollte es nur als "kleine Warnung" erwähnt haben. -
Ein kleiner Tipp meinerseits (ich weiß leider nicht, ob man den auf Blocky anwenden kann), aber ich hab es bei der Anfrage in Javascript wie folgt gelöst:
if (summary.toLowerCase().includes("stehlampe") && summary.toLowerCase().includes("an"))
Man hat dadurch zwar etwas mehr Code am Ende drin stehen. Dafür ist man aber bei der "Spracheingabe" durch Alexa deutlich flexibler, da der Code dann nicht nur bei "Stehlampe an", sondern auch bei "Schalte die Stehlampe an" reagiert.
-
@Tictactoo sagte in Ohne Cloud: Alexa nur mittels Adapter steuern?:
Man kann auch einen Blueprint Skill "Frage & Antwort" machen.
Das ist auch eine Idee. Bisher hab ich mich immer gefragt, was man mit den Blueprints anfangen soll.
Die Idee mit den Blueprints bei Alexa ist machbar, Allerdings ist das Einrichten seht träge.
-
Nutze auch Blueprints, da ich kein Android5+ Gerät habe, daher gibt's für mich keine Routinen...
Schade nur, dass mann immer eine Antwort eintragen muss, manschmal wäre mir Stille lieber.
Übrigens, gestern ist mir zum ersten Mal aufgefallen, dass amzon wohl (inzwischen?) Trigger sperrt.
Wollte mir im Blueprint "lauter" und "leiser" anlegen, da kam die Info, dass sie für Alexa reserviert sind.
Bisher konnte ich eigentlich alles "überschreiben".
Sind die zwei auch für Routinen gesperrt? -
@padrino
ich habe "mach lauter" und "mach leiser" genommen. Nur lauter und leiser in Routinen geht auch nicht. -
@Mic Hi, zum Thema warum so kompliziert, mit Node Red, aus deinem ersten Beitrag.
Das ist meiner Meinung nach nicht kompliziert. Ich bin fast komplett zu Node-Red umgestiegen, kann meine ganzen Scripte darüber erstellen, brauche also keinen Script Adapter mehr, der ja Arbeitsspeicher ohne Ende frist. Ich brauche keine Cloud, es gibt ja für Node Red die Amazon Echo Node, ich brauche keine Telegramm Adapter, kein Speech2Text, es gibt ja die Chatbot Nodes, ich brauche keinen Amazon Dash Button Adapter, dafür gibts auch Node Red Nodes, ich brauche keine Vis, dafür hat Node Red das Dashboard. Und vieles mehr. Mein Node Red verbraucht nur 60 MB Arbeitsspeicher. Im Gegensatz dazu würden der Script Adapter, der Telegramm Adapter, Speech2Text, die Vis, der Dashbutton Adapter bestimmt um die 400 MB für verbauchen. Und ich habe alles unter einem Hut. Wenn man erst mal im Thema drin ist, ist Node Red eher viel einfacher als die anderen Sachen.