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.
  • 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 Offline
          M Offline
          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

                      614

                      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