NEWS


  • 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();
    
    
    
    
    
  • Developer

    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.

  • Developer

    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.

Suggested Topics

1.3k
Online

35.1k
Users

41.1k
Topics

564.9k
Posts