Meine noch sehr frische Lösung für genau ebendiesen POW-HPM5.6KW, läuft einfach auf einem Pi Zero 2 W welcher per USB an dem WR angeschlossen wird.
Bei mir ist besagter Pi Zero2 für BMS und WR zuständig, die Daten werden per MQTT an Homeassistant durchgereicht. Alternativ funktioniert wohl Solaranzeige auch mit dem WR, dort muss der wohl baugleiche EASUN SMG II eingetragen werden. Wenn man mit dem Easun sucht, bekommt man auch ein ESP-basiertes System per RS485 Adapter, fand da direkt USB einfacher 
#!/usr/bin/env python3
import minimalmodbus
import time
import random
from paho.mqtt import client as mqtt_client
broker = 'MQTT SERVER'
port = 1883
prefix_topic = "homeassistant/inverter/"
username = 'MQTT USERNAME'
password = 'MQTT PASSWORT'
client_id = f'publish-{random.randint(0, 1000)}'
instrument = minimalmodbus.Instrument('/dev/ttyUSB0', 1, 'rtu') # port name, slave address (in decimal)
instrument.serial.baudrate = 9600
instrument.serial.bytesize = 8
instrument.serial.parity = 'N'
instrument.serial.stoppbits = 1
instrument.clear_buffers_before_each_transaction = True
instrument.serial.timeout = 0.2 # seconds
instrument.mode = minimalmodbus.MODE_RTU
pausetime=1
def connect_mqtt():
def on_connect(client, userdata, flags, rc):
if rc == 0:
print("Connected to MQTT Broker!")
else:
print("Failed to connect, return code %d\n", rc)
client = mqtt_client.Client(client_id)
client.username_pw_set(username, password)
client.on_connect = on_connect
client.connect(broker, port)
return client
def publish(client,topic,payload):
topic = prefix_topic + topic
result = client.publish(topic, payload)
# result: [0, 1]
status = result[0]
if status == 0:
print(f"Send `{payload}` to topic `{topic}`")
else:
print(f"Failed to send message to topic {topic}")
def run():
client = connect_mqtt()
client.loop_start()
while (1):
battery_voltage = instrument.read_register(0x101, 1,3)
print(battery_voltage)
publish(client,"battery_voltage",battery_voltage)
time.sleep(pausetime)
pv_power = instrument.read_register(0x109, 1,3)*10
print(pv_power)
publish(client,"pv_power",pv_power)
time.sleep(pausetime)
pv_voltage = instrument.read_register(0x107, 1,3)
print(pv_voltage)
publish(client,"pv_voltage",pv_voltage)
time.sleep(pausetime)
pv_current = instrument.read_register(0x108, 1,3)
print(pv_current)
publish(client,"pv_current",pv_current)
time.sleep(pausetime)
temp_dcdc = instrument.read_register(0x220, 1,3)
print(temp_dcdc)
publish(client,"temp_dcdc",temp_dcdc)
time.sleep(pausetime)
temp_dcac = instrument.read_register(0x221, 1,3)
print(temp_dcac)
publish(client,"temp_dcac",temp_dcac)
time.sleep(pausetime)
temp_trans = instrument.read_register(0x222, 1,3)
print(temp_trans)
publish(client,"temp_transformer",temp_trans)
time.sleep(pausetime)
loadva = instrument.read_register(0x21C, 1,3)
print(loadva)
publish(client,"load_va",loadva)
time.sleep(pausetime)
loadpower = instrument.read_register(0x21B, 1,3)*10
print(loadpower)
publish(client,"load_power",loadpower)
time.sleep(pausetime)
voltage_inverter = instrument.read_register(0x216, 1,3)
print(voltage_inverter)
publish(client,"voltage_inverter",voltage_inverter)
time.sleep(pausetime)
current_inverter = instrument.read_register(0x217, 1,3)
print(current_inverter)
publish(client,"current_inverter",current_inverter)
time.sleep(pausetime)
pv_charging_current = instrument.read_register(0x224, 1,3)
print(pv_charging_current)
publish(client,"pv_charging_current",pv_charging_current)
time.sleep(pausetime)
instrument.serial.close()
client.loop_stop()
if __name__ == '__main__':
run()