Ich hatte zufällig beim internetsurfen gesehen, das es für Home Assistant ein ganz faszinierendes AddIn gibt: PowerCalc. Hiermit kann man den Stromverbrauch seines smarten Heimes in Echtzeit einsehen.
Sowas wollte ich auch haben :-) Ich habe mir sofort auf einen unbenutzten Raspi4 mir Home Assistant installiert. Das geht eigentlich ganz einfach, da der Raspi Pi Imager schon das Image mit anbietet. Ich werde hier nicht die Installation von Home Assistant beschreiben (hier aber mal ein guter Artikel dazu). Als ich Home Assistant am laufen hatte, habe ich mir erstmal den HACS-Store installiert. Hier bekommt man einen Haufen Community Erweiterungen, und unter anderem auch PowerCalc. Als ich PowerCalc installiert hatte, hat er schon einen Haufen Lampen von Hue gefunden. Obwohl die Lampen gar keine Strommessung unterstützen, können Sie trotzdem gemessen werden. Ich komme gleich dazu.
Grundsätzlich kann PowerCalc natürlich nicht zaubern, es muss jedes stromverbrauchende Gerät der Wohnung in der Wohnung in Home Assistant eingerichtet werden. Man kann die Geräte in folgende Gruppen einteilen:
Dummy Geräte:
Ich habe für jeden Raum ein "DummyGerät" angelegt z.B.: "AllwaysOn Wz Device". Dies habe ich über "Integration\Helfer" getan, indem ich hier einen Schalter angelegt habe. Diesen habe ich eingeschaltet. Diesen Dummy habe ich benutzt um Offline-Geräte einzurichten. Soweit ich das aber gesehen habe, kann man als Gerät auch einfach den Raum eingeben.
Typ I: Offline-Geräte, immer an:
Ein Beispiel wäre hier zum Beispiel mein Kühlschrank. Der hat noch keine smarten Funktionen, und läuft immer. Ich habe einfach in das Datenblatt geschaut, den Stromverbrauch im Jahr herrausgesucht, und die Zahl durch 365 für einen Tag dividiert. Nun noch durch 24 für die Stunde dividieren und schon hatte ich die Kilowattstunde. Ich habe in PowerCalc (Integrationen\PowerCalc "Eintrag hinzufügen") einen "Virtuellen Sensor" erstellt. Dieser verbraucht immer dann Strom wenn das entsprechende Gerät läuft. Im Falle unseres Dummy also immer. Die Berechnungsstrategie ist "fixed", Standby gibts nicht. Dies ist ein Powersensor der die aktuellen Watt misst. Ich habe den Energiesensor mit angehakt, welcher Kilowattstunden misst. Dazu noch den Utilitymeter, welcher dann auch Daten pro Tag, pro Jahr usw erzeugt. Bei Leistung habe ich nun die Watt eingetragen. Die restlichen Werte sind für ein so einfaches Gerät uninteressant. Nach dem erstellen, hat man nun eine Geräteverknüpfung mit dem Dummygerät, und passend dazu mit dem entsprechenden Raum. Für mehr ist das Gerät (glaub ich zumindest) nicht wichtig. Außerdem wurden ein Haufen Entitäten erstellt. Darunter der "Frigde PCalc power" und "Frigde PCalc energy", welche diee Grundberechnung des Verbrauches beinhalten.
Zusammengefasst:
- Virtueller Sensor
- Entität "Allways On Küche Device"
- Berechnungstyp fixed
- Energie und Utilitysensor erstellen
- Leistung 9 Watt
Typ II: Offline/Online-Geräte, feste Regeln:
Diese Gruppe von Geräten ist schon etwas spezieller. Ich habe zum Beispiel ein Hydro-System, welches 12 Stunden das Licht einschaltet, und dann wieder 12 Stunden dunkel ist, um Tag und Nacht für die Pflanzen zu simulieren. Außerdem läuft am Anfang jeder Stunde für 5 Minuten eine Umwälzspumpe, und das Gerät hat natürlich auch einen gewissen "Grundverbrauch". Ich habe das alles mit einem Energiemessgerät (so ein einfaches Stecksdosenteil welches den Verbrauch anzeigt) durchgemessen, und mir die Daten aufgeschrieben. Als allererstes habe ich einen Helfer (Integrationen\Helfer) "Hydro Timer" eingerichtet. Es ist ein Tageszeitsensor, welcher von 8:00 bis 20:00 einschalten soll.
Nun habe ich hierfür folgendes eingerichtet:
- Virtueller Sensor
- Entität "hydro Timer"
- Berechnungstyp Playbook
- Energie und Utilitysensor erstellen
- 2 Playbooks "lamp_on" und "lamp_off"
- Playbooks Wiederholen
- Autostart "lamp on"
- zwei State Trigger "off" und "on"
Hier wie ich es bei den Playbooks eingetragen habe:
lamp_off: hydro_lamp_off.csv
lamp_on: hydro_lamp_on.csv
und hier die beiden State Trigger:
"off": lamp_off
"on": lamp_on
Das bewirkt nun das der Tageszeitsensor nun alle 12 Stunden umschaltet, somit werden die Trigger des Playbooks bedient und die beiden entsprechenden Dateien ausgeführt. Die Dateien selber liegen unter "config>/powercalc/playbooks". Um diese zu erstellen benötigt ihr den "File Editor", oder den "Studio Code Server".
So sehen die beiden aus:
hydro_lamp_on.csv:
0,16
300,11
3200,16
hydro_lamp_off.csv:
0,5
300,1
3200,5
Die beiden CSVs sind so zu interpretieren:
lamp_on: Starte mit 16 Watt, nach 300 Sekunden (5min), wechsele zu 11 Watt, und nach 3200s (55 min) wechsele wieder zu 16 Watt. Danach startet das Playbook wieder neu.
lamp_off: Starte bei 5 Watt, nach 300s 1 Watt, nach 3200s wechsele wieder zu 5 Watt.
Typ III: Online immer an:
Hierzu fällt mir der InternetRouter ein: Er verbraucht immer denselben Strom, und man kann erkennen ob er vielleicht abgeschaltet wurde. Mein Router wird von Home Assistant unterstützt. Ich habe mir also einfach eine sinnvolle Entität gesucht und die als Sensor angebunden:
- Virtueller Sensor
- Entität "WAN"
- Berechnungstyp fixed
- Energie und Utilitysensor erstellen
- Leistung 9 Watt
alles weitere habe ich leer gelassen. Sollte der Router nicht mehr am Netzwerk sein, wird er mit 0 Watt kalkuliert, ansonsten immer mit 9 Watt.
Typ IV: Online mit verschiedenen Stati:
Ein schönes Beispiel hierfür ist mein Fernseher: Er wurde als "LG" und auch als "Google Cast" erkannt. Ich habe die enstprechende Entität über die "Etwicklungstools" herrausgesucht, indem ich den Fernseher bedient habe und geschaut habe was sich wie verändert. Dannn habe ich zur besseren unterscheidung die Entität in "LG TV Media (Main)" umbenannt.
Nun habe ich folgenden Sensor in Powercalc angelegt:
- Virtueller Sensor
- Entität "LG TV Media (Main)"
- Berechnungstyp fixed
- Energie und Utilitysensor erstellen
- Leistung je Zustand (andere Felder leer)
Bei "Leistung je Zustand" habe ich nun folgendes eingetragen:
idle: 36
"off": 2
"on": 54
paused: 48
playing: 60
puffering: 60
standby: 21
Je nach Zustand wird also nun ein anderer Verbrauch verwendet.
Typ V: Offline/Online unvorhersehbar
Die meisten Geräte in der Küche gehören zu diesem Typ: Ofen, Geschirrspüler, Waschmaschiene... Die Geräte sind meist nicht smart, oder übermitteln nicht den Stromverbrauch. Um hier an sinnvolle Daten zu kommen ist eine Investition notwendig: Ich habe mich für die Smarten Strommesser von TP-Link entschieden, da sie günstig sind und sich problemlos mit HomeAssistant verwenden lassen: TP-Link Tapo P110. Das 4rer-Pack kostet derzeit 30 Euro, man bekommt also eine Menge Smart-Devices für sein Geld. Natürlich kann man die Steckdose auch schalten und mit Google/Alex verknüpfen wenn man das möchte. Nach dem einrichten und den einbinden in HomeAssistant liefern diese Dinger beispielsweise eine Entität "Trockner Derzeitiger Verbrauch". Um den Verbrauch in PowerCalc zu integrieren braucht es nur noch ein Energiesensor:
- Energie des Quellsensors
- Entität "Trockner Derzeitiger Verbrauch"
- Gerät "Trockner"
- Energie und Utilitysensor erstellen
Nun haben wir einen passenden Energiesensor.
Typ VI: Smart mit Energiemessung
Diese Sensoren kann man kurz gesagt wie ein Typ V Gerät einbinden.
Typ VII: Smart mit komplexen Regelwerk
Bei mir betrifft das in allererster Linie das Philipps Hue System: Die Lampen wurden schon automatisch von PowerCalc gefunden und eingebunden. Powercalc verwendet dazu verschiedenste Formeln und Regelwerke, welche dann als "Plugin" in PowerCalc integriert sind. Erreichbar ist diese Art von Sensor als "Virtuelle Leistung (Bibliothek)". Man sucht das passende Gerät aus der Bibliothek und die Messung funktioniert sofort.
Typ VIII: Spezial
Am schwersten wird wahrscheinlich das Kochfeld werden, da es ja meist via Drehstromdose angebunden ist. Ich habe ein relativ modernes Kochfeld, welches Smart ist mir nach jedem Ausschalten den Energieverbrauch anzeigt (leider aber nicht via Entität mitteilt). Ich habe nun ein paar Messungen durchgeführt und herrausgefunden, das ich unter 10 min Kochen signifikant anders Strom verbrauche als über 10 Minuten. Ich habe also zwei Durchschnittswerte ermittelt und diese dann in einem Playbook eingetragen. Also ein Typ II.
Ein anderes Beispiel: Ich habe PCs und Monitore. Dazu habe ich den Monitor gemessen, und dann den PC via "Ping" Integration eingebunden um herrauszufinden ob er an ist (Der PC selber ist Typ V). Nun habe ich noch als Helfer einen Schalter erstellt (Monitor). Mittels Automation wird nun der Schalter "Monitor" ein/ausgeschalten je nach Ping. So konnte ich nun einen Typ III erstellen, wobei ich entsprechend Standby und Leistung ausgefüllt habe.
PowerCalc Gruppen
Um nun einen Gesamtwert zu ermitteln, und überhaupt diese Sensorik zu bündeln, nimmt man keine "normalen" Gruppen, sondern Powercalc Gruppen. Bei diesen hat man den Vorteil, das man auch UtilitySensoren erstellen kann, also schon komplett alle Daten da hat. Ich habe für jeden Raum eine Gruppe erstellt, und dann noch eine Gruppe für alles.
Zuerst hatte ich bei den Bereichen die Funktion "Bereich" verwendet, aber ich musste feststellen, das immer wieder Entitäten in der Berechnung gefehlt hatten, trotz richtigen Raum. ich habe nun Bei "Leistungs Entitäten" und bei "Energie Entitäten" alles eingetragen und das läuft und rechnet richtig (auch wenn es super aufwändig ist).
Dashboard
Alle Daten sind da, doch wie werden Sie angezeigt? Ich bin mir sicher das Ihr mit ein wenig Fantasie euch die Daten nach Lust und Laune anzeigen lassen könnt. Eine Sache war etwas schwieriger, und deshalb möchte ich es euch nicht vorenthalten: TopListen der Energiefresser. Ich habe dazu eine MarkUp-Kachel angelegt, da Sie jinja unterstützt. Das ist eine Templatesprache, welche doch recht leistungsfähig ist. Ich bin mir sicher Jinja ist euch schon im Zusammenhang mit HomeAssistant begegnet.
Zuallererst müsst Ihr dafür sorgen das alle Utilitysensoren so existieren wir Ihr das benötigt. Dazu geht ihr bei jedem Gerät auf "konfigurieren" und "UtilityMeter Options" und fügt die "Cycles" hinzu die Ihr benötigt.
Folgendes habe ich eingefügt um die Top der monatlichen Stromverbraucher zu ermitteln (für andere Zeiträume "cycles" eifach oben bei 'monthly' abändern):
{% set ns = namespace(sVal=[], trange='monthly') %}
{% for grp in ['sensor.grp_wohnzimmer_pcalc_energy', 'sensor.grp_bad_pcalc_energy', 'sensor.grp_flur_pcalc_energy', 'sensor.grp_kinderzimmer_pcalc_energy', 'sensor.grp_kuche_pcalc_energy', 'sensor.grp_schlafzimmer_pcalc_energy'] %}
{% for x in expand(grp) | selectattr('state') %}
{% for attr in x.attributes['entities'] %}
{% set currVal = states(attr + '_' + ns.trange) %}
{% set currId = state_attr(attr + '_' + ns.trange, 'friendly_name') %}
{% set ns.sVal = ns.sVal + [(currId, currVal|float(0))] %}
{% endfor %}
{% endfor %}
{% endfor %}
{% for k, v in (dict.from_keys(ns.sVal)|dictsort(false, 'value', reverse=true))[:15] -%}
{{ k }}: {{ v }}
{% endfor %}
Dieses Skript macht folgendes:
- erstelle zwei namespace-Variablen sVal-Verzeichnis für die Werte und trange für den Zeitraum
- Gehe in einer Schleife alle PowerCalc Gruppen für Bereiche durch
- hier wiederum, ermittle die Daten der jeweilige Gruppe
- Nun hole die einzelnen Geräte der Gruppe
- Gehe jedes einzelne gerät durch
- ermittele den jeweiligen energysensor mit der entsprechenden Range, und den Namen des entsprechenden Sensors
- wandele den Wert in eine zahl um (zur Sortierung) und speichere den Wert und den Namen
- In den letzten Drei Zeilen wird die Toplist aufgebaut: Sortiere das Verzeichnis und nimm die ersten 15 Werte
- schreibe das namen/Wertepaar in die Kachelansicht
Ihr bekommt dann eine Liste so ähnlich wie folgende angezeigt:
Fridge energy monthly: 3.2801
TV_power energy monthly: 1.9348
Router1 energy monthly: 1.6172
Ofen PCalc energy monthly: 1.4766
PC1 PCalc energy monthly: 1.4075
NB1 energy monthly: 1.2569
Router2 energy monthly: 1.0407
SmartDisplay energy monthly: 1.0395
Geschirrspüler energy monthly: 0.9964
Bad Wecker energy monthly: 0.8097
WZ Wecker energy monthly: 0.8074
Flooter energy monthly: 0.7713
Hydro energy monthly: 0.7238
Monitor1 energy monthly: 0.694
HA Raspi energy monthly: 0.693
Ich wünsche euch viel Spaß bei der Umsetzung!
cheers
VoSs2o0o