Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. Blockly
    5. Stromzählung stündlich

    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

    Stromzählung stündlich

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

      Hallo zusammen,

      ich werde ab Januar meinen Strom bei Awattar beziehen. Die rechnen den Strom nach stündlich unterschiedlichen Preisen ab. Ich habe mir jetzt ein Blockly geschrieben, in dem ich stündlich den Verbrauch abfrage und in EUR umrechne. Das hat soweit funktioniert. D.h. ich habe in diesem Fall 24 Datenpunkte --> pro Stunde einer. Das habe ich so gemacht, da ich das ganze in Grafana visualisieren möchte.

      Jetzt kommt mein Problem. Ich möchte die 24 Datenpunkte summieren und in Datenpunkte schreiben, d.h. in einen Datenpunkt pro pro Tag im Monat.

      Die Stundenwerte der 24 Datenpunkte bekomme ich addiert. Wie setzte ich jetzt aber einen Trigger z.B. nach jeder vollen Stunde, der

      • alle Stundenwerte addiert und
      • der in den Datenpunkt für den 27.12 schreibt bzw. in den für den 28. usw.

      D..h ich habe ein Problem mit dem Trigger und mit dem Cron, da ich einen Cron von 1:05 bis 0:05 Uhr des Folgetags benötige. Ich hoffe nicht, dass die Antwort ist, dass ich 31. Skripte schreiben muss (=für jeden Tag ein Skript).

      Ich hoffe jemand kann mir helfen.

      Viele Grüße
      Rafael

      K a200 Asgothian 3 Replies Last reply Reply Quote 0
      • K
        klassisch Most Active @loni78 last edited by

        @loni78 Bin nicht sicher, ob ich die Frage richtig verstanden habe.
        Cron

        5 * * * *
        

        sollte doch stündlich um "fünf nach" triggern.
        In einem parallelen Datenpunkt "SumOfToday" addierst Du Dir die Stundenwerte und schreibst diese Summe um 0:06 in einen neuen Datenpunkt "dailySum" und setzt die Tagessumme "SumOfToday" auf 0.

        Homoran 1 Reply Last reply Reply Quote 0
        • Homoran
          Homoran Global Moderator Administrators @klassisch last edited by

          @klassisch Wobei das dann leider um 0:05 schon der nächste Tag ist.
          Die sumOfToday müsste um 23:59 laufen, und damit auch alle anderen um 59 * * * *

          K 1 Reply Last reply Reply Quote 0
          • a200
            a200 @loni78 last edited by a200

            @loni78 Schau dir mal das Sourceanalytics Plugin. https://github.com/iobroker-community-adapters/ioBroker.sourceanalytix/blob/master/README.md Das könnte vllt. für dich passend sein.

            001.JPG

            1 Reply Last reply Reply Quote 0
            • K
              klassisch Most Active @Homoran last edited by

              @Homoran sagte in Stromzählung stündlich:

              @klassisch Wobei das dann leider um 0:05 schon der nächste Tag ist.
              Die sumOfToday müsste um 23:59 laufen, und damit auch alle anderen um 59 * * * *

              Darüber habe ich nicht nachgedacht. Habe lediglich die Anforderung "1:05 bis 0:05 " papageienartig umgesetzt.

              1 Reply Last reply Reply Quote 0
              • Asgothian
                Asgothian Developer @loni78 last edited by Asgothian

                @loni78
                Ich würde das Blockly erweitern was Dir die Daten holt. An der Stelle kannst du die Tages-Werte direkt aufaddieren indem du

                • über die Zeit den aktuellen Tag ermittelst
                • Den erhaltenen Wert zum Datenpunkt für diesen Tag hinzu addierst

                Mal dumm gefragt - warum hast Du 24 Datenpunkte pro Tag ? Für eine Visualisierung in Grafana als Kurve sollte es doch ausreichen das Du einen Datenpunkt hast der jeweils den Wert der letzten Stunde beinhaltet ?

                Zeig doch mal dein Blockly 🙂

                A.

                Nachtrag: Wenn es nur darum geht die Verbräuche pro Tag in Grafana zu visualisieren dann sollte das Folgende reichen:

                • ein DP der jeweils den Verbrauch der letzten Stunde beinhaltet
                • Diesen DP per History in die Datenbank geschrieben so das der per Grafana auswertbar ist.
                • in Grafana 2 Abfragen:
                  -- Kurve über die DP, Zeitrange "heute" für die Werte von heute
                  -- Kurve über die DP, Zeitrange "dieser Monat", 'aggregation' "same day' für die Verbräuche pro Tag in diesem Monat.
                Homoran 1 Reply Last reply Reply Quote 0
                • Homoran
                  Homoran Global Moderator Administrators @Asgothian last edited by Homoran

                  @loni78
                  @Asgothian sagte in Stromzählung stündlich:

                  Mal dumm gefragt - warum hast Du 24 Datenpunkte pro Tag ? Für eine Visualisierung

                  ich habe zwar keinen stündlich wechselnden Tarif, aber ich mache es ähnlich wie @Asgothian es schreibt.
                  Einen DP der die aktuellen Werte kumuliert, und dann je einen für Tag, Monat und Jahr, ebenfalls kumuliert. Bei dir käme dann noch einer je Stunde dazu.
                  Am Ende jeden Zeitabschnitts wird der Wert in die Datenpunkte der jeweils höheren "Kategorie" geschrieben sowie in weitere Datenpunkte, in denen nur der Endwert geloggt wird

                  05-Strom.png
                  Hier für Erzeugung, Einspeisung, Bezug und Verbrauch

                  K L 2 Replies Last reply Reply Quote 0
                  • K
                    klassisch Most Active @Homoran last edited by

                    @Homoran sagte in Stromzählung stündlich:
                    Monat und Jahr, ebenfalls kumuliert.

                    Den Tageswert merke ich mit auch noch. Aber was ist die Motivation für Monat und Jahr und warum nicht Woche?
                    Ich dachte, Verbrauch pro Tag ist noch eine griffige Größe.
                    Und was sind dann die Stichtermine? Fürs Jahr die Aufforderung zum Zählermelden oder 1.1.? Und wie ermittelt man geschickt das Monatsende? Datum auf den 1. untersuchen? Ja, das könnte man im newDay Teil des Skripts erledigen.
                    Will das nicht inAbrede stellen, denn es wird seinen Grund haben. Und wenn man es implementieren möchte, dann wäre jetzt die beste Zeit.

                    Homoran 1 Reply Last reply Reply Quote 0
                    • Homoran
                      Homoran Global Moderator Administrators @klassisch last edited by

                      @klassisch sagte in Stromzählung stündlich:

                      Und was sind dann die Stichtermine?

                      Meinst du die "Hochrechnungen"?
                      da wird jeweils der aktuelle Tages- / Monats- oder Jahreswert bis zum Jahresende hochgerechnet

                      @klassisch sagte in Stromzählung stündlich:

                      Und wie ermittelt man geschickt das Monatsende?

                      Da hat mir mal wieder @paul53 (wer sonst!!!) geholfen
                      Monatsletzter.png

                      Wenn man es weiß - eigentlich ganz einfach 😂

                      K 1 Reply Last reply Reply Quote 1
                      • K
                        klassisch Most Active @Homoran last edited by

                        @Homoran Danke, also den Monatstag rausholen und dann auf 1 prüfen. Da wird sich in JS was finden, ich mache ja kein Blockly.

                        Homoran 1 Reply Last reply Reply Quote 0
                        • Homoran
                          Homoran Global Moderator Administrators @klassisch last edited by Homoran

                          @klassisch sagte in Stromzählung stündlich:

                          also den Monatstag rausholen und dann auf 1 prüfen.

                          nicht ganz,
                          das aktuelle Datum nehmen, Anzahl msec hinzuzählen, bis der nächste Tag sein wird und das dann auf den 1. prüfen

                          a200 1 Reply Last reply Reply Quote 0
                          • a200
                            a200 @Homoran last edited by

                            @Homoran @klassisch so mache ich das:

                            // NEU - Zählerstand vom Anfang der akt. Stunde wird ermittelt
                            // 
                            
                            var cronH           = "0 * * * *";
                            var cronD           = "59 23 * * *";
                            var cronW           = "0 0 * * 1";
                            var cronM           = "0 0 1 * *";
                            var cronY           = "1 0 1 1 *";
                            
                            var PathToDP        = "javascript.0.Stromzähler.Hager.";  // Pfad zum Datenpunkt
                            
                            var idHAGTotH       = PathToDP + "tmp.Total-h";
                            var idHAGTotD       = PathToDP + "tmp.Total-d";
                            var idHAGTotW       = PathToDP + "tmp.Total-w";
                            var idHAGTotM       = PathToDP + "tmp.Total-m";
                            var idHAGTotY       = PathToDP + "tmp.Total-y";
                            var idHAGTotal      = "smartmeter.0.1-0:1_8_0__255.value";
                            var idHAGZielH      = PathToDP + "Hour";
                            var idHAGZielD      = PathToDP + "Day";
                            var idHAGZielW      = PathToDP + "Week";
                            var idHAGZielM      = PathToDP + "Month";
                            var idHAGZielT      = PathToDP + "CurrentDay";
                            var idHAGZielY      = PathToDP + "Year";
                            var idHAGZielCW     = PathToDP + "CurrentWeek";
                            var idHAGZielCM     = PathToDP + "CurrentMonth";
                            var Teiler, dat, zahl;
                            var debug           = true;
                            
                            var DPArray         = [idHAGTotH, idHAGTotD , idHAGTotW, idHAGTotM, idHAGTotY, idHAGZielH, idHAGZielD, idHAGZielW, idHAGZielM, idHAGZielY, idHAGZielT, idHAGZielCW, idHAGZielCM];
                            var DPUnit          = "W";
                            
                            DPArray.forEach(function(wert, index, array) {
                                var DPType = wert.split(".");
                                var DPDescr = "Power consumption of " + (DPType[DPType.length - 1]);
                                
                                if(index > 4) DPUnit = "Wh";
                                createState(wert, 0, {
                                    name: DPDescr,
                                    desc: DPDescr,
                                    type: 'number',
                                    unit: DPUnit,
                                    role: 'value'
                                });
                            });
                            
                            function haupt (VorId, ZielId, SetN) {
                                var nVorwert = getState(VorId).val;
                                var nAktuell = getState(idHAGTotal).val;
                                var nDiff = (parseFloat(nAktuell) - parseFloat(nVorwert)).toFixed(3);
                                if(debug) log("Vor: " + parseFloat(nVorwert) + " Aktuell: " +parseFloat(nAktuell) + " Differenz: " + nDiff);
                                setState(ZielId, parseFloat(nDiff), true);
                                if(SetN) {
                                    var shandler = on ({id: ZielId, change: 'any'}, function(data) {
                                        setState(VorId, nAktuell, true);
                                        unsubscribe(shandler); 
                                    });
                                }
                            }
                            
                            // regelmäßige Wiederholungen
                            // -----------------------------------------------------------------------------
                            
                            schedule(cronH, function () {
                                haupt(idHAGTotH, idHAGZielH, true);
                            
                                haupt(idHAGTotD, idHAGZielT, false);    // Today
                            
                                haupt(idHAGTotW, idHAGZielCW, false);  // Current Week
                            
                                haupt(idHAGTotM, idHAGZielCM, false);  // Current Month
                            });
                            
                            schedule(cronD, function () {
                                haupt(idHAGTotD, idHAGZielD, true);
                            });
                            
                            schedule(cronW, function () {
                                haupt(idHAGTotW, idHAGZielW, true);
                            });
                            
                            schedule(cronM, function () {
                                haupt(idHAGTotM, idHAGZielM, true);
                            });
                            
                            schedule(cronY, function () {
                                haupt(idHAGTotY, idHAGZielY, true);
                            });
                            
                            

                            Ich schreibe die Vorperioden-Werte in einzelne DP (das sind die tmp.Total-?)
                            Damit habe ich die DP für minütlich, stündlich, täglich, wöchentlich, monatlich, jährlich, heute, diese Woche und dieser Monat.

                            Homoran 1 Reply Last reply Reply Quote 0
                            • Homoran
                              Homoran Global Moderator Administrators @a200 last edited by

                              @a200 sagte in Stromzählung stündlich:

                              Damit habe ich die DP für minütlich, stündlich, täglich, wöchentlich, monatlich, jährlich, heute, diese Woche und dieser Monat.

                              Ich habe mir das script nicht näher angesehen, aber der cronM mit 0 0 1 * * wird am ersten (ich nehme an des Folgemonats) geschrieben, das wird bei grafischer Darstellung dann dem nächsten Monat zugeordnet, während cronD "korrekterweise" kurz vor Mitternacht 59 23 * * * abläuft

                              a200 1 Reply Last reply Reply Quote 0
                              • a200
                                a200 @Homoran last edited by a200

                                @Homoran sagte in Stromzählung stündlich:

                                @a200 sagte in Stromzählung stündlich:

                                Damit habe ich die DP für minütlich, stündlich, täglich, wöchentlich, monatlich, jährlich, heute, diese Woche und dieser Monat.

                                Ich habe mir das script nicht näher angesehen, aber der cronM mit 0 0 1 * * wird am ersten (ich nehme an des Folgemonats) geschrieben, das wird bei grafischer Darstellung dann dem nächsten Monat zugeordnet, während cronD "korrekterweise" kurz vor Mitternacht 59 23 * * * abläuft

                                am ersten eines Monats wird der aktueller Gesamtwert in den DP tmp.Total-m geschrieben. Am ersten des Folgemonats wird die Differenz der beider Werte als Monatsverbrauch gespeichert und danach der aktueller Gesamtwert wieder in den DP tmp.Total-m geschrieben.

                                Das gleiche mache ich stündlich, wöchentlich und jährlich. Die Werte für heute, diese Woche und dieser Monat werden nach dem Prinzip "aktueller Wert" - "Vorwert" gerechnet.

                                Ich verstehe deinen Einwand, deine Frage nicht ganz.

                                cronD könnte auch "0 0 * * *" sein, aber es gab da schon genug andere Jobs.

                                Homoran 1 Reply Last reply Reply Quote 0
                                • Homoran
                                  Homoran Global Moderator Administrators @a200 last edited by

                                  @a200 sagte in Stromzählung stündlich:

                                  Ich verstehe deinen Einwand, deine Frage nicht ganz.

                                  Ich versuche es nochmal 😉

                                  Wenn du deinen Stromverbrauch als Balkengrafik darstellen willst, werden dein Balken dem Folgemonat (in dem du vielleicht in Urlaub bist) zugeordnet.
                                  Aus dem Grund mache ich das (genau wie du am Tag) am letzten Tag des Monats um 23:59
                                  Dann ist der Timestmp des Wertes noch im aktuellen Monat

                                  a200 1 Reply Last reply Reply Quote 0
                                  • L
                                    loni78 @Homoran last edited by

                                    @Homoran
                                    @Asgothian

                                    So ich habe mal meine Sammlung von Datenpunkten gelöscht...... und habe Euren Ratschlag umgesetzt. D.h. ich aggregiere jetzt die Werte hoch --> von Stunde --> zu Tage --> zu Monate usw.

                                    Es scheint so, dass es funktioniert. Manchmal sieht man den Wald vor lauter Bäumen nicht. Jetzt muss ich mir nur noch überlegen, wie ich das mit den Tageswerten mache, da diese erst um 0.01 Uhr in der Influx gespeichert werden.

                                    Erstmal vielen Dank an alle.

                                    Grüße
                                    Rafael

                                    L 1 Reply Last reply Reply Quote 0
                                    • L
                                      loni78 @loni78 last edited by

                                      @Homoran
                                      @Asgothian 4df46893-0211-4af0-8c87-88752288613f-image.png

                                      So habe ich das in Blockly umgesetzt. Müsste doch so funktionieren bzw. gibt es Verbesserungsvorschlage. In diesem Skript werden erstmal nur die kWh gezählt bzw. geloggt. In einem zweiten würde ich das noch in EUR umrechnen.

                                      Grüße
                                      Rafael

                                      1 Reply Last reply Reply Quote 0
                                      • a200
                                        a200 @Homoran last edited by a200

                                        @Homoran sagte in Stromzählung stündlich:

                                        Ich versuche es nochmal 😉

                                        Wenn du deinen Stromverbrauch als Balkengrafik darstellen willst, werden dein Balken dem Folgemonat (in dem du vielleicht in Urlaub bist) zugeordnet.
                                        Aus dem Grund mache ich das (genau wie du am Tag) am letzten Tag des Monats um 23:59
                                        Dann ist der Timestmp des Wertes noch im aktuellen Monat

                                        Ok, jetzt! Balkendiagramm ist das Stichwort! Du hast vorhin nur von Grafen gesprochen.
                                        Ich nutze Liniendiagram und dann habe ich korrekterweise am Ersten eines Monats um 0:00 den Verbrauch bis zu diesem Zeitpunkt.

                                        002.PNG

                                        003.PNG

                                        XxJooO 1 Reply Last reply Reply Quote 0
                                        • XxJooO
                                          XxJooO @a200 last edited by

                                          Hallo,

                                          darf ich mal in die Runde fragen, wie Ihr das dann speichert? Ich kann ja DPs anlegen für 31 Tage und die dann jeweils füllen. Für Wochen, Monate und Jahre ist das Anlegen von DPs (man möchte ja nichts verlieren) aber irgendwie viel Aufwand (kann man automatisieren, ist mir bekannt). Lässt sich sowas in einer Art array speichern, oder habt Ihr jeweils wirklich DPs erstellt?

                                          paul53 Asgothian Homoran 3 Replies Last reply Reply Quote 0
                                          • paul53
                                            paul53 @XxJooO last edited by

                                            @XxJooO sagte:

                                            Lässt sich sowas in einer Art array speichern

                                            Ja, das lässt sich in einem Datenpunkt vom Typ "array" speichern.

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

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            656
                                            Online

                                            31.9k
                                            Users

                                            80.2k
                                            Topics

                                            1.3m
                                            Posts

                                            7
                                            22
                                            1705
                                            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