Weiter zum Inhalt
  • Home
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • GitHub
  • Docu
  • Hilfe
Skins
  • Hell
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dunkel
  • 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 mit Zeitspannen rechnen (TimeSpan)

NEWS

  • Der neue Monatsrückblick für Mai und Juni 2026 ist online!
    BluefoxB
    Bluefox
    8
    1
    834

  • wichtiges UPDATE für controller 7.2.2 im stable
    HomoranH
    Homoran
    10
    1
    3.5k

  • Neues YouTube-Video: Visualisierung im Devices-Adapter
    BluefoxB
    Bluefox
    16
    1
    5.7k

JavaScript mit Zeitspannen rechnen (TimeSpan)

Geplant Angeheftet Gesperrt Verschoben Skripten / Logik
javascript
5 Beiträge 2 Kommentatoren 1.0k Aufrufe 1 Beobachtet
  • Ä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.
  • B Offline
    B Offline
    BoBeRzE
    schrieb am zuletzt editiert von BoBeRzE
    #1

    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

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

      paul53P Offline
      paul53P Offline
      paul53
      schrieb am zuletzt editiert von paul53
      #2

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

      Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
      Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

      1 Antwort Letzte Antwort
      0
      • B Offline
        B Offline
        BoBeRzE
        schrieb am zuletzt editiert von
        #3

        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 :D

        Vielen Dank 👍

        paul53P 1 Antwort Letzte Antwort
        0
        • B BoBeRzE

          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 :D

          Vielen Dank 👍

          paul53P Offline
          paul53P Offline
          paul53
          schrieb am zuletzt editiert von paul53
          #4

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

          Bitte verzichtet auf Chat-Nachrichten, denn die Handhabung ist grauenhaft !
          Produktiv: Asus PN 42 / N100 / 8 GB / 500 GB; Proxmox mit 2 VM (iob / openCCU)

          1 Antwort Letzte Antwort
          0
          • B Offline
            B Offline
            BoBeRzE
            schrieb am zuletzt editiert von
            #5

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

            1 Antwort Letzte Antwort
            0

            Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.

            Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.

            Mit deinem Input könnte dieser Beitrag noch besser werden 💗

            Registrieren Anmelden
            Antworten
            • In einem neuen Thema antworten
            Anmelden zum Antworten
            • Älteste zuerst
            • Neuste zuerst
            • Meiste Stimmen


            Support us

            ioBroker
            Community Adapters
            Donate

            421

            Online

            33.0k

            Benutzer

            83.5k

            Themen

            1.3m

            Beiträge
            Community
            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen | Einwilligungseinstellungen
            ioBroker Community 2014-2026
            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