Hoymiles Wechselrichter

Aktuelle Balkon-PV-Komplettanlagen enthalten häufig Mikrowechselrichter der Firma hoymiles. Es gibt aber offenbar auch bereits umgebrandete Modelle anderer Hersteller.

Eine Integration in Volkszähler ist sehr einfach und auf einem Raspberry Pi 4 erfolgreich getestet. Basis ist die dankenswerterweise verfügbare „ahoy“ Software https://github.com/lumapu/ahoy/tree/main/tools/rpi basierend auf der Python RF24 library https://github.com/nRF24/pyRF24.

Hardware

Es gibt offenbar inzwischen auch hoymiles Wechselrichter mit eingebauten WiFi, zumindestens aber die Modelle HM600 usw kommunizieren mit einer sogenannnten DTU. Diese kann von hoymiles gekauft werden und die Datenverarbeitung passiert in der hoymiles cloud - oder eben wir nutzen alternativ den Volkszähler.

Die DTU ist ein 2.4GHz Funkmodul mit einem proprietärem Top-Level-Protokoll, auf unterer Ebene aber standardisiert und damit ist der Wechselrichter über kleine Funkmodule des Typs NRF24L01+ ansprechbar (wichtig das Plus, es gibt offenbar auch ähnliche Varianten, die aber die benötigte Funkfrequenz nicht unterstützen). Beispiel: https://www.makershop.de/module/funk/nrf24l01 Dieses Funkmodul wird mit dem RPi verkabelt wie hier beschrieben: https://tutorials-raspberrypi.de/funkkommunikation-zwischen-raspberry-pis-und-arduinos-2-4-ghz

Entgegen den Hinweisen, die auf verschiedenen Seiten zu finden sind, funktioniert dies problemlos einfach so und

Software

Auf der „ahoy“ Seite sind verschiedene Methoden beschrieben, der erprobte und wahrscheinlich einfachste Weg ist aber der folgende:

[1] Installation pyRF24
[2] Installation ahoy
[3] Configuration Wechselrichter und Volkszähler middleware
[4] Einrichten als OS Service (läuft nicht im vzlogger)
Installation pyRF24

Einfach

pip3 install pyrf24

oder evtl nur pip anstelle pip3, je nach vorhandenem OS/Python.

Installation ahoy

Es werden ein paar Abhängigkeiten benötigt:

pip3 install crcmod pyyaml paho-mqtt SunTimes

Danach brauchen wir ein Installationsdirectory und clonen den benötigten Teil des Git repo hierhin:

mkdir ~/ahoy
cd ~/ahoy
git clone https://github.com/lumapu/ahoy/tree/main/tools/rpi

Danach:

sh install.sh

Das Script erfragt verschiedene Punkte:

Config

In tools/rpi befindet sich jetzt ein File namens ahoy.yml.example, welches kopiert wird:

cd tools/rpi
cp ahoy.yml.example ahoy.yml

und angepasst.

Zum einen muss unbedingt die Seriennummer des Wechselrichters (zu finden auf dessen Rückseite) an mehreren Stellen eingetragen werden. Zweitens benötigen wir die URL der Volkszähler middleware und schliesslich die zu sendenden Werte (die wie üblich mit VZ Channel-UUIDs verknüpft werden müssen). Für eine direkte Integration mit Volkszähler wird influxdb oder mqtt nicht benötigt. Die GPS Koordinaten des Standortes eintragen.

Das Ganze sieht dann z.B. so aus:

ahoy:
  interval: 15
  transmit_retries: 5
  logging:
    filename: 'hoymiles.log'
    # DEBUG, INFO, WARNING, ERROR, FATAL
    level: 'INFO'
    max_log_filesize: 1000000
    max_log_files: 5
  sunset:
    disabled: false
    latitude: 51.3255
    longitude: 12.3395
    altitude: 100
  # List of available NRF24 transceivers
  nrf:
    - ce_pin: 22
      cs_pin: 0
      txpower: 'low' # default txpower (min,low,high,max)
  volkszaehler:
    disabled: false
    inverters:
      - serial: 11410123456
        url: 'http://vz-server:8000/middleware.php'
        channels:
          - type: 'ac_power0'
            uid:  'c9671a60-1808-11ef-8039-4ba60d7468c1'
  dtu:
    serial: 99978563001
    name: my_DTU_name
  inverters:
    - name: 'Dach'
      serial: 11410123456
      txpower: 'low'                      # txpower per inverter (min,low,high,max)
      strings:                            # list all available strings
      - s_name: 'String 1 left'           # String 1 name
        s_maxpower: 395                   # String 1 max power in inverter
      - s_name: 'String 2 right'          # String 2 name
        s_maxpower: 400                   # String 2 max power in inverter
      - s_name: 'String 3 up'             # String 3 name
        s_maxpower: 405                   # String 3 max power in inverter
      - s_name: 'String 4 down'           # String 4 name
        s_maxpower: 410                   # String 4 max power in inverter

Danach war nur noch das Verlinken von ein paar libraries nötig, die beim Starten des Scripts nicht gefunden wurden:

cd tools/rpi
ln -s ~/.local/lib/python3.7/site-packages/pyrf24/libcpp_rf24.so .
ln -s ~/.local/lib/python3.7/site-packages/pyrf24/libcpp_rf24_network.so .
ln -s ~/.local/lib/python3.7/site-packages/pyrf24/libcpp_rf24_mesh.so .
Test

Starten des Scripts von Hand:

sudo python3 -um hoymiles --log-transactions --verbose --config ./ahoy.yml

Um das SPI Interface ansprechen zu können, werden root Rechte benötigt. Dieses Kommando sagt fast nichts und sollte sich aber auch nicht beenden. Statt dessen sollte im log file hoymiles.log in etwa sowas auftauchen:

more hoymiles.log
2024-05-25 19:30:00.1716658200 DEBUG: 2024-05-25 19:30:00.640391 Transmit 11 bytes channel 75: 15 84 22 03 10 78 56 30 01 82 3d
2024-05-25 19:30:00.1716658200 DEBUG: Received 27 bytes channel 3: 95 84 22 03 10 84 22 03 10 02 4f 1e 00 00 71 76 00 00 02 e4 08 d1 13 87 00 b4 de
2024-05-25 19:30:01.1716658201 DEBUG: Payload: 00 01 00 08 00 02 00 00 01 28 00 40 00 bc 00 00 4f 1e 00 00 71 76 00 00 02 e4 08 d1 13 87 00 b4 00 00 00 08 03 e8 01 29 00 03 df f4
2024-05-25 19:30:01.1716658201 DEBUG: http://vz-server:8000 "GET /middleware.php/data/c9671a60-1808-11ef-8039-4ba60d7468c1.json?operation=add&ts=1716658201217&value=18.0 HTTP/1.1" 200 26
Installieren als OS Service

Auch hierzu ist schon alles vorbereitet:

sudo systemctl enable `pwd`/ahoy_system.service

Vorher noch das dort enthaltene WorkingDirectory anpassen. Aus der Kommandozeile das „–verbose“ entfernen, um die Menge der Log-Daten zu reduzieren.