Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] clearTimeout für Lichtsteuerung funktioniert nicht.

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    [gelöst] clearTimeout für Lichtsteuerung funktioniert nicht.

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

      Hi,

      ich habe mir ein kurzes Bewegungsmelder-Lichtscript gebastelt welches eigentlich nach Bewegungserkennung bspw. 3 Minuten das Licht eingeschaltet lassen soll. Wenn innerhalb dieser 3 Minuten wieder eine Bewegung erkannt wird sollt der noch verbleibende Timeout für das ausschalten gelöscht und ein neuer mit 3 Minuten gesetzt werden.

      So die Theorie in der Praxis funktioniert das nur leider überhaupt nicht :lol:

      Vielleicht sieht ja jemand vor euch den Fehler der mir nicht auffällt.

      
      var timer = [];
      function LichtAutomatik(GeraeteID,Zeit) {
          if(getState(GeraeteID).val === false){
              log(GeraeteID);
              setState(GeraeteID,true);
              if(timer.GeraeteID) clearTimeout(timer.GeraeteID);
      
              timer.GeraeteID = setTimeout(function () {
                          setState(GeraeteID,false);
                          log('Aus geschalten');
                      }, Zeit * 60000);
          }            
      }
      
      on({id:"zigbee.0.00158d0002b6093f.occupancy"/*Occupancy*/, change: "any"}, function (dp) {
          if(dp.state.val === true && getState("hm-rpc.1.xxxxxxx.1.CURRENT_ILLUMINATION"/*Lichtsensor.Aussen.West*/).val < 60) {
              LichtAutomatik("hm-rpc.0.xxxxxxxx.1.STATE",3);
          log('bewegung erkannt');
          }
      });
      
      on({id:"zigbee.0.00158d0002c65109.occupancy"/*Occupancy*/, change: "any"}, function (dp) {
          if(dp.state.val === true && getState('hm-rpc.0.xxxxxxxxxx.3.BRIGHTNESS').val < 60) {
              LichtAutomatik("hm-rpc.0.xxxxxxxx.1.STATE",3);
              log('bewegung erkannt');
          }
      });
      
      1 Reply Last reply Reply Quote 0
      • thovid
        thovid last edited by

        Beim ersten draufschauen würde ich sagen, der Aufruf an clearTimeout ist innerhalb des if Blockesif(getState(GeraeteID).val === false){und wird daher für die Verlängerung nicht ausgeführt, da da das Licht ja schon an ist. Weiter würde ich kein array sondern ein object für das Speichern der timer nehmen, also````
        var timer = {};

        
        Grüße
        
        Thomas
        1 Reply Last reply Reply Quote 0
        • Peoples
          Peoples last edited by

          @thovid:

          Beim ersten draufschauen würde ich sagen, der Aufruf an clearTimeout ist innerhalb des if Blockesif(getState(GeraeteID).val === false){und wird daher für die Verlängerung nicht ausgeführt, da da das Licht ja schon an ist. Weiter würde ich kein array sondern ein object für das Speichern der timer nehmen, also````
          var timer = {};

          Grüße
          
          Thomas `  
          

          Du bist mein Held! :lol:, jetzt wo du es sagst hast du natürlich 100%ig recht.

          Warum würdest du denn ein object verwenden? Da ich nur amateurprogrammierer bin, lass ich mich da immer gerne belehren.

          Edit

          So ich habe es nun geändert und es funktioniert an und für sich, aber das Licht wird nach Bewegungserkennung auch ausgeschalten wenn es von Hand eingeschalten war. Dazu habe ich ein neues Array erstellt, in welchem die Geräteid eingeragen wird wenn das Licht durch den Bewegungsmelder eingeschalten wurde.

          Im Anschluss Frage ich eben dieses Array nach dem vorhanden sein der GeräteID ab, aber beim ersten Durchlauf wird der Eintrag nicht gefunden, erst nach dem Reload funktioniert es. Das Problem hatte ich schonmal, aber die Lösung fällt mir nicht mehr ein.

          Hier mal das geänderte Script:

          var timer = [];
          var GeraeteListe = [];
          
          function LichtAutomatik(GeraeteID,Zeit) {
          
              if(getState(GeraeteID).val === false) {
                  setState(GeraeteID,true);
                  GeraeteListe.push(GeraeteID);
              }
              log(GeraeteListe.indexOf(GeraeteID));
          
              if(GeraeteListe.indexOf(GeraeteID)) {
                  log('gerät ist eingetragen');
                  if(timer.GeraeteID) clearTimeout(timer.GeraeteID);
          
                  timer.GeraeteID = setTimeout(function () {
                      setState(GeraeteID,false);
                      log('----------------------- Vor dem Löschen -----------------------');
                      log('Index:'+GeraeteListe.indexOf(GeraeteID));
                      GeraeteListe.splice(GeraeteListe.indexOf(GeraeteID),1);
                      log('----------------------- Nach dem Löschen -----------------------');
                      log('Aus geschalten');
                  }, 10000);//Zeit * 60000);
              }
              else{
                  log('gerät ist nicht eingetragen');
              }
          }
          
          
          1 Reply Last reply Reply Quote 0
          • Peoples
            Peoples last edited by

            Habe es gelöst bekommen, indem ich einen Teil der Funktion in eine zweite ausgelagert habe.

            var timer = [];
            var GeraeteListe = [];
            
            function LichtCountdown(GeraeteID,Zeit){
                timer.GeraeteID = setTimeout(function () {
                    setState(GeraeteID,false);
                   GeraeteListe.splice(GeraeteListe.indexOf(GeraeteID),1);
                }, Zeit * 60000);
            }
            
            function LichtAutomatik(GeraeteID,Zeit) {
                if(getState(GeraeteID).val === false) {
                    setState(GeraeteID,true);
                    GeraeteListe.push(GeraeteID);
                    LichtCountdown(GeraeteID,Zeit);
                }
                if(GeraeteListe.indexOf(GeraeteID)) {
                    LichtCountdown(GeraeteID,Zeit);
                }
            }
            

            Vielleicht kann es ja jemand brauchen

            1 Reply Last reply Reply Quote 1
            • J
              JojoS last edited by

              Danke für den Code,
              ein altes Thema, aber genau das was ich bei meinem spärlichen JS Kenntnissen gebrauchen kann. Ich werde es übernehmen und etwas einenglischen 🙂
              Ist nach praktischem Gebrauch noch etwas verändert/verbessert worden? Ich wünsche mir da so eine Sammlung solch nützlicher Scripte, gibt es da etwas?

              Peoples 1 Reply Last reply Reply Quote 0
              • Peoples
                Peoples @JojoS last edited by

                @jojos
                Ja wurde noch erweitert, kann ich einstellen wenn du es brauchst

                J 1 Reply Last reply Reply Quote 0
                • J
                  JojoS @Peoples last edited by

                  @peoples gerne,auch wenn es schon tut was es soll.

                  Peoples 1 Reply Last reply Reply Quote 0
                  • Peoples
                    Peoples @JojoS last edited by

                    @jojos

                    // *******************************************************************************************************
                    //
                    // Automatiklicht-Script
                    // Autor: Peoples
                    //
                    //
                    // Funktionen:  
                    //
                    // V1.0.0   01.04.23 Initialversion der Version 2
                    //
                    //
                    // Wichtig:
                    // - Enum-Function für Bewegungsmelder muss existieren (Bewegungsmelder)
                    // - Enum-Function für die Lichtquellen muss existieren (Beleuchtung)
                    // 
                    // *******************************************************************************************************
                    
                    // -----------------------------------------------------------------------------
                    // allgemeine Variablen
                    // -----------------------------------------------------------------------------
                    var timer = [];                         //Array für die verschiedenen Timer
                    var automaticLightsArray = [];          //Array zum auswerten ob das Licht automatisch oder manuel eingeschalten wurde
                    
                    var lightingLimitDefault = 55;          //Beleuchtungswert in Lux ab wann das Licht eingeschalten wird
                    
                    var loglevel = 0;                       // Loglevel 0 =  kein Logging / 1 -3 Logging wird genauer 
                    var Systemlog = true;                   // Systemmeldungen anlegen ja/nein
                    
                    
                    var instanz = '0_userdata.0'; instanz = instanz +'.';
                    var pfad0 = 'Lighting'; pfad0 = pfad0 +'.';
                    var pfad1 = 'AutoLightTimers'; pfad1 = pfad0 + pfad1 +'.';
                    var pfad2 = 'config'; pfad2 = pfad0 + pfad2 +'.';
                    
                    var autolightList = [                   // Automatic-Licht Geräteliste
                        
                               /*Name*/                         /*Auslösender Melder*/                                      /*Verwendeter Licht Sensor*/                /*Zu schaltendes Licht*/                               /* An State */       /*Aus State */     /*An Zeit*/     /* Mind. Helligk. */
                        {'name':'TreppenhausDG',        'mdetID':'hm-rpc.2.XXXX.1.MOTION',                    'luxdetID':'hm-rpc.2.XXXX.1.ILLUMINATION',        'lightID':'hm-rpc.0.XXXX.1.STATE',                          'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':10},
                        {'name':'TreppenhausEG',        'mdetID':'hm-rpc.0.XXXX.3.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS',          'lightID':'hm-rpc.0.XXXX.1.STATE',                          'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':lightingLimitDefault},
                        {'name':'TreppenhausKG',        'mdetID':'hm-rpc.0.XXXX.3.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS',          'lightID':'hm-rpc.0.XXXX.1.STATE',                          'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':32},
                        {'name':'FlurELW',              'mdetID':'hm-rpc.0.XXXX.3.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS',          'lightID':'hm-rpc.0.XXXX.1.STATE',                          'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':10},
                        {'name':'KellerGang1',          'mdetID':'hm-rpc.0.XXXX.3.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS',          'lightID':'hm-rpc.0.XXXX.1.STATE',                          'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':12},
                        {'name':'KellerGang2',          'mdetID':'hm-rpc.0.XXXX.3.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.3.BRIGHTNESS',          'lightID':'hm-rpc.0.XXXX.1.STATE',                          'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':15},
                        {'name':'TerrassenTreppe',      'mdetID':'hm-rpc.0.XXXX.1.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.1.LUX',                 'lightID':instanz + pfad0 + 'terraceStairsLightGroup',      'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':lightingLimitDefault},
                        {'name':'Bewegungsm-Gartentor', 'mdetID':'hm-rpc.0.XXXX.1.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.1.LUX',                 'lightID':'shelly.0.SHSW-XXXX.Relay1.Switch',               'wishValueON':true, 'wishValueOFF':false,   'time':3, 'lightingLimit':lightingLimitDefault},
                        {'name':'Haustuere1',           'mdetID':'hm-rpc.0.XXXX.1.MOTION',                    'luxdetID':'hm-rpc.0.XXXX.1.LUX',                 'lightID':'sonoff.0.Licht-Haustuere.POWER',                 'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':lightingLimitDefault},
                        {'name':'Haustuere2',           'mdetID':'hm-rpc.0.XXXX.1.STATE',                     'luxdetID':'hm-rpc.0.XXXX.1.LUX',                 'lightID':'sonoff.0.Licht-Haustuere.POWER',                 'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':lightingLimitDefault},
                        {'name':'AussenkuecheTuere',    'mdetID':'hm-rpc.2.XXXX.1.STATE',                     'luxdetID':'hm-rpc.0.XXXX.1.LUX',                 'lightID':'shelly.0.SHSW-XXXX.Relay0.Switch',               'wishValueON':true, 'wishValueOFF':false,   'time':3, 'lightingLimit':lightingLimitDefault},
                        {'name':'GaesteWCEG',           'mdetID':'hm-rpc.2.XXXX.1.PRESENCE_DETECTION_STATE',  'luxdetID':'hm-rpc.2.XXXX.1.ILLUMINATION',        'lightID':'shelly.0.SHSW-XXXXRelay0.Switch',                'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':2},
                        {'name':'Kueche',               'mdetID':'hm-rpc.2.XXXX.1.MOTION',                    'luxdetID':'hm-rpc.2.XXXX.1.ILLUMINATION',        'lightID':instanz + pfad0 + 'Kitchenette',                  'wishValueON':true, 'wishValueOFF':false,   'time':2, 'lightingLimit':5},
                        {'name':'Gartentor',            'mdetID':'hm-rpc.2.XXXX.1.STATE',                     'luxdetID':'hm-rpc.0.XXXX.1.LUX',                 'lightID':'shelly.0.SHSW-XXXX.Relay1.Switch',               'wishValueON':true, 'wishValueOFF':false,   'time':5, 'lightingLimit':lightingLimitDefault}
                    ];
                    
                    
                    // -----------------------------------------------------------------------------
                    // Objekte
                    // ---------.-------------------------------------------------------------------.
                    // Objekt: Lichtautomatik für Automatische Abläufe
                    
                    var KitchenetteOffValue = 0;
                    
                    
                    createState(instanz + pfad0 + 'terraceStairsLightPermOn',  {def:false, type:'boolean', name:'Treppenlicht dauerhaft ein',});
                    createState(instanz + pfad0 + 'terraceStairsLightGroup',  {def:false, type:'boolean', name:'Treppenlicht Gruppe',})
                    
                    createState(instanz + pfad0 + 'Kitchenette',  {def:false, type:'boolean', name:'Lichtlevel Kuechenzeile',})
                    
                    // #############################################################################
                    // #                                                                           #
                    // #  Funktion Geräte Stati erstellen                                          #
                    // #                                                                           #
                    // #############################################################################
                    
                    
                    async function createDeviceStates(){
                        try {
                            for(var i = 0; i < autolightList.length; i++) { 
                                await createStateAsync(instanz + pfad1 + 'timer_' + autolightList[i].name , {name: 'Timer_'+ autolightList[i].name, type:'number', def:'0', read:true, write:true});
                                await createStateAsync(instanz + pfad2 + 'blockMD_' + autolightList[i].name , {name: 'Bewegungserkennung deaktiviert', type:'state', def:false, read:true, write:true});
                            }
                        } catch (error) {
                            log(`Unexpected error - ${error}`, 'error');
                        }
                    }
                    
                    // #############################################################################
                    // #                                                                           #
                    // #  Funktion zum automatischen Einschalten des Lichts                        #
                    // #                                                                           #
                    // #############################################################################
                    function searchAutoLightList(mdID){
                        if(getState('alias.0.System_Konfiguration.Beleuchtungsautomatik.ACTUAL'/*Actual*/).val === true){
                            for(var i = 0; i < Object.keys(autolightList).length; i++) {  
                                if(autolightList[i].mdetID == mdID) {
                                    if(loglevel > 1) log('Geräteindex wurde an Stelle:' + i + ' gefunden');
                                    if(getState(instanz + pfad2 + 'blockMD_' + autolightList[i].name).val === false) {
                                        setAutoLightTimer(i);
                                    } else {
                                        if(loglevel > 1) log('Bei dem Beleuchtungsgerät:' + autolightList[i].name + ' wurde die Bewegungserkennung deaktiviert');
                                    }
                                } else {
                                    if(loglevel > 1)('Gerät wurde nicht gefunden!')
                                }
                            }
                        } else {
                            if(loglevel > 1)('Beleuchtungsautomatik ausgeschalten!')
                        }
                    }
                    
                    // #############################################################################
                    // #                                                                           #
                    // #  Funktion zum Prüfen und automatischen Auschalten des Lichts              #
                    // #                                                                           #
                    // #############################################################################
                    function setAutoLightTimer(i){
                        if(getState(autolightList[i].luxdetID).val < autolightList[i].lightingLimit) {
                            setState(autolightList[i].lightID, autolightList[i].wishValueON);
                            if(getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val != autolightList[i].time * 60){
                                if(getState(autolightList[i].lightID).val != autolightList[i].wishValueON){
                                    setState(instanz + pfad1 + 'timer_' + autolightList[i].name, autolightList[i].time * 60);
                                } else {
                                    clearInterval(timer[autolightList[i].name]);
                                    setState(instanz + pfad1 + 'timer_' + autolightList[i].name, autolightList[i].time * 60);
                                }
                                timer[autolightList[i].name] = setInterval(function () {
                                    if(getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val > 0){
                                        setState(instanz + pfad1 + 'timer_' + autolightList[i].name, getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val - 1);
                                    } else {
                                    setState(autolightList[i].lightID, autolightList[i].wishValueOFF);
                                    clearInterval(timer[autolightList[i].name]);
                                    }
                                }, 1000);
                            }
                        }
                    }
                    
                    // #############################################################################
                    // #                                                                           #
                    // #  Funktion zum zurücksetzen des Timers bei manuelem ausschalten des Lichts #
                    // #                                                                           #
                    // #############################################################################
                    function setTimerToZero(liID){
                        for(var i = 0; i < Object.keys(autolightList).length; i++) {  
                            if(autolightList[i].lightID === liID) {
                                    if(getState(instanz + pfad1 + 'timer_' + autolightList[i].name).val > 0){
                                        clearInterval(timer[autolightList[i].name]);
                                        setState(instanz + pfad1 + 'timer_' + autolightList[i].name, 0);
                                        if(loglevel > 1) log('Timer von:'+liID+' wurde wegen manuellem Ausschalten auf 0 gesetzt');
                                    }
                            }
                        }
                    }
                    
                    
                    
                    
                    // #############################################################################
                    // #                                                                           #
                    // #  Script start                                                             #
                    // #                                                                           #
                    // #############################################################################
                    
                    async function scriptStart(){
                        try{
                            createDeviceStates();
                            
                            for(var i = 0; i < Object.keys(autolightList).length; i++) {
                                await setStateAsync(autolightList[i].lightID, autolightList[i].wishValueOFF);
                                await setStateAsync(instanz + pfad1 + 'timer_' + autolightList[i].name,0);
                            }
                    
                            log ('------------------------------------------- Script Bewegungsmelder neu gestartet -------------------------------------------');
                        } catch (error) {
                            log(`Unexpected error - ${error}`, 'error');
                        }
                    }
                    
                    scriptStart();
                    
                    
                    // Beobachten der enum.functions "Bewegungsmelder"
                    $('state(functions=Bewegungsmelder)').on(function(dp) {
                        if(dp.state.val === true) {
                            if(loglevel > 1 )log('Auslösender Sensor: ' + dp.id + ': ' + dp.state.val);
                            searchAutoLightList(dp.id);
                        }
                    });
                    
                    // Beobachten der enum.functions "Beleuchtung"
                    $('state(functions=Beleuchtung)').on(function(dp) {
                        if(dp.state.val === false) {
                            setTimerToZero(dp.id);
                        }
                    });
                    
                    
                    
                    

                    Bitteschön

                    J 1 Reply Last reply Reply Quote 0
                    • J
                      JojoS @Peoples last edited by

                      @peoples Danke, das über Tabellen zu lösen finde ich auch gut. Ich habe aber nur zwei Lampen die mit dieser Automatik gesteuert werden, andere über KNX und da hat der BWM viele Einstellmöglichkeiten.
                      Sinnvoll wäre noch eine Sperre um die Automatik zu deaktivieren. Die KNX Melder haben auch eine Einstellung für Kurzzeit und längerer Anwesenheit. Bei Durchgangsräumen braucht man zB nur 30 s Licht wenn man da in 10 s durchgelaufen ist. Nur als Anregung für die eierlegende Wollmilchsau 🙂

                      Peoples 1 Reply Last reply Reply Quote 0
                      • Peoples
                        Peoples @JojoS last edited by

                        @jojos
                        wenn du das Licht per Hand einschaltest reagiert der Timeout nicht und du kannst ja auch für jedes Licht die Zeit einzeln vorgeben. Oder wie meinst du das?

                        J 1 Reply Last reply Reply Quote 0
                        • J
                          JojoS @Peoples last edited by

                          @peoples bevor ich das Licht von Hand einschalten kann hat der BWM schon reagiert, funktioniert das dann auch?

                          Das andere Feature ist eine variable Zeit die davon abhängt ob einmal in 10..x s auslöse oder mehrmals. Eben wenn man nur durch den Raum durchläuft oder kurz rein-raus.

                          Peoples 1 Reply Last reply Reply Quote 0
                          • Peoples
                            Peoples @JojoS last edited by

                            @jojos
                            Wenn du drin rum läufst wird stetig neu getriggert und es bleibt an

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            725
                            Online

                            31.7k
                            Users

                            79.8k
                            Topics

                            1.3m
                            Posts

                            3
                            12
                            831
                            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