Alternative Anbindung von Huawei WR
Verfasst: Do Jun 01, 2023 7:40 pm
Moin, moin,
da die Regelzeit mit Huawei WR aufgrund des langsamen Modbus-LAN-Adapters bekanntlich ein Grauß ist, habe ich nach einer anderen Lösung gesucht, die hier seit ein paar Monaten stabil läuft und ich daher gerne mit Euch teilen möchte.
Die Huawei WR spannen ein eigenes WLAN auf, ist ein Client in dieses eingeloggt, kann direkt per ModBus auf den WR zugegriffen werden.
Da das WLAN des WR eine sehr beschränkte Reichweite hat, habe ich als Gateway einen RPI3+ in direkter Umgebung positioniert.
Auf dem RPi sind WLAN und LAN parallel aktiv. Ein Script holt sich über das WLAN die Werte vom WR und pushed diese über LAN in meine openWB.
Das Skript ist für openWB 1.9, die MQTT-Topics müssen für 2.0 angepasst werden.
In meiner openWB steht PV und Batterie auf MQTT.
Da ich für den EVU ein anderes Smartmeter nutze, müsste hier ggf. das Skript um die entsprechenden MQTT-Topics erweitert werden.
Das Skript starte ich per system.d und erhalte so sekündlich die aktuellen Daten des WR in meiner openWB.
Weitere Informationen:
Viel Erfolg!
Grüße,
Jens
da die Regelzeit mit Huawei WR aufgrund des langsamen Modbus-LAN-Adapters bekanntlich ein Grauß ist, habe ich nach einer anderen Lösung gesucht, die hier seit ein paar Monaten stabil läuft und ich daher gerne mit Euch teilen möchte.
Die Huawei WR spannen ein eigenes WLAN auf, ist ein Client in dieses eingeloggt, kann direkt per ModBus auf den WR zugegriffen werden.
Da das WLAN des WR eine sehr beschränkte Reichweite hat, habe ich als Gateway einen RPI3+ in direkter Umgebung positioniert.
Auf dem RPi sind WLAN und LAN parallel aktiv. Ein Script holt sich über das WLAN die Werte vom WR und pushed diese über LAN in meine openWB.
Das Skript ist für openWB 1.9, die MQTT-Topics müssen für 2.0 angepasst werden.
Code: Alles auswählen
#!/usr/bin/python3
import time
import asyncio
import paho.mqtt.publish as publish
from huawei_solar import HuaweiSolarBridge, register_names as rn, register_values as rv
loop = asyncio.new_event_loop()
# openWB IP:
mqtthost = "192.168.xxx.xxx"
mqttclient = "PVImporter"
def publish2openWB(mqtttopic, message):
publish.single(mqtttopic, payload=message, qos=0, retain=False, hostname=mqtthost, client_id=mqttclient)
async def huaweiReadValues():
bridge = await HuaweiSolarBridge.create(host="192.168.200.1", port=6607)
# Register names
registers_evu = ['power_meter_active_power']
registers_wr = ['input_power', 'accumulated_yield_energy']
registers_bat = ['storage_state_of_capacity','storage_charge_discharge_power','storage_total_charge','storage_total_discharge']
registers = registers_evu + registers_wr + registers_bat
# Main Tasks:
while True:
if not bridge:
bridge = await HuaweiSolarBridge.create(host="192.168.200.1", port=6607)
for i in registers:
try:
result = await bridge.client.get(i)
if result[0] is not None:
mqtttopic = False
if str(i) == "input_power":
mqtttopic = "openWB/set/pv/1/W"
message = result[0]
elif str(i) == "storage_state_of_capacity":
mqtttopic = "openWB/set/houseBattery/%Soc"
message = result[0]
elif str(i) == "storage_charge_discharge_power":
mqtttopic = "openWB/set/houseBattery/W"
message = result[0]
elif str(i) == "accumulated_yield_energy":
mqtttopic = "openWB/set/pv/1/WhCounter"
message = result[0] * 1000
elif str(i) == "storage_total_charge":
mqtttopic = "openWB/set/houseBattery/WhImported"
message = result[0] * 1000
elif str(i) == "storage_total_discharge":
mqtttopic = "openWB/set/houseBattery/WhExported"
message = result[0] * 1000
if mqtttopic is not False:
try:
publish.single(mqtttopic, payload=message, qos=0, retain=False, hostname=mqtthost, client_id=mqttclient)
except:
pass
except:
await bridge.stop()
bridge = False
pass
time.sleep(1)
await bridge.stop()
loop.run_until_complete(huaweiReadValues())
Da ich für den EVU ein anderes Smartmeter nutze, müsste hier ggf. das Skript um die entsprechenden MQTT-Topics erweitert werden.
Das Skript starte ich per system.d und erhalte so sekündlich die aktuellen Daten des WR in meiner openWB.
Weitere Informationen:
Viel Erfolg!
Grüße,
Jens