Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. [gelöst]js-skript zeitspanne Objekt-State "true" erfassen

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

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

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      sveni_lee last edited by

      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 😄

      Also besten Dank schon mal

      1 Reply Last reply Reply Quote 0
      • paul53
        paul53 last edited by

        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
        });
        
        1 Reply Last reply Reply Quote 0
        • S
          sveni_lee last edited by

          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 Reply Quote 0
          • paul53
            paul53 last edited by

            @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 !

            1 Reply Last reply Reply Quote 0
            • S
              sveni_lee last edited by

              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);
                  }
              });
              
              
              J 1 Reply Last reply Reply Quote 0
              • paul53
                paul53 last edited by

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

                1 Reply Last reply Reply Quote 0
                • paul53
                  paul53 last edited by

                    }
                    else if (!obj.state.val) { // wenn Gerät AUS
                  
                  

                  kann vereinfacht werden

                    } else { // wenn Gerät AUS
                  
                  
                  1 Reply Last reply Reply Quote 0
                  • P
                    pix last edited by

                    @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 😉

                    1 Reply Last reply Reply Quote 0
                    • S
                      sveni_lee last edited by

                      @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 Reply Quote 0
                      • J
                        Jukabroker @sveni_lee last edited by

                        @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 Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        768
                        Online

                        31.9k
                        Users

                        80.1k
                        Topics

                        1.3m
                        Posts

                        4
                        13
                        1774
                        Loading More Posts
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes
                        Reply
                        • Reply as topic
                        Log in to reply
                        Community
                        Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                        The ioBroker Community 2014-2023
                        logo