Skip to content
  • Home
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • 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

  • Default (No Skin)
  • No Skin
Collapse
ioBroker Logo

Community Forum

donate donate
  1. ioBroker Community Home
  2. Deutsch
  3. Skripten / Logik
  4. JavaScript
  5. [gelöst]js-skript zeitspanne Objekt-State "true" erfassen

NEWS

  • Monatsrückblick Januar/Februar 2026 ist online!
    BluefoxB
    Bluefox
    16
    1
    285

  • Jahresrückblick 2025 – unser neuer Blogbeitrag ist online! ✨
    BluefoxB
    Bluefox
    17
    1
    4.7k

  • Neuer Blogbeitrag: Monatsrückblick - Dezember 2025 🎄
    BluefoxB
    Bluefox
    13
    1
    1.3k

[gelöst]js-skript zeitspanne Objekt-State "true" erfassen

Scheduled Pinned Locked Moved JavaScript
13 Posts 4 Posters 2.0k Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    sveni_lee
    wrote on last edited by
    #4

    ich habe mein Skript mal mit deinem kombiniert, das ganze sieht jetzt so aus…

    var ts_ein = 0,
        ts_aus = 0,
        dauer_ein = 0,
        dauer_aus = 0;
    
    on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
      if (obj.state.val) { //wenn Gerät EIN 
        setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
        ts_ein = obj.state.ts;
      }
      else if (!obj.state.val) { // wenn Gerät AUS
        ts_aus = obj.state.ts;
        dauer_ein = ts_aus - ts_ein;
        log(dauer_ein)
        setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round(dauer_ein/60000) + " Minuten", true);
        }
    });
    

    das ganze funktioniert sogar :D

    Also besten Dank schon mal

    1 Reply Last reply
    0
    • paul53P Offline
      paul53P Offline
      paul53
      wrote on last edited by
      #5

      Das geht noch einfacher

      const idDauer = "javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON";
      on('hm-rpc.0.OEQ0207710.5.STATE', function(dp) {
         if(!dp.state.val) setState(idDauer, Math.round((dp.state.lc - dp.oldState.lc) / 60000), true); // Minuten
      });
      

      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 Reply Last reply
      0
      • S Offline
        S Offline
        sveni_lee
        wrote on last edited by
        #6

        cool, damit spart man sich tatsächlich auch noch die Variablen…

        dann hätte ich noch eine Frage:

        könnte man im ersten Abschnitt

        on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
          if (obj.state.val) { //wenn Gerät EIN 
            setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
          }
        

        eine art Stopp-uhr mitlaufen lassen, die alle 30 oder 60 sekunden einen wert in ms ausgibt, so dass man einen Wert hätte wie lange das Objekt schon auf true steht?

        1 Reply Last reply
        0
        • paul53P Offline
          paul53P Offline
          paul53
          wrote on last edited by
          #7

          @sveni_lee:

          eine art Stopp-uhr mitlaufen lassen, die alle 30 oder 60 sekunden einen wert in ms ausgibt, `
          Dafür gibt es https://wiki.selfhtml.org/wiki/JavaScript/Window/setInterval zusammen mit einer globalen Zählvariablen. Das Stoppen mit https://wiki.selfhtml.org/wiki/JavaScript/Window/clearInterval beim Ausschalten nicht vergessen !

          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 Reply Last reply
          0
          • S Offline
            S Offline
            sveni_lee
            wrote on last edited by
            #8

            okay… das starten des Intervals funktioniert:

            on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
              if (obj.state.val) { //wenn Gerät EIN 
                setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
                setInterval(function(){ 
                    setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true);
                }, 10000);
              }
              else if (!obj.state.val) { // wenn Gerät AUS
                clearInterval(timer);
                setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true);
                setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true);
                }
            });
            

            aber das mit cearInterval(timer) habe ich noch nicht ganz verstanden

            EDIT:

            ich denke ich habs herausgefunden:

            var intervalId = null;
            
            on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
              if (obj.state.val) { //wenn Gerät EIN 
                setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
                intervalId = setInterval(function(){ 
                    setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true);
                }, 10000);
              }
              else if (!obj.state.val) { // wenn Gerät AUS
                clearInterval(intervalId);
                setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true);
                setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true);
                }
            });
            
            
            ? 1 Reply Last reply
            0
            • paul53P Offline
              paul53P Offline
              paul53
              wrote on last edited by
              #9

              Weshalb verwendest Du ein Intervall von 10 s, wenn Du den angezeigten Wert auf ganze Minuten rundest ?

              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 Reply Last reply
              0
              • paul53P Offline
                paul53P Offline
                paul53
                wrote on last edited by
                #10
                  }
                  else if (!obj.state.val) { // wenn Gerät AUS
                
                

                kann vereinfacht werden

                  } else { // wenn Gerät AUS
                
                

                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 Reply Last reply
                0
                • P Offline
                  P Offline
                  pix
                  wrote on last edited by
                  #11

                  @sveni_lee:

                  cool, damit spart man sich tatsächlich auch noch die Variablen… `
                  Das Skript sollte nicht möglichst kurz sein, sondern eine Variante von deinem Ursprungsskript. Da du in deinem Skript das gleiche Objekt, welches du mit der on()-Funktion überwachst im Callback mit getState() abfragst, habe ich deine JS-Kenntnisse falsch eingeschätzt.

                  KLappt es jetzt?

                  Pix

                  EDIT:

                  @Paul: auf die Vereinfachungen sollte er selbst kommen ;)

                  ioBroker auf Ubuntu in Proxmox (früher Mac mini (bis OS X 10.12.6 Sierra), VIS via iOS; angeschlossen: Homematic CCU2, Homepilot 1, ConBee II, einige Wemos, Sonos, Unifi CK+Protect, Homekit, Homebridge; KEIN blockly! Github-Profil

                  1 Reply Last reply
                  0
                  • S Offline
                    S Offline
                    sveni_lee
                    wrote on last edited by
                    #12

                    @pix:

                    Das Skript sollte nicht möglichst kurz sein, sondern eine Variante von deinem Ursprungsskript. Da du in deinem Skript das gleiche Objekt, welches du mit der on()-Funktion überwachst im Callback mit getState() abfragst, habe ich deine JS-Kenntnisse falsch eingeschätzt. `

                    naja, sagen wir mal ich bin blutiger anfänger

                    > KLappt es jetzt?

                    ja, funktioniert nun so… alle 10sec wird der state aktulisiert...

                    1 Reply Last reply
                    0
                    • S sveni_lee

                      okay… das starten des Intervals funktioniert:

                      on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
                        if (obj.state.val) { //wenn Gerät EIN 
                          setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
                          setInterval(function(){ 
                              setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true);
                          }, 10000);
                        }
                        else if (!obj.state.val) { // wenn Gerät AUS
                          clearInterval(timer);
                          setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true);
                          setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true);
                          }
                      });
                      

                      aber das mit cearInterval(timer) habe ich noch nicht ganz verstanden

                      EDIT:

                      ich denke ich habs herausgefunden:

                      var intervalId = null;
                      
                      on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
                        if (obj.state.val) { //wenn Gerät EIN 
                          setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
                          intervalId = setInterval(function(){ 
                              setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true);
                          }, 10000);
                        }
                        else if (!obj.state.val) { // wenn Gerät AUS
                          clearInterval(intervalId);
                          setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true);
                          setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true);
                          }
                      });
                      
                      
                      ? Offline
                      ? Offline
                      A Former User
                      wrote on last edited by
                      #13

                      @sveni_lee sagte in [gelöst]js-skript zeitspanne Objekt-State "true" erfassen:

                      okay… das starten des Intervals funktioniert:

                      on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
                        if (obj.state.val) { //wenn Gerät EIN 
                          setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
                          setInterval(function(){ 
                              setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true);
                          }, 10000);
                        }
                        else if (!obj.state.val) { // wenn Gerät AUS
                          clearInterval(timer);
                          setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true);
                          setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true);
                          }
                      });
                      

                      aber das mit cearInterval(timer) habe ich noch nicht ganz verstanden

                      EDIT:

                      ich denke ich habs herausgefunden:

                      var intervalId = null;
                      
                      on({id: 'hm-rpc.0.OEQ0207710.5.STATE', change: "ne"}, function (obj) {
                        if (obj.state.val) { //wenn Gerät EIN 
                          setState("javascript.0.Bewässerung.Ventil1.Timestamp_ON"/*Timestamp_ON*/, formatDate(new Date(), "TT.MM.JJJJ SS:mm"), true);
                          intervalId = setInterval(function(){ 
                              setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((Date.now() - obj.state.lc)/60000) + " Minuten", true);
                          }, 10000);
                        }
                        else if (!obj.state.val) { // wenn Gerät AUS
                          clearInterval(intervalId);
                          setState("javascript.0.Bewässerung.Ventil1.Laufzeit_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000) + " Minuten", true);
                          setState("javascript.0.Bewässerung.Ventil1.Menge_last_ON"/*Laufzeit_last_ON*/, Math.round((obj.state.lc - obj.oldState.lc)/60000/60*4000) + " Liter", true);
                          }
                      });
                      
                      

                      Hallo sveni_lee
                      ich habe das Script zufällig gefunden und mal nachgebaut, es funktioniert auch, aber nach einiger Zeit ändert sich ohne zutun der Timestamp_ON ??? dann fängt der Timer auch wieder neu an zu zählen.
                      Kannst du da ev. helfen?
                      Jukabroker

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      Support us

                      ioBroker
                      Community Adapters
                      Donate

                      567

                      Online

                      32.7k

                      Users

                      82.5k

                      Topics

                      1.3m

                      Posts
                      Community
                      Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
                      ioBroker Community 2014-2025
                      logo
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Home
                      • Recent
                      • Tags
                      • Unread 0
                      • Categories
                      • Unreplied
                      • Popular
                      • GitHub
                      • Docu
                      • Hilfe