Zitat von: MadMax am 07 Dezember 2025, 14:19:20........habe ich folgende Readings hinzugefügt.
Code Auswählen ErweiternBAT_Lower_discharge_limit : Untere Grenze des Tiefentladeschutzbereichs vor Abschaltung
BAT_backup_power_area : Minimale Breite des Ersatzstrombereichs
BAT_deep_discharge_protection_area : Minimale Breite des Tiefentladeschutzbereichs
BAT_inv_BAT_conserving_battery_state_of_charge_area : Breite des Bereichs zur Erhaltung des Batterieladezustands
Diese werden immer mit dem Parametern abgefragt, hierzu ist aber der installer Zugang nötig und es muss das Attribut installerLogin auf 1 gesetzt werden.
Bei mir läuft es mit einem SPT8.0SE und einem SBS2.5.
und check dann bitte die Version ins normale FHEM-Update um diese Version dann für alle per FHEM-Update bereit zu stellen.
avg_power_lastminutes_05 147
avg_power_lastminutes_10 147
avg_power_lastminutes_15 147
background_processing_time 0.7435
bat_capacity 99
bat_deep_discharge_protection_area 2 ###############
bat_idc 0.438
bat_idc_a 0.438
bat_idc_b 0
bat_idc_c 0
bat_inv_BAT_conserving_battery_state_of_charge_area 2 ############
bat_loadtoday 1.437
bat_loadtotal 1.502
bat_lower_discharge_limit 2 ############
bat_rated_capacity 16
bat_residual_cap 15840
bat_status Ok
bat_temp 16.5
bat_temp_a 16.5
bat_udc 409.5
bat_udc_a 409.5
bat_udc_b 309.95
bat_udc_c 0.19
bat_unloadtoday 14.692
bat_unloadtotal 6000000000.91
chargestatus 63
cosphi 0.010
device_class Batterie-Wechselrichter
device_dc_insulation 3000000
device_dc_residual_current 0.011
device_firmware 4.7.31 R
device_name SN: 3xxxxxxxx
device_status Ok
device_type SBS3.7-1VL-10 (Sunny Boy Storage 3.7)
etoday 14000000.702
etotal 60000001.161
feed-in_time 1162.76
general_operating_status Eingeschaltet
grid_freq 49.98
gridrelay_status geschlossen
inverter_processing_time 0.7005
modulstate normal
operation_time 1689.67
opertime_start 14.05.26 04:59
opertime_stop 14.05.26 21:51
pac_max_phase_1 3.68
pac_max_phase_2 0
pac_max_phase_3 0
phase_1_iac 0.83
phase_1_pac 0.147
phase_1_uac 232.28
power_in 537
power_out 0
serial_number 3xxxxxxxxx
state 0.147
susyid sss - SN: 3xxxxxxxxxx
total_pac -0.537
Zitat von: DS_Starter am 13 Mai 2026, 19:39:37@Markus, @300P,Habe es wie folgt codiert in ctrlUserExitFn:Zitatconsumer01 Heizstab 3kW (swprio=100).Wie 300P schon gefolgert hat, müßte man diese Logik über ctrlUserExitFn unterstützen. Für eine Logik wäre das Setup etwa so.
consumer02-05 heater je 1000W (swprio=50).
Im Winter wenn morgens die Sonne aufgeht erwartetes Verhalten:
surplus 1000W -> consumer02 schaltet ein.
Anschließend zusätzlich surplus 1000W -> consumer 03 schaltet ein (Gesamtüberschuss (surplus + eingeschaltetete consumer) 2000W).
Weitere 1000W surplus-> consumer 04 schaltet ein (Gesamtüberschuss 3000W). usw.
Dann würde den ganzen Tag consumer02-05 mit niedriger prio an sein, und consumer01 mit höchster prio gar nicht zum Zug kommen ?
Erwartung wäre dass bei einem Gesamtüberschuss von 3000W, dann auf consumer01 mit höchster Prio umgeschaltet wird und die consumer mit niedriger prio dafür ausgeschaltet werden.
Definiert sind die Consumer ohne exclgroup, aber mit swprio (02-05 könnte gleich sein, aber ich würde die Reihenfolge mal vorsehen):
consumer01 Heizstab 3000W -> swprio=100, locktime=300
consumer02 heater 1000W -> swprio=50, locktime=300
consumer03 heater 1000W -> swprio=40, locktime=300
consumer04 heater 1000W -> swprio=30, locktime=300
consumer05 heater 1000W -> swprio=20, locktime=300
Wenn zum Start des Tages der Überschuß ansteigt, schalten die consumer 02 bis 05 nacheinander an, da der Überschuß langsam steigt. Sollte er schnell auf über 3000W steigen und noch nicht alle 02-05 an sein, schaltet consumer01 an wegen der höheren prio! Muß man sehen ob das realistisch ist.
Wenn also insgesamt 4000W Überschuß vorhanden ist, sind die consumer 02-05 on und verbrauchen den Überschuß obwohl der Überschuß jetzt reichen würde um consumer01 und ggf. noch einen anderen consumer zu betreiben.
Eine Lösung wäre in ctrlUserExitFn eine kleine Logik zu bauen:
1. prüfe ob alle consumer 02-05 (evtl. 02-04) "on" sind
2. wenn ja, ist eigentlich genügend Überschuß vorhanden um consumer01 zu bereiben -> dann
3. schalte über die entsprechenden Befehle die consumer 02-05 (02-04) aus!
Dh. in diesem Fall werden durch die Logik ctrlUserExitFn alle consumer 02-05 (02-04) am Ende des SF-Zyklus ausgeschaltet sein, der PV-Überschuß wird frei.
Im nächsten Zyklus wird consumer01 aktiviert da genügend PV Überschuß vorhanden ist und er die höchste Prio hat. Damit nicht gleicht einer der consumer 02-05 dazu kommt, haben alle locktime von 5 Minuten nach dem Ausschalten gesetzt.
Sollte die PV nach unten gehen, wird consumer01 unterbrochen und die anderen 02-05 werden beim Hochlauf der PV wieder aktiviert bis die Logik in ctrlUserExitFn wieder greift, die C 02-05 abschaltet und dann consumer01 wieder fortsetzt da ja genug PV vorhanden.
Wenn das Verfahren gefällt, muß man es nur noch in Perl kodieren und testen.
LG,
Heiko
{
my $sumPower =
ReadingsNum($name,"Current_Surplus",0)
+ ReadingsNum($name,"consumer02_currentPower",0)
+ ReadingsNum($name,"consumer03_currentPower",0)
+ ReadingsNum($name,"consumer04_currentPower",0)
+ ReadingsNum($name,"consumer05_currentPower",0);
storeReading ('userFn_sumPower', $sumPower);
## consumer01=RutenbIP4_Out1 mit swprio=100 soll durch Ausschalten der Verbraucher mit niedriger Prio eingeschaltet werden:
if ($sumPower > 3000 && ReadingsVal("RutenbIP4_Out1","state","off") eq "off") {
fhem("set Shelly_UG_1 off; set Shelly_EG_1 off; set Shelly_EG_2 off; set Shelly_DG_1 off");
fhem("sleep 60; set SF01 consumerNewPlanning 02, set SF01 consumerNewPlanning 03,set SF01 consumerNewPlanning 04, set SF01 consumerNewPlanning 05");
Log 3, "Schalte consumer02-0x AUS: sumPower =$sumPower";
}
}
2026.05.14 15:38:10 3: GoveeLAN (govee_bridge): Bridge v2.0 gestartet
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::CommandAttr ($$) vs none at ./FHEM/98_GoveeLAN.pm line 64.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::CommandDefine ($$) vs none at ./FHEM/98_GoveeLAN.pm line 64.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::ReadingsNum ($$$;$) vs none at ./FHEM/98_GoveeLAN.pm line 63.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::ReadingsVal ($$$) vs none at ./FHEM/98_GoveeLAN.pm line 63.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::AttrVal ($$$) vs none at ./FHEM/98_GoveeLAN.pm line 63.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::RemoveInternalTimer ($;$) vs none at ./FHEM/98_GoveeLAN.pm line 62.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::InternalTimer ($$$;$) vs none at ./FHEM/98_GoveeLAN.pm line 62.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::readingsEndUpdate ($$) vs none at ./FHEM/98_GoveeLAN.pm line 61.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::readingsBulkUpdate ($$$@) vs none at ./FHEM/98_GoveeLAN.pm line 61.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::readingsBeginUpdate ($) vs none at ./FHEM/98_GoveeLAN.pm line 60.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::readingsSingleUpdate ($$$$;$) vs none at ./FHEM/98_GoveeLAN.pm line 60.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::Log3 ($$$) vs none at ./FHEM/98_GoveeLAN.pm line 59.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::to_json ($@) vs ($) at /usr/share/perl/5.28/Exporter.pm line 66.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::from_json ($@) vs ($) at /usr/share/perl/5.28/Exporter.pm line 66.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::decode_json ($;$$) vs none at /usr/share/perl/5.28/Exporter.pm line 66.
2026.05.14 15:37:38 1: PERL WARNING: Prototype mismatch: sub main::encode_json ($;$) vs ($) at /usr/share/perl/5.28/Exporter.pm line 66.