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.
  • P Offline
    P Offline
    pix
    schrieb am zuletzt editiert von
    #2

    hallo sveni_lee,

    es gibt ein Skript von looxer (Betriebstundenzähler), das genau für sowas da ist.

    Wenn du aber gern selbst probieren möchtest, dann brauchst natürlich den Timestamp vom Einschalten und vom Ausschalten.

    /* Test Dauer An Aus
    Skript zeigt Einschaltdauer und Ausschaltdauer bei Änderung an
    https://forum.iobroker.net/posting.php?mode=reply&f=21&t=13432#pr141557
    für sveni_lee
    11.04.2018 erstellt von pix
    */
    
    const idGERAET = "hm-rpc.0.OEQ0207710.5.STATE";
    
    // Variablen werden beim Start(Neustart des Skriptes (oder Javascript Adapters) auf 0 gesetzt. Für dauerhafte Speicherung mit createState() Objekte erstellen
    var ts_ein = 0,
        ts_aus = 0,
        dauer_ein = 0,
        dauer_aus = 0;
    
    on({id: idGERAET, change: "ne"}, function (obj) {
        if (obj.state.val) { // wenn Gerät EIN
            ts_ein = obj.state.ts;
            dauer_ein = ts_ein - ts_aus;
            log("Gerät wurde eingeschaltet und war zuvor " + dauer_ein + "ms ausgeschaltet");
        } else if (!obj.state.val) { // wenn nicht EIN oder wenn AUS
            ts_aus = obj.state.ts;
            dauer_aus = ts_aus - ts_ein;
            log("Gerät wurde ausgeschaltet und war zuvor " + dauer_aus + "ms eingeschaltet");
        }
    });
    
    

    Habs mal bei mir laufen lassen und sieht dann so aus:

    10:58:54.879	[info]	javascript.1 Stop script script.js.Test.Test_DauerAnAus
    10:59:00.998	[info]	javascript.2 Start javascript script.js.Test.Test_DauerAnAus
    10:59:00.998	[info]	javascript.2 script.js.Test.Test_DauerAnAus: registered 1 subscription and 0 schedules
    10:59:04.964	[info]	javascript.2 script.js.Test.Test_DauerAnAus: Gerät wurde eingeschaltet und war zuvor 1523437144961ms ausgeschaltet
    10:59:14.226	[info]	javascript.2 script.js.Test.Test_DauerAnAus: Gerät wurde ausgeschaltet und war zuvor 9263ms eingeschaltet
    10:59:17.463	[info]	javascript.2 script.js.Test.Test_DauerAnAus: Gerät wurde eingeschaltet und war zuvor 3237ms ausgeschaltet
    10:59:20.468	[info]	javascript.2 script.js.Test.Test_DauerAnAus: Gerät wurde ausgeschaltet und war zuvor 3006ms eingeschaltet
    10:59:23.969	[info]	javascript.2 script.js.Test.Test_DauerAnAus: Gerät wurde eingeschaltet und war zuvor 3500ms ausgeschaltet
    

    Das erste Schalten erzeugt natürlich einen falschen Wert, aber danach stimmt es. Natürlich kann mann nun noch die ms in Sekunden oder Minuten so umrechnen.

    Achtung: Wenn es um die Dauer des Einschaltens geht, während das Gerät eingeschaltet ist, braucht man eine ständige Abfrage. Falls dir da nur eine Darstellung in VIS wichtig ist, solltest du auf ein Timestamp/Lastchange-Widget zurückgreifen.

    Gruß

    Pix

    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
      #3

      Hallo pix,

      den Betriebsstundenzähler habe ich sogar installiert :-)

      aber so richtig bin ich noch nicht dahinter gestiegen.

      was benötige ich…

      • Zeitpunkt des letzen einschaltens: erledigt
      • Dauer des letzten einschltens: ???
      • kommulierte "Tageszeiten": Betribsstundenzähler
      • kommulierte "Zeiten" pro Woche: Betriebsstundenzähler
      • kommulierte "Zeiten" pro Monat: Betriebsstundenzähler
      • kommulierte "Zeiten" pro Jahr: Betriebsstundenzähler

      Einzi mit der Dauer des letzten einschaltens komm ich noch nicht klar….

      1 Antwort Letzte Antwort
      0
      • 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

                          989

                          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