Seite 1 von 2

FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Do 23. Mai 2019, 09:10
von Ulrich
Diese Geräte ist baugleich mit dem MPI 3 Phasen Wechselrichter von MPPSolar

Es hat einen USB Anschluss. Es wird nur ein einfaches USB Kabel benötigt (A + B Stecker) Die Schnittstelle ist eine Hidraw Schnittstelle.
Das standard Dashboard muss eventuell etwas angepasst werden.

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: So 12. Mär 2023, 20:05
von mabo66
Moin zusammen,
auch ich trage mich mit dem Gedanken, meinen FSP 10kW datentechnisch anzulesen. Hier lesen ich viel über die Anbindung über die USB Schnittstelle. ABER: Mein FSP ist über den seriellen Anschluß mit einer Duo-Modbus-Karte verbunden. Und es ist vorgegeben, dann man die Schnittstelle RS232 und USB nicht parallel benutzen darf. Wenn ich den FSP einstelle, ziehe ich den RS232 Stecker heraus, dann USB rein und danach wieder retour. Wie verbinde ich nun den Rapsberry dauerhaft mit meinem System? An meiner Modbuskarte ist noch ein Anschluß frei. Kann ich den nutzen? Ich häng mal ein Bild mit rein, wie mein System aufgebaut ist. Ein Kabel geht von der Modbuskarte zum PM-Emeter, der zweite ist frei (ist im Bild mit RJ45 Kabel dargestellt mit blau PL40 PIN4, blau/weiß PL40 PIN 3)
Freue mich über eine Info. Vielen Dank. Gruß Mabo

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Mo 13. Mär 2023, 09:47
von mabo66
Ulrich hat geschrieben:
Do 23. Mai 2019, 09:10
Diese Geräte ist baugleich mit dem MPI 3 Phasen Wechselrichter von MPPSolar

Es hat einen USB Anschluss. Es wird nur ein einfaches USB Kabel benötigt (A + B Stecker) Die Schnittstelle ist eine Hidraw Schnittstelle.
Das standard Dashboard muss eventuell etwas angepasst werden.
Moin Ulrich,
danke für deine Antwort. Folgendes Problem: Wenn ich den PC mit dem FSP über USB verbinde, geht dieser in eine Art "internen" Modus, so dass er nur noch den Akku läd, aber das Haus nicht mehr versorgt. Den USB Anschluß kann ich nicht parallel nutzen. Das hat mir die Montagefirma auch gesagt. Sobald Strom auf dem USB Anschluß ist wird das Haus nicht mehr versorgt. Deshalb die Frage, ob der freie Anschluß am Duo-Modbus genutzt werden kann, die Daten auszulesen.

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Mo 13. Mär 2023, 10:21
von Ulrich
Das kann ich leider nicht sagen, da ich so ein Gerät nicht besitze.
Per MODBUS kann das Gerät nicht ausgelesen werden. Das kann die Routine nicht.

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Di 30. Mai 2023, 15:17
von badgerhill
ja, man kann es auslesen. hier ein bsp. in python, das ein csv-file schreibt.

Code: Alles auswählen


#!/usr/bin/env python3
import minimalmodbus
import serial
import json
import time
from datetime import datetime
from dataclasses import dataclass
import csv


@dataclass
class Register:
    address: int
    size: int
    name: str
    unit: str
    desc: str
    orig_name: str =""
    factor: int = 1
    signed: bool = False

    

myList = [] 

