Einbindung vom SolaX Wechselrichter

Auflistung von gewünschten Features, Ausschreibung zur Umsetzung
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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.
openWB series2 standard+
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag von Peete »

Ich brauche bitte Hilfe.

In dem solax.py im Modul bezug_solax steht:

Code: Alles auswählen

resp=client.read_input_registers(0, 114)
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):
openWB series2 standard+
derNeueDet
Beiträge: 4229
Registriert: Mi Nov 11, 2020 7:16 pm

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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
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 250 (07/2023)
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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.

Code: Alles auswählen

resp=client.read_input_registers(0, 130)
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
openWB series2 standard+
okaegi
Beiträge: 2221
Registriert: Fr Mär 08, 2019 1:57 pm

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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
Dateianhänge
Screenshot_20211208-183639_Adobe Acrobat.jpg
Entwickler- openWB (ehrenamtlich) / Feedback zu Funktionen immer erwünscht..
Smarthomeprobleme siehe hier (update :!: ): viewtopic.php?f=14&t=5923
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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! :ugeek:

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!
openWB series2 standard+
okaegi
Beiträge: 2221
Registriert: Fr Mär 08, 2019 1:57 pm

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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
Entwickler- openWB (ehrenamtlich) / Feedback zu Funktionen immer erwünscht..
Smarthomeprobleme siehe hier (update :!: ): viewtopic.php?f=14&t=5923
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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
:idea:

Mega Oliver. Es klappt bisher alles:
Bild

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()
openWB series2 standard+
okaegi
Beiträge: 2221
Registriert: Fr Mär 08, 2019 1:57 pm

Re: Einbindung vom SolaX Wechselrichter

Beitrag von okaegi »

Kannsr du pr ?
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
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag 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ß
openWB series2 standard+
Antworten