Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Exakt selben Zeitstempel bei mehreren States setzen?

    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

    Exakt selben Zeitstempel bei mehreren States setzen?

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

      Hallo!

      Ich berechne mit einem Script im 5-Minuten-Takt die Mittelwerte mehrerer States, deren Daten eigentlich im Sekundentakt eintrudeln (da ich sie in dieser Zeitauflösung nicht lange in der MySQL halten möchte). Da Script wird also alle 5 Min ausgeführt, durchläuft eine Schleife durch die verschiedenen States, greift sich deren Werte der letzten 5 Min, berechnet und schreibt den jeweiligen Mittelwert dann mittels setSetate jeweils in einem zusätzlichen State weg.

      Nun ist es es logischerweise so, dass das Skript ein paar Millisekunden benötigt, um die Schleife zu durchlaufen, entsprechend unterscheiden sich die Zeitstempel der neue erzeugten States um einige Millisekunden.

      Das stört mich, da ich die Werte in Grafana gerne in einem gestapelten Diagramm anzeigen möchte. Durch die leicht abweichenden Zeitstempel klappt das nicht so, wie ich mir das wünsche.

      Ist es möglich, bei setState den Zeitstempel für den geschriebenen State mitzugeben? Also quasi vorzugeben, dass bei allen Schleifendurchläufen bei setState der selbe Zeitstempel (der z.B. über Date.now() vor dem ersten Schleifendurchlauf erzeugt wird) verwendet wird?

      paul53 BananaJoe OliverIO 4 Replies Last reply Reply Quote 0
      • paul53
        paul53 @bfit last edited by

        @benefit sagte: Ist es möglich, bei setState den Zeitstempel für den geschriebenen State mitzugeben?

        Nein, der Zeitstempel wird vom js-controller gesetzt.

        1 Reply Last reply Reply Quote 1
        • BananaJoe
          BananaJoe Most Active @bfit last edited by

          @benefit Du schreibst das in einen State - der wiederum mit dem SQL-Adapter verbunden ist und die Werte aufzeichnet?
          Schau mal in die Beschreibung des SQL-Adapters, du kannst auch direkt Werte mit Zeitstempel in die Datenbank schreiben:
          https://github.com/ioBroker/ioBroker.sql#storestate

          Das siehst du dann zwar nicht mehr im Datenpunkt, ECharts & Co aber ja (also auch Grafana). Ich nutze das z.B. für die Vorhersage meiner Solaranlage.

          Du nutzt InfluxDB? Kenne ich mich nicht mit aus, scheint es dort aber auch zu geben: https://github.com/ioBroker/ioBroker.influxdb#storestate

          B 1 Reply Last reply Reply Quote 1
          • OliverIO
            OliverIO @bfit last edited by

            @benefit
            Ich würde die Angleichung auf 5 Minuten im sql machen
            da könntest du die Minuten mit folgender Formel angleichen (aus javascript, aber gibts bestimmt auch für grafana

            Math.floor(minuten/5)*5
            

            Problematisch wird es, wenn die Werte genau an der 5 Minutengrenze geschrieben wird
            12:04:59
            12:05:01
            Dann fällt der eine Wert in das eine Raster und der andere in den nächsten Raster.

            1 Reply Last reply Reply Quote 1
            • paul53
              paul53 @bfit last edited by

              @benefit sagte: das Skript ein paar Millisekunden benötigt, um die Schleife zu durchlaufen, entsprechend unterscheiden sich die Zeitstempel der neue erzeugten States um einige Millisekunden.

              Schreibe das Ergebnis der Schleifen in Variablen und führe zum Schluss alle setState() unmittelbar hintereinander aus. Dann liegen die Zeitstempel nur wenige ms auseinander.

              1 Reply Last reply Reply Quote 1
              • B
                bfit @BananaJoe last edited by bfit

                Vielen Dank für die vielen hilfreichen Antworten!

                Habe es nun tatsächlich so gelöst wie von @BananaJoe vorgeschlagen. Da ich die States im ioBroker sonst nicht benötige, schreibe ich sie mit storeState von sql-Adapter direkt in die MySQL:

                sendTo('sql.0', 'storeState', {
                                    id: newStateName,
                                    state: {ts: timeStamp, val: averageValue, ack: false, from: 'newStateName'}
                                });
                

                Funktioniert klasse!

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

                Support us

                ioBroker
                Community Adapters
                Donate

                830
                Online

                31.7k
                Users

                79.9k
                Topics

                1.3m
                Posts

                4
                6
                303
                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