Ankündigung

Einklappen
Keine Ankündigung bisher.

Tagesverbrauch Strom berechnen

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

    Tagesverbrauch Strom berechnen

    Hi,

    neben dem persistieren, hängt es derzeit an der Berechnung, welche ich anhand eines Beispiels übernehmen wollte.

    Items
    Code:
    Number:Power    House_PowerIn   "Power in: [%.2f W]"        { channel="smaenergymeter:energymeter:1234567890:PowerIn" }
    Number:Power    House_PowerOut  "Power out: [%.2f W]"       { channel="smaenergymeter:energymeter:12345678900:PowerOut" }
    Number:Energy   House_EnergyIn  "Bezug [%.2f kWh]"          { channel="smaenergymeter:energymeter:1234567890:energyIn" }
    Number:Energy   House_EnergyOut "Einspeisung  [%.2f kWh]"   { channel="smaenergymeter:energymeter:1234567890:energyOut" }
    Number:Energy   House_Power_Day "Verbrauch heute [%.2f kWh]"
    Rule
    Code:
    [COLOR=#6a9955]/* Stromwerte */[/COLOR]
    rule "Stromzaehler Verbrauch Tag"
    when
        Item House_PowerIn received update
    then
        House_Power_Day.postUpdate(House_EnergyIn.deltaSince(now.withTimeAtStartOfDay))
    end
    Fehler
    21:41:11.550 [ERROR] [untime.internal.engine.RuleEngineImpl] - Rule 'Stromzaehler Verbrauch Tag': The argument 'state' must not be null.
    Muss ich dies ggfs doch erst noch persistieren, damit delta.Since berechnet werden kann??

    #2
    Zitat von JoergA Beitrag anzeigen
    Muss ich dies ggfs doch erst noch persistieren, damit delta.Since berechnet werden kann??
    Ohne Persistierung kann das nicht funktionieren. Hast Du eine .persist-Datei angelegt?

    Abgesehen davon würde ich empfehlen die Regel bei Änderung von House_EnergyIn/Out ausführen. Mit der aktuellen Definition würdest Du bei konstanter Leistungsaufnahme kein Update durchführen...

    Kommentar


      #3
      Also ich habe die nun (wie ich denke) persistiert in eine SQL, zumindest kommen 2 Werte dort an

      Item
      Code:
      Number:Energy   House_EnergyIn      "Bezug [%.2f kWh]"              (House_Energy_Chart)    { channel="smaenergymeter:energymeter:1234567890:energyIn" }
      Number:Energy   House_EnergyOut     "Einspeisung  [%.2f kWh]"       (House_Energy_Chart)    { channel="smaenergymeter:energymeter:1234567890:energyOut" }
      Number:Energy   House_Energy_Day    "Verbrauch heute [%.2f kWh]"
      jdbc.persist
      Code:
      House_EnergyIn : strategy = everyMinute,restoreOnStartup
      House_EnergyOut  : strategy = everyMinute,restoreOnStartup
      House_Energy_Day  : strategy = everyMinute,restoreOnStartup
      Die Werte kommen auch in der DB an

      Rule
      Code:
      rule "Stromzaehler Verbrauch Tag"
      when
          Item House_EnergyIn received update
      then
          House_Energy_Day.postUpdate(House_EnergyIn.deltaSince(now.withTimeAtStartOfDay))
      end
      Unverändert kommt der Fehler
      13:47:11.738 [ERROR] [untime.internal.engine.RuleEngineImpl] - Rule 'Stromzaehler Verbrauch Tag': The argument 'state' must not be null.
      Die Kür mit einem zusätzlichen Wert als Trigger würde ich angehen, wenn es mal grundsätzlich läuft?

      Kommentar


        #4
        Ich würde die eine Zeile vorübergehend zur Fehlersuche aufsplitten und mit Logs arbeiten.
        An irgendeiner Stelle scheint ein ungültiger/falscher Wert zu sein...

        Das Problem bei dem Befehl ist, dass wenn er in den persistierten Daten keinen gültigen Wert für den Start vom Tag hat, so wird die Berechnung nicht richtig funktionieren...

        Kommentar


          #5
          OK, es lag daran, das ich die Werte in einer jdbc speichere jedoch rr4j der default ist.
          Nun habe ich noch das "Problem" das now.withTimeAtStartOfDay noch keine Werte enthät, da die Werte erst seit 12 Uhr existieren.
          Mal sehen, ob es morgen besser wird Da müsste ja dann 0-0 eine klare Angabe sein.
          Ist ja nicht mehr lang bis dahin.

          ################
          Dies hatte ich gestern noch posten wollen, aber schein t nicht hochgeladen worden zu sein
          Zuletzt geändert von JoergA; 11.02.2020, 19:05.

          Kommentar


            #6
            Ich habe die Regel angepasst um den täglichen Eigenverbrauch zu erfassen, und seit 0:00 Uhr funktioniert dies nun auch.

            Kommentar


              #7
              Zitat von JoergA Beitrag anzeigen
              es lag daran, das ich die Werte in einer jdbc speichere jedoch rr4j der default ist.
              Nun habe ich noch das "Problem" das now.withTimeAtStartOfDay noch keine Werte enthät, da die Werte erst seit 12 Uhr existieren.
              Die Funktionen zum Abruf der Historie gibt es zumindest teilweise auch mit einen weiteren Parameter zur Angabe der Speicher-Engine. Das ist in der Dokumentation nur leider nicht wirklich klar abgebildet...

              Kommentar


                #8
                Zitat von wknx Beitrag anzeigen
                Die Funktionen zum Abruf der Historie gibt es zumindest teilweise auch mit einen weiteren Parameter zur Angabe der Speicher-Engine. Das ist in der Dokumentation nur leider nicht wirklich klar abgebildet...
                stimmt, in der Doku habe ich da auch nicht wirklich was gefunden, aber im großen Internet nach der Angabe der DB konnte ich auf die Daten zugreifen. Dann habe ich noch Zeitangaben hinzugefügt und konnte damit herausfinden, dass es an fehlenden Daten lag.

                Kommentar


                  #9
                  Vielleicht kannst Du Deine Lösung nochmals im Klartext hochladen, falls Einsteiger hier drüber stolpern...

                  Kommentar


                    #10
                    Hallo zusammen,

                    anbei die gewünschte Zusammenfassung, wie es derzeit bei mir funktioniert.

                    Da ich die Werte über einen längeren Zeitraum speichern möchte, war rr4j die falsche Wahl und ich habe mich für jdbc mit einer SQLite Datenbank entschieden, da ich diese bereits für andere Zwecke im Einsatz habe.

                    Items
                    Code:
                    Number House_EnergyIn       "Bezug [%.2f kWh]"              (House_Energy_Chart)    { channel="smaenergymeter:energymeter:1234567890:energyI n" }
                    Number House_EnergyOut      "Einspeisung  [%.2f kWh]"       (House_Energy_Chart)    { channel="smaenergymeter:energymeter:1234567890:energyO ut" }
                    Number House_Energy_Day     "Eigenverbrauch heute [%.2f W]" <piggybank>
                    jdbc.persist
                    Code:
                        House_EnergyIn : strategy = everyMinute,restoreOnStartup
                        House_EnergyOut : strategy = everyMinute,restoreOnStartup
                        House_Energy_Day : strategy = everyMinute,restoreOnStartup
                    Energy_Day werde ich noch anpassen, dies wird sicher nicht minütlich benötigt ;-)

                    Rules
                    Code:
                    rule "Stromzaehler Verbrauch Tag"
                    when
                        Item House_EnergyIn received update or
                        Item House_EnergyOut received update or
                        Item SMA_power_daily_wh received update
                    then
                        House_Energy_Day.postUpdate((SMA_power_daily_wh.state as Number) - (House_EnergyOut.deltaSince(now.withTimeAtStartOfDay, "jdbc") *1000))
                    end
                    Hier ist die Angabe der DB wichtig, sowie die Umrechnung des Wertes in W, da von Smart Meter KWh geliefert werden ;-)

                    deltaSince(now.withTimeAtStartOfDay liefert natürlich erst einen Wert (ungleich NULL), wenn auch ein Wert in der DB vorhanden ist. Also entweder mit ensprechendem Vorlauf persistieren oder manuell eintragen.

                    Kommentar


                      #11
                      Hallo zusammen,

                      Ich möchte auch gerne den Tagesverbrauch speichern und habe eine ähnliche Regel, nur erhalte ich immer folgenden Fehler in VS-Code:

                      Ambiguous feature call.
                      The extension methods
                      postUpdate(Item, State) in BusEvent and
                      postUpdate(Item, Number) in BusEvent
                      both match.
                      Meine Rule:

                      Code:
                      rule "Waermemenge Bedarf Tag"
                       
                      when
                      Item HeizungDP023 received update
                      then
                      WEZ_Waermemenge_VerbrauchTag.postUpdate(HeizungDP023.deltaSince(now.withTimeAtStartOfDay))
                      end
                      WEZ_Waermemenge_VerbrauchTag ist immer 0.0 speichert also nicht den Wert.

                      Meine items:

                      Code:
                      Number   WEZ_Waermemenge_VerbrauchTag "Wärmemengenbedarf heute [%.2f kWh]"                     (KG_Heizung)
                      Number   HeizungDP023   "Wärmeerz. wärmemenge heizen status [%.0f kWh]"                          (KG_Heizung)  {channel="knx:device:42a36ac8:Heizung: DP023"}
                      Peristriert habe ich das ganze auch (rrd4j):

                      Code:
                       WEZ_Waermemenge_VerbrauchTag : strategy = everyMinute, restoreOnStartup
                      Was ist da flasch?

                      Tom
                      Zuletzt geändert von TomW80; 30.05.2020, 11:55.

                      Kommentar


                        #12
                        Na ja, wenn ich fies wäre, würde ich schreiben: steht doch da!

                        Ambigous feature call bedeutet, openHAB weiß nicht, welche der zur Verfügung stehenden Funktionen es nutzen soll. Hier stehen zwei Funktionen zur Verfügung, die beide möglich wären.

                        Das Problem kannst Du beseitigen, in dem Du den zu schreibenden Wert ausdrücklich in einen bestimmten Typ castest:
                        Code:
                        WEZ_Waermemenge_VerbrauchTag.postUpdate(HeizungDP023.deltaSince(now.withTimeAtStartOfDay) as Number)
                        So weiß openHAB nun sicher, dass es sich um eine Zahl handeln soll (ein Status ist keine Zahl, auch wenn er eine Zahl repräsentiert).
                        Zuletzt geändert von udo1toni; 30.05.2020, 14:57.

                        Kommentar


                          #13
                          Zitat von udo1toni Beitrag anzeigen
                          Das Problem kannst Du beseitigen, in dem Du den zu schreibenden Wert ausdrücklich in einen bestimmten Typ castest:
                          Code:
                          WEZ_Waermemenge_VerbrauchTag.postUpdate(HeizungDP023.deltaSince(now.withTimeAtStartOfDay) as Number)
                          So weiß openHAB nun sicher, dass es sich um eine Zahl handeln soll (ein Status ist keine Zahl, auch wenn er eine Zahl repräsentiert).
                          Der Fehler ist nun weg, aber das Item "WEZ_Waermemenge_VerbrauchTag" ändert sich nicht , ist immer noch 0.0.
                          Werde jetzt noch das "rrd4j" mit angeben, vielleicht bringt das noch was.

                          Code:
                          WEZ_Waermemenge_VerbrauchTag.postUpdate(HeizungDP023.deltaSince(now.withTimeAtStartOfDay, [COLOR=#e74c3c]"rrd4j"[/COLOR]) as Number)
                          Tom

                          Kommentar


                            #14
                            Natürlich hat das leider nichts gebracht, ich sehe immer noch keinen Wert in "WEZ_Waermemenge_VerbrauchTag"

                            Habe jetzt in meine Rule noch folgendes eingefügt um zu sehen ob diese überhaupt aufgerufen wird.

                            Code:
                            logInfo("heizung.rules", "Die Wärmemenge hat sich geändert!")
                            Die Rule wird also aufgerufen, denn im Log steht:

                            2020-06-01 06:00:40.011 [vent.ItemStateChangedEvent] - HeizungDP023 changed from 8937.0 to 8938.0
                            ..
                            2020-06-01 06:00:40.308 [INFO ] [smarthome.model.script.heizung.rules] - Die Wärmemenge hat sich geändert!
                            Aber warum erhält "WEZ_Waermemenge_VerbrauchTag" keinen Wert?
                            Kann das an dem "now.withTimeAtStartOfDay" liegen? benötige ich dafür noch etwas?

                            Bin etwas ratlos, da im Log auch kein Fehler auftaucht.

                            Tom

                            Kommentar


                              #15
                              Hast Du rrd4j als default Persistence angegeben?
                              Schau mal, was das Item zurückliefert:
                              Code:
                              rule "Waermemenge Bedarf Tag"
                              when
                                  Item HeizungDP023 received update
                              then
                                  val Verbrauch = HeizungDP0 23.deltaSince(now.withTimeAtStartOfDay) as Number
                                  logInfo("bedarfwm","Tagesverbrauch: {}",Verbrauch)
                                  WEZ_Waermemenge_VerbrauchTag.postUpdate(Verbrauch)
                              end

                              Kommentar

                              Lädt...
                              X