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 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
                                • OliverIOO OliverIO

                                  @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

                                  P Offline
                                  P Offline
                                  peterfido
                                  schrieb am zuletzt editiert von
                                  #21

                                  @oliverio Für solche Zeitspannen setze ich auf einen Datenpunkt, welcher minutiös heruntergezählt wird. Arbeitet man am ioBroker innerhalb der fünf Stunden, kann es sonst passieren, dass das Timeout verlorengeht.

                                  Gruß

                                  Peterfido


                                  Proxmox auf Intel NUC12WSHi5
                                  ioBroker: Debian (VM)
                                  CCU: Debmatic (VM)
                                  Influx: Debian (VM)
                                  Grafana: Debian (VM)
                                  eBus: Debian (VM)
                                  Zigbee: Debian (VM) mit zigbee2mqtt

                                  OliverIOO 1 Antwort Letzte Antwort
                                  0
                                  • P peterfido

                                    @oliverio Für solche Zeitspannen setze ich auf einen Datenpunkt, welcher minutiös heruntergezählt wird. Arbeitet man am ioBroker innerhalb der fünf Stunden, kann es sonst passieren, dass das Timeout verlorengeht.

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

                                    @peterfido
                                    Besser:
                                    Den Ende timestamp in einem datenpunkt merken und dann regelmäßig prüfen, ob er erreicht wird. Bzw. der datenpunkt existiert nur falls der Adapter neu gestartet wird, damit man wieder neu aufsetzen kann.
                                    Dann schreibt man nicht so oft in der Datenbank herum.

                                    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
                                    • P Offline
                                      P Offline
                                      peterfido
                                      schrieb am zuletzt editiert von
                                      #23

                                      @oliverio Der Schreibzyklen wegen vielleicht schon. Darüber habe ich mir zu Raspi-Zeiten tatsächlich Gedanken gemacht.Also, wie so oft, ein "kommt darauf an".

                                      Gruß

                                      Peterfido


                                      Proxmox auf Intel NUC12WSHi5
                                      ioBroker: Debian (VM)
                                      CCU: Debmatic (VM)
                                      Influx: Debian (VM)
                                      Grafana: Debian (VM)
                                      eBus: Debian (VM)
                                      Zigbee: Debian (VM) mit zigbee2mqtt

                                      1 Antwort Letzte Antwort
                                      0
                                      • OliverIOO OliverIO

                                        @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

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

                                        @oliverio said in Timeout in JS einbinden:

                                        allerdings ist das auch nicht die priorität, ist ja eh nur für debugging

                                        genau.

                                        @oliverio said in Timeout in JS einbinden:

                                        Den Ende timestamp in einem datenpunkt merken und dann regelmäßig prüfen, ob er erreicht wird. Bzw. der datenpunkt existiert nur falls der Adapter neu gestartet wird, damit man wieder neu aufsetzen kann.
                                        Dann schreibt man nicht so oft in der Datenbank herum

                                        hier eigentlich unkritisch. Dann bleibt die Heizung weitere 5 Std. an.
                                        ich lass es erst mal beim normalen Teimout und werde das beobachten.

                                        danke an alle

                                        Gruß Udo

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


                                        Support us

                                        ioBroker
                                        Community Adapters
                                        Donate

                                        873

                                        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