Stromverbrauch überwachen – mit FHEM kein Problem

Bei der Renovierungsplanung unseres Hauses war schnell klar dass hier einige Dinge automatisiert werden “müssen”. Dinge wie eine automatische Rolladensteuerung oder die Steuerung der Dachfenster bei Regen sind wohl selbstverständlich. Dazu kam nun aber die Frage ob es nicht auch möglich sei den Stromverbrauch überwachen zu können. Hintergrund ist hier im Kern der angeschaffte Whirlpool und die Frage wie viel Energie dieser wohl so verbraucht. Glücklicherweise war dies mit der eingesetzten FHEM ein Kinderspiel. Dieser Artikel soll die dafür eingesetzten Scripte sammeln.

technische Voraussetzungen

Damit das, was ich hier nun beschreibe, funktioniert, müssen einige technische Voraussetzungen erfüllt sein. Zum ersten benötigen wir eine lauffähige FHEM Installation. Bei mir läuft diese auf einem Raspberry PI*. Damit die FHEM nun mit den Homematic Komponenten kommunizieren kann setze ich selbst auf das HM-MOD-RPI-PCB HomeMatic Funkmodul* welches einfach auf den PI aufgesteckt wird (Konfigurationsanleitung siehe Wiki). Zu eigentlichen Steuerung und Überwachung der zu messenden Geräte setze ich auf eine schaltbare Steckdose mit Leistungsmessung von Homematic*.

Wie man nun eine FHEM installiert beschreibe ich hier nicht, dazu gibt es eine echt gute Anleitung im FHEM-Wiki. Sobald die Installation läuft, das HomeMatic Funkmodul eingerichtet und die Steckdose angelernt ist, kann es auch schon losgehen.

Stromverbrauch überwachen – Einrichtung der Channels

Die HomeMatic Funksteckdose verfügt insgesamt über 6 Channels welche alle unterschiedliche Informationen ausliefern. Der “channel_02” ist, für die von uns geplante Überwachtung des Stromverbrauches, der Channel der Wahl. Ich habe diesen in meinem Fall erstmal umbenannt und diesem einen für mich sprechenden Namen gegeben:

rename <DEVICE_ID>.channel_02 <Zielname>
-> rename <DEVICE_ID>.channel_02 strom.whirlpool.pwr

Als nächstes schauen wir uns einmal die Readings von unserem neuen Device an und sehen, dass alle gewünschten Parameter direkt ersichtlich sind:

FHEM Stromverbrauch überwachen - Readings

In meinem Fall liegt der aktuelle Stromverbrauch bei 5,19 Watt. Die Anzeige verändert sich, sobald das Gerät an der Steckdose seinen Verbrauch ändert. Schaltet sich nun als eine Pumpe oder die Heizung des Whirlpools ein, so schnellt der Stromverbrauch hoch und wir können erkennen was hier passiert.

Stromverbrauch protokollieren – Umleiten in Logfile

Damit wir den Verbrauch nun auswerten können benötigen wir ein Protokoll. Auch dies ist mit FHEM ein absolutes Kinderspiel, wir legen einfach ein neues Logfile an und lassen die gewünschten Werte dort rein protokollieren. Auch hier gibt die Commandref von Wiki wieder Hilfestellung. Der von mir genutzte Befehl hierzu lautete wie folgt:

define FileLog_Strom.Whirlpool.Verbrauch FileLog ./log/Strom.Whirlpool.Verbrauch-%Y-%m.log strom.whirlpool.pwr:eState:.*

Der Befehl erzeugt ein neues Logfile mit dem Namen ‘Strom.Whirlpool.Verbrauch-%Y-%m.log’ wobei das %Y durch das aktuelle Jahr und das %m durch das aktuelle Monat ersetzt wird. Sobald sich nun der Stromverbrauch an der Funksteckdose ändert wird ein Eintrag in die neu angelegte Logdatei geschrieben. Das Ergebnis sieht nun ungefähr so aus:

FHEM Stromverbrauch überwachen - Logfile

Verbrauchskosten in Übersicht darstellen

Das nun angelegte Protokoll ist schonmal eine schöne Sache doch so richtig bringt uns das natürlich nicht weiter. Ich selbst wollte gerne auf einen Blick sehen wie hoch mein Stromverbrauch heute und im aktuellen Monat bisher so war.

FHEM Stromverbrauch überwachen - Verbrauchswerte anzeigen

Der Aufbau dieser Anzeige war nicht ganz so trivial und benötigte neben 2 Dummys zur Anzeige auch noch einen AT-Trigger welche jede Minute in das Logfile schaut und den aktuellen Wert berechnet.

Legen wir uns zuerst einmal die benötigten Dummys und den leeren AT-Trigger an.

define WhirlpoolStromkostenTag dummy
define WhirlpoolStromkostenMonat dummy
define atWhirlpoolStromkosten at +*00:01:00 test

Nun ist noch nicht viel passiert. Wir haben 2 leere Dummys für die Stromkosten des Tages und des Monates und einen AT welcher jede Minute läuft und das Command “test” ausführt.

