Monitor von Strom- und Solarpanelen
Installation
Vor längerer Zeit habe ich von meinem Stromanbieter einen digitalen Stromzähler von EMH eHZ montiert bekommen. Kurz danach hatte ich mit dem bitshake Tasmota ein Gerät gefunden, um diesen zu überwachen. D.h. es ging darum eingehende und ausgehenden Strom zu monitoren. Ausserdem konnte ich meinen aktuellen Stromverbrauch ablesen.
Hier ein grober Überblick über die Infrastruktur:
bitshake Tasmota
Der Stromversorger, nicht der Stromverkäufer, muss erst das auslesen des Stromzählers frei schalten. Ist der Stromzähler freigeschaltet, eignet sich ein Tasmota Aufsatz der mit Dioden die aktuellen Daten ausliest. Ist die Freischaltung des Stromversorgers geschehen kann man den Tasmota so konfigurieren, dass er die Daten, also Stromzähler, aus- und ein-gehenden Strom per MQTT an einen Mosquitto MQTT server schickt.
Als Gerät eignet sich vom Stromverbrauch her ein kleiner Server wie der Raspberry Pi. Der Server kann die Daten empfangen/weiterleiten oder speichern Ich nutze eine Raspberry Pi ab Model 3. Beim neusten Model Raspberry Pi 4 sind durch den Einsatz der M2 SSD die Daten sicherer abgespeichert. USB-Festplatten oder gar Mini-SD Karten sind da sehr unsicher.
Um die richtigen Daten auszulesen zu können, braucht der Tasmota ein Geräte-entsprechendes Skript in der Konsole.
Mein Skript sieht dort wie folgt aus:
>D
>B
=>sensor53 r
>M 1
+1,5,s,16,9600,eHZ,4
1,77070100010800ff@1000,Verbrauch,kWh,E_in,3
1,77070100020800ff@1000,Einspeisung,kWh,E_out,3
1,77070100100700ff@1,akt. Leistung,W,Power,0
#
Dieses Skript mapped Daten aus dem eHZ in eine MQTT Nachricht die von dem MQTT service Mosquitto empfangen werden kann. MQTT Services sind Server, in dem Nachrichten aus verschiedenen System gesendet werden kann um diese Nachrichten mit entsprechenden Listener abzuhören. Hierbei sind diese in Kanäle geordnet, um entsprechend pro Kanal diese Nachrichten abhören zu können.
MQTT Nachrichten verarbeiten
Des weiteren habe ich mir einen kleinen Docker Microservice gebaut, der die empfangenen Daten per MQTT Nachricht empfängt und sie dann in eine Datenbank abspeichert. Möglich Datenbanken sind hier Postgres oder MySQL kompatible Datenbanken. Die sind frei erhältlich und ohne Kosten.
Der Mosquitto Server, der MQTT-zu-Datenbank Service als auch die Datenbank können als Docker
oder Podman
container/pods laufen.
So habe ich die entsprechenden Daten in die Datenbank mit folgender Docker Konfiguration erstellt:
version: '3'
services:
mqtt5:
image: docker.io/library/eclipse-mosquitto
container_name: mosquitto-mqtt5
restart: unless-stopped
volumes:
- ./mqtt/config:/mosquitto/config:rw
- ./mqtt/data:/mosquitto/data:rw
- ./mqtt/log:/mosquitto/log:rw
- "/etc/localtime:/etc/localtime:ro"
mqtt2db:
image: thknie/mqtt2db:0.9.0.63
container_name: mqtt2db
restart: unless-stopped
environment:
- MQTT_STORE_URL=postgres://<Postgres host>:5422/home
- MQTT_STORE_TABLENAME=home
- MQTT_STORE_USER=postgres
- MQTT_STORE_PASS=${POSTGRES_PASSWORD}
- LOGPATH=/mqtt2db/log
- MQTT_TOPIC_URL=mqtt5:1883
- MQTT_TOPIC=tele/tasmota_9291A6/SENSOR
- MQTT_TOPIC_USERNAME=<user>
- MQTT_TOPIC_PASSWORD=<password>
volumes:
- "$PWD/mqtt2db/log:/mqtt2db/log"
- "/etc/localtime:/etc/localtime:ro"
Es werden im Mosquitto Server die Daten vom Tasmota empfangen, also muss der MQTT service im Tasmota als Ziel den Mosquitto Server eingetragen haben.
Der MQTT2DB
service registriert sich in einem Kanal auf dem Mosquitto Server und trägt die empfangenen Daten in eine Datenbank ein.
Man kann auch in die docker-compose
oder podman
pod Konfiguration so erweitern, sodas die Postgres Datenbank ebenfalls in dem docker-compose
-Verband integriert ist. Wenn z.B. die Daten auf auf dem selben Host gespeichert werden können.
Nun habe ich aktuelle Strom-Zähler Daten in der Datenbank gespeichert.
Verbrauch bewerten
Die Kurven des aktuellen Verbrauchs haben gezeigt, dass gerade Waschmaschine oder Geschirrspüler kurze Spitzen im Verbrauch haben. Die Solarzellen erzeugen aber gleichmässig Strom. Das Beste ist die erzeugte Energie für dein Grundbedarf des Hauses zu nutzen. Es ergab das Nachts unser minimal-Grundverbrauch 190 Watt ist. Die Kurve der Energie die in das Stromnetz eingespeist wird sollte so gering wie möglich sein. Das erreicht man in dem man den aktuellen Verbrauch auswertet und entsprechend die Daten zeitnah aktualisiert. Eine andere Möglichkeit ist, Überschuss in den Batteriespeicher zu speisen und in der Nacht die 190 Watt Grundbedarf wieder zu entladen. Leider ist meine 1024 Watt Batterie bei voller Sonne innerhalb von eineinhalb Stunden voll. Dabei habe ich nur Nachmittags Sonne auf meinen Solarzellen.
Szenario | Verbrauch |
---|---|
Grundverbrauch Sommer | ca. 140 Watt |
Grundverbrauch Winter | ca. 190 Watt |
Fernseher an | 350 Watt (pro Fernseher ca. 150-200 Watt) |
Arbeitsplatz in Nutzung mit drei Monitoren | 380 Watt (bei Bildschirmschoner wieder 200 Watt) |
Wichtig hierbei ist, dass durch die Datensammlung mit dem Tasmota in der Datenbank diese ausgewertet werden können. So habe ich am Anfang auch mal jedes der drei Stockwerke vom Strom genommen um die Verbraucher auszuwerten. Da ergab sich dass das ein oder andere Gerät nicht ins Gewicht fällt wenn es im Stand-by läuft. Andere jedoch überraschend viel Strom ziehen. So fanden wir z.B. in einer Lampe noch einige alte 60 Watt Birnen, die aufgrund der Lage sehr viel verbrauchten. Auch unsere Heizung zieht viel Strom. Anscheinend wird das Öl vorgeheizt um eine bessere CO2 Ausbeute zu haben. Überraschenderweise verbrauchen mein Raspberry Pi und NAS weniger Strom als gedacht. Jedes neue neue Geräte für die Küche, Geschirrspüler, Herd oder Kaffeemaschine verbrauchen viel. Der neue Kühlschrank verbraucht jedoch vergleichbar wenig.
Zu dem Grundverbrauch muss man sagen, dass alle möglichen Geräte Nachts in den Stand-by gefahren werden. So ist unser NAS von Abends 23 Uhr bis morgens 9 Uhr im Stand-by.
Solarzellen Daten
Mein aktueller Microinverter ist von der Marke Ecoflow
. Hierfür gibt es verschiedene Möglichkeiten Daten aus dem aktuellen Solarzellen, Batterie und auch Inverter auszuwerten.
Es gibt folgende Möglichkeiten
Ecoflow
hat einen MQTT service, der aber leider nur bei laufenderEcoflow
-App Daten empfängt- Durch einen HTTP Rest-API kann man aktuell Daten aller
Ecoflow
Devices auslesen. Ich kann also aktuellen Verbrauch, Solarzellen-Input und Batteriestand per HTTP auslesen. Zusätzlich kann ich einzelne Parameter mit der HTTP Rest-API setzen.
Auch hierfür haben ich eine Applikation erstellt. ecoflow2db
liest wahlweise aus dem MQTT und HTTP Daten heraus und speichert sie pro Device in entsprechende Datenbanktabellen in der Datenbank. Zusätzlich kann ich den benötigten Verbrauch des Haus mit dem Kommando hoch setzen.
Grafische Auswertung
Wie habe ich die Auswertung vorgenommen. Klar kann man mit entsprechenden SQL statements und AI viel schon von Hand auswerten. Doch die meisten interessanten Daten sieht man in einem Graph.
Hierfür eignet sich ein einfacher Grafana-Server. Auch diesen kann man mit docker-compose
laufen lassen. Ich lasse es aber im Podman
pod laufen. Eigentlich wollte ich alles im Podman
laufen lassen, jedoch ist die Konfiguration von Podman
um beim reboot des Host automatisch zu starten, sehr komplex. Deshalb bin ich bei wichtigen Tools oben wieder auf Docker
zurück konfiguriert.
version: '3.8'
services:
grafana:
image: grafana/grafana-enterprise
container_name: grafana
restart: unless-stopped
environment:
# increases the log level from info to debug
- GF_LOG_LEVEL=info
ports:
- '3001:3001'
volumes:
- 'grafana_storage:/var/lib/grafana'
- './grafana.ini:/etc/grafana/grafana.ini'
volumes:
grafana_storage:
driver_opts:
type: none
device: ${GRAFANA_DATA}
o: bind
SQL Auswertung
Die Tools, die ich gebaut habe, erstellen bei nicht vorhanden sein, automatisch die Tabelle in der Datenbank. Diese Tabelle kann für eine kleine Auswertung dann per SQL statement ausgewertet werden.
Hier ein simples Beispiel um Daten zu erhalten.
SELECT "inserted_on" AT TIME ZONE 'UTC' AT TIME ZONE 'GMT' AS "time",
powercurr AS "Stromnetz", powerout AS "Ins Stromnetz"
FROM home ORDER BY inserted_on desc
Wie ihr seht, kann es unter Umständen wichtig sein die Zeit zu anzupassen. Manchmal schreibt die Datenbank in UTC, manchmal in lokaler Zeit. Grafana liesst es dann in lokaler Zeit aus.
Für eine Auswertung direkt auf der Datenbank kann ein SQL Tool wie DBeaver genutzt werden.
Um dann einen ungefähren Forcast für das Jahr zu machen hier mal ein etwas komplexeres SQL Statement:
select (ce.total-mx.total)/(CURRENT_DATE- '2024-12-31')*365 from (SELECT total,inserted_on FROM home order by inserted_on DESC LIMIT 10000) ce, (select total as total from home where date_part('year',time) = date_part('year',now()) order by time limit 1) mx order by inserted_on
Oder hier mal ein Graph für das ganze Jahr per Monat der Forecast:
with t1 as (select
h.inserted_on,inserted_on::date as day,
row_number() over (partition by TO_CHAR(inserted_on::date, 'mm/yyyy')
order by h.inserted_on desc) as rn,
date_part('year', inserted_on) as oyear,
h.total as total,
TO_CHAR(NOW()::date, 'mm/yyyy')
from
home h),
t2 as (select
date_part('year', inserted_on) tyear,
row_number() over (partition by date_part('year', inserted_on)
order by h.inserted_on asc) as rx,
h.total as start
from
home h)
select t1.inserted_on ,t1.total - t2.start as "Verbrauch bis Monat",
greatest(0,(t1.total-t2.start)/(DATE_PART('doy',t1.inserted_on))* 365-(t1.total-t2.start)) as "Verbrauchsprognose"
from t2,t1 where rx=1 and rn=1 and t2.tyear = t1.oyear order by inserted_on
Das Dashboard der verschiedenen Daten kann so aussehen. Ich habe mittlerweile verschieden Auswertungen vom Strom-Verbrauch: