Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. [gelöst] Mittelwert ohne feste Abtastrate

    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] Mittelwert ohne feste Abtastrate

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

      Liebes Forum,

      ich möchte ein Mittelwert der als Variable vorliegenden (und gelochten) Leistung meines Heizungs-Brenners erstellen. Dazu habe ich viel im Forum gefunden, komme aber nicht weiter. Denn gefundene Anleitungen und Skripte basieren auf der Annahme einer konstanten Abtastrate. Klar ist es denn relativ einfach, aus einem alle 60s geloggten Wert den Mittelwert auszurechnen. Ich logge meine Heizung aber per Modbus und erhalte neue Werte nur bei Änderungen. Für einen zu mittelöden Zeitraum können also unterschiedlich viele Werte vorliegen.

      Gibt es da eine Funktion? Kann mir jemand einen Tipp geben?

      Danke und beste Grüße!

      Marc

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

        Du musst das Integral bilden: Aufsummieren von oldState.val * (state.lc - oldState.lc) und dann zu einem bestimmten Zeitpunkt durch die Gesamtzeit dividieren.

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

          Beispiel: Wenn die Daten aus dem https://github.com/ioBroker/ioBroker.history/blob/master/README.md ausgewertet werden sollen (2. Beispiel in Doku), dann kann die Auswertung etwa so erfolgen:

          `}, function (result) {
              var integral = 0;
              for (var i = 0; i < result.result.length; i++) {
                  if(i + 1 < result.result.length) integral = integral + result.result[i].val * (result.result[i].ts - result.result[i].ts);
          	else integral = integral + result.result[i].val * (end - result.result[i].ts);
              }
              setState(idMittel, integral / (end - result.result[0].ts), true);
          });`[/i][/i][/i][/i][/i]
          
          D 1 Reply Last reply Reply Quote 1
          • M
            Marc_St last edited by

            Super - danke! Ich bastel selbst gerade, und da kommt dein zweites Posting genau richtig. Sehr nett!

            Viele Grüße!

            1 Reply Last reply Reply Quote 0
            • M
              Marc_St last edited by

              Es klappt alles. Danke! 😄

              Ich gehe immer mehr dazu über, Funktionen aus Homematic in iobroker zu überführen und dann nur noch die Ergebnisse in HM-Variablen zu schreiben.

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

                @Marc_St:

                Ich gehe immer mehr dazu über, Funktionen aus Homematic in iobroker zu überführen `
                Das habe ich vor 2 Jahren gemacht.
                @Marc_St:

                Es klappt alles. `
                Dann markiere bitte das Thema im Betreff des ersten Beitrags als [gelöst].

                1 Reply Last reply Reply Quote 0
                • M
                  Marc_St last edited by

                  Sorry, aber doch noch einmal ich dazu. Die Funktion führt bei mir teilweise zu folgendem Fehler:

                  javascript.0 TypeError: Cannot read property 'ts' of undefined at Object.cb (script.js.common.HM_Inkjektoren.Brennerleistung_24h:19:63) at Object.change (/opt/iobroker/node_modules/iobroker.js-controller/lib/adapter.js:3386:71) at Socket. (/opt/iobroker/node_modules/iobroker.js-controller/lib/states/statesInMemClient.js:52:30) at Socket.Emitter.emit (/opt/iobroker/node_modules/component-emitter/index.js:133:20) at Socket.onevent (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:278:10) at Socket.onpacket (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/socket.js:236:12) at Manager. (/opt/iobroker/node_modules/component-bind/index.js:21:15) at Manager.Emitter.emit (/opt/iobroker/node_modules/component-emitter/index.js:133:20) at Manager.ondecoded (/opt/iobroker/node_modules/iobroker.js-controller/node_modules/socket.io-client/lib/manager.js:345:8) at Decoder. (/opt/iobroker/node_modules/component-bind/index.js:21:15)
                  

                  Mit einigen Experimente bin ich zum Ergebnis gekommen, dass das Problem immer dann auftritt, wenn in em zu betrachtenden Zeitraum keine Daten vorlagen, z.B. weil der Brenner die letzten 24h einfach aus war.

                  Ist das ein Bug?

                  Gibt es da einen Workaround?

                  Viele Grüße

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

                    @Marc_St:

                    Gibt es da einen Workaround? `
                    Gleiche Werte aufzeichnen(s): 86400 (24 h)

                    1 Reply Last reply Reply Quote 0
                    • M
                      Marc_St last edited by

                      Perfekt, danke! Es reicht also tatsächlich aus, wenn eine 0 gespeichert ist.

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

                        @paul53

                        Ich habe mich auch gerade damit beschäftigt und meine, dass da ein kleiner Fehler drinsteckt:
                        Es sollte heißen:

                        if(i + 1 < result.result.length) integral = integral + result.result[i].val * (result.result[i+1].ts - result.result[i].ts);

                        Mein Dank gebührt trotzdem @paul53. Ohne ihn hätte ich den Ansatz nicht gefunden!

                        Mein Code sieht komplett dann so aus (für die Nachwelt):

                        var end = Date.now();
                        sendTo('history.0', 'getHistory', {
                            id: 'mqtt.0.heizung.HzAnlage.Laststellung',
                            options: {
                                start:      end - 86400000,
                                end:        end,
                                aggregate: 'none'
                        
                            }
                        }, function (result) {
                            var integral = 0;
                            console.log("Anzahl: "+result.result.length);
                            for (var i=0; i < result.result.length; i++) {
                            console.log(i+"---"+result.result[i].ts + "---"+ result.result[i].val);
                            }  
                        
                        // Test
                        for (var i=0; i < result.result.length; i++) {
                            // var zeitdiff = 0;
                            // zeitdiff = result.result[i+1].ts - result.result[i].ts;
                            // console.log(i+"--diff--" + zeitdiff);
                             
                        
                        if (i + 1 < result.result.length) {
                            integral = integral + ( result.result[i].val * (result.result[i+1].ts - result.result[i].ts)    ) ;
                        } else {
                            integral = integral + result.result[i].val * (end - result.result[i].ts);
                        } // Else Ende
                        
                        }  // Schleifen Ende 
                        
                        var gesamtzeit = end - result.result[0].ts;
                        console.log("Gesamtzeit in sek: " + gesamtzeit/1000 + " = "+ gesamtzeit/(1000*60) + " min = " + gesamtzeit/(1000*60*60) + " h");
                        var mittelwert = integral / gesamtzeit;
                        console.log("Mittelwert: " + mittelwert);
                        
                        // Hier Zuweisung an eine iobroker Variable
                        
                        }); // function ende
                        
                        1 Reply Last reply Reply Quote 0
                        • First post
                          Last post

                        Support us

                        ioBroker
                        Community Adapters
                        Donate

                        713
                        Online

                        31.9k
                        Users

                        80.2k
                        Topics

                        1.3m
                        Posts

                        3
                        10
                        1002
                        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