Hendrich.org

SMA Wechselrichter und Home Manager auslesen

Veröffentlicht: 19.12.2019

Seit Anfang 2020 bin ich in Besitz einer PV Anlage (7,36 kWp) mit zwei Sunnyboy-Wechselrichtern (SMA-SB 4.0-1AV-41). Das Einspeisemangagement wird mit dem Sunny Home Manager (SMA-SHM-2.0) realsiert. Alle Geräte sind über Ethernet mit dem Heimnetzwerk verbunden.

Leider musste ich feststellen, dasss beide Geräte keine einfach zu erlernenden API zur Verfügung stellen. Daher habe ich etwas im Internet recherchieren müssen.

Sunny Home Manager auslesen

Das Tool SMA-EM (findet man auf Github) ist geeignet, um die Werte des Home Managers auszulesen. Der Home Manager gibt Informationen über die eingespeiste und entnommene Energiemenge ins/aus dem Netz aus.

Die Installation erfolgte gemäß der Anleitung auf der Webseite:

apt install git
apt install python3 cl-py-configparser
mkdir /opt/smaemd/
mkdir /etc/smaemd/
cd /opt/smaemd/
git clone https://github.com/datenschuft/SMA-EM.git .
cp systemd-settings /etc/systemd/system/smaemd.service

Konfiguration erzeugen/anpassen indem man im Verzeichnis /etc/smaemd die Datei config mit folgendem Inhalt anlegt. Dabei ist xxxxx die Seriennummer des Sunny Home Managers, welche man in der Geräteübersicht des Sunny-Portals findet.

[SMA-EM]
# serials of sma-ems the daemon should take notice
# seperated by space
serials=xxxxx
# features could filter serials to, but wouldn't see serials if these serials was not defines in SMA-EM serials
# list of features to load/run
#features=simplefswriter sample pvdata mqtt remotedebug symcon influxdb
features=simplefswriter

[DAEMON]
pidfile=/run/smaemd.pid
# listen on an interface with the given ip
# use 0.0.0.0 for any interface
ipbind=0.0.0.0
# multicast ip and port of sma-datagrams
# defaults
mcastgrp=239.12.255.254
mcastport=9522
statusdir=

# each feature/plugin has its own section
# called FEATURE-[featurename]
# the feature section is required if a feature is listed in [SMA-EM]features

[FEATURE-simplefswriter]
# list serials simplefswriter notice
serials=xxxxx
# measurement vars simplefswriter should write to filesystem (only from smas with serial in serials)
values=pconsume pconsumecounter psupply psupplycounter sconsume sconsumecounter qsupply qsupplycounter ssupply ssupplycounter cosphi p1consume p1consumecounter p1supply p1supplycounter s1consume s1consumecounter q1supply q1supplycounter s1supply s1supplycounter cosphi1 v1 thd1 p2consume p2consumecounter p2supply p2supplycounter s2consume s2consumecounter q2supply q2supplycounter s2supply s2supplycounter cosphi2 v2 thd2 p3consume p3consumecounter p3supply p3supplycounter s3consume s3consumecounter q3supply q3supplycounter s3supply s3supplycounter cosphi3 v3 thd3 qconsume qconsumecounter q1consume q1consumecounter q2consume q2consumecounter q3consume q3consumecounter
statusdir=

Jetzt startet man den Deamon mit folgendem Befehl:

update systemd

systemctl daemon-reload
systemctl enable smaemd.service
systemctl start smaemd.service

Anschließend läuft der Daemon und man findet die letzten Daten im Verzeichnis /run/shm/ in verschiedenen Dateien. Dabei werden die Kürzel p, q, s verwendet (q ist die Blindleistung und s die Scheinleistung, siehe Wikipedia).

Mit folgendem Python-Code lese ich die Daten aus (xxxx ist die Seriennummer meines Home-Managers):

with open('/run/shm/em-xxxx-pconsumecounter','r') as f:
        pconsumecounter = f.read()
    with open('/run/shm/em-xxxx-psupplycounter','r') as f:
        psupplycounter = f.read()

Wechselrichter auslesen

Das Tool SBFspot (findet man auf Github) liest alle Werte der Wechselrichter aus und speichert diese auf Wunsch in einer Datenbank. Die Installation erfolgte gemäß der geführten Anleitung:

curl -s https://raw.githubusercontent.com/sbfspot/sbfspot-config/master/sbfspot-config | sudo bash

Da ich zwei Wechselrichter besitze habe ich zwei Konfigurationsdateien cfgSBFspot.cfg und cfgSBF2spot.cfg angelgt, weil ich ja zwei Wechselrichter habe.

(...)
IP_Address=xxx
Password=yyy
(...)

Dabei muss man die IP-Adresse herausfinden, indem man z.B. die Liste der angemeldeten Geräte im Kabel-/DSL-Router durchprobiert. Das Passwort für die Wechselrichter sollte man vom Installateur mitgeteilt bekommen haben.

Standardmäßig speichert SBFspot die Daten in einer Datenbank auf dem RaspberryPi. Ich habe jedoch kein Bedarf die Werte in eine Datenbank auf dem Raspberry zu speichern. Daher rufe ich die Daten wie folgt ab:

/usr/local/bin/sbfspot.3/SBFspot -v -nosql -nocsv -finq -cfgSBFspot2.cfg
/usr/local/bin/sbfspot.3/SBFspot -v -nosql -nocsv -finq -cfgSBFspot.cfg

Die Wechselrichter geben die erzeugte Energiemenge aus, welche ich mit folgender Python-Funktion auslese (die anderen Daten interessieren mich nicht):

sunnyboy1 = subprocess.Popen('/usr/local/bin/sbfspot.3/SBFspot -v -nosql -nocsv -finq -cfgSBFspot.cfg', shell=True, stdout=subprocess.PIPE).stdout.read()
sunnyboy2 = subprocess.Popen('/usr/local/bin/sbfspot.3/SBFspot -v -nosql -nocsv -finq -cfgSBFspot2.cfg', shell=True, stdout=subprocess.PIPE).stdout.read()

sunnyboy1_production = re.findall('.*ETotal:\s([0-9\.]*)kWh', sunnyboy1, re.MULTILINE)
sunnyboy2_production = re.findall('.*ETotal:\s([0-9\.]*)kWh', sunnyboy2, re.MULTILINE)