NEWS
Trigger verzögern
-
Ich habe ein kleines Problem. Am Donnerstag hatte ich Urlaub. Per ical wird dazu ein Feld gesetzt. Am Freitag hatte meine Frau Urlaub (auch per ical).
Heute Morgen wurde per ical dann mein Urlaub wieder auf false geändert und der meiner Frau auf true
Ich reagiere per Script auf die Änderung der Felder. Im Log sehe ich was passiert ist.Zuerst wurde per ical mein Urlaub auf false geändert. Darauf hin lief mein Script und kam zu dem Ergebnis niemand hat Urlaub also Heizprogramm auf 0 ändern.
Nur wenige Milisekunden später wurde wegen dem Urlaub meiner Frau das Script erneute aufgerufen. Dort stand das Heizprogramm aber noch auf 2. Ergebnis keine Ändeurng notwendig.
Gesamtergebnis das Heizprogramm wurde geändert auf 0. Und so muss meine Frau heute frieren oder sich warm arbeiten.Das Problem ist in dieser Reihenfolge für mich nicht so schlimm aber wenn ich mir vorstelle es wäre anders herum gelaufen
Wie kann ich das umgehen? Meine Idee ist ein Timer beim Aufruf zu starten. Aber irgendwie habe ich im Gefühl das dies keine Besserung bringt oder?Das triggern dürfte einfach nicht sofort passieren. Sondern erst wenn der ical Adapter alle Felder neu befüllt hat.
Hier das Log:
javascript.0 2019-03-01 00:10:00.033 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Keine Änderung der Variable. SV Heizprogramm steht bereits in: 2 javascript.0 2019-03-01 00:10:00.033 info script.js.Allgemein.Heizung_Wochenprogramm: y hat alleine Urlaub. SV Heizprogramm wird in 2 geändert werden (Wochenprogramm für Krankheit oder nur eine Person Urlaub). javascript.0 2019-03-01 00:10:00.032 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Arbeitstag: true --- Feiertag: false --- Urlaub: false --- x Krank: false --- y Krank: false javascript.0 2019-03-01 00:10:00.018 info script.js.Allgemein.Heizung_Wochenprogramm: SV Heizprogramm wird geändert in: 0 javascript.0 2019-03-01 00:10:00.018 info script.js.Allgemein.Heizung_Wochenprogramm: Normaler Arbeitstag. SV Heizprogramm wird in 0 geändert werden (noramles Wochenprogramm). javascript.0 2019-03-01 00:10:00.018 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Arbeitstag: true --- Feiertag: false --- Urlaub: false --- x Krank: false --- y Krank: false
Und hier der entscheidene Teil vom Script (verkürtzt aber schon mit Timer):
var logging = true; var debugging = true; var sendpush = true; var pushover_Instanz = 'pushover.0'; var id_Heizperiode = "hm-rega.0.2425"/*SV Heizperiode*/; var id_Heizprogramm = "hm-rega.0.30484"/*SV Heizprogramm*/; var id_Arbeitstag = "Systemvariable.0.Arbeitstag"/*Arbeitstag*/; var id_Feiertag = "feiertage.0.heute.boolean"/*Feiertag heute?*/; var id_Urlaub = "Systemvariable.0.Urlaub_Beide"/*Urlaub_Beide*/; var id_Urlaub_x = "Systemvariable.0.Urlaub_x"/*Urlaub_x*/; var id_Urlaub_y = "Systemvariable.0.Urlaub_y"/*Urlaub_y*/; var id_Krank_x = "Systemvariable.0.Krank_x"/*Krank_x*/; var id_Krank_y = "Systemvariable.0.Krank_y"/*Krank_y*/; var timer = null; var Heizungsgruppe; function func_Variable_Heizprogramm(){ timer = setTimeout(function(){ var Heizprogramm = getState(id_Heizprogramm).val; var Arbeitstag = getState(id_Arbeitstag).val; var Feiertag = getState(id_Feiertag).val; var Urlaub = getState(id_Urlaub).val; var Urlaub_x = getState(id_Urlaub_x).val; var Urlaub_y = getState(id_Urlaub_y).val; var Krank_x = getState(id_Krank_x).val; var Krank_y = getState(id_Krank_y).val; var Ergebnis; if(debugging){ log('[DEBUG] '+'Arbeitstag: '+Arbeitstag +' --- Feiertag: '+Feiertag +' --- Urlaub: '+Urlaub +' --- x Urlaub' +Urlaub_x +' --- x Krank: '+Krank_x +' --- y Urlaub' +Urlaub_y +' --- y Krank: '+Krank_y); } if(Feiertag){ if(logging){ log('Es ist ein Feiertag. SV Heizprogramm wird in 1 geändert werden (Urlaub- oder Feiertagsprogramm).'); } Ergebnis = 1; } else if(Urlaub_x){ if(logging){ log('x hat alleine Urlaub. SV Heizprogramm wird in 2 geändert werden (Wochenprogramm für Krankheit oder nur eine Person Urlaub).'); } Ergebnis = 2; } else if(Urlaub_y){ if(logging){ log('y hat alleine Urlaub. SV Heizprogramm wird in 2 geändert werden (Wochenprogramm für Krankheit oder nur eine Person Urlaub).'); } Ergebnis = 2; } else if(Krank_x){ if(logging){ log('x ist Krank. SV Heizprogramm wird in 2 geändert werden (Wochenprogramm für Krankheit).'); } Ergebnis = 2; } else{ if(logging){ log('Normaler Arbeitstag. SV Heizprogramm wird in 0 geändert werden (noramles Wochenprogramm).'); } Ergebnis = 0; } //SV Heizprogramm ändern if(Heizprogramm != Ergebnis){ if(logging){ log('SV Heizprogramm wird geändert in: '+Ergebnis); } setState(id_Heizprogramm,Ergebnis); } else{ if(debugging){ log('[DEBUG] '+'Keine Änderung der Variable. SV Heizprogramm steht bereits in: '+Ergebnis); } } },1 * 60000); //Minuten } //bei Änderung on({id: id_Heizprogramm, change: "ne"}, func_Wochenprogramm); on({id: id_Feiertag, change: "ne"}, func_Variable_Heizprogramm); on({id: id_Urlaub, change: "ne"}, func_Variable_Heizprogramm); on({id: id_Urlaub_x, change: "ne"}, func_Variable_Heizprogramm); on({id: id_Urlaub_y, change: "ne"}, func_Variable_Heizprogramm); on({id: id_Krank_x, change: "ne"}, func_Variable_Heizprogramm); on({id: id_Krank_y, change: "ne"}, func_Variable_Heizprogramm); //einmalig ausführen //func_Variable_Heizprogramm(); //func_Wochenprogramm();
-
Hallo,
aus verschiedenen Gründen würde ich hier nicht mit triggern arbeiten. Einer ist das nicht immer sichergestellt ist in welcher Reihenfolge die verschiedenen Trigger laufen - das macht die Entscheidungsmatrix unschön. Ich würde daher jeden Morgen zu einem festen Zeitpunkt (per cron) einmal die ical Datenpunkte abklappern und schauen ob sich das Heizprogramm für diesen Tag ändern muss.
Eine Alternative ist mit dem geänderten ical Eintrag einen Timeout starten (falls der nicht schon läuft) und dann durch die Änderung getriggert alle relevanten Datenpunkte abklappern und den Heizstatus setzen.
In beiden Fällen läuft dann die Auswertung asynchron vom Trigger.
A.
-
einmal am Tag hatte ich vorher. Aber dann wollte ich die Krankheit auch darüber steuern. Und Krank werde ich am ersten Tag meistens plötzlich.
Sprich mein Wecker klingelt und ich merke ich bin krank dann will ich nicht bis zum nächsten Morgen warten bis die Heizungen richtig laufen.
So muss ich nur die Krankheit im Kalender notieren und bin fertig.
Die zweite Variante würde funktionieren. Falls es keine anderen Lösungsvorschläge gibt würde ich die testen...
Danke schonmal
-
Habe mich heute nochmal hingesetzt und ein wenig getestet. Mit einem Timer funktioniert das ganze ohne Probleme. Habe mein Script nochmal log technisch aufgebohrt. Hier das Ergebnis:
javascript.0 2019-03-02 12:30:22.498 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Arbeitstag: false --- Feiertag: false --- Urlaub: false --- x Urlaub: true --- x Krank: false --- y Urlaub: true --- y Krank: false javascript.0 2019-03-02 12:30:22.498 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Urlaub y true seit 02.03.19 12:29:22 Uhr javascript.0 2019-03-02 12:30:22.497 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Urlaub x true seit 02.03.19 12:29:22 Uhr javascript.0 2019-03-02 12:30:22.497 info script.js.Allgemein.Heizung_Wochenprogramm: Timer abgelaufen javascript.0 2019-03-02 12:29:22.496 info script.js.Allgemein.Heizung_Wochenprogramm: Timer lief und wird abgebrochen javascript.0 2019-03-02 12:29:22.495 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Urlaub y true seit 02.03.19 12:29:22 Uhr javascript.0 2019-03-02 12:29:22.495 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Urlaub x true seit 02.03.19 12:29:22 Uhr javascript.0 2019-03-02 12:29:22.495 info script.js.Allgemein.Heizung_Wochenprogramm: Ausfürhung durch Trigger javascript.0 2019-03-02 12:29:22.494 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Urlaub y false seit 02.03.19 12:29:08 Uhr javascript.0 2019-03-02 12:29:22.493 info script.js.Allgemein.Heizung_Wochenprogramm: [DEBUG] Urlaub x true seit 02.03.19 12:29:22 Uhr javascript.0 2019-03-02 12:29:22.492 info script.js.Allgemein.Heizung_Wochenprogramm: Ausfürhung durch Trigger javascript.0 2019-03-02 12:29:22.486 info script.js.Allgemein.Diverse_Systemvariablen_setzen: registered 0 subscriptions and 1 schedule javascript.0 2019-03-02 12:29:22.486 info script.js.Allgemein.Diverse_Systemvariablen_setzen: Urlaubstag y geändert in true javascript.0 2019-03-02 12:29:22.485 info script.js.Allgemein.Diverse_Systemvariablen_setzen: Urlaubstag x geändert in true
Man sieht wieder wie das Script zweimal getriggert wird. Beim zweiten Lauf lief der Timer bereits, den habe ich gestoppt und danach den Timer neu gestartet. Danach läuft das Script genau einmal und bringt die richten Ergebnisse.
-
Das ist so zu erwarten. Jeder trigger startet einen timeout. Was du machen musst ist da eine Ebene zwischen zu legen, nach diesem Muster:
var timeout =null; function func_Variable_Heizprogramm () { If (timeout==null) timeout=setTimeout...
Weiter unten in der Funktion die den timeout ausführt muss dann
timeout=null;
Dann sollte es gehen.
A.