Smartmeter Berechnung liefert falsches Ergebnis

Einrichtung der openHAB Umgebung und allgemeine Konfigurationsthemen.

Moderatoren: seppy, udo1toni

Antworten
kaper
Beiträge: 5
Registriert: 16. Nov 2019 16:57
Answers: 0

Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von kaper »

Hallo,
bin noch ziemlich neu in openhab und komme mit einer Berechnung nicht klar. Ich habe das Smartmeterbinding aktiviertund bekomme auch brav einen Zählerstand. Nun möchte ich aber nicht nur den Zählerstand anzeigen, sondern die Veränderung innerhalb eine bestimmten Zeitraumes. Dazu hab ein weiteres thing mit nummern-chanels angelegt, die über eine rule berechnet werden sollen. Das Ergebnis ist aber seltsam. Hat sich der Zählerstand nicht geändert so wird korrekt "0" ausgegeben, gibt es eine Differenz ( meist im Kommabereich) so wird "360000" ausgegeben. Wenn ich die Variablen in der rule manuell im script befülle funktioniert es richtig.

Jemand erfahrener kann mir sicher sagen, was ich falsch mache.
Danke vorab.
rule "CronxMinuten"
when
Time cron "0 0/1 * * * ?"
then
var Number z181 = 0.0
var Number x22 = 0.0

z181 = smartmeter_meter_EVN1_1_8_1.state as Number
x22 = mqtt_topic_EVN2_Stand181.state as Number
mqtt_topic_EVN2_Stand181.sendCommand(z181)

mqtt_topic_EVN2_L181.sendCommand(x22)
mqtt_topic_EVN2_L281.sendCommand(z181 - x22)


end
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von udo1toni »

Erst mal zur Klärung:
Things sind immer an eine Hardware oder einen Dienst gekoppelt, ein Thing ist ein "Ding", das kann eine Leuchte oder auch z.B. die Sonne sein. Wenn Du Dir Werte aufbewahren willst, um Berechnungen anzustellen, benötigst Du dafür zusätzliche Items, aber keine Things oder Channel, denn es gibt kein Gerät dafür.

Im Wirklichkeit möchtest Du immer die Differenz aus einer Zeitspanne haben, dafür nutzt man normalerweise einen Persistence Service. Konfiguriere beispielsweise rrd4j so, dass der Zählerstand minütlich und bei Änderung gesichert wird:

persistence/rrd4j.persist (Name uns Speicherort sind fest vorgegeben):

Code: Alles auswählen

Strategies {
        // for rrd4j, we need a cron strategy
        everyMinute : "0 * * * * ?"
}

Items {
        smartmeter_meter_EVN1_1_8_1 : strategy = everyMinute, everyChange
}
das rrd4j Addon muss natürlich installiert sein, mehr ist aber nicht nötig (Du musst also nichts weiter konfigurieren).
Ab sofort steht die Historie des Items zur Verfügung, natürlich erst ab dem Zeitpunkt, wo rrd4j aktiv wird.

Nun kannst Du in einer Rule folgendes tun:

Code: Alles auswählen

rule "CronxMinuten"
when
    Time cron "0 0/1 * * * ?"
then
    var Number z181 
    z181 = smartmeter_meter_EVN1_1_8_1.historicState(now.minusMinutes(1)).state as Number
    logInfo("energy","Differenz ist {}",(smartmeter_meter_EVN1_1_8_1.state as Number) - z181)
end
Die Differenz kannst Du auch in einem anderen Number Item speichern.

Paper UI Control ist als UI ungeeignet. Man kann sie nicht sinnvoll gestalten, es gibt keine Trennung der Rollen (Paper UI ist eine Administrationsoberfläche) und nicht zuletzt ist Paper UI deprecated, es wird nicht mehr weiterentwickelt und es werden auch keine Fehler mehr beseitigt. In der nächsten Version von openHAB (openHAB 3) wird es diese Oberfläche nicht mehr geben.
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

kaper
Beiträge: 5
Registriert: 16. Nov 2019 16:57
Answers: 0

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von kaper »

Danke udo1toni.
Die o.a. persistence habe ich natürlich eingerichtet.
Da sich die Werte (Zählerstand)im 5-stelligen Bereich bewegen, die Änderungen aber im Zehntelbereich,ist in der grafischen Darstellung nur eine Gerade zu erkennen, die nichts aussagt.
rechnen_oh5.jpg
Darum möchte ich den Zählerstand etwa 1/4 stündlich (zum Testen hab ich jetz im Skript minütlich eingestellt) mit dem letzten Wert vergleichen und die Differenz persistent speichern um aussagekräfitige Verbrauchswerte zu erhalten.

Das für mich komische ist, dass die rule funktioniert, wenn ich dirket Werte im Skript eintrage. Wenn ich die Werte aber vom thing hole, wird Unsinn angezeigt. Die paperUI ist natülich nicht der entgültige Zweck. Angezeigt sollen die Werte dann über ein Habpanel werden, aber zuerst müssen sie mal richtig errechnet sein.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

kaper
Beiträge: 5
Registriert: 16. Nov 2019 16:57
Answers: 0

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von kaper »

