Wer einen digitalen Stromzähler, Wasserzähler oder Gaszähler im Haus hat, kann damit nicht nur den aktuellen Zählerstand ablesen, sodern auch den aktuellen Verbrauch, Tagesverbraucht oder auch die Kosten pro Tag errechnen. Ich zeige am Beispiel eines KNX Stromzählers wie ich die oben genannten Werte umgesetzt habe.
Stromzähler Item(s) anlegen
Ich habe einen KNX Stromzähler verbaut, der mit den Zählerstand in Wh anzeigt. Um also die kWh zu erhalten, muss der Wert durch 1000 geteilt werden. Hierzu später mehr. Zuerst wird das KNX Item angelegt:
1 |
Number Stromzaehler "Stromzähler [%f Wh]" (Strom) {knx="<13.001:6/2/1"} |
Jetzt sollte kurz überlegt werden, was wir alles darstellen möchten. In meinem Fall:
- Zählerstand in kWh
- aktueller Verbrauch
- Verbrauch heute
- Stromkosten heute
Für diese Werte müssen nun Dummy Items angelegt werden.
1 2 3 4 |
Number Stromzaehler_kWh "Zählerstand [%.2f kWh]" (Strom) Number Stromzaehler_Verbrauch_Aktuell "Verbrauch aktuell [%.0f W]" (Strom) Number Stromzaehler_Verbrauch_Tag "Verbrauch heute [%.2f kWh]" (Strom) Number Strom_Kosten_Tag "Kosten heute [%.2f €]" (Strom) |
Nun müssen noch einige Werte in der Datenbank gespeichert werden, um später ein Delta ermitteln zu können. Ich nutzer eine rrd4j Datenbank. (Wie diese installiert wird, kannst du hier nachlesen. ) Dazu schreibst du Folgendes in die rrd4j.persist Datei:
1 2 3 |
Stromzaehler_kWh : strategy = everyMinute, restoreOnStartup Stromzaehler_Verbrauch_Aktuell : strategy = everyMinute, restoreOnStartup Stromzaehler_Speicher_Tag : strategy = everyMinute, restoreOnStartup |
Ab jetzt läuft alles über Regeln. Dafür habe ich zugunsten der Übersichtlichkeit eine stromzaehler.rules Datei angelegt.
Regeln für Stromzähler anlegen
Zuerst rechne ich den Zählerstand von Wh in kWh um. Wenn deine Ausgabe bereits in der richtigen Ausgabe erfolgt, kannst du diesen Schritt überspringen.
1 2 3 4 5 6 7 8 |
rule "Stromzaehler kWh" when Item Stromzaehler received update then Stromzaehler_kWh. postUpdate(Stromzaehler.state as DecimalType / 1000) end |
Unser Item Stromzaehler_kWh wird in der Datenbank gespeichert. Das ist wichtig um den aktuellen Verbrauch und den Tagesverbrauch zu errechnen.
Um den aktuellen Verbrauch zu errechnen trickse ich ein wenig. Ich nehme den Verbauch der letzten 6 Minuten und multipliziere den Wert mit 10 um den entsprechenden Verbrauch einer Stunde zu erhalten. Daraus kann ich den aktuellen Verbrauch (ungefähr) ablesen. (Ich bin kein Elektriker 😉 Sollte ich an dieser Stelle Fachbegriffe falsch verwenden oder andere Fehler begangen haben, freue ich mich sehr über eine kleine Lerneinheit)
Beispiel:
- in 6 Minuten wird eine Differenz von 0,1 kWh gemessen
- auf eine Stunde gerechnet (x10) = 0,6 kWh
- Mein Haus verbraucht also pro Stunde 0,6 kWh -> Entspricht einer Leistungsaufnahme von 0,6 kW oder 600 Watt
Da sich die Leistungsaufnahme in Watt schöner darstellen lässt, multipliziere ich das Ergebnis wieder mit 1000 um Watt zu erhalten.
1 2 3 4 5 6 7 8 |
rule "Stromzähler Verbrauch Aktuell" when Item Stromzaehler_kWh received update then Stromzaehler_Verbrauch_Aktuell. postUpdate(Stromzaehler_kWh.deltaSince(now.minusMinutes(6))*10*1000) end |
Damit hätten wir den Wert für den aktuellen Verbrauch, den wir später in der Sitemap verwenden können. Als nächstes errechnen wir den Stromverbrauch heute. Das funktioniert ganz ähnlich.
1 2 3 4 5 6 7 8 |
rule "Stromzaehler Verbrauch Tag" when Item Stromzaehler_kWh received update then Stromzaehler_Verbrauch_Tag. postUpdate(Stromzaehler_kWh.deltaSince(now.withTimeAtStartOfDay)) end |
Anstelle von 6 Minuten beträgt unser Delta immer die Zeit zwischen Tagesbeginn und jetzt. Hierfür wird der Ausdruck now.withTimeAtStartOfDay verwendet. Und schon spuckt das Item Stromzaehler_Verbrauch_Tag immer den Verbrauch von Tagesbeginn bis jetzt aus. Um Mitternacht wird dieser Wert wieder „zurückgesetzt“ (bzw. das Delta zwischen Tagesbeginn und jetzt beträgt im Prinzip 0 und daher gibt es auch noch keinen Verbrauch) und beginnt von vorne.
Jetzt wollen wir noch wissen wie viel Geld ich heute ausgebe. Dazu wird einfach der Verbrauch heute mit den persönlichen Stromkosten pro kWh multipliziert.
1 2 3 4 5 6 7 8 |
rule "Stromkosten heute" when Item Stromzaehler_kWh received update then Strom_Kosten_Tag. postUpdate(Stromzaehler_Verbrauch_Tag.state as DecimalType * 0.3) end |
Ich habe pauschal 30 Cent angegeben. Das entspricht zwar nicht ganz der Wahrheit, aber sicher ist sicher 😉
Darstellung in der Sitemap
Jetzt haben wir alle Werte, die wir gerne darstellen möchten. In der Sitemap musst du nur noch Folgendes einfügen:
1 2 3 |
Text item=Stromzaehler_Verbrauch_Aktuell icon="energy" Text item=Stromzaehler_Verbrauch_Tag icon="qualityofservice" Text item=Strom_Kosten_Tag icon="piggybank" |
Das Ergebnis kann sich sehen lassen.
Natürlich kann man hier noch viele weitere Werte hinzufügen. Verbrauch (oder Kosten) Woche, Monat, Jahr. Die Ergebnisse lassen sich auch in Charts darstellen. Wie das genau funktioniert habe ich in diesem Artikel am Beispiel von Temperaturwerten beschrieben.
Hi,
ich werde mit dem Beispiel mal versuchen meine PV-Produktion mit ein fliessen zu lassen… ich suche dafür nach eine Möglichkeit evt. den auszugebenden Wert in der Sitemap entweder in grün oder in rot dar zu stellen.. je nachdem ob Strom eingespeißt oder bezogen wird.. evt. noch mit einem jeweils anderen Icon davor… hat dazu jemand eine idee?
Hi, welchen Stromzähler würdet Ihr denn für dieses Beispiel empfehlen. Ich bin gerade auf der Suche nach Hardware für genau diesen Anwendungsfall.
Danke
Thomas
Hallo Thomas,
hast du bei dir KNX verbaut? Dann kann ich dir die Zähler von Lingg&Janke empfehlen https://lingg-janke.de/knx-smart-metering-produkte/elektro-energiezaehler/. Einen solchen 3 Phasen Zähler habe ich im Einsatz. Falls du eine PV Anlage betreibst und dort auf die Smart-Meter Daten zugreifen kannst, eignet sich das ebenfalls wunderbar.
Hallo, wie kann man eine Rule schreiben die den gesamten Stromverbrauch für ein Jahr zb. 01-01 bis 31-12 misst und dann wieder löscht so wie die Rule oben für den Tagesverbrauch.
Rule „Stromzaehler Verbrauch Tag“
when
Item Stromzaehler_kWh received update
then
Stromzaehler_Verbrauch_Tag.postUpdate(Stromzaehler_kWh.deltaSince(now.withTimeAtStartOfDay))
end
Meine Items
Number Stromzaehler_kWh „Zählerstand“
Number StromVerbrauchJahr „Jahresverbrauch“
bitte um Hilfe
Hallo, kann man eine Rule schreiben die den Stromverbrauch von einem gewissen Zeitraum misst zb. 15.01.2021 – 14.01.2022 und dann wieder zurücksetzt und den Wert vor dem löschen in ein Item speichert. Ich denke da an den Jahresverbrauch.
Zb. Items
Number Jahresverbrauch_aktuell
Number Jahresverbrauch_Vorperiode
Hallo,
gut beschrieben. Ich habe versucht auf dem Weg den Gesamtwert meine Wetterstation für Regen und Sonnenscheindauer als täglichen Wert auslesen zu können. Das sieht bei mir wie folgt aus:
rule „Sonne pro Tag“
when
Item Wetter_Sonnenscheindauer received update
then
Wetter_Sonnenscheindauer_1.
postUpdate(Wetter_Sonnenscheindauer.deltaSince(now.withTimeAtStartOfDay))
end
Der Wetter_Sonnenscheindauer_1 wird in die rrd4j Datei geschrieben.
Folgende Fehlermeldungen bekomme ich
In Visula Studio bekomme ich folgende Meldung
„{
„resource“: „/etc/openhab2/rules/sonnendauer-reset.rules“,
„owner“: „_generated_diagnostic_collection_name_#0“,
„code“: „org.eclipse.xtext.xbase.validation.IssueCodes.ambiguous_feature_call“,
„severity“: 8,
„message“: „Ambiguous feature call.\nThe extension methods\n\tpostUpdate(Item, State) in BusEvent and\n\tpostUpdate(Item, Number) in BusEvent\nboth match.“,
„startLineNumber“: 15,
„startColumn“: 1,
„endLineNumber“: 15,
„endColumn“: 11″
}
Und in der Log Datei sieht das wie folgt aus:
2020-05-01 18:23:06.307 [ERROR] [ntime.internal.engine.RuleEngineImpl] – Rule ‚Sonne pro Tag‘: The argument ’state‘ must not be null.
Hast du eine idee war das Problem sein könnte?
Hallo Florian,
kannst du mir die Rules und Item Datei mal zukommen lassen? Gerne anonymisiert, falls sensible Daten enthalten sind. Dann teste ich das einmal bei mir.
Viele Grüße
Patrick
Hallo danke für deine Anleitung,
Eine Frage hab ich natürlich. Kann ich zB den errechneten Stromverbrauch auch weitergeben an ein Display? Per Mqtt?
Die Anzeige in OH hab ich. Die Graphen in Grafana ebenfalls.
Wollte nur ein kleines Display an der Kellertür anbringen, um den Wert auch dort ablesen zu können.
Hast du da eine Idee? LG Auke
Hallo Auke,
freut mich, dass dich die Anleitung weitergebracht hat. Ich habe tatsächlich bereits eine Anleitung geschrieben, wie du Daten per MQTT an ein externes Display sendest. Schau dir mal diesen Artikel an: https://zukunftathome.de/led-matrix-selbst-programmieren-und-mit-openhab-verknuepfen/
Hier habe ich beispielhaft Feuchtigkeit und eine Uhrzeit übergeben. Das Prinzip ist aber immer das gleiche. Ich hoffe das hilft dir weiter 🙂
Viele Grüße
Patrick