NEWS
Ausführung einer Skript Ausführung verzögern
-
Ist es möglich, code verzögert ausführen zu lassen
Beispiel:
log("Anfang"); // Hier die Codezeile, die suche so etwas wie wait(1000); log("Ende 1 Sekunde später);
Ich kenne das Konstrukt setStateDelayed();
Das funktioniert aber nicht, wenn man mehrerer Änderungen an einem gleichen State machen möchte.
Dann wird immer nur die letzte Zuweisung ausgeführt.
Mein Use Case sind Sonos Sprachausgaben.
Es scheint wohl, dass das Queue Management im Sonos Adapter nicht richtig funktioniert, so dass man nicht einfach
mehrere Text2Speechausgaben hineineinander machen kann, sondern diese Ausgaben verzögern muss.
Deshalb möchte ich eine Verzögerung einfügen, die auf den selben State gehen.
-
Hm,
grundsätzlich mit setTimeout …
log("Anfang"); // Hier die Codezeile, die suche so etwas wie wait(1000); setTimeout( function() { log("Ende 1 Sekunde später); }, 1000);
Du kannst aber dem setStateDelayed einen Parameter mitgeben, damit der vorherige Timer eben NICHT überschrieben wird.
setStateDelayed (id, state, isAck, delay, clearRunning, callback)
wenn Du bei clearRunning eine false setzt, das ist per Default true.
Im Beispiel sieht das beim javascript Adapter so aus:
setStateDelayed('Kitchen.Light.Lamp', true, 1000);// Switch ON the light in the kitchen in one second setStateDelayed('Kitchen.Light.Lamp', false, 5000, false, function () { // Switch OFF the light in the kitchen in 5 seconds and let first timeout run. log('Lamp is OFF'); });
Schaltet also die Küchenlampe nach 1s ein und nach 5s aus.
Werner
-
Nach meiner Erfahrung kann es bei SayIt immer wieder auch so zu Verzögerungen kommen. Daher könnte eine Verzögerung im Skript ggf trotzdem nicht ausreichen. Oder aber du setzt die Verzögerung so groß, dass deine Ansage dann natürlich sehr zerrissen ist.
Was spricht dagegen, die Ansage in einem Rutsch zu machen? Du wirst wohl kaum einem 5 minütigem Dialog zuhören, oder?
-
Super. Danke für die sehr gute Erklärung.
Ich hatte bei dem Sonos Adapter und langen Texten eine Fehlermeldungen "file to short" oder so etwas ähnliches.
Es scheinen nur Texte mit ca. 4-5 Sekunden vernünftig zu funktionieren.
PS: Habe gerade nochmal mit einer anderen Say Instanz getestet, die System benutzt. Hier das gleiche.
Fehlermeldung, wenn der Text zu lang ist:
sayit.4 2017-06-21 16:36:05.588 error Cannot get file: received file is too short
-
Die Länge des Text hängt vom Text2Speech Konverter ab.
Ich hatte vorher Google benutzt und habe mit Cloud.0 experimentiert und damit lassen sich viel
längere Texte konvertieren, so dass der Vorschlag von tempestas umsetzbar ist.
-
Genau, wollte ich dir gerade schreiben aber du hast es ja schon rausgefunden.
Google macht glaube ich nach 70 Zeichen Schluss und gibt dann die (sinnlose) Nachricht aus, dass die Nachricht zu kurz wäre..