NEWS
Skript mit Alexa starten
-
Hallo Forum,
ich versuche gerade einen Skript mit Alexa zu starten. Will eine Wechselschaltung bedienen, einer der beiden Schalter ist ein Homematic Funkaktor. Wollte mir dafür ein Skript anlegen. Das Skript habe ich im Cloud Adapter eingefügt und ich glaube, es wird auch per Sprachbefehl ausgeführt. Ich weiß aber nicht auf welches Event ich triggern soll (es passiert nichts), das Event ist ja eigentlich der Aufruf der Skripts. Code derzeit:
on({id: 'hm-rpc.0.NEQ1648255.1.STATE', val: true}, function () { x = (getState("hm-rpc.0.NEQ1648255.1.STATE").val == true) ? false : true; setState("hm-rpc.0.NEQ1648255.1.STATE", x); });
Kann mir da wer weiterhelfen? Könnte mir vorstellen eine Art "Dummyevent" zu kapern…
Außerdem will der Cloud Adapter einen "An/Aus" Parameter, vllt weil in meinem Script auf ein Boolsches Event getriggert wird? Da ich bei der Wechselschaltung nicht wissen kann, ob bei State == true das Licht brennt oder nicht wäre es mir am liebsten, dass ich nur den Skriptnamen im Cloudadapter aufrufen muss, also z.B. "Alexa, schalte Küchenlicht".
Schonmal Danke fürs lesen
Edit: Das Skript macht natürlich nicht nichts, es schaltet das Licht beim betätigen des Schalters wieder an bzw aus, nur wenn ich es mit Alexa aufrufe macht es natürlich nichts weil das Event nicht ausgelöst wird
-
on({id: 'hm-rpc.0.NEQ1648255.1.STATE', val: true}, function () { x = (getState("hm-rpc.0.NEQ1648255.1.STATE").val == true) ? false : true; setState("hm-rpc.0.NEQ1648255.1.STATE", x); }); ```` `
NEQ1648255.1 ist Dein Taster?
Und das Skript oben macht was?
Geht das Licht auch an und aus, wenn das Skript gestoppt ist?
Ich kenne den Homematic-Wechselschalter leider nicht.
Außerdem will der Cloud Adapter einen "An/Aus" Parameter, vllt weil in meinem Script auf ein Boolsches Event getriggert wird? Da ich bei der Wechselschaltung nicht wissen kann, ob bei State == true das Licht brennt oder nicht wäre es mir am liebsten, dass ich nur den Skriptnamen im Cloudadapter aufrufen muss, also z.B. "Alexa, schalte Küchenlicht". `
Um das an/aus wirst Du aus meiner Sicht nicht herumkommen.
Ist das denn ein Problem?
Wenn Du siehst, dass das Licht an ist, sagst Du halt "schalte das Licht aus" und umgekehrt.
Beide Fälle funktionieren dann zwar, aber es fühlt sich dann richtig an.
Was nicht funktioniert ist, dass Du den richtigen Zustand triffst, wenn Du den aktuellen Zustand nicht sehen kannst.
Edit: Das Skript macht natürlich nicht nichts, es schaltet das Licht beim betätigen des Schalters wieder an bzw aus, nur wenn ich es mit Alexa aufrufe macht es natürlich nichts weil das Event nicht ausgelöst wird `
Du kannst einen Datenpunkt anlegen, der von Alexa angesprochen wird (an/aus).
Egal, was von Alexa kommt, lässt Du dann den Schalter den Zustand wechseln.
-
Alexa Trigger-Datenpunkt anlegen
-
diesen Datenpunkt überwachen und bei Änderung:
-> den Status des Schalters auslesen und Zustand wechseln
-
-
Versuch mal (ungetestet):
var logOn = true; // Logausgabe im Skript var forecreation = false; // true: Datenpunkte werden überschrieben (wenn z.B. Bezeichnungen geändert wurden) var pfad = "Alexa" + "."; // Pfad in dem die Datenpunkte angelegt werden // Datenpunktnamen: var idTriggerWechselschalter = pfad + 'Wechselschalter'; var idWechselschalter = "hm-rpc.0.NEQ1648255"; createState(idTriggerWechselschalter, false, forecreation, { name: 'Alexa Trigger für den Wechselschalter', desc: 'Alexa Trigger für den Wechselschalter', type: 'boolean', unit: '', role: 'value' }); on({id: "javascript."+instance+"."+idTriggerWechselschalter ,change:'any'}, function (obj) { if(logOn) log("Alexa-Trigger für Wechselschalter erkannt"); setState(idWechselschalter+".1.STATE",(getState(idWechselschalter+".1.STATE").val ? false : true)); });
Den neuen Datenpunkt javascript.0.Alexa.Wechselschalter (wenn das Skript in Instanz 0 läuft) im Cloud Adapter hinzufügen und den Smartnamen "Küchenlicht" geben.
Bei "Alexa, schalte Küchenlicht ein" oder "Alex, schalte Küchenlicht aus" sollte jeweils der Trigger angesprochen werden und der Status vom Küchenlicht wechseln.
-
Die Zeile:
setState(idWechselschalter+".1.STATE",(getState(idWechselschalter+".1.STATE").val ? false : true));
kann noch gekürzt werden:
setState(idWechselschalter+".1.STATE",!getState(idWechselschalter+".1.STATE").val);
-
Hallo ruhr70,
hat geklappt, tausend Dank! Es reicht sogar, "Alexa schalte Küchenlicht" zu sagen, ein "ein" oder "aus" will Alexa nicht zwingend.
Könntest du vllt. kurz erklären, was dabei passiert?
createState legt einen Datenpunkt an? Was ist ein Datenpunkt? Ist das eine Art Variable? Das Skript triggert auf das Event, wenn der Datenpunkt geändert wird? Warum wird der Datenpunkt verändert, wenn er durch den Cloudadapter aufgerufen wird?
Fragen über Fragen, sorry
-
Ich sehe schon ich muss meine Doku verbessern
Aber wie erkläre ich es?
Ein Datenpunkt ist ein Objekt in der Struktur von ioBroker in das Daten (Werte) geschrieben werden.
(Ist auch nicht besser, oder?)
Sieh dir mal im Admin den Reiter Objekte an. Alles was kein Ordner ist, ist ein Datenpunkt, meist State oder auf Deutsch Zustand genannt.
Hoffe geholfen zu haben.
Solltest du das mal verstanden haben, würde ich mich freuen, wenn du es dann versuchst zu erklären.
Gruß
Rainer
-
Könntest du vllt. kurz erklären, was dabei passiert?
createState legt einen Datenpunkt an? Was ist ein Datenpunkt? Ist das eine Art Variable? `
dann mal kurz…
Ein Datenpunkt ist ein Objekt, in dem es auch einen Bereich gibt, in dem Werte gespeichert werden können, wie in einer Variable.
Das Anlegen mit createState() wird hier beschrieben:
https://github.com/iobroker/ioBroker.ja … reatestate
Statt dem createState, wie es oben im Skript steht, wäre z.B. auch folgendes möglich:
createState("Alexa.Wechselschalter",false);
Damit würde ein Datenpunkt/Objekt mit der ID "javascript.0.Alexa.Wechselschalter" angelegt, mit dem Wert false.
Ich habe beim anlegen des Objektes im Skript noch mehr Infos übergeben (es gibt noch viel mehr). Die längere Version des createState() aus dem Skript hat ein Datenpunkt/Objekt mit der ID "javascript.0.Alexa.Wechselschalter" mit folgendem Inhalt angelegt:
{ "common": { "name": "Alexa Trigger für den Wechselschalter", "desc": "Alexa Trigger für den Wechselschalter", "type": "boolean", "unit": "", "role": "value" }, "native": {}, "type": "state", "_id": "javascript.2.Alexa.Wechselschalter", "acl": { "object": 1638, "state": 1638 } }
Das sind die Infos, die ich immer mindestens vorbereitet habe, auch wenn sie hier zum Teil nicht nötig sind. Es gibt noch mehr Informationen, die man mit anlegen lassen kann, wie z.B. min und max (kleinster möglicher Wert, größter möglicher Wert), einer Liste möglicher Werte, nur lesbar, usw.
Die Beschreibung der möglichen Felder findest Du hier:
https://github.com/ioBroker/ioBroker/bl … A.md#state
Ich gebe aus Gewohnheit immer folgende Infos mit an:
name: Der lesbare Name des Objekt, der auch im Admin unter Objekte angezeigt wird.
desc: eine längere Beschreibung des Objekts, in unserem Fall identisch mit dem Namen
type: welcher Datentyp wird im Objekt (Wert) gespeichert (boolean, number, string, mixed)
unit: eine Einheit. Sie wird dann hinter dem Wert im Admin mit angezeigt
role: auch "nur eine Bezeichnung. Welche Rolle hat das Objekt, z.B. um im Admin zu filtern
Du kannst die Objekte auch im Admin unter Objekte manuell erstellen.
Dazu das "Plus" oberhalb der Objektliste drücken.
Ich habe dies z.B. unter cloud.0 gemacht, um die Rückmeldungen von Alexa in ein Objekt zu speichern und weiterzuverarbeiten.
Ich habe mich dazu entschlossen, alle Objekte innerhalb des dazugehörigen Skriptes zu machen, so dass ich Skript und Objekt nicht getrennt anfassen muss. Andere Anwender legen die Objekte per Hand an.
Das Skript triggert auf das Event, wenn der Datenpunkt geändert wird? Warum wird der Datenpunkt verändert, wenn er durch den Cloudadapter aufgerufen wird? `
Alexa ordnet anhand des gesprochenen Smartnamen über den Cloud-Adapter das dazugehörige Objekt zu.
Wenn Du nun einen Homematic Schalter nimmst, dann kannst Du diesem im Cloud Adapter hinzufügen und einen Smartnamen, sagen wir z.B. "Stehlampe" geben. Ein Homematic Gerät ist wieder ein Objekt in ioBroker, in dem an einer Stelle (.1.STATE) auch der Zustand gespeichert wird und verändert werden kann.
Wenn Du nun "Stehlampe ein" sagst, schickt Alexa ein on (true), der über den Cloud-Adapter über den Smartnamen den Homematic (hm-rpc.0.) Datenpunkt mit true beschreibt.
Einen einfachen Homematic-Schalter kannst Du also ohne Umweg direkt für Alexa zuweisen.
Da Dein Wechselschalter aber den Zustand ändern muss (toogle), sind wir den Umweg über ein weiteres Objekt gegangen. Du hast nun dem Javascript Datenpunkt/Objekt in Alexa zugewiesen und dieser Datenpunkt wird nun von Alexa geändert (ein = true, aus = false und seit heute wissen wir, dass Alexa ein false schickt, wenn Du weder ein noch aus sagst).
Auf diesen neuen Datenpunkt triggern wir nun und wenn Alexa ihn anspricht, wird über das on() der Zustand Deines Schalters ausgelesen und mit dem ! davor der bisherige Zustand negiert.
-
Sieh dir mal im Admin den Reiter Objekte an. Alles was kein Ordner ist, ist ein Datenpunkt, meist State oder auf Deutsch Zustand genannt. `
Nur Objekte vom Typ "state" (Zustand) sind Datenpunkte. Es gibt noch eine Vielzahl anderer Objekt-Typen.Datenpunkte unterscheiden sich von anderen Objekten dadurch, dass sie neben statischen Bestandteilen (z.B. common, nativ, …) auch dynamische Bestandteile (state, oldState) haben.
Die statischen Bestandteile kann man im Admin-Reiter "Objekte" sehen und auch verändern. Auf die statischen Bestandteile greift man lesend mit der Javascript-Funktion getObject(id) zu.
Die dynamischen Bestandteile der Datenpunkte enthalten Elemente wie val (Wert), ts (Zeitstempel), lc (Zeitpunkt der letzten Änderung), ack (bestätigt) … Auf den dyn. Bestandteil state greift man lesend mit der Javascript-Funktion getState(id) zu; schreibend mit der Funktion setState(id, val), wobei auch oldState aktualisiert wird.
An die callback-Funktion von on(…) werden sowohl die statischen Bestandteile als auch die dynamischen Bestandteile des Datenpunktes übergeben. Es ist die einzige Möglichkeit, die Elemente von oldState abzufragen.
-
Hallo zusammen,
ibims
Der neue. (sagt man glaube ich heute so ;-))
Tolles Forum und tolle Beiträge. Genau wie dieser hier.
Leider bin ich auch noch Newbie (Iobroker & Scripte)
Ich bin nun auch stolzer Besitzer von 3 Alexas und IoBroker & Homematic.
Alles verknüpft und alles läuft soweit… aber die Ansprüche steigen
Mein Problemchen....
Ich würde gerne zum Beispiel: "Alexa schalte den Fernseher ein/aus" sagen.
In der Alexa App würde ich gerne eine Routine erstellen, die dann auch gleich Licht etc. anpasst)
Soweit klappt das auch (Routine mit licht1 und licht2...) aber dann:
Dann soll je nach dem ein Java Script "AN" ((Vu+ Duo2) per http request einschalten.)
oder Java Script "AUS" ((Vu+ Duo2) per Http request ausschalten) starten.
Ich weiss das es einen VU+ Adapter gibt aber den kann ich ja nicht in meine Alexa Routine einbinden oder?
Dank der Artikel hier habe ich es auch geschafft die VU+ mit einem Java script einzuschalten.
Aber wie unterscheide ich ob von Alexa ein Fernseh einschalten oder ein Fernseh ausschalten kommt.
Bräuchte quasi ein:
If alexa "Fernseh + einschalten" then "http request EIN"
If alexa "Fernseh + ausschalten" then "http request AUS"
Also "Fernseh" ist der trigger und EIN und AUS der Zustand.
Aber wo & wie bekomme ich diese her?
Vielleicht denke ich auch einfach falsch oder habe einen knoten im Hirn.
Vielen Dank schon mal. bin für jeden Tipp offen.
-
Ich weiss das es einen VU+ Adapter gibt aber den kann ich ja nicht in meine Alexa Routine einbinden oder? `
Ich kenne den Adapter nicht, aber üblicherweise gibt es Datenpunkte für diverse Aktionen. Diese bindest du als Smart-Geräte in Alexa ein. Dann musst du in die Routine nur einbauen, dass er den Datenpunkt (Gerät) für Power auf an stellt (oder den für AN, oder welchen es auch immer gibt).Dank der Artikel hier habe ich es auch geschafft die VU+ mit einem Java script einzuschalten.
Aber wie unterscheide ich ob von Alexa ein Fernseh einschalten oder ein Fernseh ausschalten kommt. `
Du brauchst einen Datenpunkt "Fernseh" der true/false kennt und bindest diesen als Smart-Gerät ein. Alexa setzt diesen per Sprache auf true (an)/false (aus).Im Javascript reagierst du dann auf Aktualisierung des Datenpunkts. Wenn er true ist => "http request an", wenn er false ist => "http request aus". Hierzu gab es in letzter Zeit einige Threads, bemühe einfach mal die Suche.