NEWS
Alexa-NodeRed-Script
-
Hi Leute,
Ich hab seid Tagen ein Problem mit meinem Testlauf der Datenauslesung über Alexa.
Ich schalte über Alexa den "Status" an. (Befehlswort - wie Licht genutzt)
Hierfür hab ich bei NodeRed eine Verküpfung wie ein Licht angelegt.
Dies funktioniert bei den Lichtern im Haus auch, daher denke ich nicht das hier ein Fehler liegt.
Das Objekt auf das das Script triggert ist erstellt und der Objekt.State ändert sich hier auch, da er sich von False auf True ändert. ( z.B. Alexa - Status an )
Wenn ich den Datenpunkt manuell ändere erhalte ich auch die SayIt Durchsage wie gewollt.
Leider passiert dies nicht, wenn der State über Alexa - NodeRed geändert wird.
Vielleicht kann mir hier einer helfen, da ich den Fehler irgendwie nicht finde - scheint ein Denkfehler im Code irgendwie zu sein.
Danke schonmal vorab
Hier mein Code:
var idSayIt = "sayit.0.tts.text"; // Hier die entsprechende SayIt Text ID var trigger = "javascript.0.ALEXA.TempData"; //Objekte auf daß, das Skrift auslöst var lastSay = null; // ansagetext, sind die TempDaten // Quellen var idTemperatursensor = "hm-rpc.0.NEQ1382432.1.TEMPERATURE"/*HM-WDS10-TH-O NEQ1382432:1.TEMPERATURE*/ var idTemperatursensor2 = "hm-rpc.0.NEQ1523315.1.TEMPERATURE"/*KME - EG-Wohnzimmer.TEMPERATURE*/ function ermitteleAnsageTemperatur () { // Die Außentemperatur ist xx. Das Wetter heute ist xx // Einfache Temperaturansage mit SayIt. // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht // "Es sind 18 Punkt 2 Grad " sagt. var temperatursensor = getState(idTemperatursensor).val; var temp_string = temperatursensor.toString(); log('Temp ' + temp_string); var temp_array = []; temp_array = temp_string.split("."); // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist. // Es wird dann nur "18" gelesen. if (!temp_array[1]) { temp_array[1] = "0"; log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt."); } return{ 'Ganzzahl' : temp_array[0], 'Nachkommazahl' : temp_array[1] }; } function ermitteleAnsageTemperatur2 () { // Die Außentemperatur ist xx. Das Wetter heute ist xx // Einfache Temperaturansage mit SayIt. // Variante 1 mittels splitten der Temperatur, damit die Ansage nicht // "Es sind 18 Punkt 2 Grad " sagt. var temperatursensor = getState(idTemperatursensor2).val; var temp_string = temperatursensor.toString(); log('Temp ' + temp_string); var temp_array = []; temp_array = temp_string.split("."); // Fange leere Nachkommastellen ab. Das passiert, wenn die Temperatur z. B. 18.0 ist. // Es wird dann nur "18" gelesen. if (!temp_array[1]) { temp_array[1] = "0"; log("Die Nach-Kommastelle in temp_array[1] war nicht vorhanden und wird nun fest auf 0 gesetzt."); } return{ 'Ganzzahl' : temp_array[0], 'Nachkommazahl' : temp_array[1] }; } // TempDaten melden var ansagetext = "Temperatur Garten " + ermitteleAnsageTemperatur().Ganzzahl + "," + ermitteleAnsageTemperatur().Nachkommazahl + " Grad." //+ ". Es ist" + ermitteleAnsagedatum().Stunde + " Uhr und " + ermitteleAnsagedatum().Minute + " Minuten." + " Temperatur Wohnbereich " + ermitteleAnsageTemperatur2().Ganzzahl + "," + ermitteleAnsageTemperatur2().Nachkommazahl + " Grad." ; //+ " : "+ ermitteleGeburtstage() +" ."; subscribe({id:"javascript.0.ALEXA.TempData", val: true}, function (obj) { if (!lastSay || ((new Date()).getTime() - lastSay)) { lastSay = (new Date()).getTime(); setState (idSayIt, "de;90;" + ansagetext); } // Nach 1 Sek setTimeout(function () { setState(trigger, false); }, 1); });
-
Hi Leute,
` > Im Log hab ich fesgestellt, daß er immer folgendes ausgibt anstatt eine Sprachnachricht zu senden:
javascript.0 2018-08-11 18:41:02.400 info script.js.Test.TempDatenAnsagen: registered 2 subscriptions and 0 schedules
Was bedeutet "registered 2 subscriptions and 0 schedules" ?
Hier schein das Problem zu liegen. `
Ne, das wars auch nicht
-
// Nach 1 Sek setTimeout(function () { setState(trigger, false); }, 1); ```` `
Das ist nicht 1 s sondern 1 ms ! Wert ändern in 1000 !
-
Hi Paul,
danke für deinen Support,
aber an dem Timeout liegt es nicht.
Er ändert den Datenpunkt auf "True" aber reagiert nicht darauf.
Er reagiert nur wenn ich den Datenpunkt manuell auf "True" setze. Dann funktioniert das Timeout auch und der DP wird auf "False" zurückgesetzt.
Merkwürdig, hab ne Log-Kontrollzeile, aber er geht gar nicht erst in den Bereich:
subscribe({id:"javascript.0.ALEXA.TempData", val: true}, function (obj) { if (!lastSay || ((new Date()).getTime() - lastSay)) { lastSay = (new Date()).getTime(); setState (idSayIt, "de;90;" + ansagetext); log('DatenTrigger registriert'); } // Nach 1 Sek setTimeout(function () { setState(trigger, false); }, 1000); });
-
Problem gelöst :lol: