Einbindung vom SolaX Wechselrichter
Re: Einbindung vom SolaX Wechselrichter
Ich habe KlausFindus eine pn geschickt. Er hat damals das Solax Modul geschrieben. Ich stimme mich mit ihm ab.
Zu arauhut seinem Fall.
Der Solax x3 Hybrid G2 kann über die LAN Schnittstelle Modbus und gibt die Daten an die Solax Cloud. Der LAN Dongle ist obsolet.
Ab Solax Hybrid G4 wird kein Modbus über TCP mehr unterstützt.
Der X3-MIC hat ebenfalls kein Modbus über TCP. Auch nicht über den Dongle.
Der Solax Hybrid G4 und der X3-MIC haben eine RS485 Schnittstelle. Darüber lassen sich die Werte abholen. Man zwar auch einen LAN/WLAN Dongle über USB stecken, diese übertragen nur die Daten in die Cloud.
Zu arauhut seinem Fall.
Der Solax x3 Hybrid G2 kann über die LAN Schnittstelle Modbus und gibt die Daten an die Solax Cloud. Der LAN Dongle ist obsolet.
Ab Solax Hybrid G4 wird kein Modbus über TCP mehr unterstützt.
Der X3-MIC hat ebenfalls kein Modbus über TCP. Auch nicht über den Dongle.
Der Solax Hybrid G4 und der X3-MIC haben eine RS485 Schnittstelle. Darüber lassen sich die Werte abholen. Man zwar auch einen LAN/WLAN Dongle über USB stecken, diese übertragen nur die Daten in die Cloud.
openWB series2 standard+
Re: Einbindung vom SolaX Wechselrichter
Ich brauche bitte Hilfe.
In dem solax.py im Modul bezug_solax steht:
Das heißt er fängt bei 0 an und liest bis Register 114?
Wie kann ich jetzt input register bekommen, die größer sind als 114.
Ich bräuchte 130, 132 und 134.
Hier der komplette Code
Er schreibt dann die einzelnen Watt Werte pro Phase positiv in die ramdisk, aber ich erhalte Fehler im Debug Log:
IndexError: list index out of range
low = result.registers[addr]
File "/var/www/html/openWB/modules/bezug_solax/solax.py", line 13, in unsigned32
val = unsigned32(result, addr)
File "/var/www/html/openWB/modules/bezug_solax/solax.py", line 34, in signed32
valuew3 = signed32(resp, 4)
File "/var/www/html/openWB/modules/bezug_solax/solax.py", line 69, in <module>
Traceback (most recent call last):
In dem solax.py im Modul bezug_solax steht:
Code: Alles auswählen
resp=client.read_input_registers(0, 114)
Wie kann ich jetzt input register bekommen, die größer sind als 114.
Ich bräuchte 130, 132 und 134.
Hier der komplette Code
Code: Alles auswählen
#!/usr/bin/python
import sys
# import os
# import time
# import getopt
# import socket
# import struct
# import binascii
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.factory import ClientDecoder
def unsigned32(result, addr):
low = result.registers[addr]
high = result.registers[addr + 1]
val = low +( high << 16)
return val
def unsigned16 (result, addr):
return result.registers[addr]
def signed16(result, addr):
val = result.registers[addr]
if val > 32767:
val -= 65535
return val
def signed32(result, addr):
val = unsigned32(result, addr)
if val > 2147483647:
val -= 4294967295
return val
ipaddress = str(sys.argv[1])
client = ModbusTcpClient(ipaddress, port=502)
resp=client.read_input_registers(0, 114)
value = signed32(resp, 70)
# for SolaX negative means get power from grid
value = -value
f = open('/var/www/html/openWB/ramdisk/wattbezug', 'w')
f.write(str(value))
f.close()
#Ab hier gibt es Fehler
resp=client.read_input_registers(130, 4)
valuew1 = signed32(resp, 0)
f = open('/var/www/html/openWB/ramdisk/bezugw1', 'w')
f.write(str(valuew1))
f.close()
valuew2 = signed32(resp, 2)
f = open('/var/www/html/openWB/ramdisk/bezugw2', 'w')
f.write(str(valuew2))
f.close()
valuew3 = signed32(resp, 4)
f = open('/var/www/html/openWB/ramdisk/bezugw3', 'w')
f.write(str(valuew3))
f.close()
IndexError: list index out of range
low = result.registers[addr]
File "/var/www/html/openWB/modules/bezug_solax/solax.py", line 13, in unsigned32
val = unsigned32(result, addr)
File "/var/www/html/openWB/modules/bezug_solax/solax.py", line 34, in signed32
valuew3 = signed32(resp, 4)
File "/var/www/html/openWB/modules/bezug_solax/solax.py", line 69, in <module>
Traceback (most recent call last):
openWB series2 standard+
-
- Beiträge: 4447
- Registriert: Mi Nov 11, 2020 7:16 pm
- Has thanked: 4 times
- Been thanked: 27 times
Re: Einbindung vom SolaX Wechselrichter
Ich hätte jetzt gesagt, erweitere den 1. Read_input_registers von 114 auf 130 und pflücke dann die entsprechenden Positionen heraus.
Aber das weiß sicher jemand anderes besser, ich hab noch keine Modbus Module bearbeitet.
VG
Det
Aber das weiß sicher jemand anderes besser, ich hab noch keine Modbus Module bearbeitet.
VG
Det
10kWp PV mit SMA Tripower 10000TL-10 (PE11 mit SDM72V2); 2,4kWp mit Solis 2.5 G6 (EE11 mit SDM120). OpenWB Standard+. EVU EM540 an einem Raspi mit Venus OS. BEV Mercedes EQA 300 (06/2024)
Re: Einbindung vom SolaX Wechselrichter
Hallo Det. Danke für deine Antwort.derNeueDet hat geschrieben: ↑Mi Dez 08, 2021 5:05 pm Ich hätte jetzt gesagt, erweitere den 1. Read_input_registers von 114 auf 130 und pflücke dann die entsprechenden Positionen heraus.
Ich habe von 114 auf 130 geändert.
Code: Alles auswählen
resp=client.read_input_registers(0, 130)
IndexError: list index out of range
low = result.registers[addr]
Vielleicht ist ja die Abfrage limitiert und kann nur eine gewisse Anzahl an Registern abfragen.
VG
openWB series2 standard+
-
- Beiträge: 2382
- Registriert: Fr Mär 08, 2019 1:57 pm
- Has thanked: 1 time
- Been thanked: 9 times
Re: Einbindung vom SolaX Wechselrichter
result=client.read_input_registers(130, 6)
Für uint32
Addr = 0 -> 130
Addr = 2 -> 132
Addr = 4 -> 134
low = result.registers[addr]
high = result.registers[addr + 1]
Manchmal nach modbus implementierung +1 oder -1
Je nach implementierung können falsche zugriffe read hold statt read input oder falsche adressen / zulange Adressbereiche zum Absturz führen.
Gruss Oliver
Für uint32
Addr = 0 -> 130
Addr = 2 -> 132
Addr = 4 -> 134
low = result.registers[addr]
high = result.registers[addr + 1]
Manchmal nach modbus implementierung +1 oder -1
Je nach implementierung können falsche zugriffe read hold statt read input oder falsche adressen / zulange Adressbereiche zum Absturz führen.
Gruss Oliver
Entwickler- openWB (ehrenamtlich) / Feedback zu Funktionen immer erwünscht..
Smarthomeprobleme siehe hier (update ): viewtopic.php?f=14&t=5923
Smarthomeprobleme siehe hier (update ): viewtopic.php?f=14&t=5923
Re: Einbindung vom SolaX Wechselrichter
Hallo Oliver,okaegi hat geschrieben: ↑Mi Dez 08, 2021 5:39 pm result=client.read_input_registers(130, 6)
Für uint32
Addr = 0 -> 130
Addr = 2 -> 132
Addr = 4 -> 134
low = result.registers[addr]
high = result.registers[addr + 1]
Manchmal nach modbus implementierung +1 oder -1
Je nach implementierung können falsche zugriffe read hold statt read input oder falsche adressen / zulange Adressbereiche zum Absturz führen.
Gruss Oliver
da habe ich mit euch beiden ja die Crème de la Crème!
Mit dem Code sieht alles gut aus. Keine Fehler im Log.
Code: Alles auswählen
resp=client.read_input_registers(130, 6)
value2 = signed32(resp, 0)
value2 = -value2
f = open('/var/www/html/openWB/ramdisk/bezugw1', 'w')
f.write(str(value2))
f.close()
value3 = signed32(resp, 2)
value3 = -value3
f = open('/var/www/html/openWB/ramdisk/bezugw2', 'w')
f.write(str(value3))
f.close()
value4 = signed32(resp, 4)
value4 = -value4
f = open('/var/www/html/openWB/ramdisk/bezugw3', 'w')
f.write(str(value4))
f.close()
DANKE!
openWB series2 standard+
-
- Beiträge: 2382
- Registriert: Fr Mär 08, 2019 1:57 pm
- Has thanked: 1 time
- Been thanked: 9 times
Re: Einbindung vom SolaX Wechselrichter
Zweiter Parameter gibt die Länge an, wenn du 4 angibst liest er nur zwei register aus und dann knallt es beim zugriff auf 134 (da nur von 130 +4 gelesen wurde)
Gruss Oliver
Entwickler- openWB (ehrenamtlich) / Feedback zu Funktionen immer erwünscht..
Smarthomeprobleme siehe hier (update ): viewtopic.php?f=14&t=5923
Smarthomeprobleme siehe hier (update ): viewtopic.php?f=14&t=5923
Re: Einbindung vom SolaX Wechselrichter
Mega Oliver. Es klappt bisher alles:
Jetzt bringe ich die anderen Werte noch mit rein. Dann könnte man ein PR machen für Solax X3 Wechselrichter.
Ich habe vllt auch herausgefunden, warum die Abfrage früher nicht ging.
Code: Alles auswählen
frequenz = unsigned16(resp,7) / 100
print (frequenz)
f = open('/var/www/html/openWB/ramdisk/evuhz', 'w')
f.write(str(frequenz))
f.close()
Hier jetzt der komplette Code:
Code: Alles auswählen
#!/usr/bin/python
import sys
# import os
# import time
# import getopt
# import socket
# import struct
# import binascii
from pymodbus.client.sync import ModbusTcpClient
from pymodbus.factory import ClientDecoder
def unsigned32(result, addr):
low = result.registers[addr]
high = result.registers[addr + 1]
val = low +( high << 16)
return val
def unsigned16 (result, addr):
return result.registers[addr]
def signed16(result, addr):
val = result.registers[addr]
if val > 32767:
val -= 65535
return val
def signed32(result, addr):
val = unsigned32(result, addr)
if val > 2147483647:
val -= 4294967295
return val
ipaddress = str(sys.argv[1])
client = ModbusTcpClient(ipaddress, port=502)
resp=client.read_input_registers(0, 114)
value = signed32(resp, 70)
# for SolaX negative means get power from grid
value = -value
f = open('/var/www/html/openWB/ramdisk/wattbezug', 'w')
f.write(str(value))
f.close()
einspeisung = unsigned32(resp, 72) * 10
f = open('/var/www/html/openWB/ramdisk/einspeisungkwh', 'w')
f.write(str(einspeisung))
f.close()
consumed = unsigned32(resp, 74) * 10
f = open('/var/www/html/openWB/ramdisk/bezugkwh', 'w')
f.write(str(consumed))
f.close()
resp=client.read_input_registers(130, 6)
value2 = signed32(resp, 0)
value2 = -value2
f = open('/var/www/html/openWB/ramdisk/bezugw1', 'w')
f.write(str(value2))
f.close()
value3 = signed32(resp, 2)
value3 = -value3
f = open('/var/www/html/openWB/ramdisk/bezugw2', 'w')
f.write(str(value3))
f.close()
value4 = signed32(resp, 4)
value4 = -value4
f = open('/var/www/html/openWB/ramdisk/bezugw3', 'w')
f.write(str(value4))
f.close()
openWB series2 standard+
-
- Beiträge: 2382
- Registriert: Fr Mär 08, 2019 1:57 pm
- Has thanked: 1 time
- Been thanked: 9 times
Re: Einbindung vom SolaX Wechselrichter
Kannsr du pr ?
Sonst sag mir welches modul und ich mach den Pr,
Gruss Oliver
Sonst sag mir welches modul und ich mach den Pr,
Gruss Oliver
Entwickler- openWB (ehrenamtlich) / Feedback zu Funktionen immer erwünscht..
Smarthomeprobleme siehe hier (update ): viewtopic.php?f=14&t=5923
Smarthomeprobleme siehe hier (update ): viewtopic.php?f=14&t=5923
Re: Einbindung vom SolaX Wechselrichter
Nein, kann ich nicht.
Ich würde die restlichen Werte einsammeln und Dir den Code schicken?
Macht Sinn da ein neues Modul anzulegen, weil sich das alles auf den 3ph Solax Wechselrichter bezieht und das originale Modul auf einen 1ph. wr.
Danke und Gruß
openWB series2 standard+