Skip to content
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo

Community Forum

  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Trigger verzögern

NEWS

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.4k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.0k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.5k

Trigger verzögern

Geplant Angeheftet Gesperrt Verschoben JavaScript
javascript
5 Beiträge 2 Kommentatoren 328 Aufrufe 1 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • cashC Offline
    cashC Offline
    cash
    Most Active
    schrieb am zuletzt editiert von
    #1

    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 Antwort Letzte Antwort
    0
    • AsgothianA Offline
      AsgothianA Offline
      Asgothian
      Developer
      schrieb am zuletzt editiert von
      #2

      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.

      ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
      "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

      1 Antwort Letzte Antwort
      0
      • cashC Offline
        cashC Offline
        cash
        Most Active
        schrieb am zuletzt editiert von
        #3

        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 Antwort Letzte Antwort
        0
        • cashC Offline
          cashC Offline
          cash
          Most Active
          schrieb am zuletzt editiert von
          #4

          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 Antwort Letzte Antwort
          0
          • AsgothianA Offline
            AsgothianA Offline
            Asgothian
            Developer
            schrieb am zuletzt editiert von Asgothian
            #5

            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.

            ioBroker auf RPi4 - Hardware soweit wie möglich via Zigbee.
            "Shit don't work" ist keine Fehlermeldung, sondern ein Fluch.

            1 Antwort Letzte Antwort
            0
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            855

            Online

            32.4k

            Benutzer

            81.4k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2025
            logo
            • Anmelden

            • Du hast noch kein Konto? Registrieren

            • Anmelden oder registrieren, um zu suchen
            • Erster Beitrag
              Letzter Beitrag
            0
            • Home
            • Aktuell
            • Tags
            • Ungelesen 0
            • Kategorien
            • Unreplied
            • Beliebt
            • GitHub
            • Docu
            • Hilfe