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. [gelöst]js-skript zeitspanne Objekt-State "true" erfassen

NEWS

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

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    2.2k

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    16
    1
    3.1k

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

Geplant Angeheftet Gesperrt Verschoben JavaScript
13 Beiträge 4 Kommentatoren 2.0k Aufrufe 1 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.
  • S Offline
    S Offline
    sveni_lee
    schrieb am zuletzt editiert von
    #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 Antwort Letzte Antwort
    0
    • paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von
      #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 Antwort Letzte Antwort
      0
      • S Offline
        S Offline
        sveni_lee
        schrieb am zuletzt editiert von
        #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 Antwort Letzte Antwort
        0
        • paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von
          #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 Antwort Letzte Antwort
          0
          • S Offline
            S Offline
            sveni_lee
            schrieb am zuletzt editiert von
            #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 Antwort Letzte Antwort
            0
            • paul53P Offline
              paul53P Offline
              paul53
              schrieb am zuletzt editiert von
              #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 Antwort Letzte Antwort
              0
              • paul53P Offline
                paul53P Offline
                paul53
                schrieb am zuletzt editiert von
                #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 Antwort Letzte Antwort
                0
                • P Offline
                  P Offline
                  pix
                  schrieb am zuletzt editiert von
                  #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 Antwort Letzte Antwort
                  0
                  • S Offline
                    S Offline
                    sveni_lee
                    schrieb am zuletzt editiert von
                    #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 Antwort Letzte Antwort
                    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
                      Ein ehemaliger Benutzer
                      schrieb am zuletzt editiert von
                      #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 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

                      948

                      Online

                      32.4k

                      Benutzer

                      81.5k

                      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