Seite 15 von 35
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Di Dez 07, 2021 3:55 pm
von Peete
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.
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 3:49 pm
von Peete
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
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()
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):
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 5:05 pm
von derNeueDet
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
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 5:38 pm
von Peete
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.
Hallo Det. Danke für deine Antwort.
Ich habe von 114 auf 130 geändert.
Erhalte dann im Debug Log
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
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 5:39 pm
von okaegi
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
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 5:50 pm
von Peete
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
Hallo 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()
Warum (130, 6)? Ich hatte vorher 130, 4. Damit ging es nicht.
DANKE!
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 5:56 pm
von okaegi
Peete hat geschrieben: ↑Mi Dez 08, 2021 5:50 pm
Warum (130, 6)? Ich hatte vorher 130, 4. Damit ging es nicht.
DANKE!
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
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 6:21 pm
von Peete
okaegi hat geschrieben: ↑Mi Dez 08, 2021 5:56 pm
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
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()
Wenn ich das print (frequenz) entferne, laufen auch die Einträge von KlausFindus.
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()
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 6:27 pm
von okaegi
Kannsr du pr ?
Sonst sag mir welches modul und ich mach den Pr,
Gruss Oliver
Re: Einbindung vom SolaX Wechselrichter
Verfasst: Mi Dez 08, 2021 6:30 pm
von Peete
okaegi hat geschrieben: ↑Mi Dez 08, 2021 6:27 pm
Kannsr du pr ?
Sonst sag mir welches modul und ich mach den Pr,
Gruss Oliver
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ß