Die Stromkosten explodieren, weshalb ich mir ein Shelly 3EM Smartmeter in den Zählerschrank eingebaut habe und in mein openHAB eingebunden habe um mal ein Monitoring zu haben was so geht.
Nun möchte ich mit den „Rohdaten“ die mir über das 3EM bereitgestellt werden mir verschiedene Analysedaten über „Rules“ ermittelt/berechnet“ bereitstellen lassen.
Herausgekommen ist dann das (Die Preise sind fiktiv): Ich habe den Ansatz gewählt mit dem „Total Zählerstand“ zu arbeiten um dann weiter mit ungebundenen Items meine Statistik zu erstellen.
Anmerkung: Der Stromverbrauch vom letzten Monat ist noch nicht vorhanden, weil ich darüber noch keine Daten habe. Die „Rules“ kann man aber nach Belieben für jeden Zeitraum skalieren. Projekt läuft seit 1. Juni.
Los geht’s. Die „live“ Verbräuche und Zählerstände stellt der 3EM eh schon bereit. Also Item mit Channel verlinken und fertig.
Damit die dargestellten Zahlen gut aussehen kann man noch ein Meta Data | State Description machen wenn die Einheiten nicht passen.
Für Stromverbrauch: %.3f kWh
Für Stromkosten: %.2f €
Vorher noch ein wichtiger Hinweis zum ECMA Scripting:
Die Item UID sollte vor dem abspeichern der Rule entweder leer sein zwischen den Hochkommas oder ein auch vorhandenes Item UID enthalten. Ich habe festgestellt, dass das JavaScript ( openhab-js) der Rule Übersichtsseite abstürzt oder sich in einer Schleife fängt und der Browser überlastet wird, sollte eine nicht vorhandene UID eingetragen sein. Sollte dies der Fall sein, müsst ihr die Rule löschen. Dabei ist Geduld gefragt, weil die WEB UI Seite Rules, auf Scroll und Klickbefehle nur mit ca. 30 Sekunden Verzögerung reagiert. War bei mir so Chrome,Firefox,Vivaldi. Um die Instanz braucht man sich keine Sorgen machen, die läuft normal weiter, ist wohl ein Frontendproblem. Am besten die UID´s die man benötigt in den Editor kopieren und von da aus in das Script einfügen, damit man nicht als die Seiten wechseln muss.
Stromverbrauch/Kosten „heute“, „gestern“ ab 0 Uhr: < zum testen kann man natürlich jede andere Zeit nehmen
1. Erstellen der Items mit Number Format.
2. Rule erstellen die um 0 Uhr jeden Tag eine Aktion durchführt (Cronjob) | für Monatsverbräuche entsprechend einmal im Monat eine weitere Rule 3. ECMA Code der „Then“ Aktion die dann immer um 0 Uhr einmal durchlaufen soll
Code: Alles auswählen
/*
Durchführung einer Werteübertragung in nichtgebundene Items um 0 Uhr jeden Tag
Wichtig die Reihenfolge, damit nicht der Zähler zurückgesetzt oder upgedated wird, bevor die alten Werte übertragen wurden*/
/* Step 1:
Übertragung des kwh Tagesverbrauchs auf Item Verbrauch Gestern
*/
events.postUpdate('Gesamtverbrauch_gestern',itemRegistry.getItem('Gesamtverbrauch_kWh_heute').getState ());
/* Step 2:
Übertragung der kwh Tageskosten auf Item Kosten Gestern
*/
events.postUpdate('Stromkosten_Gestern_0',itemRegistry.getItem('Stromkosten_heute_0').getState ());
/* Step 3:
Nimmt täglich um 0 Uhr den Status des Items "Gesamtverbrauch_Kw_h" und überträgt es in das Item "Zaehlerstand_total_um_0_uhr" */
events.postUpdate('Zaehlerstand_total_um_0_uhr',itemRegistry.getItem('Gesamtverbrauch_Kw_h').getState ());
Jetzt habe ich die tatsächlichen Verbräuche/Zählerstände festgehalten/übertragen. Nun kann ich meinen Stromtarif darüberlegen und bekomme die Kosten angezeigt.
4. Rule erstellen die die Stromkosten aus meinen Verbrauchsdaten errechnet:
5. ECMA Code der „Then“ Aktion die die Stromkosten für „heute“ live ausrechnet
Code: Alles auswählen
/* Stromtarif 1.6.22 - 31.5.23 bei XXX Strom AG
Grundgebühr Monat: XX,XX €
kWh Preis: XX,XX ct
*/
events.postUpdate('Stromkosten_heute_0', itemRegistry.getItem('Gesamtverbrauch_kWh_heute').getState () * 0.XXXX + 0.XX) ;
/* Die erste Zahl hinter dem * ist der kWh Preis (variable Kosten), die Zahl hinter dem + ist die Zählergrundgebühr auf einen Tag gebrochen (Fixkosten) */
Zum Schluss noch ein paar Erklärungen:
Ich habe mich bewusst gegen org.openhab.core.persistence.extensions.PersistenceExtensions , wie deltaSince() und MIDNIGHT() etc. entschieden, weil ich zum zum Stichtag meine Abrechnung haben möchte und nicht von jetzt now() um z.B. 30 zurückblicken möchte.
Ich habe mich gegen DSL Rules entschieden, weil ich den neuen ECMA Script Ansatz, auch in Verbindung mit Blocky einfach viel intuitiver finde. Aber muss jeder selbst wissen.
Ich würde Mich im Forum über mehr ECMA Rules Lösungen freuen.