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 »

okaegi hat geschrieben: Do Dez 09, 2021 4:58 pm
Peete hat geschrieben: Do Dez 09, 2021 4:42 pm Den Gesamtertrag der Anlage wollte ich drin lassen. Oder stört das in der Berechnung. Weil das kann openWB ja nicht wissen.
Das ist genau der Zähler den openWB braucht.
Gruss Oliver
Ahhhh :idea:

Und die Speicherabfrage zu entladen und geladen lasse ich weiter drin? Oder werden die auch berechnet?
openWB series2 standard+
HSC
Beiträge: 3941
Registriert: So Jan 10, 2021 8:49 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag von HSC »

Peete hat geschrieben: Do Dez 09, 2021 5:11 pm
okaegi hat geschrieben: Do Dez 09, 2021 4:58 pm
Peete hat geschrieben: Do Dez 09, 2021 4:42 pm Den Gesamtertrag der Anlage wollte ich drin lassen. Oder stört das in der Berechnung. Weil das kann openWB ja nicht wissen.
Das ist genau der Zähler den openWB braucht.
Gruss Oliver
Ahhhh :idea:

Und die Speicherabfrage zu entladen und geladen lasse ich weiter drin? Oder werden die auch berechnet?
Meinst Du damit jeweils die kWh oder die aktuellen Lade-/ EntladeWatt?
VG
okaegi
Beiträge: 2228
Registriert: Fr Mär 08, 2019 1:57 pm

Re: Einbindung vom SolaX Wechselrichter

Beitrag von okaegi »

Du brauchst bei pv
Den Gesantzähler in Kwh
Beim Speicher brauchst du den
Gesamtzähler Lade / Entlade in Kwh
Für Evu auch den Gesamtzähler Einspeisung und Bezug auch in Kwh.
Wenn du das nicht hast, kannst du im loadvars.sh jeweils die usesim... auf 1 setzten. Dann werden diese Zähler gerechnet und über mqtt persistiert.
Die Berechnun merkt sich die aktuelle Leistung zwischen zwei Regelintervallen, und nimmt dann pro Sekunde einen geschätzten Leistungswert an und rechnet dann aus Watt somit Watt pro Stunde.
Gruss Oliver

usesimbezug=0
if [[ $wattbezugmodul == "bezug_e3dc" ]] || [[ $wattbezugmodul == "bezug_huawei" ]] || [[ $wattbezugmodul == "bezug_solarwatt" ]]|| [[ $wattbezugmodul == "bezug_rct" ]]|| [[ $wattbezugmodul == "bezug_sungrow" ]] || [[ $wattbezugmodul == "bezug_varta" ]] || [[ $wattbezugmodul == "bezug_lgessv1" ]] || [[ $wattbezugmodul == "bezug_kostalpiko" ]] || [[ $wattbezugmodul == "bezug_kostalplenticoreem300haus" ]] || [[ $wattbezugmodul == "bezug_sbs25" ]] || [[ $wattbezugmodul == "bezug_solarlog" ]] || [[ $wattbezugmodul == "bezug_sonneneco" ]] || [[ $fronius_sm_bezug_meterlocation == "1" ]]; then
usesimbezug=1
fi
if [[ $usesimbezug == "1" ]]; then
ra='^-?[0-9]+$'
watt2=$(</var/www/html/openWB/ramdisk/wattbezug)
Entwickler- openWB (ehrenamtlich) / Feedback zu Funktionen immer erwünscht..
Smarthomeprobleme siehe hier (update :!: ): viewtopic.php?f=14&t=5923
HSC
Beiträge: 3941
Registriert: So Jan 10, 2021 8:49 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag von HSC »

@Oliver,
wo kommen dann die aktuellen Lade- und EntladeWatt vom Speicher her?
Beim Speicher brauchst du den
Gesamtzähler Lade / Entlade in Kwh
VG
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag von Peete »

okaegi hat geschrieben: Do Dez 09, 2021 5:26 pm Du brauchst bei pv
Den Gesantzähler in Kwh
Beim Speicher brauchst du den
Gesamtzähler Lade / Entlade in Kwh
Für Evu auch den Gesamtzähler Einspeisung und Bezug auch in Kwh.
Wenn du das nicht hast, kannst du im loadvars.sh jeweils die usesim... auf 1 setzten. Dann werden diese Zähler gerechnet und über mqtt persistiert.
Die Berechnun merkt sich die aktuelle Leistung zwischen zwei Regelintervallen, und nimmt dann pro Sekunde einen geschätzten Leistungswert an und rechnet dann aus Watt somit Watt pro Stunde.
Gruss Oliver
Du brauchst bei PV:
Den Gesamtzähler in kWh -> habe ich: Gesamtertrag [kWh] 18.420,700

Beim Speicher brauchst du den
Gesamtzähler Lade / Entlade in Kwh -> habe ich nur die Tageswerte über Modbus: geladen [kWh] 0,400 / entladen [kWh] 1,200
openWB series2 standard+
okaegi
Beiträge: 2228
Registriert: Fr Mär 08, 2019 1:57 pm

Re: Einbindung vom SolaX Wechselrichter

Beitrag von okaegi »

Die aktuelle Lade / Entaldeleustung in Watt brauchst du natürlich aus dem Speicher driver sonst kann er nichts rechnen.
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: Do Dez 09, 2021 5:37 pm Die aktuelle Lade / Entaldeleustung in Watt brauchst du natürlich aus dem Speicher driver sonst kann er nichts rechnen.
Gruss Oliver
Habe ich.
Ich ziehe hier Register
0x0016 = 22 = speicherleistung
0x001C = 28 = speichersoc
0x0020 = 32 = speicherekwh -> demnach falsch
0x0023 = 35 = speicherikwh -> auch falsch, da ich hier Tageswerte eintrage
modbus.PNG
Ich brauche 0x001D für speicherekwh und 0x0021

Probiere ich glech mal!
openWB series2 standard+
Peete
Beiträge: 76
Registriert: Mi Feb 24, 2021 9:40 am

Re: Einbindung vom SolaX Wechselrichter

Beitrag von Peete »

8-)
Speicher.PNG
Speicher.PNG (7.6 KiB) 2136 mal betrachtet
So müsste er es jetzt richtig berechnen.
openWB series2 standard+
okaegi
Beiträge: 2228
Registriert: Fr Mär 08, 2019 1:57 pm

Re: Einbindung vom SolaX Wechselrichter

Beitrag von okaegi »

Genau, diese Werte werden alle 5 Minuten in csv Dateien gespeichert und dienen dann in cron5min als Basis für die Tagesberechnung.
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 »

Dann brauchen wir auch nicht zwingend 2 Module (Solax und Solax3p), da die jetzigen von mir gewählten Register für alle Solax WR mit Modbus passen.

Hier mal die aktuellen Module:
bezug_solax/solax.py

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()

# Das funktioniert nur bei X3 WR von Solax. Würde ich auskommentieren oder löschen, dann geht das Modulen bei allen
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()
speicher_solax/solax.py

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

def unsigned16(result, addr):
    return result.registers[addr]

def signed16(result, addr):
    val = result.registers[addr]
    if val > 32767:
       val -= 65535
    return val

ipaddress = str(sys.argv[1])

client = ModbusTcpClient(ipaddress, port=502)

resp=client.read_input_registers(0, 114)

# Batterie Power
value1 = signed16(resp, 22)
f = open('/var/www/html/openWB/ramdisk/speicherleistung', 'w')
f.write(str(value1))
f.close()

# Batterieladezustand
value2 = unsigned16(resp, 28 )
f = open('/var/www/html/openWB/ramdisk/speichersoc', 'w')
f.write(str(value2))
f.close()

# Batterie entladen
value3 = unsigned16(resp, 29 ) * 100
f = open('/var/www/html/openWB/ramdisk/speicherekwh', 'w')
f.write(str(value3))
f.close()

# Batterie geladen
value4 = unsigned16(resp, 33 ) * 100
f = open('/var/www/html/openWB/ramdisk/speicherikwh', 'w')
f.write(str(value4))
f.close()

wr_solax/solax.py

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

ipaddress = str(sys.argv[1])

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 =  addr
    if val > 32767:
        val -= 65535
    return val

client = ModbusTcpClient(ipaddress, port=502)

resp=client.read_input_registers(10, 2)
pv1 = unsigned16(resp, 0)
pv2 = unsigned16(resp, 1)
f = open('/var/www/html/openWB/ramdisk/pvwatt', 'w')
f.write(str( (pv1 + pv2) * -1   ) )  # Erzeugung negativ  
f.close()

resp=client.read_input_registers(80, 4)

# Gesamtertrag [kWh]
pvall = unsigned32(resp, 2) * 100      # yield overall
f = open('/var/www/html/openWB/ramdisk/pvkwh', 'w')
f.write(str(pvall))
f.close()

client.close()
openWB series2 standard+
Antworten