Zum Inhalt

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:

Überblick

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.

Tasmota auf eHZ

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

  1. Ecoflow hat einen MQTT service, der aber leider nur bei laufender Ecoflow-App Daten empfängt
  2. 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

Momentaner Verbrauch

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 

Jahres Forecast

Das Dashboard der verschiedenen Daten kann so aussehen. Ich habe mittlerweile verschieden Auswertungen vom Strom-Verbrauch: