Kosten Strombezug/Einspeisevergütung

Hier bitte alles rein was Off-topic ist.

Moderatoren: Cyrelian, seppy

Antworten
Rob69
Beiträge: 83
Registriert: 26. Feb 2021 07:38
Answers: 0

Kosten Strombezug/Einspeisevergütung

Beitrag von Rob69 »

Hallo,

Ich bin dabei mir über OpenHab die jährliche Stromkosten und meine jährliche Einspeisevergütung anzeigen zu lassen.
Da ich Lesekopf für meinen Stromzähler habe bekomme ich die Werte von
-Stromverbrauch gesamt
-Einspeisung gesamt
diese sind von mir an Sylvester notiert worden.
Diese Rules funktionieren, aber ich möchte mir den Verbrauch in Euro anzeigen lassen diese Rules funktionieren leider nicht.
Ich habe die Rule zum errechnen der Kosten schon für die Kosten meines Gesamtverbrauchs meiner Pelletheizung schon seit OH 2 am laufen,
da funktioniert sie.
Bei den Rules für den Strom andauernd Fehler
!

Code: Alles auswählen

19:41:26.664	ERROR	
org.openhab.core.automation.module.script.internal.handler.AbstractScriptModuleHandler
Script execution of rule with UID 'Stromverbrauch-3' failed: Could not cast 114.9955136 kWh to org.openhab.core.library.types.DecimalType; line 27, column 27, length 34 in Stromverbrauch
exclamationmark_octagon_fill 
19:41:26.664	ERROR	
org.openhab.core.automation.module.script.internal.handler.AbstractScriptModuleHandler
Script execution of rule with UID 'Stromverbrauch-4' failed: Could not cast 0.1383951 kWh to org.openhab.core.library.types.DecimalType; line 34, column 34, length 35 in Stromverbrauch
vielleicht kann mir jemand erklären was ich falsch mache.

Die Items:

Code: Alles auswählen

Number:Energy Strombezug_26       "Stromverbrauch 2026 [%.2f kWh]"  
Number:Energy Einspeisung_26          "Einspeisung 2026 [%.2f kWh)"   
Number Stromkosten_26              "Stromkosten 2026 [%.2f €]"
Number Entgeld_Einspeisung26       "Entgeld Einspeisung 2026  [%.2f €]"
Die Rules:

Code: Alles auswählen

rule "Stromverbrauch 2026"

when
Item  EasymeterEnergyIn    received update
then
Strombezug_26  .
postUpdate ( EasymeterEnergyIn .state as QuantityType - 2891|"kWh")  /// Stromverbrauch   ////Number Strombezug_26       "Stromverbrauch 2026 [%.2f kWh]"   ////
end


rule "Einspeisung 2026"

when
Item  EasymeterEnergyOut    received update
then
Einspeisung_26 .
postUpdate ( EasymeterEnergyOut.state as QuantityType - 7488|"kWh")    ////Number Einspeisung_26          "Einspeisung 2026 [%.2f kWh)"
end


rule "Stromkosten 2026"

when
Item Strombezug_26 received update
then
Stromkosten_26.postUpdate(Strombezug_26.state as DecimalType * 0.35)    ////Number Stromkosten_26              "Stromkosten 2026 [%d €]" 
end

rule "Entgeld Einspeisung 2026"
when
Item Einspeisung_26 received update
then
Entgeld_Einspeisung26.postUpdate(Einspeisung_26.state as DecimalType * 0.082)     ///Number Entgeld_Einspeisung26   ///    "Entgeld Einspeisung 2026  [%d €]"
end
Wie schon gesagt die Minus Rules funktionieren.

Gruß Rob

Benutzeravatar
udo1toni
Beiträge: 15565
Registriert: 11. Apr 2018 18:05
Answers: 251
Wohnort: Darmstadt

Re: Kosten Strombezug/Einspeisevergütung

Beitrag von udo1toni »

Das Problem sind zunächst fehlende Klammern.
Der Trigger received update dürfte sich hier kaum lohnen, Du möchtest den Status des Items eigentlich nur bei Änderung neu berechnen.
Besser wäre es außerdem, aus den vier Rules zwei Rules zu machen. :) Momentan triggert die Ausführung einer Rule die Ausführung der anderen Rule, das geht effizienter.

Code: Alles auswählen

rule "Stromverbrauch 2026"
when
    Item EasymeterEnergyIn changed
then
    val qBezug = (EasymeterEnergyIn.state as QuantityType) - 2891|"kWh"
    Strombezug_26.postUpdate(qBezug)
    val Kosten = qBezug.floatValue * 0.35
    Stromkosten_26.postUpdate(Kosten)
end

rule "Einspeisung 2026"
when
    Item EasymeterEnergyOut received update
then
    val qEinspeisung = (EasymeterEnergyOut.state as QuantityType) - 7488|"kWh"
    Einspeisung_26.postUpdate(qEinspeisung)
    val Entgelt = qEinspeisung.floatValue * 0.082
    Entgeld_Einspeisung26.postUpdate(Entgelt)
end
Ganz wichtig für die Multiplikation ist es, vorher die Einheit loszuwerden, das geht am einfachsten mit der Umwandlung nach Float.

Allerdings... ;)
Es ist ja schon lästig, jährlich die Rule anzupassen. Im Zweifel ist das Item ohnehin persistiert, oder? Dann geht es auch viel hübscher.
Falls Du schon auf openHAB5 bist, kannst Du außerdem auch den QuantityType Currency verwenden :)

Das sähe dann so aus:
Items:

Code: Alles auswählen

// DSL Code
Number:Currency Stromkosten "Ausgaben" {unit="EUR",stateDescription=""[pattern="%.2f %unit%"]}
Number:Currency Einspeiseentgelt "Einnahmen" {unit="EUR",stateDescription=""[pattern="%.2f %unit%"]}

// alternativ als JAML Code, hier ebenfalls beide Items gemeinsam in einer Datei
version: 1
items:
  Einspeiseentgelt:
    type: Number
    dimension: Currency
    label: Einnahmen
    unit: EUR
    metadata:
      stateDescription:
        config:
          pattern: '%.2f %unit%'
  Stromkosten:
    type: Number
    dimension: Currency
    label: Ausgaben
    unit: EUR
    metadata:
      stateDescription:
        config:
          pattern: '%.2f %unit%'

Der Einfachheit halber hier nur als eine Rule...

Code: Alles auswählen

rule "Stromzähler changed"
 when
    Item EasymeterEnergyIn changed or
    Item EasymeterEnergyOut changed 
 then
    val vz1 = (EasymeterEnergyIn.persistedState(now.with(LocalTime.MIDNIGHT).withDayOfYear(1)).state as QuantityType<Energy>)
    val vz2 = (EasymeterEnergyOut.persistedState(now.with(LocalTime.MIDNIGHT).withDayOfYear(1)).state as QuantityType<Energy>)
    val kosten = ((EasymeterEnergyIn.state as QuantityType<Energy>) - vz1).multiply(0.35|"EUR/kWh")  
    val entgelt = ((EasymeterEnergyOut.state as QuantityType<Energy>) - vz2).multiply(0.082|"EUR/kWh")  
    Stromkosten.postUpdate(kosten as Number)
    Einspeiseentgelt.postUpdate(entgelt as Number)

end
.multiply() ist eine Methode, die beim Datentyp QuantityType zur Verfügung steht. Sie ermöglicht es, auch Mulitiplikationen mitsamt den Einheiten durchzuführen, hier also z.B. 25 kWh * 0.35 EUR/kWh, was dann als Ergebnis korrekt EUR liefert, da sich kWh wegkürzt.
Eigentlich würde man korrekt auch mit dem QuantityType<EnergyPrice> rechnen, aber leider hat die DSL da noch ein Problem. Direkt hingeschrieben geht es aber und hier gehen wir ohnehin von einem fixen Betrag aus, da ist das egal.

Natürlich könnte man auch direkt das Delta abfragen:

Code: Alles auswählen

 val sumYearIn  = (EasymeterEnergyIn.deltaSince(now.with(LocalTime.MIDNIGHT).withDayOfYear(1)) as QuantityType<Energy>)
Und es gibt auch ein .withDayOfMonth(), um auf den aktuellen Monatsersten Bezug zu nehmen :) also viele Möglichkeiten zu spielen.
openHAB5.0.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox 9.1.4 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Rob69
Beiträge: 83
Registriert: 26. Feb 2021 07:38
Answers: 0

Re: Kosten Strombezug/Einspeisevergütung

Beitrag von Rob69 »

Erstmal danke Udo1Toni,

die Rule

Code: Alles auswählen

rule "Stromverbrauch 2026"
when
  Item EasymeterEnergyIn changed
then
  val qBezug = (EasymeterEnergyIn.state as QuantityType) - 2891|"kWh"
  Strombezug_26.postUpdate(qBezug)
  val Kosten = qBezug.floatValue * 0.35
  Stromkosten_26.postUpdate(Kosten)
end

rule "Einspeisung 2026"
when
 Item EasymeterEnergyOut received update
then
 val qEinspeisung = (EasymeterEnergyOut.state as QuantityType) - 7488|"kWh"
  Einspeisung_26.postUpdate(qEinspeisung)
   val Entgelt = qEinspeisung.floatValue * 0.082
    Entgeld_Einspeisung26.postUpdate(Entgelt)
end
funktioniert ganz gut!

Aber mein Hichi Zählerkopf bringt einen mehrstelligen Verbrauch hinter dem Punkt

Code: Alles auswählen

17:11:26.810	INFO	
openhab.event.ItemStateChangedEvent
Item 'Strombezug_26' changed from 123.1182013 kWh to 123.1567985 kWh (source: org.openhab.core.automation.module.script)
info_circle 17:11:26.811	INFO	
openhab.event.ItemStateChangedEvent
Item 'Stromkosten_26' changed from 43091.37109375 to 43104.87890625 (source: org.openhab.core.automation.module.script)
Die verbrauchten Kwh werden auch nur zwei Stellen hinter dem Punkt angezeigt, eigentlich müsste es ein Komma sein.
Ich arbeite mit openHab 5.1

Gruß Rob

Benutzeravatar
udo1toni
Beiträge: 15565
Registriert: 11. Apr 2018 18:05
Answers: 251
Wohnort: Darmstadt

Re: Kosten Strombezug/Einspeisevergütung

Beitrag von udo1toni »

Im Log siehst Du ja, dass der Zahlenwert mehr als zwei Nachkommastellen hat :) Der Status des Items hält immer den "exakten" Wert, sofern dieser darstellbar ist (Float Werte bringen eine gewisse Ungenauigkeit mit sich...)
Eine andere Sache ist die Darstellung in der UI, dort ist der dargestellte Wert abhängig von der Konfiguration des Patterns. %.2f bedeutet beispielsweise, dass der Status als Gleitkommazahl mit zwei Nachkommastellen dargestellt wird. Wenn Du mehr Nachkommastellen möchtest, mach statt der 2 z.B. eine 3 hin. (das wären dann Wh, ob die angezeigten Strommengen tatsächlich bis auf diese Genauigkeit dargestellt werden, hängt vom verwendeten Zähler (nicht dem Lesekopf...) ab.

Zahlen werden intern in openHAB immer in der amerikanischen Schreibweise notiert, also mit einem Punkt als Trennung zwischen Einer- und Zehntelwert. Das betrifft vor allem das Log.
In der UI sollte openHAB aber automatisch ein Komma verwenden, wenn Du openHAB (und das darunter laufende Betriebssystem) auf Deutsch konfiguriert hast.
openHAB5.0.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox 9.1.4 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Rob69
Beiträge: 83
Registriert: 26. Feb 2021 07:38
Answers: 0

Re: Kosten Strombezug/Einspeisevergütung

Beitrag von Rob69 »

Hallo Udo1Toni,

Ich habe den Raspberry nochmals auf die Zeitzone angepasst:

Unter " sudo openhabian config"
Einstellungen lokal Time.
und danach neu gestartet.

in der Basicui wird der Wert als kWh mit 2 Stellen hinter dem Komma angezeigt.

Was mich aber heute zum Grübeln gebracht hat ist folgendes!

Code: Alles auswählen


 17:11:26.926	INFO	
openhab.event.ItemStateChangedEvent
Item 'EasymeterEnergyOut' changed from 7488158.3909 Wh to 7488158.6568 Wh (source: org.openhab.core.thing$mqtt:topic:mosquitto:hichi:sumOut)
info_circle
 17:11:26.928	INFO	
openhab.event.ItemStateChangedEvent
Item 'EasymeterEnergyIn' changed from 3029859.4862 Wh to 3029859.5454 Wh (source: org.openhab.core.thing$mqtt:topic:mosquitto:hichi:sumIn)
info_circle
 17:11:26.928	INFO	
openhab.event.ItemStateChangedEvent
Item 'EasymeterWatt' changed from -0.41 W to -2.93 W (source: org.openhab.core.thing$mqtt:topic:mosquitto:hichi:power)
info_circle
 17:11:26.928	INFO	
openhab.event.ItemStateChangedEvent
Item 'Einspeisung_26' changed from 0.1583909 kWh to 0.1586568 kWh (source: org.openhab.core.automation.module.script)
info_circle
 17:11:26.928	INFO	
openhab.event.ItemStateChangedEvent
Item 'Entgeld_Einspeisung26' changed from 12.988053771972657 DEF to 13.009857543945314 DEF (source: org.openhab.core.automation.module.script)
info_circle
 17:11:26.930	INFO	
openhab.event.ItemStateChangedEvent
Item 'Strombezug_26' changed from 138.8594862 kWh to 138.8595454 kWh (source: org.openhab.core.automation.module.script)
info_circle
 17:11:26.930	INFO	
openhab.event.ItemStateChangedEvent
Item 'Stromkosten_26' changed from 48600.819531249996 DEF to 48600.841406249994 DEF (source: org.openhab.core.automation.module.script)Icons can be provided as png (32x32) or preferably as 
Der Zähler bringt alles in Wh raus welches in der Basicui aber richtig als kWh angezeigt wird!
wie es aussieht muss man den Wert in der Rule erst anpassen.

Gruß Rob

Benutzeravatar
udo1toni
Beiträge: 15565
Registriert: 11. Apr 2018 18:05
Answers: 251
Wohnort: Darmstadt

Re: Kosten Strombezug/Einspeisevergütung

Beitrag von udo1toni »

Rob69 hat geschrieben: Gestern 18:19 wie es aussieht muss man den Wert in der Rule erst anpassen.
Dann ist das Item unerwartet konfiguriert :)

Und ich hatte Deine Aussage anders verstanden, als Du sie meintest...

Units of Measurement (UoM, QuantityType...) bewirken, dass man sich um Umrechnungen keinen Kopf machen muss. Dieses Feature ist natürlich vor allem für die Amis interessant, in Europa muss man gewöhnlich nur mit einer Zehnerpotenz multiplizieren um den Wert wie gewünscht angezeigt zu bekommen ;) Aber wie so oft steckt der Teufel im Detail...

Der Zähler liefert den Wert in Wh -> im Channel des Things muss die Einheit Wh angegeben werden. Der Hichi sendet die Daten ja über mqtt, und wenn Du den Lesekopf nicht gerade über die HomeAssistant Autokonfiguration einbindest, weiß openHAB nichts von einer Einheit, entsprechend musst Du sie als Parameter beim number Channel setzen - unit="Wh".
Das zugehörige Item muss vom Typ Number:Energy sein. Und nun gibt es zwei Stellen, an denen Du die Einheit definieren musst, das ist zum Einen die Anzeige und zum anderen der Status. Der Status bezieht sich darauf, in welchem Format das Item den Wert speichert. Du kannst hier frei aus den gültigen Einheiten wählen (Du könntest z.B. auch Joule oder Ws oder GWh angeben, ist egal). Diese Angabe (in den Metadaten zu setzen, auch hier heißt der Parameter unit) darf nur einmalig gesetzt werden, denn die Einheit wird nicht in der Persistence mit abgespeichert. Wenn die Persistence abgefragt wird, muss openHAB also anhand der im Item definierten unit den rein numerischen Wert interpretieren.
Die Anzeige (state description -> pattern) ist nur für die Anzeige in der UI verantwortlich. Im Gegensatz zu den anderen stellen kannst Du das Pattern beliebig oft ändern.
Also: Channel unit -> 0 mal anpassen (bzw. die Einheit ergibt sich durch die Datenquelle, es gibt keine Entscheidungsmöglichkeit)
Item unit -> einmal anpassen, nach den eigenen Vorstellungen, danach nicht mehr.
Pattern: so oft Du es ändern magst. Das Pattern kann auch an verschiedenen Stellen unterschiedlich gesetzt sein, Du könntest in der Basic UI z.B. drei mal untereinander ein Text Widget mit dem selben(!) Item einplanen, aber jeweils unterschiedliche Patterns setzen.

In Rules musst Du beim Zugriff auf den Item Status aufpassen.
Entweder, Du verwendest das Item als QuantityType, dann aber durchgängig. Dabei wird openHAB die Einheiten automatisch korrekt miteinander verrechnen.
Oder Du verwendest .floatValue, um die Einheit zu entfernen und mit dem nackten Zahlenwert weiter zu rechnen. Dann musst Du aber aufpassen, in welcher Einheit der Wert "nackt" geliefert wird, bzw. den passenden Umrechnungsfaktor nutzen.
openHAB5.0.3 stable in einem Debian-Container (trixie, OpenJDK 21 headless runtime - LXC, 4 Kerne, 3 GByte RAM)
Hostsystem Proxmox 9.1.4 - AMD Ryzen 5 3600 6 Kerne, 12 Threads - 64 GByte RAM - ZFS Pools: Raid Z1, 3 x 20 TB HDD -> 40 TByte und Raid Z0-Mirrored 4 x 1 TByte NVMe -> 2 TByte

Antworten