Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. ClearTimeout auf Var Object möglich?

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    ClearTimeout auf Var Object möglich?

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

      Mal wieder ein Punkt, an dem ich hänge 😞

      Kann man ein clearTimeout auf ein var Objekt (oder meinetwegen auch array) durchführen?

      var hueTimer = {};
      
      function hueQueuesAnlegen (){ 
          var x;
          for (x in hueGruppen) {   // x ist der erste Wert [0] im Array, hier der String des Gruppennamens
              hueTimer[x] = null;
          }
      }
      
      ...
      
      hueTimer[gruppenname] = setTimeout(function() {
      
      ....
      
      clearTimeout(hueTimer[gruppenname]);
      
      

      Das clearTimeout() hat keinerlei Auswirkungen.

      Die Frage ist, geht das überhaupt, was ich vorhabe?

      Der ganze Code:

      ! ```
      `// Funktionen für den Philips hue Adapter
      //
      // - definiert eigene Gruppen us Lampen und Gruppen der Bridge, unabhängig von den Gruppen der Bridge
      // - definiert diverse Presets, die für Gruppen gesetzt werden können
      //
      //
      // Funktionen:
      //------------
      // function hueGruppe (gruppe,preset,verzögerung,bri)
      // - gruppe: Gruppenname
      // - preset: Presetname
      // - verzögerung: (keine Pflicht, schaltet das Preset nach der Verzögerungszeit in ms ein -> nach der Zeit des letzetn aktiven Presets in der Queue)
      // - bri: (keine pflicht, überschreibt eine bri (Helligkeit) eines Presets, wenn ein Wert im Preset vorhanden ist
      //
      //
      //
      // geplant:
      //---------
      // - viele Standard Presets
      // - ggf. vordefinierte Effekte (Abfolgen von Presets oder Farbveläufen)
      // - ...
      //
      // umgesetzt:
      //-----------
      // - für einzelne Lampen, identisch wie für Gruppen -> Gruppe mit einer einzelnen Lampe anlegen
      // - Queue für die zeitliche verzögerung (automatisch je Gruppe)
      // - Abfangen von Tippfehlern (Gruppennamen, Preset)
      // - die schon abgelaufene Zeit wird bei neuer Verzögerung berücksichtigt
      //
      ! // Konfiguration:
      //------------------------------------------------------------------------------
      var hueMinDelay = 300; // min. males Delay zwischen zwei Farbwechsel
      ! // hue IDs (Channel) - Namen können frei vergeben werden
      // hue Lampen
      var idHueGästebadVorne = "hue.0.Philips_hue.20.1_Gästebad_Vorne"; /Philips_hue.20.1_Gästebad_Vorne/
      var idHueGästebadHinten = "hue.0.Philips_hue.20.2_Gästebad_Hinten"; /Philips_hue.20.2_Gästebad_Hinten/
      var idHueWohnzimmerKugel = "hue.0.Philips_hue.10.4_Wohn_Kugel"; /Philips_hue.10.4_Wohn_Kugel/
      var idHueArbeitszimmerSchreibtisch = "hue.0.Philips_hue.50.1_Arbeit_Schreibtisch"; /Philips_hue.50.1_Arbeit_Schreibtisch/
      // hue Gruppen der Bridge
      var idhueGruppeWohnzimmer = "hue.0.Philips_hue.Wohnzimmer_Küche"/Philips_hue.Wohnzimmer_Küche/;
      ! var hueGruppen = {};
      // hue Gruppen im Script (Zuordnung von 1-x Lampen/Gruppen der Bridge, auch gemischt)
      // wo hue Gruppen in der Bridge vorhanden sind, ist es sinnvoll diese zu nutzen (Performance der Bridge) und hier einzutragen
      hueGruppen["arbeitszimmer"] = [idHueArbeitszimmerSchreibtisch];
      hueGruppen["wohnzimmer"] = [idHueWohnzimmerKugel];
      hueGruppen["gästebad"] = [idHueGästebadVorne, idHueGästebadHinten];
      ! hueGruppen["wohnzimmerGruppe"] = [idhueGruppeWohnzimmer];
      ! var hueParameter = ["on","hue","sat","bri","ct","xy","alert","effect","r","g","b","colormode"];
      ! var huePresets = {
      "standard": {"hue":14922,"sat":144,"bri":254,"effect":"none","alert":"none"}, // Standardfarbe der hue bei Power on
      "blue": {"hue":47125,"sat":254,"bri":254}, // blau
      "red": {"r":255,"g":0,"b":0,"bri":254}, // rot
      "on": {
      "on": true
      },
      "off": {
      "on": false
      },
      "effectColorloop": {
      "effect": "colorloop"
      },
      "effectOff": {
      "effect": "none"
      },
      "alertOn": {
      "alert": "select"
      },
      "alertOff": {
      "alert": "none"
      },
      "test2": {
      "hue": 24000,
      "sat": 254,
      "bri": 254,
      "effect": "none",
      "alert": "none"
      },
      "test": {
      "hue": 5000,
      "sat": 254,
      "bri": 254,
      "effect": "none",
      "alert": "none"
      }
      };
      ! // Variablen für die Funktionen
      ! var hueWarten = []; // Wartezeit je hue-Script-Gruppe
      var hueGruppeAktiv = []; // Preset aktiv (true/false) je hue-Script-Gruppe
      var hueGruppeLasttimestamp = []; // letzter Zeitstelmep je hue Gruppe
      var hueGruppeAnzahlQueue = [];
      var hueTimer = {};
      ! // Funktionen
      ! function hueQueuesAnlegen (){ // Wartefeld Variablen für jede Gruppe erstellen
      var x;
      for (x in hueGruppen) { // x ist der erste Wert [0] im Array, hier der String des Gruppennamens

      = 0; // für jeden Gruppennamen ein Wartefeld anlegen

      = false; // für jeden Gruppennamen ein Aktivflag anlegen

      = 0;

      = 0;

      = null;

      }
      }
      ! function validBri (bri) {
      if (bri >= 0 && bri <= 254) {
      log("valid bri wurde übergeben","info");
      return true;
      }
      if (bri > 254) {
      log("bri zu hoch. Werte von 0 bis 254 sind erlaubt","error");
      }else {
      log("kein bri oder kein validen bri Wert wurde übergeben","info");
      }
      return false;
      }
      ! function hueWarteMinDelay (gruppenname) { // für die Mindestverzögerungszeit ein Flag setzen, dass ein Preset aktiv ist
      hueGruppeAktiv[gruppenname] = true;
      setTimeout (function() {
      hueGruppeAktiv[gruppenname] = false;
      },
      hueMinDelay);
      }
      ! function hueGruppeStop (gruppenname) {
      clearTimeout(hueTimer[gruppenname]);
      }
      ! function hueGruppe (gruppenname,preset,verzögerung,bri) {
      //TODO: Abbruchfunktion für bestehende Queue
      if (!hueGruppeAnzahlQueue[gruppenname]) {
      hueGruppeLasttimestamp[gruppenname] = new Date().getTime();
      }
      log(" # Sperrzeitaktiv: " + hueGruppeAktiv[gruppenname] + " ## Anzahl Queue" + hueGruppeAnzahlQueue[gruppenname],"warn");
      if (hueGruppeAktiv[gruppenname]) {
      if (!verzögerung || verzögerung < hueMinDelay) verzögerung = hueMinDelay; // Preset aktiv, bei zu geringer Verzögerungszeit die Midestverzögerung addieren
      } else {
      if (!verzögerung) verzögerung = 0; // kein Preset aktiv, das nächste Preset soll direkt starten
      }
      var wartenAktiv = verzögerung; // aktuelle Wartezeit der gerade aufgerufen Funktion
      hueWarteMinDelay(gruppenname); // Flag für die Midestverzögerungszeit, dass ein Preset aktiv ist
      if (hueGruppeAnzahlQueue[gruppenname] > 0) { // wenn ein Preset aktiv ist, die bisherige Laufzeit bei der neuen Verzögerung berücksichtogen und abziehen
      verzögerung = verzögerung - ((new Date().getTime()) - hueGruppeLasttimestamp[gruppenname]);
      }
      verzögerung += hueWarten[gruppenname]; // die Verzögerung um die derzeit aktuelle Warteschlage addieren
      hueWarten[gruppenname] += wartenAktiv; // die, für weitere Aktionen in der Gruppe, zu addierende Wartezeit und die aktuelle Wartezeit erhöhen
      hueGruppeAnzahlQueue[gruppenname]++; // Zähler Anzahl aktive Presets um 1 erhöhen
      log("Gruppe: " + gruppenname + " # Verzögerung: " +verzögerung + " # wartenAktiv: " + wartenAktiv + " # warten: " + hueWarten[gruppenname] + " # aktiv: " + hueGruppeAktiv[gruppenname],"warn");
      log("schalte Gruppe: " + gruppenname + ", Preset: " + preset + " in: " +verzögerung + " ms aktiv","warn");
      if (hueGruppen[gruppenname]) {
      hueTimer[gruppenname] = setTimeout(function() { // Preset verzögert aktivieren, wenn eingestellt
      for (i = 0; i < hueGruppen[gruppenname].length; i++) { // jede Lampe aus der Gruppe
      for (j = 0; j < hueParameter.length; j++) { // teste alle möglichen hue Parameter
      if (huePresets[preset]) {
      if (huePresets[preset].hasOwnProperty(hueParameter[j])){ // nur die im Preset enthaltenen Variablen verarbeiten
      if (hueParameter[j] != "bri") { // bri rausnehmen, da ggf. eigener Wert mitgegeben wurde
      setState(hueGruppen[gruppenname][i] + "." + hueParameter[j], huePresets[preset][hueParameter[j]] );
      log(hueParameter[j] + ": " + huePresets[preset][hueParameter[j]],"info");
      } else { // es handelt sich um bri
      if (!validBri(bri)) { // prüfen, ob ein gültiger bri Wert vom Anwender übergeben wurde
      setState(hueGruppen[gruppenname][i] + "." + hueParameter[j], huePresets[preset][hueParameter[j]] );
      log(hueParameter[j] + ": " + huePresets[preset][hueParameter[j]],"info");
      } else {
      setState(hueGruppen[gruppenname][i] + ".bri", bri); // wenn ein Helligkeitswert übergeben wurde, diesen verwenden
      log(hueParameter[j] + ": " + bri,"info");
      }
      }
      }

                      } else {
                          log("Preset: # " + preset + " # nicht definiert","error");
                          //hueWarten[gruppenname] -= wartenAktiv; // Lichteinstellungen nicht ausgeführt, Zeit nicht dazuaddiert (ohne diese Zeile wird die Zeit dazuaddiert, ohne das Licht zu ändern)
                          return null;
                      }
                  }
              }
              hueWarten[gruppenname] -= wartenAktiv;                              // beim nächsten Eintrag zu addierende Wartezeit
              hueGruppeAnzahlQueue[gruppenname]--;                                // aktive Presets um eins reduzieren (0 es ist kein Preset in der Gruppe mehr aktiv)
          }, verzögerung);
      } else {
          log("Gruppenname: # " + gruppenname + " # nicht definiert","error");
          //hueWarten[gruppenname] -= wartenAktiv;  // Lichteinstellungen nicht ausgeführt, Zeit nicht dazuaddiert
      }
      

      }

      ! // Scriptstart
      //--------------------------------------------------------------------------------------------------------------------------
      // Hinweis:
      //
      // Die Effekte ändern sich nach dem Timeout. Überlegung: dies auf eine Queue zu ändern (First in First Out, Zeiten addieren)
      // d.h. die Funktionen unten werden in der Reihenfolge (1),(4),(2),(3),(5) abgearbeitet.
      ! hueQueuesAnlegen (); // legt die Queues an, in Abhängigkeit der vorhanden Gruppen im Script
      ! log("hueWarten[arbeitszimmer]: " + hueWarten["arbeitszimmer"]);
      ! /*
      hueGruppe("wohnzimmerGruppe","standard");
      hueGruppe("wohnzimmerGruppe","blue",5000);
      hueGruppe("wohnzimmerGruppe","off",30000);
      /
      ! hueGruppe("arbeitszimmer","standard");
      hueGruppe("arbeitszimmer","red",2000);
      hueGruppe("arbeitszimmer","off",5000);
      //hueGruppe("arbeitszimmer","blue",2000);
      ! hueGruppeStop("arbeitszimmer");
      ! setTimeout(function() {
      hueGruppe("arbeitszimmer","blue",2000);
      hueGruppe("arbeitszimmer","off",2000);
      },4000);
      ! /

      hueGruppe("arbeitszimmer","blue");
      hueGruppe("arbeitszimmer","red");
      hueGruppe("arbeitszimmer","blue"),500;
      hueGruppe("arbeitszimmer","standard",500);
      hueGruppe("arbeitszimmer","blue",500);
      hueGruppe("arbeitszimmer","standard",1000);
      hueGruppe("arbeitszimmer","off",2000);
      /
      ! /

      hueGruppe("arbeitszimmer","standard",0,100);
      hueGruppe("arbeitszimmer","blue",1000);
      hueGruppe("arbeitszimmer","standard",1000,100);
      hueGruppe("arbeitszimmer","blue");
      hueGruppe("wohnzimmer","standard");
      hueGruppe("wohnzimmer","blue",1000);
      hueGruppe("wohnzimmer","off",1000);
      hueGruppe("arbeitszimmer","standard");
      hueGruppe("arbeitszimmer","blue");
      hueGruppe("arbeitszimmer","standard");
      hueGruppe("arbeitszimmer","blue",1000);
      hueGruppe("arbeitszimmer","off",1000);
      */`
      1002_server_last1.png
      1002_server_last2.png [/i][/i][/i]

      1 Reply Last reply Reply Quote 0
      • Bluefox
        Bluefox last edited by

        Das was du geschrieben hast, sollte gehen.

        Nun würde ich noch vor setTimeout prüfen ob timer schon läuft und im Timer auch hueTimer[gruppenname] auf "null" setzten.

        if (hueTimer[gruppenname]) clearTimeout(hueTimer[gruppenname]);
        
        hueTimer[gruppenname] = setTimeout(function() {  
             hueTimer[gruppenname] = null;
        ...
        
        
        1 Reply Last reply Reply Quote 0
        • ruhr70
          ruhr70 last edited by

          @Bluefox:

          Das was du geschrieben hast, sollte gehen. `

          Oje… oder besser... MIST :shock:

          Ne, das Löschen hatte so nicht funktioniert. Der Timer schon.

          Das was Du unten geschrieben hast, sagt mir, dass ich da noch etwas umbauen muss. 😞

          Das würde von Konzept her bedeuten, dass jeder Timer nur einmal aktiv sein kann? :?:

          Bei mir gibt es für jede Gruppe einen eigenen Timer, exemplarisch hueTimer[gruppenname], der aber auch gleichzeitig x-mal gestartet wird.

          Und das hat wunderbar funktioniert:

          timer ["A"]: 1000 ms, 1200ms, 5000ms, 7200ms

          timer **: 800ms, 1200 ms, 3200ms

          usw.

          D.h. jeder Timer hat quasi eine Queue von Funktionen, die nach den Zeiten nacheinander ausgeführt werden.

          Wie gesagt, klappt prima. 😉

          Deiner Erklärung kann ich entnehmen, dass das nicht das Konzept eines Timers ist (mehrfach, gleichzeitig benutzen).

          Wenn dem so ist, muss ich nicht nur Deine Änderungen einbauen, sondern noch so einiges mehr. 😞

          Für jede Stufe einen eigenen Timer:

          timer ["A"][0]: 1000 ms

          timer ["A"][1]: 1200ms

          timer ["A"][2]: 5000ms

          timer ["A"][3]: 7200ms

          Und alle löschen, wenn die Timer für einen Raum gestoppt werden sollen.

          Gefiel mir vorher besser 😛 😄

          [EDIT]

          Alternativ zu mehreren Timern je Raum, könnte ich auch "echte" Queues bauen und immer erst den Timer aufrufen, wenn der vorherige Timer durch ist. Dann hätte ich mir das Berechnen der addierten Timer sparen können.

          @Bluefox:

          Nun würde ich noch vor setTimeout prüfen ob timer schon läuft und im Timer auch hueTimer[gruppenname] auf "null" setzten.

          if (hueTimer[gruppenname]) clearTimeout(hueTimer[gruppenname]);
          
          hueTimer[gruppenname] = setTimeout(function() {  
               hueTimer[gruppenname] = null;
          ...
          
          ```` ` **
          1 Reply Last reply Reply Quote 0
          • ruhr70
            ruhr70 last edited by

            Gab es heute Morgen Probleme mit dem Forum?

            Meine im Auto gesehen zu haben, dass hier geantwortet wurde, wollte nachsehen und dann gab es nur einen Servererror.

            Entweder hat mich Tapatalk gelingt oder eine eventuelle Antwort ist nun im Nirwana verschwunden 😞
            305_heizungsscript_090_08.txt

            1 Reply Last reply Reply Quote 0
            • ruhr70
              ruhr70 last edited by

              Script ist umgebaut und funktioniert nun wie gewünscht.

              Die Erkenntnisse:

              • ein setTimeout() kann mehrmals hintereinander gestartet werden. Alle Abläufe werden abgearbeitet

              • ein clearTimeout() löscht nur den letzten Ablauf. Alle anderen mehrmals gestarteten Aufrufe werden noch abgearbeitet.

              Wenn man setTimeout() komplett stoppen will, darf man es nicht mehrmals aufrufen, sondern muss die Einträge aus einer Queue nacheinander abarbeiten.
              3467_aktueller_status.png
              3467_fehler_status.png

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

              Support us

              ioBroker
              Community Adapters
              Donate

              879
              Online

              31.7k
              Users

              79.7k
              Topics

              1.3m
              Posts

              2
              5
              1366
              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