Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Trigger verzögern

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Trigger verzögern

    This topic has been deleted. Only users with topic management privileges can see it.
    • cash
      cash Most Active last edited by

      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();
      
      
      
      
      
      1 Reply Last reply Reply Quote 0
      • Asgothian
        Asgothian Developer last edited by

        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.

        1 Reply Last reply Reply Quote 0
        • cash
          cash Most Active last edited by

          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

          1 Reply Last reply Reply Quote 0
          • cash
            cash Most Active last edited by

            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.

            1 Reply Last reply Reply Quote 0
            • Asgothian
              Asgothian Developer last edited by Asgothian

              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.

              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              792
              Online

              31.9k
              Users

              80.1k
              Topics

              1.3m
              Posts

              javascript
              2
              5
              250
              Loading More Posts
              • Oldest to Newest
              • Newest to Oldest
              • Most Votes
              Reply
              • Reply as topic
              Log in to reply
              Community
              Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
              The ioBroker Community 2014-2023
              logo