myList.append(Register(234,1,"Solarspannung1","V","Solarspannung1","Solar input voltage 1",100))
myList.append(Register(235,1,"Solarspannung2","V","Solarspannung2","Solar input voltage 2",100))
myList.append(Register(696,1,"Solarstrom1","A","Solarstrom1","Solar input current 1",10))
myList.append(Register(698,1,"Solarstrom2","A","Solarstrom2","Solar input current 2",10))
myList.append(Register(188,1,"Batteriespannung","V","Batteriespannung","Battery voltage",1000))
myList.append(Register(226,1,"Batteriekapazitaet","%","Batteriekapazitaet","Battery capacity",1000))
myList.append(Register(230,2,"Batteriestrom","A","Batteriestrom","Battery current"))
myList.append(Register(798,1,"Netzspannung_R","V","Netzspannung_R","AC input voltage R",100))
myList.append(Register(799,1,"Netzspannung_S","V","Netzspannung_S","AC input voltage S",100))
myList.append(Register(800,1,"Netzspannung_T","V","Netzspannung_T","AC input voltage R",100))
myList.append(Register(801,1,"Netzfrequenz","Hz","Netzfrequenz","AC input frequency",10))
myList.append(Register(614,1,"Netzstrom_R","V","Netzstrom_R","AC input current R",100))
myList.append(Register(616,1,"Netzstrom_S","V","Netzstrom_S","AC input current S",100))
myList.append(Register(618,1,"Netzstrom_T","V","Netzstrom_T","AC input current T",100))
myList.append(Register(216,1,"AC_Ausgangsspannung_R","V","AC_Ausgangsspannung_R","AC output voltage R",100))
myList.append(Register(247,1,"AC_Ausgangsspannung_S","V","AC_Ausgangsspannung_S","AC output voltage S",100))
myList.append(Register(248,1,"AC_Ausgangsspannung_T","V","AC_Ausgangsspannung_T","AC output voltage T",100))
myList.append(Register(219,1,"AC_Ausgangsfrequenz","Hz","AC_Ausgangsfrequenz","AC output frequency",10))
myList.append(Register(220,1,"AC_Ausgangsstrom_R","V","AC_Ausgangsstrom_R","AC output current R",100))
myList.append(Register(239,1,"AC_Ausgangsstrom_S","V","AC_Ausgangsstrom_S","AC output current S",100))
myList.append(Register(240,1,"AC_Ausgangsstrom_T","V","AC_Ausgangsstrom_T","AC output current T",100))
myList.append(Register(892,1,"Temperatur","C","Temperatur","Inner temperature",1000))
myList.append(Register(204,1,"Batterie_Temperatur","C","Batterie_Temperatur","External battery temperature",1000))
myList.append(Register(228,2,"Solarleistung1","W","Solarleistung1", "Solar input power 1"))
myList.append(Register(232,2,"Solarleistung2","W","Solarleistung2","Solar input power 2"))
myList.append(Register(1196,2,"Batterieleistung","W","Batterieleistung","Battery power"))
myList.append(Register(211,2,"AC_Eingangsleistung_R","W","AC_Eingangsleistung_R","AC input active power R",1,True)) # note:
myList.append(Register(257,2,"AC_Eingangsleistung_S","W","AC_Eingangsleistung_S","AC input active power S",1,True)) #note:
myList.append(Register(258,2,"AC_Eingangsleistung_T","W","AC_Eingangsleistung_T","AC input active power T",1,True)) #note:
myList.append(Register(377,2,"AC_Eingangsleistung","W","AC_Eingangsleistung","AC input total active power",1,True)) #note:
myList.append(Register(217,2,"AC_Wirkleistung_R","W","AC_Wirkleistung_R","AC output active power R"))
myList.append(Register(241,2,"AC_Wirkleistung_S","W","AC_Wirkleistung_S","AC output active power S"))
myList.append(Register(243,2,"AC_Wirkleistung_T","W","AC_Wirkleistung_T","AC output active power T"))
myList.append(Register(245,2,"AC_Wirkleistung","W","AC_Wirkleistung","AC output active power T"))


myList.append(Register(781,2,"AC_Scheinleistung_R","VA","AC_Scheinleistung_R","AC output apperent power R"))
myList.append(Register(894,2,"AC_Scheinleistung_S","VA","AC_Scheinleistung_S","AC output apperent power S"))
myList.append(Register(1241,2,"AC_Scheinleistung_T","VA","AC_Scheinleistung_T","AC output apperent power T"))

#myList.append(Register(0,"AC_Scheinleistung","W","AC_Scheinleistung","AC output total apperent power")) # not available
myList.append(Register(864,1,"Ausgangslast","%","Ausgangslast","AC output power percentage"))
myList.append(Register(208,1,"Modus","","Arbeitsmodus","working mode",1000))
myList.append(Register(1457,1,"BatterieMaxLadestromSet","A","BatterieMaxLadestromSet","Battery maximum charge current",10))
myList.append(Register(1240,1,"BatterieMaxEntladestromSet","A","BatterieMaxEntladestromSet","Battery discharge max current in hybrid mode",10))
myList.append(Register(1460,1,"BatterieMaxLadestrom","A","BatterieMaxLadestrom","Battery maximum charge current",10))


def read_long(instrument,number,size):
    count = 0
    value=instrument.read_long(number,size)
    while (value > 4270000000 and count < 10):
       value=instrument.read_long(number,size)
       count = count + 1
       time.sleep(count*0.5)
    if (value > 4270000000):
       value=0
    return value


def read_long_signed(instrument,number,size,signed):
    count = 0
    value=instrument.read_long(number,size,signed)
    while (value > 4270000000 and count < 5):
       value=instrument.read_long(number,size)
       count = count + 1
       time.sleep(count*0.5)
    if (value > 4270000000):
       value=0
    return value


def read_data():
    instrument = minimalmodbus.Instrument('/dev/ttyUSB0',2,minimalmodbus.MODE_RTU,False,True)  # port name, slave address (in decimal)
    instrument.serial.baudrate = 19200         # Baud
    instrument.serial.bytesize = 8
    instrument.serial.parity   = serial.PARITY_ODD
    #instrument.serial.stopbits = serial.STOPBITS_ONE
    instrument.serial.timeout  = 0.5          # seconds

    instrument.mode = minimalmodbus.MODE_RTU
    instrument.address = 2
    instrument.debug = False
    instrument.clear_buffers_before_each_transaction = True

    def printData(reg):
        if (reg.size == 1):
           val=str(round(instrument.read_register(reg.address,3)*reg.factor,2))
           print (reg.name, reg.unit,val)
        if (reg.size == 2):
           #val=str(round(instrument.read_long(reg.address,3,reg.signed)*reg.factor,2))
           val=str(round(read_long_signed(instrument,reg.address,3,reg.signed)*reg.factor,2))
           print (reg.name, reg.unit,val)
        return val
      

    header=[]
    for element in myList: 
      header.append(element.name)

    row=[]
    for element in myList: 
      row.append(printData(element))

    header.append("AC_Ausgang_Status")
    header.append("Solar_Status1")
    header.append("Solar_Status2")
    header.append("Batteriestromrichtung")
    header.append("WR_Stromrichtung")
    header.append("Netzstromrichtung")
    
    value_903 = ("6"+instrument.read_string(903,6))[0:7]
    print(int(value_903))
    digits = [int(x) for x in str(value_903)]
    for x in range (1,7):
       row.append(digits[x])
    

    currentTimeString=datetime.now().strftime('%Y%m%d%H%M%S')
    ret=instrument.write_string(453,currentTimeString[0:8]) #day
    time.sleep(2)
    energy_today = read_long(instrument,411,3)/1000
    row.append(energy_today)
    header.append("WattstundenGesamtHeute")
    
    ret=instrument.write_string(457,currentTimeString[0:6]) #month
    time.sleep(2)
    energy_month = read_long(instrument,413,3)
    row.append(energy_month)
    header.append("WattstundenGesamtMonat")
    
    ret=instrument.write_string(460,currentTimeString[0:4]) #year
    time.sleep(2)
    energy_year = read_long(instrument,415,3)
    row.append(energy_year)
    header.append("WattstundenGesamtJahr")

    total_energy = read_long(instrument,407,3)
    row.append(total_energy)
    header.append("KiloWattstundenTotal")

    v1 = instrument.read_string(275,7,3);
    print("currentDateTime: ",v1)
    row.append(v1[8:10])
    row.append(v1[10:12])
    row.append(v1[12:14])
    header.append("Stunden")
    header.append("Minuten")
    header.append("Sekunden")
    print("stunden",v1[8:10])
    print("minuten",v1[10:12])
    print("sekunden",v1[12:14])

    
    ret=instrument.write_string(275,currentTimeString,7) # write current system time
    print("error ? ",ret)

    f = open('/home/pi/csv_file', 'w', )
    writer = csv.writer(f, delimiter=';')
    writer.writerow(header)
    writer.writerow(row)
    
    f.close()
    instrument.serial.close()