Das Command ist natürlich noch absoluter Quatsch und muss “leicht” angepasst werden. Wir öffnen selbiges, klicken auf “DEF” und tragen hier folgendes Command ein:

+*00:01:00 {
my $oldVerbrauchVortag = (ReadingsVal("WhirlpoolStromkostenTag","VerbrauchVortag",0)); 
my $neuerVerbrauch = (ReadingsVal("strom.whirlpool.pwr","energy",0)); 
my $a = ($neuerVerbrauch / 1000) - $oldVerbrauchVortag;
fhem("setreading WhirlpoolStromkostenTag Verbrauch $a");
fhem("setreading WhirlpoolStromkostenMonat Tagesverbrauch $a");
if(($hour==0) && ($min==0)){ 
  my $neuerVortagesverbrauch = $oldVerbrauchVortag + $a; 
  fhem("setreading WhirlpoolStromkostenTag VerbrauchVortag $neuerVortagesverbrauch ");
  fhem("setreading WhirlpoolStromkostenTag Verbrauch 0")
} 
if(($hour==0) && ($min==0) && ($mday==1)){
  fhem("setreading WhirlpoolStromkostenMonat Verbrauch 0")
}
}

Stromverbrauch überwachen – was tut das Script?

Im Grunde genommen ist das Script recht einfach. Der Dummy für den Tagesverbrauch bekommt ein zusätzliches Reading für den Verbrauch des Vortages sowie den aktuellen Verbrauch. Wir lesen zuerst den Vortagesverbrauch und anschliessend den aktuellen Verbrauch aus und berechnen nun den aktuellen Verbrauch welchen wir sowohl in das Tages als auch das Monatsreading setzen.

Ist es gerade 0 Uhr so setzen wir den Vortagesverbrauch auf 0, gleiches tun wir beim Monatsreading am Start eines neuen Monates.

Stromverbrauch in lesbarer Form anzeigen

Somit verfügen die einzelnen Dummys nun also über den aktuellen Stromverbrauch (je Einheit) in KW. Was nun noch fehlt ist die Anzeige und die “Übersetzung” in die realen Kosten. Dies kann über die Attribute der jeweiligen Dummys angepasst werden.

attr WhirlpoolStromkostenTag stateFormat {sprintf("%.2f kWh - %.2f €",ReadingsVal("WhirlpoolStromkostenTag", "Verbrauch",0), ReadingsVal("WhirlpoolStromkostenTag","Kosten",0))}
attr WhirlpoolStromkostenTag userReadings Kosten {ReadingsVal("WhirlpoolStromkostenTag","Verbrauch",0)*0.2507}

attr WhirlpoolStromkostenMonat stateFormat {sprintf("%.2f kWh - %.2f €",ReadingsVal("WhirlpoolStromkostenMonat", "Verbrauch",0), ReadingsVal("WhirlpoolStromkostenMonat","Kosten",0))}
attr WhirlpoolStromkostenMonat userReadings Verbrauch monotonic {ReadingsVal("WhirlpoolStromkostenMonat","Tagesverbrauch",0)},Kosten {ReadingsVal("WhirlpoolStromkostenMonat","Verbrauch",0)*0.2507}

Das Ergebnis ist in diesem Post bereits einmal vorweg genommen worden. Wir erhalten eine Anzeige des aktuellen Tagesverbrauches sowie des Verbrauches im aktuellen Monat. Hierbei gehen wir davon aus dass die KWh bei 0.2507 EUR liegt.

FHEM Stromverbrauch überwachen - Verbrauchswerte anzeigen

Natürlich ist es ohne weiteres Möglich diese Auswertung auch noch auf Monats- oder Jahresbasis durchzuführen oder die Verbräuche in einem Diagram anzuzeigen. Hier sind den eigenen Wünschen und Ideen fast keine Grenzen gesetzt.

Artikel teilen

This article was written by Thomas Schiffler

Alles was mit IT zu tun hat steht bei mir hoch im Kurs. Hierbei dreht sich vieles um Java, Python oder auch mal PHP. Unser Zuhause ist mit diversen Raspberry PIs ausgestattet mit welchen ich versuche unser Leben durch etwas Automatisierung ein wenig smarter zu gestalten. Hierbei möchte ich die Technik und die dahinter eingesetzten Tools / Frameworks verstehen und nicht einfach nur Anwenden. Ich selbst bezeichne mich als ITler aus Leidenschaft :) Seit 2020 ist das Thema Chatbot / Voicebot / Conversational.ai in meinen Focus gerückt. In diesem Bereich investiere ich gerade viel Zeit.

0 thoughts on “Stromverbrauch überwachen – mit FHEM kein Problem”

  1. Danke! Leicht zu verstehen und gut umzusetzen z.B. für den Ertrag meines Balkonkraftwerks. Vorhandene Statistikmodule produzieren mir zu viel Overhead und müssen doch umgerechnet und formatiert werden für eine vernünftige Übersicht.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert