Ankündigung

Einklappen
Keine Ankündigung bisher.

Frequenzzähler (Item.prev_change())

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

    Frequenzzähler (Item.prev_change())

    Hallo,

    ich möchte aus einem Zähler mit 800 Impulsen pro kwh gerne die aktuelle Momentanleistung berechnen.


    Simpel:
    Leistung in Watt=(Zählerstand-Zählerstand vor 1min)/60*1000

    Da ich aber nur einige wenige Impulse pro Minute habe, ist das recht ungenau.
    Jetzt könnte man ein längeres Intervall wählen. Dadurch würde man aber Aktualität verlieren.

    Nun gab mir Robert den Tipp eines Frequenzzählers: Frequenzzähler ? Wikipedia

    Wenn ich es richtig verstehe, muss ich einfach nur die Zeit zwischen zwei Impulsen (genau) messen und dann so rechnen:
    1 Impuls=1/800 kWh (800 Impulse pro kwh)
    =1000/800Wh
    =1000/800*3600Ws

    Wenn ich nun weisß, dass 1s zwischen zwei Impulsen lag, dann habe ich
    Leistung=1000/800*3600Ws/1s=75W

    Das Problem ist aber, dass bei Item.prev_change() nur Integer ausgegeben werden.
    1s kann also im Extremfall 1.4999s sein. Dann würden statt 50W 75W angezeigt.

    Wäre es möglich, prev_change() als float auszugeben, oder ist einfach keine genauere Messung sinnvoll/möglich?

    Alternativ:
    Wenn ich abfragen könnte, wieviel Zeit vergangen ist, seit das Item 10 mal aktualisiert wurde, könnte ich rechnen:
    Leistung=10*1000/800*3600Ws/15s (Um beim Beispiel von 1.4999s) zu bleiben.

    Was sagt ihr?

    Gruß,
    Hendrik

    #2
    Versuchs mal mit item.age() das sollte float sein und gibt Dir direkt die Differenzzeit aus.
    Wenn man das mit enforce_updates kombiniert sollte das passen.
    Umgezogen? Ja! ... Fertig? Nein!
    Baustelle 2.0 !

    Kommentar


      #3
      Leider nicht:
      Code:
      >>> sh.Allgemein.Stromzaehler.Counter.age()*1.0
      0.0
      >>> sh.Allgemein.Stromzaehler.Counter.age()*1.0
      5.0
      >>> sh.Allgemein.Stromzaehler.Counter.age()*1.0
      6.0
      >>> sh.Allgemein.Stromzaehler.Counter.age()*1.0
      6.0
      >>> sh.Allgemein.Stromzaehler.Counter.age()*1.0
      7.0
      >>> sh.Allgemein.Stromzaehler.Counter.age()*1.0
      8.0

      Kommentar


        #4
        Hallo Hendrik,

        age() als auch prev_change() liefern, in develop seit der 3.2 Umstellung, floats zurück.

        Und age != prev_change. Siehe Doku.

        Bis bald

        Marcus

        Kommentar


          #5
          Wenn ich's in eine logic einbaue und ins Log schreibe ist es float.
          Aber das scheint das enforce_updates zu ignorieren
          Umgezogen? Ja! ... Fertig? Nein!
          Baustelle 2.0 !

          Kommentar


            #6
            Hallo,
            fast übersehen:
            Zitat von mknx Beitrag anzeigen
            age() als auch prev_change() liefern, in develop seit der 3.2 Umstellung, floats zurück.
            oh, dann muss ich das ja wohl mal wagen...

            Und age != prev_change. Siehe Doku.
            Hm..
            age()

            Returns the age of the current item value.

            prev_change()

            Returns the age in seconds of the change before the latest update.
            Wenn ich im item ein eval=... nutze, dann ist age() doch immer 0 (oder fast 0), oder?
            D.h. in dem Falle wäre prev_change() richtig, bzw. ggf. noch
            prev_change()-age() (wenn man ganz genau sein will und die Zeit zwischen dem ändern des Wertes und dem Abarbeiten der Logik berücksichtigen will), oder?

            Gruß,
            Hendrik

            Kommentar


              #7
              Ja klar ... ich bin in develop ...

              Mit age ist natürlich quatsch, da ist das item ja schon aktuell oder wird das erst nach dem eval aktuell ?

              Welches Alter hat das Item vor/bei eval ?
              Umgezogen? Ja! ... Fertig? Nein!
              Baustelle 2.0 !

              Kommentar


                #8
                Hallo,

                jetzt auch in develop..
                prev_change macht nicht, was ich erwarten würde.
                An der shell:
                Code:
                sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.61906
                >>> sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.61906
                >>> sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.61906
                >>> sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.61906
                >>> sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.61906
                >>> sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.640734
                >>> sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.640734
                >>> sh.Allgemein.Stromzaehler.Counter.prev_change()
                3.640734
                Und nein, so schnell habe ich nicht getippt, dass weniger als 0.000001s dazwischen lagen.

                Gruß,
                Hendrik

                Kommentar


                  #9
                  Hallo Hendrik,

                  age() gibt die Zeit zurück wann der Wert zuletzt geändert wurde.
                  prev_change() gibt die Zeit zurück wie lange der Wert vor der letzten Änderung gültig war.

                  Bis bald

                  Marcus

                  Kommentar


                    #10
                    Hi,

                    danke, ich verstehe das soweit.
                    Aber:
                    ich weiß nicht, zu welchem Zeitpunkt eval ausgeführt wird:
                    Ist age/prev_change hier schon aktualisiert? Dann wäre age() ja nahe Null und ich müsste prev_change nehmen.
                    Oder wird erst dass eval ausgeführt? Dann müsste ich age() nehmen.

                    Gruß,
                    Hendrik

                    Kommentar


                      #11
                      Hallo,

                      es wird erst eval ausgeführt und dann werden die Zeiten aktualisiert.

                      Bis bald

                      Marcus

                      Kommentar


                        #12
                        Ok. Dann ist Age ja richtig.

                        Gruß,
                        Hendrik

                        Kommentar


                          #13
                          Hallo,

                          es funktioniert leider nicht...

                          Code:
                          >>> 
                          >>> sh.Allgemein.Stromzaehler.Momentanleistung_freq()
                          25423.87245125679
                          sh.Allgemein.Stromzaehler.Momentanleistung_1min()
                          899.9999999991815
                          Ich verstehe das nicht...
                          Wenn age() erst nach dem Eval aktualisiert wird, dann habe ich in age() doch die Zeit die seit dem letzten "tick" des Counters vergangen ist.

                          Die Überlegung
                          Jeder Counter=1/800kWh
                          =3600/800kws
                          =3600/800*1000Ws
                          Zeit zwischen zwei Impulsen messen und dadurch teilen --> W

                          Stimmt doch, oder?
                          Ich habe hier aber gerade keine 25kW Verbrauch!
                          Wo steckt der Käfer?


                          Gruß,
                          Hendrik

                          Hier der Code:
                          Code:
                                  [[[Momentanleistung_1min]]]
                          	    name = Momentanleistung_1min
                          	    type = num
                          	    sqlite = yes
                          	    knx_dpt = 14
                          	    knx_send = 6/7/2
                          	    eval = "(sh.Allgemein.Stromzaehler.Zaehlerstand()- sh.Allgemein.Stromzaehler.Zaehlerstand.db('max', '1i', '1i'))*60.0*1000.0"
                          	    eval_trigger=Allgemein.Stromzaehler.Counter
                              	    visu=yes
                                  [[[Momentanleistung_freq]]]
                          	    name = Momentanleistung_freq
                          	    type = num
                          	    sqlite = yes
                          	    knx_dpt = 14
                          #	    knx_send = 6/7/2
                          #Frequenzzähler: Jeder Counter=1/800kWh=3600/800kws=3600/800*1000Ws; Zeit zwischen zwei Impulsen messen und dadurch teilen --> W
                          	    eval = "3600.0/800.0*1000.0/sh.Allgemein.Stromzaehler.Counter.age()"
                          	    eval_trigger=Allgemein.Stromzaehler.Counter
                          	    enforce_updates=yes
                          	    visu=yes

                          Kommentar


                            #14
                            Edit: War wohl Käse ... ist zu spät
                            Umgezogen? Ja! ... Fertig? Nein!
                            Baustelle 2.0 !

                            Kommentar


                              #15
                              Nur geraten: age des eval-items wird natürlich nach dem eval geändert, aber age des trigger-item ist da natürlich gerade frisch aktualisiert. Ergo braucht es da das prev_change.

                              Treffer?

                              Kommentar

                              Lädt...
                              X