while True:
    try:
       read_data()
       break
    except Exception:
       print("Error")
print("ENDE")


Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Di 30. Mai 2023, 17:04
von Ulrich
badgerhill hat geschrieben:
Di 30. Mai 2023, 15:17
ja, man kann es auslesen. hier ein bsp. in python, das ein csv-file schreibt.

Code: Alles auswählen


#!/usr/bin/env python3
import minimalmodbus
import serial
import json
import time
from datetime import datetime
from dataclasses import dataclass
import csv


@dataclass
class Register:
    address: int
    size: int
    name: str
    unit: str
    desc: str
    orig_name: str =""
    factor: int = 1
    signed: bool = False

    

myList = [] 

myList.append(Register(234,1,"Solarspannung1","V","Solarspannung1","Solar input voltage 1",100))
myList.append(Register(235,1,"Solarspannung2","V","Solarspannung2","Solar input voltage 2",100))
myList.append(Register(696,1,"Solarstrom1","A","Solarstrom1","Solar input current 1",10))
myList.append(Register(698,1,"Solarstrom2","A","Solarstrom2","Solar input current 2",10))
myList.append(Register(188,1,"Batteriespannung","V","Batteriespannung","Battery voltage",1000))
myList.append(Register(226,1,"Batteriekapazitaet","%","Batteriekapazitaet","Battery capacity",1000))
myList.append(Register(230,2,"Batteriestrom","A","Batteriestrom","Battery current"))
myList.append(Register(798,1,"Netzspannung_R","V","Netzspannung_R","AC input voltage R",100))
myList.append(Register(799,1,"Netzspannung_S","V","Netzspannung_S","AC input voltage S",100))
myList.append(Register(800,1,"Netzspannung_T","V","Netzspannung_T","AC input voltage R",100))
myList.append(Register(801,1,"Netzfrequenz","Hz","Netzfrequenz","AC input frequency",10))
myList.append(Register(614,1,"Netzstrom_R","V","Netzstrom_R","AC input current R",100))
myList.append(Register(616,1,"Netzstrom_S","V","Netzstrom_S","AC input current S",100))
myList.append(Register(618,1,"Netzstrom_T","V","Netzstrom_T","AC input current T",100))
myList.append(Register(216,1,"AC_Ausgangsspannung_R","V","AC_Ausgangsspannung_R","AC output voltage R",100))
myList.append(Register(247,1,"AC_Ausgangsspannung_S","V","AC_Ausgangsspannung_S","AC output voltage S",100))
myList.append(Register(248,1,"AC_Ausgangsspannung_T","V","AC_Ausgangsspannung_T","AC output voltage T",100))
myList.append(Register(219,1,"AC_Ausgangsfrequenz","Hz","AC_Ausgangsfrequenz","AC output frequency",10))
myList.append(Register(220,1,"AC_Ausgangsstrom_R","V","AC_Ausgangsstrom_R","AC output current R",100))
myList.append(Register(239,1,"AC_Ausgangsstrom_S","V","AC_Ausgangsstrom_S","AC output current S",100))
myList.append(Register(240,1,"AC_Ausgangsstrom_T","V","AC_Ausgangsstrom_T","AC output current T",100))
myList.append(Register(892,1,"Temperatur","C","Temperatur","Inner temperature",1000))
myList.append(Register(204,1,"Batterie_Temperatur","C","Batterie_Temperatur","External battery temperature",1000))
myList.append(Register(228,2,"Solarleistung1","W","Solarleistung1", "Solar input power 1"))
myList.append(Register(232,2,"Solarleistung2","W","Solarleistung2","Solar input power 2"))
myList.append(Register(1196,2,"Batterieleistung","W","Batterieleistung","Battery power"))
myList.append(Register(211,2,"AC_Eingangsleistung_R","W","AC_Eingangsleistung_R","AC input active power R",1,True)) # note:
myList.append(Register(257,2,"AC_Eingangsleistung_S","W","AC_Eingangsleistung_S","AC input active power S",1,True)) #note:
myList.append(Register(258,2,"AC_Eingangsleistung_T","W","AC_Eingangsleistung_T","AC input active power T",1,True)) #note:
myList.append(Register(377,2,"AC_Eingangsleistung","W","AC_Eingangsleistung","AC input total active power",1,True)) #note:
myList.append(Register(217,2,"AC_Wirkleistung_R","W","AC_Wirkleistung_R","AC output active power R"))
myList.append(Register(241,2,"AC_Wirkleistung_S","W","AC_Wirkleistung_S","AC output active power S"))
myList.append(Register(243,2,"AC_Wirkleistung_T","W","AC_Wirkleistung_T","AC output active power T"))
myList.append(Register(245,2,"AC_Wirkleistung","W","AC_Wirkleistung","AC output active power T"))


myList.append(Register(781,2,"AC_Scheinleistung_R","VA","AC_Scheinleistung_R","AC output apperent power R"))
myList.append(Register(894,2,"AC_Scheinleistung_S","VA","AC_Scheinleistung_S","AC output apperent power S"))
myList.append(Register(1241,2,"AC_Scheinleistung_T","VA","AC_Scheinleistung_T","AC output apperent power T"))

#myList.append(Register(0,"AC_Scheinleistung","W","AC_Scheinleistung","AC output total apperent power")) # not available
myList.append(Register(864,1,"Ausgangslast","%","Ausgangslast","AC output power percentage"))
myList.append(Register(208,1,"Modus","","Arbeitsmodus","working mode",1000))
myList.append(Register(1457,1,"BatterieMaxLadestromSet","A","BatterieMaxLadestromSet","Battery maximum charge current",10))
myList.append(Register(1240,1,"BatterieMaxEntladestromSet","A","BatterieMaxEntladestromSet","Battery discharge max current in hybrid mode",10))
myList.append(Register(1460,1,"BatterieMaxLadestrom","A","BatterieMaxLadestrom","Battery maximum charge current",10))


def read_long(instrument,number,size):
    count = 0
    value=instrument.read_long(number,size)
    while (value > 4270000000 and count < 10):
       value=instrument.read_long(number,size)
       count = count + 1
       time.sleep(count*0.5)
    if (value > 4270000000):
       value=0
    return value


def read_long_signed(instrument,number,size,signed):
    count = 0
    value=instrument.read_long(number,size,signed)
    while (value > 4270000000 and count < 5):
       value=instrument.read_long(number,size)
       count = count + 1
       time.sleep(count*0.5)
    if (value > 4270000000):
       value=0
    return value


def read_data():
    instrument = minimalmodbus.Instrument('/dev/ttyUSB0',2,minimalmodbus.MODE_RTU,False,True)  # port name, slave address (in decimal)
    instrument.serial.baudrate = 19200         # Baud
    instrument.serial.bytesize = 8
    instrument.serial.parity   = serial.PARITY_ODD
    #instrument.serial.stopbits = serial.STOPBITS_ONE
    instrument.serial.timeout  = 0.5          # seconds

    instrument.mode = minimalmodbus.MODE_RTU
    instrument.address = 2
    instrument.debug = False
    instrument.clear_buffers_before_each_transaction = True

    def printData(reg):
        if (reg.size == 1):
           val=str(round(instrument.read_register(reg.address,3)*reg.factor,2))
           print (reg.name, reg.unit,val)
        if (reg.size == 2):
           #val=str(round(instrument.read_long(reg.address,3,reg.signed)*reg.factor,2))
           val=str(round(read_long_signed(instrument,reg.address,3,reg.signed)*reg.factor,2))
           print (reg.name, reg.unit,val)
        return val
      

    header=[]
    for element in myList: 
      header.append(element.name)

    row=[]
    for element in myList: 
      row.append(printData(element))

    header.append("AC_Ausgang_Status")
    header.append("Solar_Status1")
    header.append("Solar_Status2")
    header.append("Batteriestromrichtung")
    header.append("WR_Stromrichtung")
    header.append("Netzstromrichtung")
    
    value_903 = ("6"+instrument.read_string(903,6))[0:7]
    print(int(value_903))
    digits = [int(x) for x in str(value_903)]
    for x in range (1,7):
       row.append(digits[x])
    

    currentTimeString=datetime.now().strftime('%Y%m%d%H%M%S')
    ret=instrument.write_string(453,currentTimeString[0:8]) #day
    time.sleep(2)
    energy_today = read_long(instrument,411,3)/1000
    row.append(energy_today)
    header.append("WattstundenGesamtHeute")
    
    ret=instrument.write_string(457,currentTimeString[0:6]) #month
    time.sleep(2)
    energy_month = read_long(instrument,413,3)
    row.append(energy_month)
    header.append("WattstundenGesamtMonat")
    
    ret=instrument.write_string(460,currentTimeString[0:4]) #year
    time.sleep(2)
    energy_year = read_long(instrument,415,3)
    row.append(energy_year)
    header.append("WattstundenGesamtJahr")

    total_energy = read_long(instrument,407,3)
    row.append(total_energy)
    header.append("KiloWattstundenTotal")

    v1 = instrument.read_string(275,7,3);
    print("currentDateTime: ",v1)
    row.append(v1[8:10])
    row.append(v1[10:12])
    row.append(v1[12:14])
    header.append("Stunden")
    header.append("Minuten")
    header.append("Sekunden")
    print("stunden",v1[8:10])
    print("minuten",v1[10:12])
    print("sekunden",v1[12:14])

    
    ret=instrument.write_string(275,currentTimeString,7) # write current system time
    print("error ? ",ret)

    f = open('/home/pi/csv_file', 'w', )
    writer = csv.writer(f, delimiter=';')
    writer.writerow(header)
    writer.writerow(row)
    
    f.close()
    instrument.serial.close()


while True:
    try:
       read_data()
       break
    except Exception:
       print("Error")
print("ENDE")

Natürlich kan man das Geräte per MODBUS auslesen, aber meine Routine kann das nicht!

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Di 30. Mai 2023, 20:12
von mabo66
Moin badgerhill.
Das hört sich gut an. Ich stehe hier am Anfang des Datenauslesens und freue mich, dass es geht. Hast du dafür einen Win Rechner oder machst das anders? Freu mich von dir zu hören.

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Fr 2. Jun 2023, 11:28
von badgerhill
hallo mabo66,

nein es ist ein raspi mit solaranzeige, auf dem minimalmodbus instaliert ist.

Code: Alles auswählen

pip3 install -U minimalmodbus
und falls pip noch nicht drauf ist, kannst du es installieren mit:

Code: Alles auswählen

apt install python3-pip

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Mo 5. Jun 2023, 08:44
von mabo66
Moin Badgerhill, dank dir.
Ich besorge jetzt erst mal die Hardware und dann kommen ich bestimmt noch mal mit der einen oder anderen Frage auf dich zu :-)

Re: FSP 10kW Hybrid PowerManager und FSP 5,5kW Hybrid

Verfasst: Fr 16. Jun 2023, 14:43
von mabo66
Moin badgerhill,
hab jetzt einen pi4 mit 4Gb ergattert und möchte die Daten über modbus abrufen.
Die aktuelle 32Bit Version Solaranzeige ist installiert, läuft auch.
Über Putty komme ich auf die Eingabeoberfläche. Soweit gut.
Was muss ich jetzt machen?

Wenn ich die Befehle von dir (siehe oben) eingebe, dann kommt eine Fehlermeldung.
Kannst du mir helfen?