Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript mit Zeitspannen rechnen (TimeSpan)

    NEWS

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

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    JavaScript mit Zeitspannen rechnen (TimeSpan)

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

      Hallo Leute,

      gibt es eine einfache Möglichkeit die Zeitspanne der letzen Änderung eines Objektes zu errechnen?

      Ich lese aktuell meinen Gaszähler mit einem Reedkontakt aus. In ca. 17 Sekunden werden 0.01m³ Gas verbraucht. Nun ist es so, dass gelegentlich zuviel gezählt wird.

      Ich möchte jetzt einbauen dass nur gezählt wird wenn seit dem letzten Durchlauf mindestens 17s vergangen sind.

      Mein aktuelles Skript sieht derzeit so aus:

      //on ({id: 'zigbee.0.00158d0003469504.opened', change: 'ne'}, IncreaseValue);
      on ({id: 'sonoff.0.Gaszaehler.POWER2', change: 'ne'}, IncreaseValue);
      
      
      if(!getState('javascript.0.00_CustomVariables.Gasverbrauch').val)
      {
        createState('javascript.0.00_CustomVariables.Gasverbrauch',0, true, {name: "Gasverbrauch total",type: "number",desc:"aktueller Zählerstand", unit: "m³", def: 0.00, role: "value"});  
      }
      
      function IncreaseValue()
      { 
       //var LastChange = formatDate((getState('zigbee.0.00158d0003469504.opened')).lc, 'hh:mm:ss');
         var LastChange = formatDate((getState('sonoff.0.Gaszaehler.POWER2')).lc, 'hh:mm:ss');
      
      //if(getState('zigbee.0.00158d0003469504.opened').val)
        if(getState('sonoff.0.Gaszaehler.POWER2').val)
        {
          var NewValue   = Number(parseFloat((getState('javascript.0.00_CustomVariables.Gasverbrauch').val + 0.01).toFixed(2)))
          var Message    = "Der Zählerstand beträgt " + NewValue + "m³ - " + LastChange;
      
          setState('javascript.0.00_CustomVariables.Gasverbrauch',NewValue,true);
        //sendTo("telegram.0", "send", {text: Message, disable_notification: true,chatId: xxxxxxxxxx});
          log(Message);
        }
      }
      

      Ich muss also die Bedingung in Zeile 5 erweitern. Den "LastChange" ermittle ich ja bereits. Was jetzt noch fehlt ist die Zeitspanne mit dem/der aktuellen Datum/Zeit. Ich kenne mich mit JavaScript noch nicht gut aus. Wenn es am aktuellen Script noch Verbesserungen geben kann dann gerne her damit 🙂

      Mit Powershell wäre es einfach New-Timespan 🙂 Aber PS wird ja leider nicht unterstützt 😞

      Vielleicht kann mich ja einer in die richtige Richtung schubsen 🙂

      Vielen Dank und einen schönen 3. Advent

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

        @BoBeRzE sagte in JavaScript mit Zeitspannen rechnen (TimeSpan):

        Zeitspanne mit dem/der aktuellen Datum/Zeit.

        Mit Zeitdifferenz in s:

        var lastTime = Date.now(); // aktuelle Uhrzeit in ms seit 1.1.1970
        var newValue = parseFloat(getState('javascript.0.00_CustomVariables.Gasverbrauch').val);
        
        function IncreaseValue(dp) {
           var diff = (dp.state.lc - lastTime) / 1000;
           if(diff >= 17) {
              lastTime = dp.state.lc;
              newValue = newValue + 0.01; // 1 Impuls = 0,01 m³
              setState('javascript.0.00_CustomVariables.Gasverbrauch', newValue, true);
              var lastChange = formatDate(lastTime, 'hh:mm:ss');
              var Message    = "Der Zählerstand beträgt " + newValue + " m³ - um " + lastChange;
              log(Message);
           }
        }
        
        on ({id: 'sonoff.0.Gaszaehler.POWER2', change: 'ne', val: true}, IncreaseValue); // triggert bei Änderung false --> true
        

        EDIT: Variable lastTime initialisiert. newValue wird mit parseFloat() initialisiert, für den Fall, dass ein String in den Datenpunkt geraten ist.

        1 Reply Last reply Reply Quote 0
        • B
          BoBeRzE last edited by

          Hallo paul53,

          vielen Dank für die schnelle Hilfe.

          Dazu habe ich ein- zwei Fragen.

          1: Die Funktion hast du um einen Übergabeparameter "dp" erweitert. Wird der der automatisch von dem Trigger übergeben und ist dadurch innerhalb der Funktion als "dp" verfügbar?
          2: Die Variablen lastTime und newValue werden einmalig bei Skriptstart erzeugt und newValue wird befüllt.
          - lastTime ist am Anfang "undefiniert" und dadurch wird mit dem ersten Aufruf die Bedingung $true weil diff >= 17
          - innerhalb der IF-Abfrage wird lastTime dann auf letzten tatsächlichen Änderungswert gesetzt
          3: Funktioniert bei dir "newValue = newValue + 0.01" wie erwartet?
          - Ich habe mir

          Number(parseFloat((getState('javascript.0.00_CustomVariables.Gasverbrauch').val + 0.01).toFixed(2)))
          

          gebastelt weil ich sonst immer enorm viele Nachkomastellen hatte.

          Ich werde versuchen das Ganze später zu integrieren und schauen ob das Script noch läuft 😄

          Vielen Dank 👍

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

            @BoBeRzE sagte:

            Übergabeparameter "dp" erweitert. Wird der der automatisch von dem Trigger übergeben und ist dadurch innerhalb der Funktion als "dp" verfügbar?

            Zu 1. Ja.
            Zu 2. Habe ich geändert, so dass lastTime mit der aktuellen Uhrzeit initialisiert wird (s. Skript oben).
            Zu 3. Du hast den Datenpunkt mit Typ "number" erstellt. Mit Zahlen funktioniert die Berechnung. toFixed(2) wandelt in einen String und ist deshalb kontraproduktiv. Wenn Rundung erforderlich ist, dann so

                  newValue = Math.round(100 * newValue + 1) / 100; // 1 Impuls = 0,01 m³
            
            1 Reply Last reply Reply Quote 0
            • B
              BoBeRzE last edited by

              Super, vielen Dank für die Erklärung. Das bringt mich schon einen Schritt weiter 👍

              1 Reply Last reply Reply Quote 0
              • First post
                Last post

              Support us

              ioBroker
              Community Adapters
              Donate

              487
              Online

              31.6k
              Users

              79.6k
              Topics

              1.3m
              Posts

              javascript
              2
              5
              715
              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