NEWS
[Problem] Ungewollte SayIt-Ansage nach ioBroker-Neustart
-
Hallo,
ich habe fogendes sayIt-Skript bei mir laufen:
var idSayIt = "sayit.0.tts.text"; var date; // EG Flur SV Tablet Kamera on({id: "hm-rega.0.2727", val: true}, function(){ setState(idSayIt, 'de;100;Achtung. Ihr Einbruch wurde registriert und wir haben bereits die Polizei verständigt.'); }); // CCU CUxD Timer Abwesenheit.WORKING on({id: "javascript.0.AlarmCountdown", change: "gt"}, function(obj){ setState(idSayIt, 'Achtung. Alarmanlage in '+obj.state.val+' Sekunden scharf. Zum Entschärfen Haustür aufschließen.'); }); // Heizungsanlage Betriebsart on({id: "viessmann.0.get.VitoBetriebsart", change: "ne"}, function(obj){ date = new Date(); if((6 < date.getHours()) && (date.getHours() < 23)){ setState(idSayIt, 'Betriebsart der Heizunmgsanlage auf '+obj.state.val+' geändert.'); } }); // Heizungsanlage Partybetrieb on({id: "viessmann.0.get.VitoBetriebParty", change: "ne"}, function(obj){ date = new Date(); if((6 < date.getHours()) && (date.getHours() < 23)){ if(obj.state.val === "aus"){ setState(idSayIt, 'Partybetrieb der Heizungsanlage ausgeschaltet.'); } if(obj.state.val === "an"){ setState(idSayIt, 'Partybetrieb der Heizungsanlage eingeschaltet.'); } } }); // Heizungsanlage Sparbetrieb on({id: "viessmann.0.get.VitoBetriebSpar", change: "ne"}, function(obj){ date = new Date(); if((6 < date.getHours()) && (date.getHours() < 23)){ if(obj.state.val === "aus"){ setState(idSayIt, 'Sparbetrieb der Heizungsanlage ausgeschaltet.'); } if(obj.state.val === "an"){ setState(idSayIt, 'Sparbetrieb der Heizungsanlage eingeschaltet.'); } } });
Nach einem reboot des Raspi bzw. einem Neustart von ioBroker werden jedes Mal die beiden letzten Ansagen "Partybetrieb der Heizungsanlage ausgeschaltet." und "Sparbetrieb der Heizungsanlage ausgeschaltet." auf meinem Tablet ausgegeben, obwohl sich deren Zustand eigentlich gar nicht geändert hat (ist immer aus). Nun ergeben sich zwei Fragen:
1. Wieso erfolgt nicht auch eine Ansage zur Betriebsart?
2. Wie kann ich die Ansagen nach einem Neustart vermeiden?
Gruß,
Thorsten
-
Vermutlich startet das Skript bevor der Vitotronic-Adapter seine Initialisierung beendet hat.
@dtp:Wie kann ich die Ansagen nach einem Neustart vermeiden? `
Vielleicht hilft es, das Skript (mit Hilfe eines separaten Skriptes) zu stoppen und verzögert wieder zu starten. Habe mal getestet und festgestellt, dass stopScript('Scriptname') leider nicht funktioniert. Versuche es mal so:var obj = getObject('script.js.Skriptname'); obj.common.enabled = false; setObject('script.js.Skriptname', obj); // Skript stoppen setTimeout(function() { runScript('Skriptname'); }, 10000); // nach 10 s wieder starten
-
Anderer Vorschlag: Eine Freigabeverzögerung nach Skriptstart einbauen:
var idSayIt = "sayit.0.tts.text"; var date; var startDelay = false; setTimeout(function() { startDelay = true; }, 10000); ...
und dann die Abfragen erweitern:
if((6 < date.getHours()) && (date.getHours() < 23) && startDelay){
-
Hallo paul53,
vielen Dank für die Hilfe. Doch leider kommen die Ansagen immer noch. Nun entsprechend verzögert. Gibt es keine Möglichkeit, den Neustart von ioBroker abzufragen und dann eine entsprechende if-Abfrage einzufügen?
Gruß,
Thorsten
-
@dtp:Gibt es keine Möglichkeit, den Neustart von ioBroker abzufragen und dann eine entsprechende if-Abfrage einzufügen? `
Genau das passiert mit der zusätzlichen Auswertung von startDelay. Da mit ioBroker-Neustart alle Adapter und somit alle Skripte gestartet werden, wird startDelay erst auf false und nach 10 s auf true gesetzt. Folglich können Wertänderungen der Vitotronic-Datenpunkte innerhalb der ersten 10 s nach ioBroker-Neustart keine Reaktion (sayit) auslösen.