Hab die rule jetzt mal probiert, es kommt auch da ein seltsamer Wert als Ergebnis.

2019-11-17 16:24:00.005 [INFO ] [clipse.smarthome.model.script.energy] - Differenz ist 95152293568.9
müsste aber im Bereich 0.0 - 1 liegen.

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

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von udo1toni »

Versuch es mal mit etwas Logging:

Code: Alles auswählen

rule "CronxMinuten"
when
    Time cron "0 0/1 * * * ?"
then
    var Number z181_alt = 0
    var Number z181_neu = 0
    z181_alt = smartmeter_meter_EVN1_1_8_1.historicState(now.minusMinutes(1)).state as Number
    z181_neu = smartmeter_meter_EVN1_1_8_1.state as Number
    logInfo("energy","Alt: {} Neu: {}",z181_alt ,z181_neu)
    logInfo("energy","Differenz: {}",z181_neu-z181_alt)
end
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

kaper
Beiträge: 5
Registriert: 16. Nov 2019 16:57
Answers: 0

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von kaper »

Ich versteh es nicht ?????
2019-11-18 17:02:00.002 [INFO ] [clipse.smarthome.model.script.energy] - Alt: 26445.3 Neu: 26445.4 kWh
2019-11-18 17:02:00.003 [INFO ] [clipse.smarthome.model.script.energy] - Differenz: 95203413554.7

Ich hab es jetzt mal so gelöst:

Code: Alles auswählen

rule "CronxMinuten"
when
    Time cron "0 0/15 * * * ?"
then
  var Number z181_alt = 0
  var Number z181_neu = 0
  var Number z281_alt = 0
  var Number z281_neu = 0
 
 
    z181_alt = smartmeter_meter_EVN1_1_8_1.historicState(now.minusMinutes(16)).state as Number
    z181_neu = smartmeter_meter_EVN1_1_8_1.historicState(now.minusMinutes(1)).state as Number

    z281_alt = smartmeter_meter_EVN1_2_8_1.historicState(now.minusMinutes(16)).state as Number
    z281_neu = smartmeter_meter_EVN1_2_8_1.historicState(now.minusMinutes(1)).state as Number


    logInfo("energy","Differenz1: {}",z181_neu-z181_alt)
    logInfo("energy","Differenz2: {}",z281_neu-z281_alt)
    mqtt_topic_EVN2_L181.sendCommand(z181_neu - z181_alt)
    mqtt_topic_EVN2_L281.sendCommand(z281_neu - z281_alt)

    //mqtt_topic_SF_BR1_K9.sendCommand(ON)
    //createTimer(now.plusSeconds(2)) [| mqtt_topic_SF_BR1_K9.sendCommand(OFF) ]

    
end
das scheint zu funktionieren.
Danke für die Unterstützung!

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

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von udo1toni »

Der Punkt ist hier der abweichende Wert:

Code: Alles auswählen

Alt: 26445.3 Neu: 26445.4 kWh
Nun frage ich Dich: Woher kommen die letzten drei Buchstaben?
Und liefere auch gleich noch die Antwort: Das Item verwendet UoM (Units of Measurement). Damit ist der Wert vom Typ QuantityTpe, damit muss man etwas spezieller umgehen:

Code: Alles auswählen

rule "CronxMinuten"
when
    Time cron "0 0/1 * * * ?"
then
    var Number z181_alt = 0
    var Number z181_neu = 0
    z181_alt = smartmeter_meter_EVN1_1_8_1.historicState(now.minusMinutes(1)).state as Number
    z181_neu = (smartmeter_meter_EVN1_1_8_1.state as Number).floatValue
    logInfo("energy","Alt: {} Neu: {}",z181_alt ,z181_neu)
    logInfo("energy","Differenz: {}",z181_neu-z181_alt)
end
rrd4j kann nicht mit UoM umgehen, die Einheiten werden von openHAB automatisch entfernt, bevor die Zahlen gespeichert werden. Da Du bei Deiner Rule für beide Werte auf rrd4j zurückgreifst, erledigt sich das Problem von selbst (um den Preis der Inaktualität ;) wobei Du natürlich auch mit now.minusMillis(500) als historicState arbeiten kannst, das relativiert das Alter :) )
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

kaper
Beiträge: 5
Registriert: 16. Nov 2019 16:57
Answers: 0

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von kaper »

Danke für die Erklärung!
Ich werde das so auch noch probieren, aber jetzt bekomme ich mal plausible Werte.
rechnen_oh6.jpg
Leider habe ich bisher nirgends eine vernünftige Referenzdoku gefunden, um auf solche Umstände selbst zu kommen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

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

Re: Smartmeter Berechnung liefert falsches Ergebnis

Beitrag von udo1toni »

Das mit UoM ist auch etwas knifflig, da sind schon Profis drüber gestolpert :) Es gibt verschiedene Dokumente, letztlich findet man eigentlich fast alles in der Doku auf openhab.org, vielleicht mit Ausnahme der Feinheiten der Rules DSL, da bietet sich XTend als Quelle an (darauf beruht die Rules DSL)
openHAB4.3.3 stable in einem Debian-Container (bookworm) (Proxmox 8.3.5, LXC), mit openHABian eingerichtet

Antworten