FHEM Forum

FHEM => Sonstiges => Thema gestartet von: Dracolein am 06 April 2026, 18:13:42

Titel: ModbusAttr Device (Marstek Venus E) reduziert FHEM Performance
Beitrag von: Dracolein am 06 April 2026, 18:13:42
Hallo zusammen,

ich habe mich in den letzten Tagen in die Modbus Thematik reingenerdet. Mein Ziel war es, den neuen Marstek Venus E 3.0 für FHEM lesbar und steuerbar zu machen. Technisch habe ich es inzwischen störungsfrei am laufen. Während 3 Hilfs-Devices nur zur aktiven Steuerung dienen und hier ignoriert werden können, liegt mein Fokus auf dem Main-Device vom Typ ModbusAttr.

Der Grund für diesen Thread bzw. mein "Problem": Meine FHEM Instanz ist nun spürbar deutlich weniger performant, als ich es seit Jahren gewöhnt bin. Einfachste Steuerbefehle (Licht an) haben plötzlich Delays von 1-3 Sekunden, was ich so nicht hinnehmen möchte. Im Folgenden gebe ich das Device als Raw-Code hier mit und hoffe auf Eure Expertise speziell mit Fokus, ob ich irgendwelche Attribute doof / falsch / Suboptimal / whatever definiert habe und dadurch Performance leidet?

Was ich schon getan habe:
- Polling auf 30 Sekunden raufgesetzt
- Register rausgelöscht, die ich nicht unbedingt benötige
- polldelay für diverse Register definiert

Sonstiges:
- FHEM (auf Raspberry Pi) via LAN im Netzwerk
- Batteriespeicher via LAN im Netzwerk
- feste IP-Adressen
- Schnittstelle am Batteriespeicher: Modbus-TCP
- Geräte-Pings im niedrigsten ms-Bereich (also eig. top)

Ich frage mehrere Register gleichzeitig in einem Block ab, die nicht zusammenhängen und Abfragelücken haben. Kann das ein Problem sein?

