Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Aus sekündlichen Leistungsdaten Minutendurchschnitt bilden

    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

    Aus sekündlichen Leistungsdaten Minutendurchschnitt bilden

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

      Von meinem E3/DC PV-Hauskraftwerk frage ich etwa 20 Leistungsdaten (W) ab. Da ich daraus mittels Skript die Energie (Wh) berechne, muss ich die Werte jede Sekunde abfragen, damit die Berechnung hinreichend genau ist. Neben der Energie interessiert mich natürlich auch der Leistungsverlauf, weshalb die Datenpunkte mit dem SQL-Adapter historisiert werden.

      Ich habe mit der Aufzeichnung am 01.01.2021 begonnen (neues Haus). Problem: Jetzt schon rund 80 Mio. Datensätze in der mySQL. Wenn ich das so weiter mache, explodiert mir recht bald die Datenbank.

      Für eine Historisierung und Visualisierung würde mir die durchschnittliche Leistung je Minute völlig ausreichen. Das sind zwar immer noch 10 Mio. Datensätze pro Jahr, aber nach 3 Jahren könnte man ja hinten mal wieder löschen.

      Wie könnte ich das mit dem Durchschnitt je Minute lösen? Hatte schon mal an das Skript von @Paul53 gedacht. Würde aber Hilfe beim Anpassen benötigen und ich habe noch nicht ganz verstanden, wie das arbeitet. Holt es sich die Daten aus der Historisierung? Was ist, wenn das Skript mal nicht läuft? Habe ich dann Lücken in den Daten?

      Bin für alle Tips dankbar!

      Grüße

      Frank

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

        @frank2604 sagte: Holt es sich die Daten aus der Historisierung?

        Welches Script?

        @frank2604 sagte in Aus sekündlichen Leistungsdaten Minutendurchschnitt bilden:

        Was ist, wenn das Skript mal nicht läuft?

        Weshalb sollte es mal nicht laufen ?

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

          @paul53 sagte in Aus sekündlichen Leistungsdaten Minutendurchschnitt bilden:

          @frank2604 sagte: Holt es sich die Daten aus der Historisierung?

          Welches Script?

          Ich hatte das hier gefunden: Gleitender Durchschnitt, Min., Max. über def. Zeitraum

          @frank2604 sagte in Aus sekündlichen Leistungsdaten Minutendurchschnitt bilden:

          Was ist, wenn das Skript mal nicht läuft?

          Weshalb sollte es mal nicht laufen ?

          Gute Frage. Wartungsarbeiten, Skript-Adapter gestoppt

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

            @frank2604 sagte: Ich hatte das hier gefunden:

            Der gleitende Durchschnitt ist zu komplex und wird nicht benötigt, wenn jede Minute ein Mittelwert gebildet werden soll. Es geht recht einfach:

            Bild_2021-02-24_181323.png

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

              @paul53
              Setzt das Script nicht eine konstante Abtastung voraus?
              Andernfalls müsste man sich die Zeitstempel merken und das Produkt aus Zeit und Wert aufsummieren

              paul53 frank2604 3 Replies Last reply Reply Quote 0
              • paul53
                paul53 @ente34 last edited by

                @ente34 sagte: Setzt das Script nicht eine konstante Abtastung voraus?

                Ja, steht doch in der Überschrift des Themas.

                1 Reply Last reply Reply Quote 0
                • frank2604
                  frank2604 @ente34 last edited by

                  @ente34 sagte in Aus sekündlichen Leistungsdaten Minutendurchschnitt bilden:

                  @paul53
                  Setzt das Script nicht eine konstante Abtastung voraus?
                  Andernfalls müsste man sich die Zeitstempel merken und das Produkt aus Zeit und Wert aufsummieren

                  Guter Punkt. Der Modus Adapter fragt konstant jede Sekunde ab. Eigentlich sollte der Trigger "wurde aktualisiert" auch bei unveränderten Werten reagieren. Alternativ könnte ich auch hier einen CRON-Zeitplan mit sekündlicher Ausführung nehmen?

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

                    @ente34 sagte: Andernfalls müsste man sich die Zeitstempel merken und das Produkt aus Zeit und Wert aufsummieren

                    Das wird bereits gemacht:

                    @frank2604 sagte in Aus sekündlichen Leistungsdaten Minutendurchschnitt bilden:

                    daraus mittels Skript die Energie (Wh) berechne,

                    Man kann auch den Energiewert verwenden, um daraus jede Minute den Mittelwert der Leistung zu ermitteln; am besten im gleichen Script, da dort sicherlich die ungerundeten Werte zur Verfügung stehen.

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

                      @paul53

                      Zunächst einmal vielen Dank für die Idee mit dem Blockly-Skript. Das funktioniert schon mal prima. Mit 'Liste' hatte ich bisher noch nicht gearbeitet. Hatte keine Ahnung, was man damit anfangen kann 👍. Wenn ich das für alle DP machen möchte, müsste ich für jeden ein Skript anlegen, richtig?

                      Zur Idee mit der Rückrechnung aus der Energie. Hier mal der Ausschnitt aus dem JS-Skript für einen DP:

                      // Datenpunkte für die QUELLEN (Leistung in W) in Konstante schreiben
                       const idNetzbezugW             = 'javascript.0.Strom.Netzbezug.Leistung'/*Netzbezug Leistung*/
                      
                       // Datenpunkte der ZIELE (Energie in Wh) in Konstante schreiben
                       const idNetzbezugWh           = 'javascript.0.Strom.Netzbezug.Fortlaufend'/*Netzbezug fortlaufend*/
                      
                      // Variablen für die Fortschreibung der Energie definieren und mit dem letzen Wert füllen, falls Skript gestopt wurde
                       var energyNetzbezug            = getState("javascript.0.Strom.Netzbezug.Fortlaufend").val;
                      
                       // Berechnung durchführen und Werte in Ziel-Datenpunkte schreiben
                       on({ id: idNetzbezugW }, function (dp) {
                           energyNetzbezug = energyNetzbezug + dp.oldState.val * (dp.state.ts - dp.oldState.ts) / 3600000; // Wh
                           setState(idNetzbezugWh, Math.round(energyNetzbezug * 1000) / 1000 , true); // Wh gerundet auf 3 Nachkommastellen
                      

                      Wie würdest Du das mit der Berechnung für dem Minutendurchschnitt der Leistung machen? Sorry, bin nicht so fit in JS und habe mir das obige auch nur zusammengesucht ...😁

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

                        @frank2604 sagte: Wie würdest Du das mit der Berechnung für dem Minutendurchschnitt der Leistung machen?

                        Ergänzen:

                        var Wh;
                        schedule('* * * * *', function() {
                            if(Wh) {
                                let mittel = 60 * (energyNetzbezug - Wh);
                                setState(idMittel, Math.round(mittel), true);
                            }
                            Wh = energyNetzbezug;
                        });
                        
                        E 1 Reply Last reply Reply Quote 0
                        • E
                          ente34 @paul53 last edited by

                          @paul53
                          Wäre es nicht ressourcen-schonender, man würde die Werte gleich aufsummieren?
                          Man bräucht dann nur einen Zähler+Summe pro Energiewert.
                          Das würden vermutlich auch den Garbage Collector etwas beruhigen.
                          Ich bin allerdings kein Javascript Experte...
                          Und wenn man im Hinterkopf behält, dass @frank2604 20 Werte mitteln will, würdest Du dann 20 Trigger erstellen oder lieber einen sekündlichen Zeitplan, der dann alle Werte abklappert?

                          Eigentlich ein ganz spannendes Projekt ...

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

                            @ente34 sagte: würdest Du dann 20 Trigger erstellen oder lieber einen sekündlichen Zeitplan, der dann alle Werte abklappert?

                            Wenn alle Werte in einem Script vorhanden sind, würde ich nur einen Minuten-Zeitplan verwenden.
                            Da die Wh im Datenpunkt offenbar auf 3 Nachkommastellen gerundet sind - was ungewöhnlich ist, kann man auch in einem getrennten Skript alle Datenpunkte abklappern.

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

                            Support us

                            ioBroker
                            Community Adapters
                            Donate

                            397
                            Online

                            31.9k
                            Users

                            80.2k
                            Topics

                            1.3m
                            Posts

                            blockly javascript
                            3
                            12
                            475
                            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