Ankündigung

Einklappen
Keine Ankündigung bisher.

Stromzähler: Umrechnungen (Durchschnitt über historische Werte)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Stromzähler: Umrechnungen (Durchschnitt über historische Werte)

    Hallo,

    ich habe einen Stromzähler, den ich per S0 Schnittselle abtaste. Ich bekomme also von der Tasterschnittstelle die Anzahl der bisher gezählten Impulse.

    Die würde ich jetzt gerne umrechnen in den aktuellen Verbrauch (Durchschnitt über 1/5/30/60 min) und den Gesamtverbrauch.
    Außerdem wäre natürlich der Tages und Monatsverbrauch interessant.

    Gesamtverbrauch ist kein Problem:
    eval = value / 800 (800 Impulse pro kwh).

    Aber wie mache ich den gleitenden Durchschnitt? Dazu muss ja die Historie der letzten 60 min vorhanden sein.

    Außerdem muss ich ja das Ergebnis an verschiedene GAs geben. D.h. ich mache verschiedene Items und in jedem Item eine andere Berechnung, richtig?


    Gruß,
    Hendrik

    #2
    Stromzähler: Umrechnungen (Durchschnitt über historische Werte)

    Schau dir mal das sqlite Plugin an, das bietet entsprechend dekorierten Items zusätzliche Methoden wie z.B. avg (= average) bei dem du dann einen Zeitbereich angeben kannst.
    Mit freundlichen Grüßen
    Niko Will

    Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
    - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

    Kommentar


      #3
      Ja, da genügt es, wenn zum einem beliebiegen Zeitpunkt (je nach dem wann der Aktor sendet) einfach der Zählerstand "geloggt" wird.

      Die Umrechnung auf die Zeitintervalle erfolgt automatisch.

      Gruss
      Join smartVISU on facebook. Web: smartvisu.de.
      Dir gefällt smartVISU? Bitte spenden für die Weiterentwicklung.

      Kommentar


        #4
        Hallo,

        danke für eure Tipps.



        Zitat von Apollo Beitrag anzeigen
        Ja, da genügt es, wenn zum einem beliebiegen Zeitpunkt (je nach dem wann der Aktor sendet) einfach der Zählerstand "geloggt" wird.

        Die Umrechnung auf die Zeitintervalle erfolgt automatisch.
        Aber der Mittlere Zählerstand über eine Woche ist doch z.b. bei
        Heute =100
        Gestern=90

        95

        Was mich aber interessiert ist der Verbrauch in den letzten 24h, also 10.
        Woher weiss das Plugin, was ich mit "avg" meine?

        Ich hätte es jetzt so gemacht:

        Code:
        cat /usr/local/smarthome/items/allgemein.conf
        [Allgemein]
            name = Allgemein
            [[Stromzaehler]]
                [[[Counter]]]
                name = Counter
                type = num
                sqlite = yes
                knx_dpt=13001
        #        knx_send=6/7/0
                knx_listen=6/7/0
                [[[Zaehlerstand]]]
                name = Zaehlerstand
                type = num
                sqlite = yes
                knx_dpt=13010
                knx_send=6/7/1
                eval=sh.Allgemein.Stromzaehler.Counter/800
                eval_trigger=sh.Allgemein.Stromzaehler.Counter
                [[[Momentanleistung_1min]]]
                name = Mommentanleistung_1min
                type = num
                sqlite = yes
                knx_dpt=13010
                knx_send=6/7/2
                eval=sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i')-sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '2i')
                cycle=60
        
                [[[Momentanleistung_5min]]]
                name = Mommentanleistung_5min
                type = num
                sqlite = yes
                knx_dpt=13010
                knx_send=6/7/3
                eval=sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i')-sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '5i')
                cycle=60
        
                [[[VerbrauchWoche]]]
                name = VerbrauchWoche
                type = num
                sqlite = yes
                knx_dpt=13010
                knx_send=6/7/4
                eval=sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i')-sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '1w')
                crontab=0:00
        
                [[[VerbrauchMonat]]]
                name = VerbrauchMonat
                type = num
                sqlite = yes
                knx_dpt=13010
                knx_send=6/7/5
                eval=sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i')-sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '1m')
                crontab=0:00
        
                [[[VerbrauchJahr]]]
                name = VerbrauchJahr
                type = num
                sqlite = yes
                knx_dpt=13010
                knx_send=6/7/6
                eval=sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i')-sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '1y')
                crontab=0:00
        Ist das falsch?

        Mit sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i') hole ich mir den letzten Wert (ein "last" gibt es ja nicht... Aber mir fällt gerade ein dass da ich da das .db() weglassen kann, oder?! Da hätte ich drauf kommen können.

        Aber das Bilden einer Differenz aus jetzt und "vor einiger Zeit", also das -sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '1y') ist nötig, oder?

        Gruß,
        Hendrik

        Kommentar


          #5
          Hm. Kann keiner was dazu sagen?

          Muss ich die Differenzen nun selbst bilden, oder macht die db-Funktion das?

          Gruß,
          Hendrik

          Kommentar


            #6
            Derzeit gibt es IMHO keine db Funktion dafür. Wäre aber durchaus sinnvoll für Zählerstände im allgemeinen (z.B. auch Wasserzähler) um z.B. auch den Verbrauch einer Woche festzustellen und mit letztem Jahr vergleichen zu können.
            Mit freundlichen Grüßen
            Niko Will

            Logiken und Schnittstelle zu anderen Systemen: smarthome.py - Visualisierung: smartVISU
            - Gira TS3 - iPhone & iPad - Mobotix T24 - ekey - Denon 2313 - Russound C5 (RIO over TCP Plugin) -

            Kommentar


              #7
              Ok.

              Was auch noch fehlen würde ist den Wert eines bestimmten Zeitpunkt zu bekommen.

              Momentan mache ich ja:
              Code:
              sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i')-sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '2i')
              Heute ginge auch:
              Code:
              sh.Allgemein.Stromzaehler.Zaehlerstand.value-sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '2i')
              aber mit dem ('max', '1i', '2i') will ich ja eigentlich nicht den maximalen Wert von vor 2min haben, sondern den Wert von vor Zwei Min.

              Also wäre etwas wie
              Code:
              sh.Allgemein.Stromzaehler.Zaehlerstand.db('value', '-2i')
              oder
              Code:
              sh.Allgemein.Stromzaehler.Zaehlerstand.db('value', '1981/12/24 18:00:00')
              nützlich, oder?

              Für mein jetziges Problem ist der Ansatz mit den Differenzen aber richtig, oder?
              Die Syntax mit eval&co ist auch richtig?

              Gruß,
              Hendrik

              Kommentar


                #8
                Hallo,

                ich habe mich jetzt noch einmal daran gemacht. Ich bin so weit:
                Code:
                ./items/allgemein.conf
                [Allgemein]
                    name = Allgemein
                    [[Stromzaehler]]
                        [[[Counter]]]
                        name = Counter
                        type = num
                        sqlite = yes
                        knx_dpt=13
                #        knx_send=6/7/0
                        knx_listen=6/7/0
                        [[[Zaehlerstand]]]
                        name = Zaehlerstand
                        type = num
                        sqlite = yes
                        knx_dpt=13
                        knx_send=6/7/1
                        eval=sh.Allgemein.Stromzaehler.Counter/800
                        eval_trigger=sh.Allgemein.Stromzaehler.Counter
                        [[[Momentanleistung_1min]]]
                        name = Mommentanleistung_1min
                        type = num
                        sqlite = yes
                        knx_dpt=13
                        knx_send=6/7/2
                       eval=sh.Allgemein.Stromzaehler.Zaehlerstand-sh.Allgemein.Stromzaehler.Zaehlerstand.db('avg', '2w', '1w')
                Dabei habe ich zwei Probleme:
                -sh.Allgemein.Stromzaehler.Zaehlerstand wird nicht gesetzt. Ich sehe nix im Log dazu und per Gruppenmonitor kann ich es nicht lesen.
                -wenn ich die letzte Zeile nicht auskommentiere, dann bekomme ich eine Fehlermeldung (parse-error in dieser Zeile).

                Das Sqlite Plugin scheint aber aktiv zu sein:
                Code:
                 DEBUG    sqlite next time: 2013-07-11 03:02:00+02:00 -- scheduler.py:_next_time:238
                Habe ich etwas falsch verstanden?

                Gruß,
                Hendrik

                Kommentar


                  #9
                  1. Das "sh." bei den evals entfernen.
                  2. Vernünftig formatieren

                  Code:
                  [Allgemein]
                  	name = Allgemein
                  	[[Stromzaehler]]
                  		[[[Counter]]]
                  			name = Counter
                  			type = num
                  			sqlite = yes
                  			knx_dpt = 13
                  			knx_send = 6/7/0
                  			knx_listen = 6/7/0
                  		[[[Zaehlerstand]]]
                  			name = Zaehlerstand
                  			type = num
                  			sqlite = yes
                  			knx_dpt = 13
                  			knx_send = 6/7/1
                  			eval = Allgemein.Stromzaehler.Counter/800
                  			eval_trigger = Allgemein.Stromzaehler.Counter
                  		[[[Momentanleistung_1min]]]
                  			name = Momentanleistung_1min
                  			type = num
                  			sqlite = yes
                  			knx_dpt = 13
                  			knx_send = 6/7/2
                  			eval = (Allgemein.Stromzaehler.Zaehlerstand)-(Allgemein.Stromzaehler.Zaehlerstand.db('avg', '2w', '1w'))
                  Nun nochmal versuchen ... wobei ich keinen Plan habe wie das sql-Plugin arbeitet.
                  Umgezogen? Ja! ... Fertig? Nein!
                  Baustelle 2.0 !

                  Kommentar


                    #10
                    Hallo,

                    danke für den Tipp.
                    Leider funktioniert es noch nicht.
                    Er meckert bei der letzten Zeile. Aber lassen wir die mal weg, dann können wir das durch 800 teilen testen. Klappt aber auch nicht:
                    Code:
                    2013-07-11 19:01:20,659 SmartHome.py DEBUG    Triggering Allgemein.Stromzaehler.Zaehlerstand - by: Init source: None dest: None value: None -- scheduler.py:trigger:117
                    2013-07-11 19:01:20,687 Allgemein.Stromzaehler.Zaehlerstand WARNING  Method Allgemein.Stromzaehler.Zaehlerstand exception: name 'Allgemein' is not defined -- scheduler.py:_task:295
                    Was soll das heißen? Allgemein ist ganz offensichtlich definiert, siehe die Zeile darüber.

                    Zu meinem vorherigen Fehler noch eine Frage:
                    Aus der Doku:
                    Code:
                    # items/room.conf
                    [room]
                        [[temp]]
                            type = num
                        [[hum]]
                            type = num
                        [[dew]]
                            type = num
                            eval = sh.tools.dewpoint(sh.room.temp(), sh.room.hum())
                            eval_trigger = room.temp, room.hum  # every change of temp or hum would trigger the evaluation of dew.
                    warum heisst es einmal sh.room.temp() und einmal nur room.temp?


                    Gruß,
                    Hendrik

                    Kommentar


                      #11
                      Ganz einfach:

                      eval_trigger: OHNE "sh." - da diese Angabe durch einen gesonderten Parser beim Starten entsprechend behandelt wird (genau wie "watch_item").
                      eval: MIT "sh." da der gesamte String einem "eval" zum Fraß vorgeworfen wird - halt alles genau so wie in der Doku.

                      Kommentar


                        #12
                        Ah, ok.

                        War für mich nicht intuitiv.

                        Danke!

                        Kommentar


                          #13
                          mea culpa

                          Nur zum Verständnis, bräuchte man nicht beim eval dann ein itemname.subname() um an den aktuelllen Wert zu kommen?
                          Umgezogen? Ja! ... Fertig? Nein!
                          Baustelle 2.0 !

                          Kommentar


                            #14
                            Hallo,

                            ja, so habe ich das auch verstanden:
                            Code:
                                    [[[Zaehlerstand]]]
                                        name = Zaehlerstand
                                        type = num
                                        sqlite = yes
                                        knx_dpt = 13
                                        knx_send = 6/7/1
                                        eval = sh.Allgemein.Stromzaehler.Counter()/800
                                        eval_trigger = Allgemein.Stromzaehler.Counter
                            Dadurch habe ich jetzt im log einmal:

                            Code:
                            2013-07-11 19:35:43.177,A_GroupValue_Write,0.0.0,6/7/1,00 00 00 1D,,,,0,low,7,T_DATA_XXX_REQ,0
                            Die ETS hat daraus irgenwasE-44 gemacht..

                            Aber danach wurde noch mehrmals getriggert, aber nix gesendet:
                            Code:
                            2013-07-11 20:00:14,413 SmartHome.py DEBUG    Allgemein.Stromzaehler.Counter = 24020 via KNX 1.0.5 -- item.py:_update:219
                            2013-07-11 20:00:14,662 SmartHome.py DEBUG    Triggering Allgemein.Stromzaehler.Zaehlerstand - by: KNX source: 1.0.5 dest: 6/7/0 value: {'source': 'Allgemein.Stromzaehler.Count -- scheduler.py:trigger:117
                            2013-07-11 20:00:18,720 SmartHome.py DEBUG    Allgemein.Stromzaehler.Counter = 24021 via KNX 1.0.5 -- item.py:_update:219
                            2013-07-11 20:00:18,898 SmartHome.py DEBUG    Triggering Allgemein.Stromzaehler.Zaehlerstand - by: KNX source: 1.0.5 dest: 6/7/0 value: {'source': 'Allgemein.Stromzaeh
                            Wird vielleicht nur gesendet, wenn der Wert wieder durch 800 teilbar ist?

                            Edit: Ja, ich habe jetzt mal durch 8, statt durch 800 geteilt und so wird häufiger aktualisiert.
                            Ich habe mittlerweile den DPT auf 14 gesetzt. Das sollte ja ein Gleitkomma Wert sein.

                            Code:
                            cat /usr/local/smarthome/items/allgemein.conf
                            [Allgemein]
                                name = Allgemein
                                [[Stromzaehler]]
                                    [[[Counter]]]
                                        name = Counter
                                        type = num
                                        sqlite = yes
                                        knx_dpt = 12
                                        knx_send = 6/7/0
                                        knx_listen = 6/7/0
                                    [[[Zaehlerstand]]]
                                        name = Zaehlerstand
                                        type = num
                                        sqlite = yes
                                        knx_dpt = 14
                                        knx_send = 6/7/1
                                        eval = sh.Allgemein.Stromzaehler.Counter()/8
                                        eval_trigger = Allgemein.Stromzaehler.Counter
                            Es kommen allerdings immer nur ganzzahlige Werte.
                            In der ETS habe ich die GA 6/7/1 mit einer Dummyapplikation (Gira) verknüpft und auch den DPT 14 vergeben.

                            Gruß,
                            Hendrik

                            Kommentar


                              #15
                              1. Python anweisen mit float zu teilen: /800.0
                              2. mit Python auseinandersetzen - sonst wird das hier beliebig schmerzhaft

                              Kommentar

                              Lädt...
                              X