defmod MarstekVenus01 ModbusAttr 1 30 192.168.178.112:502 TCP
attr MarstekVenus01 comment !!! ACHTUNG: STEUERUNG ÜBER DEVICE dummy_MarstekBefehl !!!\
ACPower        - AC-Leistung in Watt. Positiv = Bezug aus Netz, Negativ = Einspeisung ins Netz\
BattPower      - Batterieleistung in Watt. Positiv = Laden, Negativ = Entladen\
BattVoltage    - Batteriespannung in Volt\
SoC            - State of Charge, Ladestand in Prozent\
TempInternal   - Innentemperatur des Wechselrichters in Grad Celsius\
InverterState  - Aktueller Betriebszustand: Standby/Bereit/Laden/Entladen/USV/Update\
ControlMode    - Externe Steuerung freischalten: 21930=Ein, 21947=Aus. (Muss einmalig auf 21930 gesetzt werden bevor Steuerbefehle wirken)\
Betriebsmodus  - Grundlegende Strategie: Eigenverbrauch / KI-Optimierung / Manuell\
ForceMode      - Aktiver Ladebefehl im Manuell-Modus: Aus / Laden / Entladen\
SetChargePower    - Ladeleistung in Watt (0-2500W), wirkt wenn ForceMode=Laden\
SetDischargePower - Entladeleistung in Watt (0-2500W), wirkt wenn ForceMode=Entladen\
ChargeToSoC    - Ziel-Ladestand in Prozent, Laden/Entladen stoppt automatisch bei diesem Wert
attr MarstekVenus01 dev-h-combine 20
attr MarstekVenus01 dev-h-defPoll 1
attr MarstekVenus01 dev-timing-commDelay 1
attr MarstekVenus01 dev-timing-sendDelay 0.5
attr MarstekVenus01 dev-timing-timeout 4
attr MarstekVenus01 dev-type-i16-len 1
attr MarstekVenus01 dev-type-i16-unpack s>
attr MarstekVenus01 dev-type-u16-len 1
attr MarstekVenus01 dev-type-u16-unpack n
attr MarstekVenus01 group Marstek
attr MarstekVenus01 icon battery_100
attr MarstekVenus01 obj-h30001-format %.0f
attr MarstekVenus01 obj-h30001-reading BattPower
attr MarstekVenus01 obj-h30001-type i16
attr MarstekVenus01 obj-h30006-format %.0f
attr MarstekVenus01 obj-h30006-reading ACPower
attr MarstekVenus01 obj-h30006-type i16
attr MarstekVenus01 obj-h30100-expr $val * 0.01
attr MarstekVenus01 obj-h30100-format %.2f
attr MarstekVenus01 obj-h30100-reading BattVoltage
attr MarstekVenus01 obj-h30100-type u16
attr MarstekVenus01 obj-h35000-expr $val * 0.1
attr MarstekVenus01 obj-h35000-format %.1f
attr MarstekVenus01 obj-h35000-polldelay x10
attr MarstekVenus01 obj-h35000-reading TempInternal
attr MarstekVenus01 obj-h35000-type i16
attr MarstekVenus01 obj-h35100-map 0:Standby,1:Bereit,2:Laden,3:Entladen,4:USV,5:Update
attr MarstekVenus01 obj-h35100-reading InverterState
attr MarstekVenus01 obj-h35100-type u16
attr MarstekVenus01 obj-h37005-format %.0f
attr MarstekVenus01 obj-h37005-polldelay x10
attr MarstekVenus01 obj-h37005-reading SoC
attr MarstekVenus01 obj-h37005-type u16
attr MarstekVenus01 obj-h42000-poll 0
attr MarstekVenus01 obj-h42000-reading ControlMode
attr MarstekVenus01 obj-h42000-set 1
attr MarstekVenus01 obj-h42000-type u16
attr MarstekVenus01 obj-h42010-map 0:Aus,1:Laden,2:Entladen
attr MarstekVenus01 obj-h42010-poll 1
attr MarstekVenus01 obj-h42010-reading ForceMode
attr MarstekVenus01 obj-h42010-set 1
attr MarstekVenus01 obj-h42010-type u16
attr MarstekVenus01 obj-h42011-max 100
attr MarstekVenus01 obj-h42011-min 10
attr MarstekVenus01 obj-h42011-poll 1
attr MarstekVenus01 obj-h42011-reading ChargeToSoC
attr MarstekVenus01 obj-h42011-set 1
attr MarstekVenus01 obj-h42011-type u16
attr MarstekVenus01 obj-h42020-max 2500
attr MarstekVenus01 obj-h42020-min 0
attr MarstekVenus01 obj-h42020-poll 1
attr MarstekVenus01 obj-h42020-reading SetChargePower
attr MarstekVenus01 obj-h42020-set 1
attr MarstekVenus01 obj-h42020-type u16
attr MarstekVenus01 obj-h42021-max 2500
attr MarstekVenus01 obj-h42021-min 0
attr MarstekVenus01 obj-h42021-poll 1
attr MarstekVenus01 obj-h42021-reading SetDischargePower
attr MarstekVenus01 obj-h42021-set 1
attr MarstekVenus01 obj-h42021-type u16
attr MarstekVenus01 obj-h43000-map 0:Manuell,1:Eigenverbrauch,2:KI-Optimierung
attr MarstekVenus01 obj-h43000-poll 1
attr MarstekVenus01 obj-h43000-reading Betriebsmodus
attr MarstekVenus01 obj-h43000-set 1
attr MarstekVenus01 obj-h43000-type u16
attr MarstekVenus01 stateFormat {ReadingsVal($name,"SoC","?") . "% | " . ReadingsVal($name,"InverterState","?") . " | " . ReadingsVal($name,"BattPower","?") . "W"}
attr MarstekVenus01 userReadings ACPower_log {\
    my $last_age = ReadingsAge("MarstekVenus01", "ACPower_log", 9999);;;;\
    my $last_val = ReadingsNum("MarstekVenus01", "ACPower_log", 0);;;;\
    my $current  = ReadingsNum("MarstekVenus01", "ACPower", 0);;;;\
    return ($last_age >= 900 || abs($current - $last_val) >= 100) ? $current : undef;;;;\
},\
  SoC_log {\
    my $last = ReadingsAge("MarstekVenus01", "SoC_log", 9999);;;;\
    return $last >= 900 ? ReadingsNum("MarstekVenus01", "SoC", 0) : undef;;;;\
  }

setstate MarstekVenus01 100% | Bereit | 0W
setstate MarstekVenus01 2026-04-06 17:58:47 ACPower 0
setstate MarstekVenus01 2026-04-06 17:48:13 ACPower_log 0
setstate MarstekVenus01 2026-04-06 17:58:47 BattPower 0
setstate MarstekVenus01 2026-04-06 17:58:48 BattVoltage 53.52
setstate MarstekVenus01 2026-04-06 17:58:51 Betriebsmodus Eigenverbrauch
setstate MarstekVenus01 2026-04-05 20:48:12 ChargeToSoC 100
setstate MarstekVenus01 2026-04-05 20:43:52 ControlMode 21947
setstate MarstekVenus01 2026-04-05 20:43:50 ForceMode Aus
setstate MarstekVenus01 2026-04-06 17:58:49 InverterState Bereit
setstate MarstekVenus01 2026-04-05 20:19:47 SetChargePower 200
setstate MarstekVenus01 2026-04-05 19:34:35 SetDischargePower 300
setstate MarstekVenus01 2026-04-06 17:55:53 SoC 100
setstate MarstekVenus01 2026-04-06 17:45:42 SoC_log 100
setstate MarstekVenus01 2026-04-06 17:56:16 TempInternal 22.6
setstate MarstekVenus01 2026-04-06 12:14:22 state opened