Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst] Refresh eines externen Systems

    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

    [gelöst] Refresh eines externen Systems

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

      Hallo,

      ich möchte meine in ioBroker vorhandenen Tür- und Fensterkontakte nutzen um meine Heizung zu deaktivieren, so lange das Fenster offen ist.
      Das geht per HTTP Request, in dem ich die Zieltemperatur in dem betroffenem Raum heruntersetze. Konkret wird dabei in der Heizungssteuerung ein weiterer Offset erzeugt, der Einfluss auf die Zieltemperatur hat.
      Leider hat dieser nur eine Lebenszeit von 10 Minuten und muss dann erneuert werden.

      Mir fehlt hier zur Zeit der gedanklich richtige Ansatz. Bei Öffnen eines Fensters einen Trigger zu starten und dann den HTTP - Request zu senden.
      Aber nun muss dieser Request alle 10 Minuten wiederholt werden, solange das Fenster noch offen ist.
      Ich habe schon überlegt mit SetStateDelayed rekursiv das an zu gehen, bin mir aber nicht sicher, ob es eine elegantere Variante gibt.

      Wie löse ich das am besten in Javascript? Kann ich einen 10minütigen Timer starten, solange ein Fenster offen ist?

      Vielen Dank im Voraus

      paul53 1 Reply Last reply Reply Quote 0
      • paul53
        paul53 @Gwenselah last edited by

        @Gwenselah sagte:

        Kann ich einen 10minütigen Timer starten, solange ein Fenster offen ist?

        Ja, mit setInterval(callback, cycle).

        1 Reply Last reply Reply Quote 0
        • M
          Mephist0 last edited by

          Ich habe ein ähnliches Szenario. Ich will dass nach 30 Sekunden mein Licht ausgeschaltet wird, außer der Bewegungsmelder erkennt weiterhin Bewegung. Das prüfe ich alle 30 Sekunden. Vielleicht hilft dir mein Skript:

          on({id: 'hm-rpc.2.00091569950FCC.1.MOTION', change: "ne"}, function (obj) {
              //Licht einschalten
              setState("hue-extended.0.groups.002-flur_vorne.action.on", true);
          
              //Prüfe alle [checkInterval] Sekunden auf weitere Bewegung
              checkNoFutherMovement();
          });
          
          function checkNoFutherMovement(){
              //Bewegungsmelder wieder scharf schalten
              setState('hm-rpc.2.00091569950FCC.1.RESET_MOTION', true);
              
              var nextMovementCheck = new Date();
              nextMovementCheck.setSeconds(nextMovementCheck.getSeconds() + checkInterval);
              var hrs = nextMovementCheck.getHours();
              var mins = nextMovementCheck.getMinutes();
              var secs = nextMovementCheck.getSeconds();
          
              //console.log("Next Check: " + hrs + ":" + mins  + ":" + secs);
          
              //Prüfe in [checkInterval] Sekunden ob noch Bewegung vorhanden ist
              schedule({hour: hrs, minute: mins, second: secs}, 
                  function(){
                      if( getState("hm-rpc.2.00091569950FCC.1.MOTION").val == true ){
                          checkNoFutherMovement();
                      } else {
                          flurlichtAusschalten();
                      }
                  }
              );
          }
          
          function flurlichtAusschalten(){
              setState("hue-extended.0.groups.002-flur_vorne.action.on", false);
          }
          
          G 1 Reply Last reply Reply Quote 0
          • G
            Gwenselah last edited by

            Vielen Dank für die Anregungen, ich werde diese in mein Script einfließen lassen.

            1 Reply Last reply Reply Quote 0
            • G
              Gwenselah @Mephist0 last edited by

              @Mephist0 said in Refresh eines externen Systems:

              checkInterval

              Wie setzt Du "checkInterval"?

              1 Reply Last reply Reply Quote 0
              • M
                Mephist0 last edited by Mephist0

                @Mephist0 sagte in Refresh eines externen Systems:

                var nextMovementCheck = new Date();

                Das ist einfach ein Zahlenwert in Sekudnen. Da du alle 10 Minuten prüfen willst, sähe es bei dir so aus:

                    var nextCheck = new Date();
                
                    nextCheck.setMinutes(nextCheck.getMinutes() + 10);
                
                    var hrs = nextCheck.getHours();
                
                    var mins = nextCheck.getMinutes();
                   (...)
                
                1 Reply Last reply Reply Quote 1
                • T
                  ticaki Developer last edited by ticaki

                  Hallo,

                  ich hab es in meinem Luftbefeuchter-Script so gelöst:

                  var myPowerInterval = null;
                  //....
                      if (isOutletOn) {
                          if (myPowerInterval) clearInterval(myPowerInterval);
                          myPowerInterval = setInterval(function(){
                              var currentWatt = getState('sonoff.0.Gesund Steckdose 2.ENERGY_Power').val;
                              setState('0_userdata.0.Automation.Luftbefeuchtungsscript_Wohnzimmer.StatusFault', (currentWatt < 10));
                          },11000);
                      } else if (myPowerInterval) clearInterval(myPowerInterval);
                  

                  Gruß Tim

                  1 Reply Last reply Reply Quote 0
                  • G
                    Gwenselah last edited by

                    Ich hab dazu noch einen Verständnisfrage. Wie verhält sich die TimerVariable "myPowerInterval" bei mehrfachen Aufrufen?
                    Ein Beispiel basierend auf dem Script von tictaki:

                    function TueIrgendwas (Raum){
                    	var myPowerInterval = null;
                        if (isOutletOn) {
                            if (myPowerInterval) clearInterval(myPowerInterval);
                            myPowerInterval = setInterval(function(){            
                                setState(Raum, "-5");
                            },11000);
                        } else if (myPowerInterval) clearInterval(myPowerInterval);
                    }
                    
                    on {(TriggerRaum1),function(){
                    	TueIrgendwas("Raum1");
                    }
                    
                    on {(TriggerRaum2),function(){
                    	TueIrgendwas("Raum2");
                    }
                    
                    

                    Übersteht die Variable myPowerInterval (bzw. deren Inhalt) von Aufruf "Raum1" den Aufruf durch "Raum2"? (Sind die Aufrufe von TueIrgandwas von einander gekapselt?)
                    Oder benötige ich für jeden Raum eine eigene Variable?

                    T 1 Reply Last reply Reply Quote 0
                    • T
                      ticaki Developer @Gwenselah last edited by ticaki

                      @Gwenselah
                      Hallo,

                      die Variable myPowerInterval muß fürs Skript (global, außerhalb einer Funktion) deklariert werden.

                      var myPowerInterval = null;
                      
                      function TueIrgendwas (Raum){
                      ...
                      

                      Aber die gilt nur für 1 gleichzeitigen Timer. Du benötigst für jeden Raum eine eigene. Mein Vorschlag:

                      var myPowerInterval = [null,null];
                      
                      function TueIrgendwas (Raum, index){
                      	
                          if (isOutletOn) {
                              if (myPowerInterval[index]) clearInterval(myPowerInterval[index]);
                              myPowerInterval[index] = setInterval(function(){            
                                  setState(Raum, "-5");
                              },11000);
                          } else if (myPowerInterval[index]) clearInterval(myPowerInterval[index]);
                      }
                       
                      on {(TriggerRaum1),function(){
                      	TueIrgendwas("Raum1", 0);
                      }
                       
                      on {(TriggerRaum2),function(){
                      	TueIrgendwas("Raum2", 1);
                      }
                      

                      Gruß Tim

                      G 1 Reply Last reply Reply Quote 0
                      • G
                        Gwenselah @ticaki last edited by

                        @ticaki
                        Auf Grundlage Deines Vorschlags habe ich nun mein Script entwickelt. Vielen Dank für Deine Hilfe.
                        Man muss nur aufpassen, dass SetIntervall erst mit dem Delay beginnt und dann die Funktion ausführt.

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

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        796
                        Online

                        31.8k
                        Users

                        80.0k
                        Topics

                        1.3m
                        Posts

                        4
                        10
                        488
                        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