NEWS
[gelöst] Script wird nicht immer ausgeführt
-
Hallo,
ich habe mich nun entschieden, meine Blockly-Scripte in JS neu zu schreiben. Dabei habe ich folgendes Script für die Nachttemperatur erstellt:
function SchlafzimmerNacht(){ let ScheduleSchlafzimmerNacht; let ort = 'Schlafzimmer'; let textContent = 'Nachttemperatur startet.'; if (ScheduleSchlafzimmerNacht) { clearSchedule(ScheduleSchlafzimmerNacht); ScheduleSchlafzimmerNacht = null; }; ScheduleSchlafzimmerNacht = schedule('0 15 23 * * *', function () { if (getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Allgemein.Arbeitsmodus").val != 3 && getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Allgemein.Arbeitsmodus").val != 4) { if (getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Fenster_Status").val == true) { setState("hm-rpc.1.000A1BE99F98AD.1.SET_POINT_TEMPERATURE", getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nachttemperatur").val); Whatsapp_Nachricht(ort, textContent); } else { setState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Temperatur_speichern_Fenster", getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nachttemperatur").val); }; } }); }; on({id: 'javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nacht-Beginn.Zeit_veraendert', val: true}, function () { SchlafzimmerNacht(); setState('javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nacht-Beginn.Zeit_veraendert', false); });
Der Trigger hat derzeit keine echte Funktion, da ich aktuell noch eine feste Zeit beim schedule hinterlegt habe ("Zeit_veraendert" ist aber ein existierender Datenpunkt, den ich manuell auf true setzen kann). Ansonsten soll einfach abends die vorgegebene Temperatur eingestellt werden, wenn das Fenster geschlossen ist. Ist es geöffnet, wird die Temperatur in einen Datenpunkt geschrieben. Die Abfrage von "Arbeitsmodus" dient nur zur Unterscheidung von Arbeit, Urlaub etc. Die Funktion "Whatsapp_Nachricht" ist in einem Script beschrieben, dass ich im Ordner "global" erstellt habe. Das ganze läuft auf einem Raspberry Pi 3B+.
Mein Problem ist, dass das Script anfangs getriggert wurde, nun aber nicht mehr. Auch wenn ich "Zeit_veraendert" auf true setze, zeigt das Log nichts an, der Datenpunkt wechselt aber sofort wieder zu false bzw. bleibt auf false (ich sehe nicht, dass er sich auf meine Eingabe hin tatsächlich ändert). Ich weiß nicht, wo das Problem liegt. Spätestens durch den Trigger ab Zeile 25 müsste ich doch das Script zumindest starten können?
-
- es ist davon auszugehen das das Skript durchaus läuft - allerdings bekommst du nur zu einer ganz bestimmten Zeit eine Rückmeldung - wenn der schedule läuft.
- das undefinierten des schedule funktioniert so nicht, du musst die Variable
SheduleSchlafzimmerNacht
Außerhalb der Funktion definieren. - du solltest dir eine log Ausgabe in die Funktion einbauen damit du siehst das sie läuft.
A.
-
Vielen Dank, jetzt läuft es auch!
Da ich gleich noch eine Anschlussfrage habe, hier der Code:
schedule('0 30 8 * * *', SchlafzimmerNacht); function SchlafzimmerNacht(){ let ort = 'Schlafzimmer'; let textContent = 'Nachttemperatur startet.'; /* if (ScheduleSchlafzimmerNacht) { clearSchedule(ScheduleSchlafzimmerNacht); ScheduleSchlafzimmerNacht = null; }; */ if (getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Allgemein.Arbeitsmodus").val != 3 && getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Allgemein.Arbeitsmodus").val != 4) { if (getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Fenster_Status").val == true) { /*setState("hm-rpc.1.000A1BE99F98AD.1.SET_POINT_TEMPERATURE", getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nachttemperatur").val);*/ Whatsapp_Nachricht(ort, textContent); } else { setState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Temperatur_speichern_Fenster", getState("javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nachttemperatur").val); }; } console.log('Schlafzimmer: Funktion für Nachttemperatur ausgeführt.'); }; on({id: 'javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nacht-Beginn.Zeit_veraendert', val: true}, function () { SchlafzimmerNacht(); setState('javascript.0.scriptEnabled.Eigene_Datenpunkte.Schlafzimmer.Nacht-Beginn.Zeit_veraendert', false); });
Am Ende möchte ich den schedule nicht fest auf eine Zeit definieren, sondern Variablen nutzen, deren Wert über die Visu geändert werden kann. Ich hatte mal gelesen, dass für die Aktualisierung der schedule gelöscht und neu angelegt werden sollte/muss. Das Löschen sollte nicht das Problem sein, aber wie funktioniert das Erstellen? Da wäre ich wieder bei meinem ursprünglichen Script, das den Schedule in der Funktion definiert. Äußerlich soll sich nichts ändern, nur der neue Wert der Variablen soll genutzt werden.
Gibt es eine ähnliche Möglichkeit wie bei Objekten mit dem Konstruktor? -
Siehe hier: https://github.com/ioBroker/ioBroker.javascript/blob/master/docs/en/javascript.md#clearschedule
Beispiel:
var scheduleRef = null var s = "*/2 * * * *"; var bla = false; scheduleRef = schedule(s, work); function work() { if (bla) { if (scheduleRef) { clearSchedule(scheduleRef); scheduleRef = schedule(s, work); } } }
Hab das jetzt nicht getestet, sollte aber gehen.
-
@ticaki
Danke dir, das ist es. Ich hatte gar nicht richtig registriert, dass ich schon fast alles dafür im Script stehen hatte. Manchmal braucht es eben doch noch einen Anstoß von außen