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?
-
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
SheduleSchlafzimmerNachtAußerhalb der Funktion definieren. - du solltest dir eine log Ausgabe in die Funktion einbauen damit du siehst das sie läuft.
A.
-
- 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
SheduleSchlafzimmerNachtAuß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? -
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.
-
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.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden