NEWS
Über scriptEnabled triggern verboten. Aber wie richtig?
-
Hi,
was daran falsch ist, kann ich Dir leider nicht sagen. Aber in diversen anderen Threads zum thema Script starten wird genau das empfohlen: hier oder hier.
Vielleicht schreibt ja @apollon77 was die korrekte Vorgehensweise wäre.
Gruss, Jürgen
-
@Wildbill
Die korrekte Arbeitsweise ist es einen Datenpunkt typ Logik anzulegen.Diesen Daten punkt bei Bedarf ändern und das programm darauf triggern
-
Hi,
so läuft es ja auch mit den Scripts normalerweise. Ich selbst verwende auch nur Skripts, die ich entweder immer aktiv habe, oder nur zum Archivieren deaktiviert in einem separaten Ordner vorhalte.
Aber wenn das Script, wie der TE ja schreibt, sich selbst wieder beendet, dann würde ja ein Ändern des Triggers danach nicht mehr erkannt und das Skript für alle Ewigkeit stehen bleiben? Oder ist es gar nicht vorgesehen, dass Skripte, die in Verwendung sind, beendet und automatisch gestartet werden?Gruss, Jürgen
-
@Wildbill sagte in Über scriptEnabled triggern verboten. Aber wie richtig?:
Oder ist es gar nicht vorgesehen, dass Skripte, die in Verwendung sind, beendet und automatisch gestartet werden?
So ist es.
Ich verstehe nicht warum ein Skript beendet wird. -
Gut, das ist dann wenigstens eine Aussage.
Dann wäre es also am TE seine Skripte dementsprechend anzupassen, dass sie auf einen Trigger nur eine Aktion ausführen und anschliessend untätig auf den nächsten Trigger warten. So, wie ich es eigentlich auch nur kenne: Trigger --> evtl. Abfrage weiterer Bedingungen --> Aktion --> Warten auf den nächsten Trigger....@ramses : Vielleicht verlinkst Du ja zu dem entsprechennden Thread oder beschreibst hier nochmal, wie genau Deine Skripte ablaufen. Dann kommt bestimmt ein Tipp, wie es korrekt aussehen und funktionieren sollte.
Gruss, Jürgen
-
Hi,
Korrekt. Man legt sich im Bereich vom JavaScript-Adapter einen eigenen State an (Rolle zB Button oder Switch je nachdem was man braucht). Das nutzt man dann zum triggern und setzt es entsprechend. Im JavaScript "subscribed" man dann auf die Änderung dieses States und baut Da seine Logik ein.
-
@apollon77
Nur noch mal zur Nachfrage, damit ich es auch richtig verstanden habe:
Ich lege mir erst mal mit createState einen State unter dem Javascript Adapter an z.b. mit dem Wert False.
Dann Verbinde ich den Datenpunkt mit dem Iobroker Output in Node-Red um es Alexa zugänglich zu mache.
Und als letztes mach ich noch ein subscribe mit change: true oder any und einer if-Abfrage auf den Datenpunkt. Wobei der Change Wert immer True betragen muss weil das Script kein False/Aus benötigt.Dann könnte/muss das Script natürlich auch permanent laufen.
Habe ich das als Nichtprogrammierer alles so richtig verstanden/zusammengefasst?
Achja, das Script kann ich natürlich beilegen. Ist nur eine simple Werteabfrage über Alexa:
var RAUMNAME='Kinderzimmer' var TEMP1 = getState('netatmo.0.Micha.Kinderzimmer.Temperature.Temperature').val; var CO1 = getState('netatmo.0.Micha.Kinderzimmer.CO2.CO2').val; var HUMIDITY1 = getState('netatmo.0.Micha.Kinderzimmer.Humidity.Humidity').val var LASTALEXA = 'alexa2.0.Echo-Devices.'+getState('alexa2.0.History.serialNumber').val+'.Commands.speak' if (CO1>1000){ setState(LASTALEXA, '40;Die Temperatur beträgt ' + TEMP1 + ' Grad. Die Luftfeuchtigkeit beträgt ' + HUMIDITY1 + ' Prozent. Das Zimmer sollte gelüftet werden.' ),5000; } else { setState(LASTALEXA, '40;Die Temperatur beträgt ' + TEMP1 + ' Grad. Die Luftfeuchtigkeit beträgt ' + HUMIDITY1 + ' Prozent. Das Zimmer muss nicht gelüftet werden.' ),5000; } stopScript();
-
var gSpotKueche = "G070RQ000000002K"; var gSpotWecker = "G070RQ0000000049"; on({id:"javascript.0.alexa.rolladen.sonneblendet",change:'any'}, function (obj) { var ID = getState("alexa2.0.History.serialNumber"); var lAusgabeEcho = "alexa2.0.Echo-Devices." + ID.val + ".Commands.speak"; if (ID.val == gSpotKueche) { setState("javascript.0.alexa.rolladen.Alexabefehl", 'KuecheSonne'); setState(lAusgabeEcho, 'Warte kurz, ich fahre die Rollade in der Küche herunter!'); } if (ID.val == gSpotWecker) { setState("javascript.0.alexa.rolladen.Alexabefehl", 'SchlafenSonne'); setState(lAusgabeEcho, 'Warte kurz, ich fahre die Rollade im Schlafzimmer herunter!'); } });
Das mal als Beispiel wie ich es gemacht habe als ich noch 2 Spots hatte.
Das Change:'any' bedeutet das er auf jede Änderung reagieren soll. Hat den Vorteil das ich die bool-Variable am Ende der Ausführung nicht wieder auf "false" setzen muss (das wäre aber konsequenter)
Das script liegt einfach nur da und reagiert nur auf eine Änderung des Datenpunkts "sonneblendet" den ich mir irgendwo unterhalb von javascript.0 angelegt habe. Einfach über den Reiter Objecte.
Man könnte aber auch createState nutzen um den Datenpunkt anzulegen. -
@htrecksler
Das sieht meinem ja doch sehr ähnlich bis auf die on change sache.. aber schön, dann habe ich es ja doch richtig verstandenVielen Dank
-
Meine Empfehlung: Packe alles, was das Skript tun soll, in eine Funktion und anstelle von stopScript() verwendest Du einen Datenpunkt-Trigger. Prinzip:
function meineFunktion() { // hier der Ausführungs-Code } on({id: idTrigger}, meineFunktion);
-
Wenn Dein Script nur einmal getriggert werden soll, kannst Du noch einen zweiten Datenpunkt anlegen, der als Flag benutzt wird und anzeigt, ob Dein Script schon mal gelaufen ist.
Ich benutze das im Zusammenhang mit einem Bewegungsmelder: Wenn abends der erste am Bewegungsmelder vorbei geht, lasse ich Alexa Termine für den Nächsten Tag ansagen z,B. Mülltermine und so. Aber natürlich soll das nicht jedesmal anlaufen, wenn jemand durch den Flur geht. Also nach dem ersten Aufruf ein Flag setzen, und das dann nachts wirder auf false... -
@OstfrieseUnterwegs
Hatte mich da ein wenig unglücklich ausgedrückt. Es soll so oft getriggert werden wie man möchte, aber halt durch Alexa-Zuruf. Denke die On change any variante ist da tatsächlich die glücklichste und einfachste.
Aber deine Idee mit dem Bewegungsmelder gefällt mir! Zwar nicht für Terminansagen aber für anderes. Ich klau mir die Idee mal -
Also, ich habe jetzt alles so umgesetzt wie ihr es vorgeschlagen habt, aber der Fehler ist geblieben.
Wenn ich das Script trigger, springt alexa2.0.History.name und alexa2.0.History.serialNumber kurz auf die richtige Alexa (von wo der Aufruf erfolgte) und springt dann manchmal einfach um auf irgendeine andere und gibt es letztendlich im falschen Raum aus.Beispiel: alexa2.0.History.name steht auf Badezimmer. Ich trigger im Wohnzimmer das Script.
Alexa2.0.History.name springt um auf Wohnzimmer und eine Sekunde danach zurück auf Badezimmer oder manchmal auch Küche. Ist er einmal aus dem Tritt, kann ich im Wohnzimmer das Script so oft triggern wie er will, er gibt es dann z.b. immer in Küche aus.
Frage ich Alexa dann im Wohnzimmer z.b. nach der Uhrzeit, ist er wieder im Tritt und die Ausgabe erfolgt beim nächsten Trigger richtigerweise im Wohnzimmer. Dieser Fehler tritt so jedes 10. Mal auf.
Alles sehr verwirrend.Kann es sein, dass es ein Timing Problem ist ?
Ich merke, dass vor allem die Dots nicht mal dazu kommen ihr "OK" zu beenden. Habe es jetzt testweise mal mit einem setStateDelayed,1000 versucht. Ob das was gebracht hat, wird sich im Laufe der Tage zeigen. Bis jetzt konnte ich ihn nicht mehr aus dem Tritt bringen.Hier das geänderte Script, vielleicht fällt einem ja syntaktisch ein Fehler auf (bitte keine Optik-Korrekturen)
on({id:"javascript.0.klima.kinderzimmer",change:'any'}, function (obj) { var TEMP1 = getState('netatmo.0.Micha.Kinderzimmer.Temperature.Temperature').val; var CO1 = getState('netatmo.0.Micha.Kinderzimmer.CO2.CO2').val; var HUMIDITY1 = getState('netatmo.0.Micha.Kinderzimmer.Humidity.Humidity').val; var LASTALEXA = 'alexa2.0.Echo-Devices.'+getState('alexa2.0.History.serialNumber').val+'.Commands.speak'; if (CO1>1000){ // setState(LASTALEXA, '40;Die Temperatur beträgt ' + TEMP1 + ' Grad. Die Luftfeuchtigkeit beträgt ' + HUMIDITY1 + ' Prozent. Das Zimmer sollte gelüftet werden.' ); setStateDelayed(LASTALEXA, '40;Die Temperatur beträgt ' + TEMP1 + ' Grad. Die Luftfeuchtigkeit beträgt ' + HUMIDITY1 + ' Prozent. Das Zimmer sollte gelüftet werden.',1000); } else { // setState(LASTALEXA, '40;Die Temperatur beträgt ' + TEMP1 + ' Grad. Die Luftfeuchtigkeit beträgt ' + HUMIDITY1 + ' Prozent. Das Zimmer muss nicht gelüftet werden.' ); setStateDelayed(LASTALEXA, '40;Die Temperatur beträgt ' + TEMP1 + ' Grad. Die Luftfeuchtigkeit beträgt ' + HUMIDITY1 + ' Prozent. Das Zimmer muss nicht gelüftet werden.',1000); } });
PS: Just mit abschicken dieses Posts, hab ich Sie auch mit setStateDelayed aus dem Tritt gebracht
-
@ramses
hier mal ein Auszug eines Blocklys (nur eine Temperaturabfrage). In der Alexa App eine Routine mit: Alexa, wie ist die Temperatur im Garten. Angestoßen wird ein eigener Datenpunkt.
Ist zwar ssml und nicht speak, aber sonst der gleiche Vorgang.
(Garten und Ansage sind Variablen die weiter oben im Script angelegt sind---sind hier nicht im Code-Ausschnitt sichtbar)on({id: 'javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Ansagen.05Temperaturansage_Garten', change: "any"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Garten = getState("javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Temperaturen.06Garten").val; Ansage = ['<speak><voice name="Alexa">','draussen im Garten sind, ',Garten,'Grad.','</voice></speak>'].join(''); // Echo Küche if (getState("alexa2.0.History.name").val == 'Küche') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Echo Wohnzimmer if (getState("alexa2.0.History.name").val == 'Wohnzimmer') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Echo Gästezimmer if (getState("alexa2.0.History.name").val == 'Gästezimmer') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Echo Schlafzimmer if (getState("alexa2.0.History.name").val == 'Schlafzimmer') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Echo Badezimmer if (getState("alexa2.0.History.name").val == 'Badezimmer') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Echo Keller-Flur if (getState("alexa2.0.History.name").val == 'Keller-Flur') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Echo Flur if (getState("alexa2.0.History.name").val == 'Flur') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Echo Werkstatt if (getState("alexa2.0.History.name").val == 'Werkstatt') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } // Gäste WC if (getState("alexa2.0.History.name").val == 'Gäste WC') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); } });
-
@dslraser
Oh, mit den Routinen habe ich mich noch nie beschäftigt, verstehe aber das Prinzip.
Glaube nur, es wird auf das Selbe hinauslaufen, da du auch mit (getState("alexa2.0.History.name) die letzte aktive aufrufst und bei mir der Wert dort dann einfach schon falsch ist.Habe einfach mal direkt nach dem on change any , die Abfrage nach alexa2.0.History.name gemacht und schon dort war sie dann gegebenenfalls falsch.
Aber danke für den Hinweis auf die Routinen. "Wie ist das Klima im Kinderzimmer?" klingt defintiv besser als "Aktiviere Klima Kinderzimmer" -
@ramses sagte in Über scriptEnabled triggern verboten. Aber wie richtig?:
Aber danke für den Hinweis auf die Routinen. "Wie ist das Klima im Kinderzimmer?" klingt defintiv besser als "Aktiviere Klima Kinderzimmer"
Nur wegen der individuellen Fragestellung nutze ich Routinen. "Schalte Temperatur im Garten an" oder sowas ist, na ja....
Temperaturen kann ja iot/cloud im Grunde auch ohne Script ansagen, aber ich habe für mich ein Script in dem Hans und Vicki (Stimmen) die Temperaturen aller Räume nacheinander und im Wechsel mit den Stimmen ansagen. Ist nicht so langweilig... -
@dslraser
Auch wenn das jetzt absolut off-topic ist. Das musst du mir bitte genauer erklären. Stimmenwechsel?
Ich glaube die halbe Alexa-Welt ist scheinbar an mir vorbeigezogen. Geht dieser Stimmenwechsel nur über ssml?
Wäre toll wenn du dazu mal was Javascript-Code zeigen würdest. Blockly macht mich kirre -
@ramses
ja, über ssmlhier mal ein Ausschnitt
on({id: 'javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Ansagen.01Temperaturansage_gesamt', change: "any"}, function (obj) { var value = obj.state.val; var oldValue = obj.oldState.val; Schlafzimmer = getState("javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Temperaturen.01Schlafzimmer").val; Wohnzimmer = getState("javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Temperaturen.02Wohnzimmer").val; Badezimmer = getState("javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Temperaturen.03Badezimmer").val; Flur = getState("javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Temperaturen.04Flur").val; G_C3_A4stezimmer = getState("javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Temperaturen.05Gästezimmer").val; Garten = getState("javascript.0.Eigene_Datenpunkte.01Alexa2Ansagen.Temperaturen.06Garten").val; Ansage = ['<speak><voice name="Hans">','','','Los gehts. ','Im Wohnzimmer sind,',Wohnzimmer,'Grad.','</voice><voice name="Vicki">','im Badezimmer sind,',Badezimmer,'Grad.','</voice><voice name="Hans">','im Gästezimmer sind,',G_C3_A4stezimmer,'Grad.','</voice><voice name="Vicki">','im Flur sind, ',Flur,'Grad.','</voice><voice name="Hans">','im Schlafzimmer sind, ',Schlafzimmer,'Grad, ','</voice><voice name="Vicki">','und draussen im Garten sind, ',Garten,'Grad.','</voice><voice name="Alexa"><prosody volume="+6dB">','Das wäre dann alles .','</prosody>','</voice></speak>'].join(''); // Wohnzimmer if (getState("alexa2.0.History.name").val == 'Wohnzimmer') { setState("alexa2.0.Echo-Devices.xxx.Commands.ssml"/*ssml*/, Ansage); }
Das sind die Ansagen im Wechsel mit Hans und Vicki und zum Schluss eine Lautstärke Erhöhung mit der Ansage durch Alexa mit: das wäre dann alles.
-
sehr schön. Danke dir.
So ich glaube ich hab meinen Fehler gefunden. Ich wohne in einem Altbau mit 3m hohen Wänden. Hier schallt es oftmals ein wenig. Es scheint so, 2 andere Alexas hören meine Stimme auch und springen deshalb hin und her und geben dann im falschen Raum aus. Wenn ich die Alexa mit ihrem Namen "anflüster" so das definitiv nur eine reagieren kann, ist es bisher nicht mehr vorgekommen (300 Versuche -morgen bin ich heiser).
Lustigerweise ist sowas zb noch nie vorgekommen bei anderen Befehlen wie Musikwiedergabe und Co. -
@dslraser
Hab jetzt mal so eine Routine gemacht. Kann man unterbinden, dass eine Ansage wie "Alexa, wie ist das Klima im Kinderzimmer" nicht mit OK quittiert?