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

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. Timeout in JS einbinden

NEWS

  • Weihnachtsangebot 2025! 🎄
    BluefoxB
    Bluefox
    22
    1
    1.1k

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    14
    1
    2.4k

Timeout in JS einbinden

Geplant Angeheftet Gesperrt Verschoben JavaScript
24 Beiträge 6 Kommentatoren 1.8k Aufrufe 5 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.
  • ubeckerU Offline
    ubeckerU Offline
    ubecker
    schrieb am zuletzt editiert von
    #1

    Hallo
    für den Fachmann wohl eine Kleinigkeit, ich weiss nicht wie man das schreiben soll
    Mein Script:

    
    // Heizung ein bei Energieanforderung
    
    const ids = 'javascript.0.Array_IDs_Heizung_level'/*Array IDs Heizung level*/
    const ID_Liste_Level = getState(ids).val; 
    const level_value = 20.1;
    
    
    // Trigger auf Array ID Heizung level
    on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
      let value = obj.state.val;
      let oldValue = obj.oldState.val;
    
      // FOR Schleife um Daten zu holen
      var x_end = ID_Liste_Level.length -1;
      var x_inc = 1;
      var gesamt_value = 0.0;
      var timeout;
      if (0 > x_end) { x_inc = -x_inc;}
        for (var x = 0; x_inc >= 0 ? x <= x_end : x >= x_end; x += x_inc) {
            // Level geändert
            gesamt_value = gesamt_value +  (getState(ID_Liste_Level[x]).val )
        }
        // Test auf level_value 
        if (gesamt_value >= level_value) {
            // Heizung ein
            setState('javascript.0.Heizung_Kessel_aktiv'/*Heizung Kessel aktiv*/,true,true)
            // clear timeout muss hier hinzu
            }
            // Heizung aus soll aber erst nach 5 Std 
            else //Timeout setzten 300min muss hier rein
               {setState('javascript.0.Heizung_Kessel_aktiv'/*Heizung Kessel aktiv*/,false,true)}
        console.log(gesamt_value)
    });
    
    Kann mit einer den code eintragen.
    danke
    
    

    Gruß Udo

    OliverIOO 1 Antwort Letzte Antwort
    0
    • ubeckerU ubecker

      Hallo
      für den Fachmann wohl eine Kleinigkeit, ich weiss nicht wie man das schreiben soll
      Mein Script:

      
      // Heizung ein bei Energieanforderung
      
      const ids = 'javascript.0.Array_IDs_Heizung_level'/*Array IDs Heizung level*/
      const ID_Liste_Level = getState(ids).val; 
      const level_value = 20.1;
      
      
      // Trigger auf Array ID Heizung level
      on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
        let value = obj.state.val;
        let oldValue = obj.oldState.val;
      
        // FOR Schleife um Daten zu holen
        var x_end = ID_Liste_Level.length -1;
        var x_inc = 1;
        var gesamt_value = 0.0;
        var timeout;
        if (0 > x_end) { x_inc = -x_inc;}
          for (var x = 0; x_inc >= 0 ? x <= x_end : x >= x_end; x += x_inc) {
              // Level geändert
              gesamt_value = gesamt_value +  (getState(ID_Liste_Level[x]).val )
          }
          // Test auf level_value 
          if (gesamt_value >= level_value) {
              // Heizung ein
              setState('javascript.0.Heizung_Kessel_aktiv'/*Heizung Kessel aktiv*/,true,true)
              // clear timeout muss hier hinzu
              }
              // Heizung aus soll aber erst nach 5 Std 
              else //Timeout setzten 300min muss hier rein
                 {setState('javascript.0.Heizung_Kessel_aktiv'/*Heizung Kessel aktiv*/,false,true)}
          console.log(gesamt_value)
      });
      
      Kann mit einer den code eintragen.
      danke
      
      
      OliverIOO Offline
      OliverIOO Offline
      OliverIO
      schrieb am zuletzt editiert von
      #2

      @ubecker

      evtl solltest du genauer beschreiben was du willst.
      mir sind das zuwenig informationen

      Meine Adapter und Widgets
      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
      Links im Profil

      ubeckerU 1 Antwort Letzte Antwort
      0
      • OliverIOO OliverIO

        @ubecker

        evtl solltest du genauer beschreiben was du willst.
        mir sind das zuwenig informationen

        ubeckerU Offline
        ubeckerU Offline
        ubecker
        schrieb am zuletzt editiert von
        #3

        @oliverio said in Timeout in JS einbinden:

        @ubecker

        evtl solltest du genauer beschreiben was du willst.
        mir sind das zuwenig informationen

        sorry dachte das wäre so schon klar.

        ich möchte an den Stellen in dem Script
        // clear timeout muss hier hinzu
        einen Clear Timeout haben

        und hier:
        //Timeout setzten 300min muss hier rein
        soll ein Timeout starten

        Gruß Udo

        OliverIOO 1 Antwort Letzte Antwort
        0
        • ubeckerU ubecker

          @oliverio said in Timeout in JS einbinden:

          @ubecker

          evtl solltest du genauer beschreiben was du willst.
          mir sind das zuwenig informationen

          sorry dachte das wäre so schon klar.

          ich möchte an den Stellen in dem Script
          // clear timeout muss hier hinzu
          einen Clear Timeout haben

          und hier:
          //Timeout setzten 300min muss hier rein
          soll ein Timeout starten

          OliverIOO Offline
          OliverIOO Offline
          OliverIO
          schrieb am zuletzt editiert von OliverIO
          #4

          @ubecker

          gut, auf basis der informationen die du mir gegeben hast

          
          // Heizung ein bei Energieanforderung
          
          const ids = 'javascript.0.Array_IDs_Heizung_level'/*Array IDs Heizung level*/
          const ID_Liste_Level = getState(ids).val; 
          const level_value = 20.1;
          
          
          // Trigger auf Array ID Heizung level
          on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
            let value = obj.state.val;
            let oldValue = obj.oldState.val;
          
            // FOR Schleife um Daten zu holen
            var x_end = ID_Liste_Level.length -1;
            var x_inc = 1;
            var gesamt_value = 0.0;
            var timeout;
            if (0 > x_end) { x_inc = -x_inc;}
              for (var x = 0; x_inc >= 0 ? x <= x_end : x >= x_end; x += x_inc) {
                  // Level geändert
                  gesamt_value = gesamt_value +  (getState(ID_Liste_Level[x]).val )
              }
              // Test auf level_value 
              if (gesamt_value >= level_value) {
                  // Heizung ein
                  setState('javascript.0.Heizung_Kessel_aktiv'/*Heizung Kessel aktiv*/,true,true)
                  // clear timeout muss hier hinzu
          		clearTimeout(timeout);
                  }
                  // Heizung aus soll aber erst nach 5 Std 
                  else //Timeout setzten 300min muss hier rein
          		timeout=setTimeout(() => {
          		  setState('javascript.0.Heizung_Kessel_aktiv'/*Heizung Kessel aktiv*/,false,true);
          		}, 300*60*60*1000);		
              console.log(gesamt_value)
          });
          
          Kann mit einer den code eintragen.
          danke
          
          

          Meine Adapter und Widgets
          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
          Links im Profil

          1 Antwort Letzte Antwort
          0
          • ubeckerU Offline
            ubeckerU Offline
            ubecker
            schrieb am zuletzt editiert von
            #5

            @oliverio
            danke, so einfach?
            Hatte das in blockly gemacht und als JS augegeben. Da sah das sehr komplex aus.

            Gruß Udo

            OliverIOO Meister MopperM 2 Antworten Letzte Antwort
            0
            • ubeckerU ubecker

              @oliverio
              danke, so einfach?
              Hatte das in blockly gemacht und als JS augegeben. Da sah das sehr komplex aus.

              OliverIOO Offline
              OliverIOO Offline
              OliverIO
              schrieb am zuletzt editiert von OliverIO
              #6

              @ubecker

              keine ahnung.
              du hattest ja nur geschrieben, hier die entsprechenden befehle eintragen und das habe ich getan.
              warum und wieso weiß ich ja nicht.

              hier die Hilfeseiten dazu
              https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
              https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout

              Meine Adapter und Widgets
              TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
              Links im Profil

              M ubeckerU 2 Antworten Letzte Antwort
              0
              • OliverIOO OliverIO

                @ubecker

                keine ahnung.
                du hattest ja nur geschrieben, hier die entsprechenden befehle eintragen und das habe ich getan.
                warum und wieso weiß ich ja nicht.

                hier die Hilfeseiten dazu
                https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout

                M Online
                M Online
                MCU
                schrieb am zuletzt editiert von
                #7

                @oliverio

                300*60*60*1000  sind mehr als 5Stunden?
                
                300*60*1000 -> 5Std
                

                NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
                Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

                OliverIOO 1 Antwort Letzte Antwort
                0
                • ubeckerU ubecker

                  @oliverio
                  danke, so einfach?
                  Hatte das in blockly gemacht und als JS augegeben. Da sah das sehr komplex aus.

                  Meister MopperM Online
                  Meister MopperM Online
                  Meister Mopper
                  schrieb am zuletzt editiert von
                  #8

                  @ubecker sagte in Timeout in JS einbinden:

                  @oliverio
                  danke, so einfach?
                  Hatte das in blockly gemacht und als JS augegeben. Da sah das sehr komplex aus.

                  Dafür kannste auch KI verwenden, in vielen Fällen übersetzt sie die Blockly gut in JS. Ob es dann auch ressourcenschonend ist, steht auf einem anderen Blatt (dafür bracht es Profis).

                  Proxmox und HA

                  1 Antwort Letzte Antwort
                  0
                  • OliverIOO OliverIO

                    @ubecker

                    keine ahnung.
                    du hattest ja nur geschrieben, hier die entsprechenden befehle eintragen und das habe ich getan.
                    warum und wieso weiß ich ja nicht.

                    hier die Hilfeseiten dazu
                    https://developer.mozilla.org/en-US/docs/Web/API/Window/clearTimeout
                    https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout

                    ubeckerU Offline
                    ubeckerU Offline
                    ubecker
                    schrieb am zuletzt editiert von
                    #9

                    @oliverio
                    alles ok, mir ging es nur um die syntax zu den Befehlen. Hab das nirgendwo gefunden.
                    und danke für die links
                    Zur weiteren Info:
                    ich teste mittels Array Werte von (ca 20) Heizkörperventilen
                    Wenn die Raumtemperatur abfällt öffnen die Ventile = Energieanforderung.
                    Dann schalte ich die Heizung ein
                    Der Timeout macht nur eine Verzögerung des ausschalten der Heizung

                    Gruß Udo

                    OliverIOO 2 Antworten Letzte Antwort
                    0
                    • M MCU

                      @oliverio

                      300*60*60*1000  sind mehr als 5Stunden?
                      
                      300*60*1000 -> 5Std
                      
                      OliverIOO Offline
                      OliverIOO Offline
                      OliverIO
                      schrieb am zuletzt editiert von
                      #10

                      @mcu

                      ah ja, einmal 60* zuviel

                      Meine Adapter und Widgets
                      TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                      Links im Profil

                      1 Antwort Letzte Antwort
                      0
                      • ubeckerU ubecker

                        @oliverio
                        alles ok, mir ging es nur um die syntax zu den Befehlen. Hab das nirgendwo gefunden.
                        und danke für die links
                        Zur weiteren Info:
                        ich teste mittels Array Werte von (ca 20) Heizkörperventilen
                        Wenn die Raumtemperatur abfällt öffnen die Ventile = Energieanforderung.
                        Dann schalte ich die Heizung ein
                        Der Timeout macht nur eine Verzögerung des ausschalten der Heizung

                        OliverIOO Offline
                        OliverIOO Offline
                        OliverIO
                        schrieb am zuletzt editiert von
                        #11

                        @ubecker

                        zunächst mal durch ki formatiert und erklärt

                        Gerne! Hier ist dein Skript strukturiert, korrekt eingerückt und mit Kommentaren erklärt. Es handelt sich um ein JavaScript-Skript für ioBroker (Blockly/JavaScript Adapter), das prüft, ob die Heizungsanforderung durch verschiedene Quellen hoch genug ist, um den Heizkessel einzuschalten – oder nach 5 Stunden auszuschalten.


                        ✨ Formatierter und erklärter Code

                        // 🔥 Heizung ein-/ausschalten bei Energieanforderung
                        
                        const ids = 'javascript.0.Array_IDs_Heizung_level'; // Array mit allen Level-IDs
                        const ID_Liste_Level = getState(ids).val;           // Liest die Array-IDs aus dem Datenpunkt
                        const level_value = 20.1;                            // Schwellenwert für Aktivierung der Heizung
                        
                        // ⏱ Trigger auf Änderungen in einem der Level-Werte
                        on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
                            let value = obj.state.val;
                            let oldValue = obj.oldState.val;
                        
                            // 🔁 Schleife über alle Heiz-Level IDs
                            let x_end = ID_Liste_Level.length - 1;
                            let x_inc = 1;
                            let gesamt_value = 0.0;
                            let timeout;
                        
                            if (x_end < 0) {
                                x_inc = -x_inc;
                            }
                        
                            for (let x = 0; x_inc >= 0 ? x <= x_end : x >= x_end; x += x_inc) {
                                gesamt_value += getState(ID_Liste_Level[x]).val;
                            }
                        
                            // ✅ Wenn die Gesamtleistung über dem Schwellwert liegt
                            if (gesamt_value >= level_value) {
                                // Heizung aktivieren
                                setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                        
                                // Eventuell vorhandenen Ausschalt-Timer löschen
                                clearTimeout(timeout);
                            } else {
                                // ❄️ Heizung erst nach 5 Stunden deaktivieren
                                timeout = setTimeout(() => {
                                    setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                            }
                        
                            // 🧾 Debug-Ausgabe
                            console.log(gesamt_value);
                        });
                        

                        🧠 Was macht das Skript genau?

                        Abschnitt Funktion
                        getState(ids).val Holt die Liste der IDs, deren Werte überwacht werden sollen
                        on({...}) Reagiert auf jede Änderung eines Werts in dieser Liste
                        for-Schleife Summiert alle aktuellen Werte der IDs (z. B. Heizkreise)
                        if gesamt_value >= ... Wenn genug Anforderung vorhanden ist → Heizung an
                        else mit setTimeout Sonst: nach 5 Stunden (300 Minuten) → Heizung aus
                        clearTimeout(timeout) Wenn vorher ein Ausschalten geplant war, aber jetzt wieder Anforderung kommt, wird der Timer gelöscht

                        🛠 Hinweise

                        • timeout ist aktuell lokal in der Funktion definiert – wird aber bei jedem Trigger neu gesetzt. Damit der Ausschalt-Timer persistiert, muss timeout außerhalb des Event-Handlers deklariert werden (sonst funktioniert clearTimeout() nicht wie gewünscht).

                        Mögliche Verbesserung:

                        let timeout; // globale Variable außerhalb des Event-Handlers
                        
                        on({...}) {
                            ...
                        }
                        

                        Wenn du willst, kann ich das für dich gleich verbessern.

                        Meine Adapter und Widgets
                        TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                        Links im Profil

                        OliverIOO 1 Antwort Letzte Antwort
                        0
                        • OliverIOO OliverIO

                          @ubecker

                          zunächst mal durch ki formatiert und erklärt

                          Gerne! Hier ist dein Skript strukturiert, korrekt eingerückt und mit Kommentaren erklärt. Es handelt sich um ein JavaScript-Skript für ioBroker (Blockly/JavaScript Adapter), das prüft, ob die Heizungsanforderung durch verschiedene Quellen hoch genug ist, um den Heizkessel einzuschalten – oder nach 5 Stunden auszuschalten.


                          ✨ Formatierter und erklärter Code

                          // 🔥 Heizung ein-/ausschalten bei Energieanforderung
                          
                          const ids = 'javascript.0.Array_IDs_Heizung_level'; // Array mit allen Level-IDs
                          const ID_Liste_Level = getState(ids).val;           // Liest die Array-IDs aus dem Datenpunkt
                          const level_value = 20.1;                            // Schwellenwert für Aktivierung der Heizung
                          
                          // ⏱ Trigger auf Änderungen in einem der Level-Werte
                          on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
                              let value = obj.state.val;
                              let oldValue = obj.oldState.val;
                          
                              // 🔁 Schleife über alle Heiz-Level IDs
                              let x_end = ID_Liste_Level.length - 1;
                              let x_inc = 1;
                              let gesamt_value = 0.0;
                              let timeout;
                          
                              if (x_end < 0) {
                                  x_inc = -x_inc;
                              }
                          
                              for (let x = 0; x_inc >= 0 ? x <= x_end : x >= x_end; x += x_inc) {
                                  gesamt_value += getState(ID_Liste_Level[x]).val;
                              }
                          
                              // ✅ Wenn die Gesamtleistung über dem Schwellwert liegt
                              if (gesamt_value >= level_value) {
                                  // Heizung aktivieren
                                  setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                          
                                  // Eventuell vorhandenen Ausschalt-Timer löschen
                                  clearTimeout(timeout);
                              } else {
                                  // ❄️ Heizung erst nach 5 Stunden deaktivieren
                                  timeout = setTimeout(() => {
                                      setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                  }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                              }
                          
                              // 🧾 Debug-Ausgabe
                              console.log(gesamt_value);
                          });
                          

                          🧠 Was macht das Skript genau?

                          Abschnitt Funktion
                          getState(ids).val Holt die Liste der IDs, deren Werte überwacht werden sollen
                          on({...}) Reagiert auf jede Änderung eines Werts in dieser Liste
                          for-Schleife Summiert alle aktuellen Werte der IDs (z. B. Heizkreise)
                          if gesamt_value >= ... Wenn genug Anforderung vorhanden ist → Heizung an
                          else mit setTimeout Sonst: nach 5 Stunden (300 Minuten) → Heizung aus
                          clearTimeout(timeout) Wenn vorher ein Ausschalten geplant war, aber jetzt wieder Anforderung kommt, wird der Timer gelöscht

                          🛠 Hinweise

                          • timeout ist aktuell lokal in der Funktion definiert – wird aber bei jedem Trigger neu gesetzt. Damit der Ausschalt-Timer persistiert, muss timeout außerhalb des Event-Handlers deklariert werden (sonst funktioniert clearTimeout() nicht wie gewünscht).

                          Mögliche Verbesserung:

                          let timeout; // globale Variable außerhalb des Event-Handlers
                          
                          on({...}) {
                              ...
                          }
                          

                          Wenn du willst, kann ich das für dich gleich verbessern.

                          OliverIOO Offline
                          OliverIOO Offline
                          OliverIO
                          schrieb am zuletzt editiert von
                          #12

                          nächster schritt

                          Perfekt! Hier ist dein Skript mit korrekt implementiertem Timeout-Handling, sodass clearTimeout(timeout) wie gewünscht funktioniert und nicht bei jedem Trigger-Ereignis verloren geht:


                          ✅ Finale Version mit persistentem Timeout

                          // 🔥 Heizung ein-/ausschalten bei Energieanforderung
                          
                          const ids = 'javascript.0.Array_IDs_Heizung_level';       // Datenpunkt mit Array von Level-IDs
                          const level_value = 20.1;                                  // Schwellenwert zur Aktivierung der Heizung
                          const ID_Liste_Level = getState(ids).val;                  // Array der zu überwachenden IDs
                          
                          let timeout = null; // ⏱ Timeout-Variable global definieren
                          
                          // 📡 Trigger bei jeder Änderung eines Wertes in der Liste
                          on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
                              let gesamt_value = 0.0;
                          
                              // 🔁 Summiere alle aktuellen Werte
                              for (let i = 0; i < ID_Liste_Level.length; i++) {
                                  let val = getState(ID_Liste_Level[i]).val;
                                  gesamt_value += val;
                              }
                          
                              // ✅ Wenn Schwelle erreicht oder überschritten → Heizung AN
                              if (gesamt_value >= level_value) {
                                  setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                          
                                  // ⛔ Bereits laufenden Ausschalt-Timer abbrechen
                                  if (timeout !== null) {
                                      clearTimeout(timeout);
                                      timeout = null;
                                  }
                              }
                              // ❄️ Wenn unter Schwelle → Heizung AUS (nach 5 Stunden)
                              else {
                                  if (timeout === null) {
                                      timeout = setTimeout(() => {
                                          setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                          timeout = null; // Timer zurücksetzen
                                      }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                                  }
                              }
                          
                              // 📋 Protokolliere aktuellen Summenwert
                              console.log('Gesamtanforderung:', gesamt_value);
                          });
                          

                          🧠 Vorteil der Änderung

                          Durch die globale timeout-Variable wird verhindert, dass mehrere setTimeout()-Aufrufe gleichzeitig laufen. Stattdessen gibt es genau einen Ausschalt-Timer, der bei Bedarf neu gesetzt oder gelöscht wird.

                          Wenn du möchtest, kann ich auch eine erweiterte Version mit Logging, Telegram-Benachrichtigung oder Visualisierung vorbereiten.

                          Meine Adapter und Widgets
                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                          Links im Profil

                          paul53P ubeckerU 2 Antworten Letzte Antwort
                          0
                          • ubeckerU ubecker

                            @oliverio
                            alles ok, mir ging es nur um die syntax zu den Befehlen. Hab das nirgendwo gefunden.
                            und danke für die links
                            Zur weiteren Info:
                            ich teste mittels Array Werte von (ca 20) Heizkörperventilen
                            Wenn die Raumtemperatur abfällt öffnen die Ventile = Energieanforderung.
                            Dann schalte ich die Heizung ein
                            Der Timeout macht nur eine Verzögerung des ausschalten der Heizung

                            OliverIOO Offline
                            OliverIOO Offline
                            OliverIO
                            schrieb am zuletzt editiert von
                            #13

                            @ubecker
                            das geht auch schon in der kostenlosen version mit chatgpt

                            Meine Adapter und Widgets
                            TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                            Links im Profil

                            ubeckerU 1 Antwort Letzte Antwort
                            0
                            • OliverIOO OliverIO

                              nächster schritt

                              Perfekt! Hier ist dein Skript mit korrekt implementiertem Timeout-Handling, sodass clearTimeout(timeout) wie gewünscht funktioniert und nicht bei jedem Trigger-Ereignis verloren geht:


                              ✅ Finale Version mit persistentem Timeout

                              // 🔥 Heizung ein-/ausschalten bei Energieanforderung
                              
                              const ids = 'javascript.0.Array_IDs_Heizung_level';       // Datenpunkt mit Array von Level-IDs
                              const level_value = 20.1;                                  // Schwellenwert zur Aktivierung der Heizung
                              const ID_Liste_Level = getState(ids).val;                  // Array der zu überwachenden IDs
                              
                              let timeout = null; // ⏱ Timeout-Variable global definieren
                              
                              // 📡 Trigger bei jeder Änderung eines Wertes in der Liste
                              on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
                                  let gesamt_value = 0.0;
                              
                                  // 🔁 Summiere alle aktuellen Werte
                                  for (let i = 0; i < ID_Liste_Level.length; i++) {
                                      let val = getState(ID_Liste_Level[i]).val;
                                      gesamt_value += val;
                                  }
                              
                                  // ✅ Wenn Schwelle erreicht oder überschritten → Heizung AN
                                  if (gesamt_value >= level_value) {
                                      setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                              
                                      // ⛔ Bereits laufenden Ausschalt-Timer abbrechen
                                      if (timeout !== null) {
                                          clearTimeout(timeout);
                                          timeout = null;
                                      }
                                  }
                                  // ❄️ Wenn unter Schwelle → Heizung AUS (nach 5 Stunden)
                                  else {
                                      if (timeout === null) {
                                          timeout = setTimeout(() => {
                                              setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                              timeout = null; // Timer zurücksetzen
                                          }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                                      }
                                  }
                              
                                  // 📋 Protokolliere aktuellen Summenwert
                                  console.log('Gesamtanforderung:', gesamt_value);
                              });
                              

                              🧠 Vorteil der Änderung

                              Durch die globale timeout-Variable wird verhindert, dass mehrere setTimeout()-Aufrufe gleichzeitig laufen. Stattdessen gibt es genau einen Ausschalt-Timer, der bei Bedarf neu gesetzt oder gelöscht wird.

                              Wenn du möchtest, kann ich auch eine erweiterte Version mit Logging, Telegram-Benachrichtigung oder Visualisierung vorbereiten.

                              paul53P Offline
                              paul53P Offline
                              paul53
                              schrieb am zuletzt editiert von paul53
                              #14

                              @oliverio sagte: Durch die globale timeout-Variable wird verhindert, dass mehrere setTimeout()-Aufrufe gleichzeitig laufen.

                              Das ist bei analogen Vergleichswerten auch erforderlich, da andernfalls clearTimeout(timeout) nicht funktioniert.
                              Prinzip:

                                  if (Vergleich von Analogwerten) {
                                      setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                                      // ⛔ Bereits laufenden Ausschalt-Timer abbrechen
                                      if (timeout) {
                                          clearTimeout(timeout);
                                          timeout = null;
                                      }
                                  } else if (!timeout) {
                                      timeout = setTimeout(() => {
                                          setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                      }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                                  }
                              

                              Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                              Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                              OliverIOO 1 Antwort Letzte Antwort
                              0
                              • paul53P paul53

                                @oliverio sagte: Durch die globale timeout-Variable wird verhindert, dass mehrere setTimeout()-Aufrufe gleichzeitig laufen.

                                Das ist bei analogen Vergleichswerten auch erforderlich, da andernfalls clearTimeout(timeout) nicht funktioniert.
                                Prinzip:

                                    if (Vergleich von Analogwerten) {
                                        setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                                        // ⛔ Bereits laufenden Ausschalt-Timer abbrechen
                                        if (timeout) {
                                            clearTimeout(timeout);
                                            timeout = null;
                                        }
                                    } else if (!timeout) {
                                        timeout = setTimeout(() => {
                                            setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                        }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                                    }
                                
                                OliverIOO Offline
                                OliverIOO Offline
                                OliverIO
                                schrieb am zuletzt editiert von
                                #15

                                @paul53 das was copy/paste aus chatgpt

                                Meine Adapter und Widgets
                                TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                Links im Profil

                                1 Antwort Letzte Antwort
                                0
                                • OliverIOO OliverIO

                                  nächster schritt

                                  Perfekt! Hier ist dein Skript mit korrekt implementiertem Timeout-Handling, sodass clearTimeout(timeout) wie gewünscht funktioniert und nicht bei jedem Trigger-Ereignis verloren geht:


                                  ✅ Finale Version mit persistentem Timeout

                                  // 🔥 Heizung ein-/ausschalten bei Energieanforderung
                                  
                                  const ids = 'javascript.0.Array_IDs_Heizung_level';       // Datenpunkt mit Array von Level-IDs
                                  const level_value = 20.1;                                  // Schwellenwert zur Aktivierung der Heizung
                                  const ID_Liste_Level = getState(ids).val;                  // Array der zu überwachenden IDs
                                  
                                  let timeout = null; // ⏱ Timeout-Variable global definieren
                                  
                                  // 📡 Trigger bei jeder Änderung eines Wertes in der Liste
                                  on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
                                      let gesamt_value = 0.0;
                                  
                                      // 🔁 Summiere alle aktuellen Werte
                                      for (let i = 0; i < ID_Liste_Level.length; i++) {
                                          let val = getState(ID_Liste_Level[i]).val;
                                          gesamt_value += val;
                                      }
                                  
                                      // ✅ Wenn Schwelle erreicht oder überschritten → Heizung AN
                                      if (gesamt_value >= level_value) {
                                          setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                                  
                                          // ⛔ Bereits laufenden Ausschalt-Timer abbrechen
                                          if (timeout !== null) {
                                              clearTimeout(timeout);
                                              timeout = null;
                                          }
                                      }
                                      // ❄️ Wenn unter Schwelle → Heizung AUS (nach 5 Stunden)
                                      else {
                                          if (timeout === null) {
                                              timeout = setTimeout(() => {
                                                  setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                                  timeout = null; // Timer zurücksetzen
                                              }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                                          }
                                      }
                                  
                                      // 📋 Protokolliere aktuellen Summenwert
                                      console.log('Gesamtanforderung:', gesamt_value);
                                  });
                                  

                                  🧠 Vorteil der Änderung

                                  Durch die globale timeout-Variable wird verhindert, dass mehrere setTimeout()-Aufrufe gleichzeitig laufen. Stattdessen gibt es genau einen Ausschalt-Timer, der bei Bedarf neu gesetzt oder gelöscht wird.

                                  Wenn du möchtest, kann ich auch eine erweiterte Version mit Logging, Telegram-Benachrichtigung oder Visualisierung vorbereiten.

                                  ubeckerU Offline
                                  ubeckerU Offline
                                  ubecker
                                  schrieb am zuletzt editiert von
                                  #16

                                  @oliverio said in Timeout in JS einbinden:

                                  nächster schritt

                                  Perfekt! Hier ist dein Skript mit korrekt implementiertem Timeout-Handling, sodass clearTimeout(timeout) wie gewünscht funktioniert und nicht bei jedem Trigger-Ereignis verloren geht:


                                  ✅ Finale Version mit persistentem Timeout

                                  // 🔥 Heizung ein-/ausschalten bei Energieanforderung
                                  
                                  const ids = 'javascript.0.Array_IDs_Heizung_level';       // Datenpunkt mit Array von Level-IDs
                                  const level_value = 20.1;                                  // Schwellenwert zur Aktivierung der Heizung
                                  const ID_Liste_Level = getState(ids).val;                  // Array der zu überwachenden IDs
                                  
                                  let timeout = null; // ⏱ Timeout-Variable global definieren
                                  
                                  // 📡 Trigger bei jeder Änderung eines Wertes in der Liste
                                  on({ id: [].concat(ID_Liste_Level), change: 'ne' }, async (obj) => {
                                      let gesamt_value = 0.0;
                                  
                                      // 🔁 Summiere alle aktuellen Werte
                                      for (let i = 0; i < ID_Liste_Level.length; i++) {
                                          let val = getState(ID_Liste_Level[i]).val;
                                          gesamt_value += val;
                                      }
                                  
                                      // ✅ Wenn Schwelle erreicht oder überschritten → Heizung AN
                                      if (gesamt_value >= level_value) {
                                          setState('javascript.0.Heizung_Kessel_aktiv', true, true);
                                  
                                          // ⛔ Bereits laufenden Ausschalt-Timer abbrechen
                                          if (timeout !== null) {
                                              clearTimeout(timeout);
                                              timeout = null;
                                          }
                                      }
                                      // ❄️ Wenn unter Schwelle → Heizung AUS (nach 5 Stunden)
                                      else {
                                          if (timeout === null) {
                                              timeout = setTimeout(() => {
                                                  setState('javascript.0.Heizung_Kessel_aktiv', false, true);
                                                  timeout = null; // Timer zurücksetzen
                                              }, 300 * 60 * 1000); // 300 Minuten = 5 Stunden
                                          }
                                      }
                                  
                                      // 📋 Protokolliere aktuellen Summenwert
                                      console.log('Gesamtanforderung:', gesamt_value);
                                  });
                                  

                                  🧠 Vorteil der Änderung

                                  Durch die globale timeout-Variable wird verhindert, dass mehrere setTimeout()-Aufrufe gleichzeitig laufen. Stattdessen gibt es genau einen Ausschalt-Timer, der bei Bedarf neu gesetzt oder gelöscht wird.

                                  Wenn du möchtest, kann ich auch eine erweiterte Version mit Logging, Telegram-Benachrichtigung oder Visualisierung vorbereiten.


                                  super; einzig was noch fehlt sind die Bedingungen wenn Heizug schon auf true steht braucht nicht wieder gesetzt zu werden, auch beim ausschalten. sind aber nur 2 if Bedingungen.

                                  Gruß Udo

                                  1 Antwort Letzte Antwort
                                  0
                                  • OliverIOO OliverIO

                                    @ubecker
                                    das geht auch schon in der kostenlosen version mit chatgpt

                                    ubeckerU Offline
                                    ubeckerU Offline
                                    ubecker
                                    schrieb am zuletzt editiert von
                                    #17

                                    @oliverio
                                    kleiner Fehler in dem Script:
                                    console.log('Gesamtanforderung:', gesamt_value);
                                    funktioniert so nicht da erst ein String und dann eine Zahl.
                                    Zahl nach String konvertieren oder einfach den String 'Gesamtanforderung:' weglassen

                                    sonst alles ok, meine if Bedingung zum setzen hab ich auch eingebaut.

                                    nochmals Danke.

                                    Gruß Udo

                                    M paul53P OliverIOO 3 Antworten Letzte Antwort
                                    0
                                    • ubeckerU ubecker

                                      @oliverio
                                      kleiner Fehler in dem Script:
                                      console.log('Gesamtanforderung:', gesamt_value);
                                      funktioniert so nicht da erst ein String und dann eine Zahl.
                                      Zahl nach String konvertieren oder einfach den String 'Gesamtanforderung:' weglassen

                                      sonst alles ok, meine if Bedingung zum setzen hab ich auch eingebaut.

                                      nochmals Danke.

                                      M Online
                                      M Online
                                      MCU
                                      schrieb am zuletzt editiert von
                                      #18

                                      @ubecker sagte in Timeout in JS einbinden:

                                      console.log('Gesamtanforderung:', gesamt_value);

                                      console.log('Gesamtanforderung: '+ gesamt_value);
                                      

                                      NUC i7 64GB mit Proxmox ---- Jarvis Infos Aktualisierungen der Doku auf Instagram verfolgen -> mcuiobroker Instagram
                                      Wenn Euch mein Vorschlag geholfen hat, bitte rechts "^" klicken.

                                      1 Antwort Letzte Antwort
                                      0
                                      • ubeckerU ubecker

                                        @oliverio
                                        kleiner Fehler in dem Script:
                                        console.log('Gesamtanforderung:', gesamt_value);
                                        funktioniert so nicht da erst ein String und dann eine Zahl.
                                        Zahl nach String konvertieren oder einfach den String 'Gesamtanforderung:' weglassen

                                        sonst alles ok, meine if Bedingung zum setzen hab ich auch eingebaut.

                                        nochmals Danke.

                                        paul53P Offline
                                        paul53P Offline
                                        paul53
                                        schrieb am zuletzt editiert von
                                        #19

                                        @ubecker sagte: funktioniert so nicht da erst ein String und dann eine Zahl.

                                        Funktioniert, wenn das Komma durch ein Plus ersetzt wird.

                                        Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
                                        Produktiv: RPi 2 mit S.USV, HM-MOD-RPI und SLC-USB-Stick mit root fs

                                        1 Antwort Letzte Antwort
                                        1
                                        • ubeckerU ubecker

                                          @oliverio
                                          kleiner Fehler in dem Script:
                                          console.log('Gesamtanforderung:', gesamt_value);
                                          funktioniert so nicht da erst ein String und dann eine Zahl.
                                          Zahl nach String konvertieren oder einfach den String 'Gesamtanforderung:' weglassen

                                          sonst alles ok, meine if Bedingung zum setzen hab ich auch eingebaut.

                                          nochmals Danke.

                                          OliverIOO Offline
                                          OliverIOO Offline
                                          OliverIO
                                          schrieb am zuletzt editiert von OliverIO
                                          #20

                                          @ubecker sagte in Timeout in JS einbinden:

                                          console.log('Gesamtanforderung:', gesamt_value);

                                          wie gesagt, das skript ist nicht von mir überarbeitet worden, sondern von chatGPT
                                          nach Definition ist das richtig
                                          https://developer.mozilla.org/en-US/docs/Web/API/console/log_static
                                          https://nodejs.org/api/console.html#consolelogdata-args
                                          console.log nimmt 1 bis N parameter. jeder parameter wird gemäß typ so ausgegeben

                                          mit + wird automatisch von javascript der typ aus gesamt_value nach string gewandelt und dann das ergebnis angehängt.

                                          da scheint es im javascript adapter noch was geben
                                          hier die ausgabe aus der browser console
                                          4e69704f-ced3-4f57-b243-1db1d37289bd-image.png

                                          und aus der node repl (einfach node starten)
                                          d774bb97-a55f-42fd-a7be-ae1477382e26-image.png

                                          habe mal geschaut.
                                          da ist die typdefinition im javascript adapter nicht ganz korrekt.
                                          die console befehle kennen alle nur einen parameter.
                                          allerdings ist das auch nicht die priorität, ist ja eh nur für debugging
                                          https://github.com/ioBroker/ioBroker.javascript/blob/64c375ea0e0840f21a7cc12582c970022f061fa2/src/types.d.ts#L570

                                          Meine Adapter und Widgets
                                          TVProgram, SqueezeboxRPC, OpenLiga, RSSFeed, MyTime,, pi-hole2, vis-json-template, skiinfo, vis-mapwidgets, vis-2-widgets-rssfeed
                                          Links im Profil

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


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          799

                                          Online

                                          32.5k

                                          Benutzer

                                          81.6k

                                          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