Deye Hybrid Angebote Deye Zubehör Produkte
Ich habe ein python3 Script programmiert, das meinen deye sun 5k sg03lp1 nachts abschaltet im Winter. Sonst habe ich 1,4kWh Verlustleistung über 24h. Die im Winter tagsüber häufig nicht wieder aufgeladen wird.
Früh wird ab einer Startspannung der Wechselrichter geweckt, daraufhin bricht die Spannung ein, da das MPPT-Tracking beginnt, deshalb warten wir dann WaitMorningLightStableForMPPTPwrCheck in Sekunden. Danach wird alle 2 Minuten Zukluszeit geschaut, ob die PV-Leistung unter 10Watt liegt (Sonnenuntergang, Abschaltung)
Der Load Anschluss bleibt durch geschaltet (on-grid). Im Sleep Mode zieht der Wechselrichter ca. 17...25W? aus dem Akku. Das BMS erkennt das in der Regel nicht, da der Strom zu klein ist und bleibt bei 100% SOC. Eingeschaltet wären es 62W aus dem Akku oder 90W aus dem Netz.
Das Skript läuft unter Linux/Raspi. Auf anderen Plattformen PathToUsbRS485Dongle anpassen, hab ich nicht getestet.
Es muss python3 und libmodbus installiert sein.
Mein Raspi ist über einen USB-zu-RS485(~10€) Adapter direkt über 2 Busdrähte zum BMS 485 Port (A/B Pins) des Wechselrichters verbunden.
Nutzung auf eigene Gefahr, es wird nur Register 43 geschrieben.
Läuft das auch bei euch?
#!/bin/phython3 #winter script to set the inverter sleeping from pymodbus.client.sync import ModbusSerialClient as ModbusClient from time import sleep, time #Setup parameters PathToUsbRS485Dongle='/dev/ttyUSB0' #time in seconds WaitMorningLightStableForMPPTPwrCheck=0.2*60*60 SleepTimeCycle=2*60 #2Min #deye modbus Device address (default 0)? devID = 0 IsLightVoltage=170 #switch on Voltage, must be under your max. stringVoltage ~60% sunsetWatt=10 #PVwatt shutdown if smaller def writeReg(devID, regNr, value): listValues = [value] #fct code 0x10 == 16 multi ->write registers (other write function code methode deye does'nt know) return client.write_registers(regNr, listValues, unit=devID) def readReg(devID, regNr): while True: read = client.read_holding_registers(address = regNr, count =1 ,unit=devID) if read.isError() == True: print("Err - try again") continue; else: val = read.registers[int(0)] #handle negativ int16 values if(val > 32767): val = val - 65536 return val def readRegFloat(devID, regNr): return round(float(readReg(devID, regNr))*0.1,1) client = ModbusClient(method='rtu', port=PathToUsbRS485Dongle, baudrate=9600, retries=30, bytesize=8, parity="N", stopbits=1, timeout=9) if ( client.connect() == False ): print("can't open rs485 bus") quit() #start? pvV = readRegFloat(devID, 109) if(pvV > IsLightVoltage): print(f" switch on pvVolt={pvV}") writeReg(devID, 43, 1) switchedOn=1 sleep(WaitMorningLightStableForMPPTPwrCheck) else: print(f" switch off pvVolt={pvV}") writeReg(devID, 43, 0) switchedOn=0 while True: pvVolt = readRegFloat(devID, 109) pvWatt = readRegFloat(devID, 186) * 10.0 gridV = readRegFloat(devID, 150) errNum = readReg(devID, 103) print( f"PvVolt={ pvVolt } pvWatt={pvWatt} gridV={gridV}" ) if((switchedOn==1) & (pvWatt < sunsetWatt)): print(" switch off") writeReg(devID, 43, 0) switchedOn = 0 sleep(WaitMorningLightStableForMPPTPwrCheck) else: if(switchedOn == 0) & (pvVolt > IsLightVoltage): print(" switch on and wait for stable mppt pwr") writeReg(devID, 43, 1) switchedOn = 1 sleep(WaitMorningLightStableForMPPTPwrCheck) else: print(f" idle FaultCode={errNum}") #=128 if off, =0 running sleep(SleepTimeCycle)