diff --git a/fhem/CHANGED b/fhem/CHANGED index fefb2e812..e9c7a6db4 100644 --- a/fhem/CHANGED +++ b/fhem/CHANGED @@ -1,5 +1,6 @@ # Add changes at the top of the list. Keep it in ASCII, and 80-char wide. # Do not insert empty lines here, update check depends on it. + - bugfix: 76_SolarForecast: fix get Automatic State - change: 76_SolarForecast: optimize battery management once more - change: 76_SolarForecast: optimize batterymanagement - change: 93_DbLog: minor change of configCheck diff --git a/fhem/FHEM/76_SolarForecast.pm b/fhem/FHEM/76_SolarForecast.pm index 70e6e9160..d4f03ec2f 100644 --- a/fhem/FHEM/76_SolarForecast.pm +++ b/fhem/FHEM/76_SolarForecast.pm @@ -155,6 +155,7 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "1.6.4" => "09.01.2024 fix get Automatic State, use key switchdev for auto-Reading if switchdev is set in consumer attr ", "1.6.3" => "08.01.2024 optimize battery management once more ", "1.6.2" => "07.01.2024 optimize battery management ", "1.6.1" => "04.01.2024 new sub __setPhysSwState, edit ___setConsumerPlanningState, boost performance of collectAllRegConsumers ". @@ -6598,7 +6599,7 @@ sub _manageConsumerData { my $chour = $paref->{chour}; my $day = $paref->{day}; - my $nhour = $chour+1; + my $nhour = $chour + 1; $paref->{nhour} = sprintf("%02d",$nhour); for my $c (sort{$a<=>$b} keys %{$data{$type}{$name}{consumers}}) { @@ -6743,7 +6744,8 @@ sub _manageConsumerData { } $paref->{consumer} = $c; - + + __getAutomaticState ($paref); # Automatic Status des Consumers abfragen __calcEnergyPieces ($paref); # Energieverbrauch auf einzelne Stunden für Planungsgrundlage aufteilen __planSwitchTimes ($paref); # Consumer Switch Zeiten planen __setTimeframeState ($paref); # Timeframe Status ermitteln @@ -6776,6 +6778,49 @@ sub _manageConsumerData { return; } +################################################################ +# Consumer Status Automatic Modus abfragen und im +# Hash consumers aktualisieren +################################################################ +sub __getAutomaticState { + my $paref = shift; + my $hash = $paref->{hash}; + my $name = $paref->{name}; + my $type = $paref->{type}; + my $c = $paref->{consumer}; + + my $consumer = AttrVal ($name, "consumer${c}", ""); + my ($ac,$hc) = parseParams ($consumer); + $consumer = $ac->[0] // ""; + + if (!$consumer || !$defs{$consumer}) { + my $err = qq{ERROR - the device "$consumer" doesn't exist anymore! Delete or change the attribute "consumer${c}".}; + Log3 ($name, 1, "$name - $err"); + return; + } + + my $dswitch = $hc->{switchdev}; # alternatives Schaltdevice + + if ($dswitch) { + if (!$defs{$dswitch}) { + my $err = qq{ERROR - the device "$dswitch" doesn't exist anymore! Delete or change the attribute "consumer${c}".}; + Log3 ($name, 1, "$name - $err"); + return; + } + } + else { + $dswitch = $consumer; + } + + my $rauto = $hc->{auto} // q{}; + my $auto = 1; + $auto = ReadingsVal ($dswitch, $rauto, 1) if($rauto); # Reading für Ready-Bit -> Einschalten möglich ? + + $data{$type}{$name}{consumers}{$c}{auto} = $auto; # Automaticsteuerung: 1 - Automatic ein, 0 - Automatic aus + +return; +} + ################################################################### # Energieverbrauch auf einzelne Stunden für Planungsgrundlage # aufteilen @@ -9948,8 +9993,8 @@ sub _graphicConsumerLegend { my $cmdon = qq{"FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name clientAction $c 0 set $dswname $oncom')"}; my $cmdoff = qq{"FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name clientAction $c 0 set $dswname $offcom')"}; - my $cmdautoon = qq{"FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name clientAction $c 0 setreading $cname $autord 1')"}; - my $cmdautooff = qq{"FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name clientAction $c 0 setreading $cname $autord 0')"}; + my $cmdautoon = qq{"FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name clientAction $c 0 setreading $dswname $autord 1')"}; + my $cmdautooff = qq{"FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name clientAction $c 0 setreading $dswname $autord 0')"}; my $implan = qq{"FW_cmd('$FW_ME$FW_subdir?XHR=1&cmd=set $name clientAction $c 0 consumerImmediatePlanning $c')"}; if ($ftui eq "ftui") { @@ -16368,7 +16413,7 @@ to ensure that the system configuration is correct.
type | Typ des Verbrauchers. Folgende Typen sind erlaubt: |
dishwasher - Verbraucher ist eine Spülmaschine | |
dryer - Verbraucher ist ein Wäschetrockner | |
washingmachine - Verbraucher ist eine Waschmaschine | |
heater - Verbraucher ist ein Heizstab | |
charger - Verbraucher ist eine Ladeeinrichtung (Akku, Auto, Fahrrad, etc.) | |
other - Verbraucher ist keiner der vorgenannten Typen | |
noSchedule - für den Verbraucher erfolgt keine Einplanung oder automatische Schaltung. | |
type | Typ des Verbrauchers. Folgende Typen sind erlaubt: |
dishwasher - Verbraucher ist eine Spülmaschine | |
dryer - Verbraucher ist ein Wäschetrockner | |
washingmachine - Verbraucher ist eine Waschmaschine | |
heater - Verbraucher ist ein Heizstab | |
charger - Verbraucher ist eine Ladeeinrichtung (Akku, Auto, Fahrrad, etc.) | |
other - Verbraucher ist keiner der vorgenannten Typen | |
noSchedule - für den Verbraucher erfolgt keine Einplanung oder automatische Schaltung. | |
- Anzeigefunktionen oder manuelle Schaltungen sind verfügbar. | |
power | nominale Leistungsaufnahme des Verbrauchers (siehe Datenblatt) in W |
(kann auf "0" gesetzt werden) | |
switchdev | Das angegebene <device> wird als Schalter Device dem Verbraucher zugeordnet (optional). Schaltvorgänge werden mit diesem Gerät |
ausgeführt. Der Schlüssel ist für Verbraucher nützlich bei denen Energiemessung und Schaltung mit verschiedenen Geräten vorgenommen | |
wird, z.B. Homematic oder readingsProxy. Ist switchdev angegeben, beziehen sich die Schlüssel on, off, swstate und asynchron auf dieses Gerät. | |
mode | Planungsmodus des Verbrauchers (optional). Erlaubt sind: |
can - Die Einplanung erfolgt zum Zeitpunkt mit wahrscheinlich genügend verfügbaren PV Überschuß (default) | |
Der Start des Verbrauchers zum Planungszeitpunkt unterbleibt bei ungenügendem PV-Überschuß. | |
must - der Verbraucher wird optimiert eingeplant auch wenn wahrscheinlich nicht genügend PV Überschuß vorhanden sein wird | |
Der Start des Verbrauchers erfolgt auch bei ungenügendem PV-Überschuß. | |
icon | Icon zur Darstellung des Verbrauchers in der Übersichtsgrafik (optional) |
mintime | Einplanungsdauer (Minuten oder "SunPath") des Verbrauchers. (optional) |
Mit der Angabe von SunPath erfolgt die Planung entsprechend des Sonnenauf- und untergangs. | |
SunPath[:<Offset_Sunrise>:<Offset_Sunset>] - die Einplanung erfolgt von Sonnenaufgang bis Sonnenuntergang. | |
Optional kann eine positive / negative Verschiebung (Minuten) der Planungszeit bzgl. Sonnenaufgang bzw. Sonnenuntergang angegeben werden. | |
Ist mintime nicht angegeben, wird eine Standard Einplanungsdauer gemäß nachfolgender Tabelle verwendet. | |
Default mintime nach Verbrauchertyp: | |
- dishwasher: 180 Minuten | |
- dryer: 90 Minuten | |
- washingmachine: 120 Minuten | |
- heater: 240 Minuten | |
- charger: 120 Minuten | |
- other: 60 Minuten | |
on | Set-Kommando zum Einschalten des Verbrauchers (optional) |
off | Set-Kommando zum Ausschalten des Verbrauchers (optional) |
swstate | Reading welches den Schaltzustand des Verbrauchers anzeigt (default: 'state'). |
on-Regex - regulärer Ausdruck für den Zustand 'ein' (default: 'on') | |
off-Regex - regulärer Ausdruck für den Zustand 'aus' (default: 'off') | |
asynchron | die Art der Schaltstatus Ermittlung im Verbraucher Device. Die Statusermittlung des Verbrauchers nach einem Schaltbefehl erfolgt nur |
durch Abfrage innerhalb eines Datensammelintervals (synchron) oder zusätzlich durch Eventverarbeitung (asynchron). | |
0 - ausschließlich synchrone Verarbeitung von Schaltzuständen (default) | |
1 - zusätzlich asynchrone Verarbeitung von Schaltzuständen durch Eventverarbeitung | |
notbefore | Startzeitpunkt Verbraucher nicht vor angegebener Stunde (01..23) einplanen (optional) |
notafter | Startzeitpunkt Verbraucher nicht nach angegebener Stunde (01..23) einplanen (optional) |
auto | Reading im Verbraucherdevice welches das Schalten des Verbrauchers freigibt bzw. blockiert (optional) |
Readingwert = 1 - Schalten freigegeben (default), 0: Schalten blockiert | |
pcurr | Reading:Einheit (W/kW) welches den aktuellen Energieverbrauch liefert (optional) |
:<Schwellenwert> (W) - Ab diesem Leistungsbezug wird der Verbraucher als aktiv gewertet. Die Angabe ist optional (default: 0) | |
etotal | Reading:Einheit (Wh/kWh) des Consumer Device, welches die Summe der verbrauchten Energie liefert (optional) |
:<Schwellenwert> (Wh) - Ab diesem Energieverbrauch pro Stunde wird der Verbrauch als gültig gewertet. Optionale Angabe (default: 0) | |
swoncond | Bedingung die zusätzlich erfüllt sein muß um den Verbraucher einzuschalten (optional). Der geplante Zyklus wird gestartet. |
Device - Device zur Lieferung der zusätzlichen Einschaltbedingung | |
Reading - Reading zur Lieferung der zusätzlichen Einschaltbedingung | |
Regex - regulärer Ausdruck der für eine 'wahre' Bedingung erfüllt sein muß | |
swoffcond | vorrangige Bedingung um den Verbraucher auszuschalten (optional). Der geplante Zyklus wird gestoppt. |
Device - Device zur Lieferung der vorrangigen Ausschaltbedingung | |
Reading - Reading zur Lieferung der vorrangigen Ausschaltbedingung | |
Regex - regulärer Ausdruck der für eine 'wahre' Bedingung erfüllt sein muß | |
spignorecond | Bedingung um einen fehlenden PV Überschuß zu ignorieren (optional). Bei erfüllter Bedingung wird der Verbraucher entsprechend |
der Planung eingeschaltet auch wenn zu dem Zeitpunkt kein PV Überschuß vorliegt. | |
ACHTUNG: Die Verwendung beider Schlüssel spignorecond und interruptable kann zu einem unerwünschten Verhalten führen! | |
Device - Device zur Lieferung der Bedingung | |
Reading - Reading welches die Bedingung enthält | |
Regex - regulärer Ausdruck der für eine 'wahre' Bedingung erfüllt sein muß | |
interruptable | definiert die möglichen Unterbrechungsoptionen für den Verbraucher nachdem er gestartet wurde (optional) |
0 - Verbraucher wird nicht temporär ausgeschaltet auch wenn der PV Überschuß die benötigte Energie unterschreitet (default) | |
1 - Verbraucher wird temporär ausgeschaltet falls der PV Überschuß die benötigte Energie unterschreitet | |
Device:Reading:Regex[:Hysterese] - Verbraucher wird temporär unterbrochen wenn der Wert des angegebenen | |
Device:Readings auf den Regex matched oder unzureichender PV Überschuß (wenn power ungleich 0) vorliegt. | |
Matched der Wert nicht mehr, wird der unterbrochene Verbraucher wieder eingeschaltet sofern ausreichender | |
PV Überschuß (wenn power ungleich 0) vorliegt. | |
Ist die optionale Hysterese angegeben, wird der Hysteresewert vom Readingswert subtrahiert und danach der Regex angewendet. | |
Matched dieser und der originale Readingswert, wird der Verbraucher temporär unterbrochen. | |
Der Verbraucher wird fortgesetzt, wenn sowohl der originale als auch der substrahierte Readingswert nicht (mehr) matchen. | |
locktime | Sperrzeiten in Sekunden für die Schaltung des Verbrauchers (optional). |
offlt - Sperrzeit in Sekunden nachdem der Verbraucher ausgeschaltet oder unterbrochen wurde | |
onlt - Sperrzeit in Sekunden nachdem der Verbraucher eingeschaltet oder fortgesetzt wurde | |
Der Verbraucher wird erst wieder geschaltet wenn die entsprechende Sperrzeit abgelaufen ist. | |
Hinweis: Der Schalter 'locktime' ist nur im Automatik-Modus wirksam. | |
noshow | Verbraucher in Grafik ausblenden oder einblenden (optional). |
0 - der Verbraucher wird eingeblendet (default) | |
1 - der Verbraucher wird ausgeblendet | |
2 - der Verbraucher wird in der Verbraucherlegende ausgeblendet | |
3 - der Verbraucher wird in der Flußgrafik ausgeblendet | |
[Device:]Reading - Reading im Verbraucher oder optional einem alternativen Device. | |
Hat das Reading den Wert 0 oder ist nicht vorhanden, wird der Verbraucher eingeblendet. | |
Die Wirkung der möglichen Readingwerte 1, 2 und 3 ist wie beschrieben. | |
power | nominale Leistungsaufnahme des Verbrauchers (siehe Datenblatt) in W |
(kann auf "0" gesetzt werden) | |
switchdev | Das angegebene <device> wird als Schalter Device dem Verbraucher zugeordnet (optional). Schaltvorgänge werden mit diesem Gerät |
ausgeführt. Der Schlüssel ist für Verbraucher nützlich bei denen Energiemessung und Schaltung mit verschiedenen Geräten vorgenommen | |
wird, z.B. Homematic oder readingsProxy. Ist switchdev angegeben, beziehen sich die Schlüssel on, off, swstate, auto, asynchron auf dieses Gerät. | |
mode | Planungsmodus des Verbrauchers (optional). Erlaubt sind: |
can - Die Einplanung erfolgt zum Zeitpunkt mit wahrscheinlich genügend verfügbaren PV Überschuß (default) | |
Der Start des Verbrauchers zum Planungszeitpunkt unterbleibt bei ungenügendem PV-Überschuß. | |
must - der Verbraucher wird optimiert eingeplant auch wenn wahrscheinlich nicht genügend PV Überschuß vorhanden sein wird | |
Der Start des Verbrauchers erfolgt auch bei ungenügendem PV-Überschuß. | |
icon | Icon zur Darstellung des Verbrauchers in der Übersichtsgrafik (optional) |
mintime | Einplanungsdauer (Minuten oder "SunPath") des Verbrauchers. (optional) |
Mit der Angabe von SunPath erfolgt die Planung entsprechend des Sonnenauf- und untergangs. | |
SunPath[:<Offset_Sunrise>:<Offset_Sunset>] - die Einplanung erfolgt von Sonnenaufgang bis Sonnenuntergang. | |
Optional kann eine positive / negative Verschiebung (Minuten) der Planungszeit bzgl. Sonnenaufgang bzw. Sonnenuntergang angegeben werden. | |
Ist mintime nicht angegeben, wird eine Standard Einplanungsdauer gemäß nachfolgender Tabelle verwendet. | |
Default mintime nach Verbrauchertyp: | |
- dishwasher: 180 Minuten | |
- dryer: 90 Minuten | |
- washingmachine: 120 Minuten | |
- heater: 240 Minuten | |
- charger: 120 Minuten | |
- other: 60 Minuten | |
on | Set-Kommando zum Einschalten des Verbrauchers (optional) |
off | Set-Kommando zum Ausschalten des Verbrauchers (optional) |
swstate | Reading welches den Schaltzustand des Verbrauchers anzeigt (default: 'state'). |
on-Regex - regulärer Ausdruck für den Zustand 'ein' (default: 'on') | |
off-Regex - regulärer Ausdruck für den Zustand 'aus' (default: 'off') | |
asynchron | die Art der Schaltstatus Ermittlung im Verbraucher Device. Die Statusermittlung des Verbrauchers nach einem Schaltbefehl erfolgt nur |
durch Abfrage innerhalb eines Datensammelintervals (synchron) oder zusätzlich durch Eventverarbeitung (asynchron). | |
0 - ausschließlich synchrone Verarbeitung von Schaltzuständen (default) | |
1 - zusätzlich asynchrone Verarbeitung von Schaltzuständen durch Eventverarbeitung | |
notbefore | Startzeitpunkt Verbraucher nicht vor angegebener Stunde (01..23) einplanen (optional) |
notafter | Startzeitpunkt Verbraucher nicht nach angegebener Stunde (01..23) einplanen (optional) |
auto | Reading im Verbraucherdevice welches das Schalten des Verbrauchers freigibt bzw. blockiert (optional) |
Ist der Schlüssel switchdev angegeben, wird das Reading in diesem Device gesetzt und ausgewertet. | |
Readingwert = 1 - Schalten freigegeben (default), 0: Schalten blockiert | |
pcurr | Reading:Einheit (W/kW) welches den aktuellen Energieverbrauch liefert (optional) |
:<Schwellenwert> (W) - Ab diesem Leistungsbezug wird der Verbraucher als aktiv gewertet. Die Angabe ist optional (default: 0) | |
etotal | Reading:Einheit (Wh/kWh) des Consumer Device, welches die Summe der verbrauchten Energie liefert (optional) |
:<Schwellenwert> (Wh) - Ab diesem Energieverbrauch pro Stunde wird der Verbrauch als gültig gewertet. Optionale Angabe (default: 0) | |
swoncond | Bedingung die zusätzlich erfüllt sein muß um den Verbraucher einzuschalten (optional). Der geplante Zyklus wird gestartet. |
Device - Device zur Lieferung der zusätzlichen Einschaltbedingung | |
Reading - Reading zur Lieferung der zusätzlichen Einschaltbedingung | |
Regex - regulärer Ausdruck der für eine 'wahre' Bedingung erfüllt sein muß | |
swoffcond | vorrangige Bedingung um den Verbraucher auszuschalten (optional). Der geplante Zyklus wird gestoppt. |
Device - Device zur Lieferung der vorrangigen Ausschaltbedingung | |
Reading - Reading zur Lieferung der vorrangigen Ausschaltbedingung | |
Regex - regulärer Ausdruck der für eine 'wahre' Bedingung erfüllt sein muß | |
spignorecond | Bedingung um einen fehlenden PV Überschuß zu ignorieren (optional). Bei erfüllter Bedingung wird der Verbraucher entsprechend |
der Planung eingeschaltet auch wenn zu dem Zeitpunkt kein PV Überschuß vorliegt. | |
ACHTUNG: Die Verwendung beider Schlüssel spignorecond und interruptable kann zu einem unerwünschten Verhalten führen! | |
Device - Device zur Lieferung der Bedingung | |
Reading - Reading welches die Bedingung enthält | |
Regex - regulärer Ausdruck der für eine 'wahre' Bedingung erfüllt sein muß | |
interruptable | definiert die möglichen Unterbrechungsoptionen für den Verbraucher nachdem er gestartet wurde (optional) |
0 - Verbraucher wird nicht temporär ausgeschaltet auch wenn der PV Überschuß die benötigte Energie unterschreitet (default) | |
1 - Verbraucher wird temporär ausgeschaltet falls der PV Überschuß die benötigte Energie unterschreitet | |
Device:Reading:Regex[:Hysterese] - Verbraucher wird temporär unterbrochen wenn der Wert des angegebenen | |
Device:Readings auf den Regex matched oder unzureichender PV Überschuß (wenn power ungleich 0) vorliegt. | |
Matched der Wert nicht mehr, wird der unterbrochene Verbraucher wieder eingeschaltet sofern ausreichender | |
PV Überschuß (wenn power ungleich 0) vorliegt. | |
Ist die optionale Hysterese angegeben, wird der Hysteresewert vom Readingswert subtrahiert und danach der Regex angewendet. | |
Matched dieser und der originale Readingswert, wird der Verbraucher temporär unterbrochen. | |
Der Verbraucher wird fortgesetzt, wenn sowohl der originale als auch der substrahierte Readingswert nicht (mehr) matchen. | |
locktime | Sperrzeiten in Sekunden für die Schaltung des Verbrauchers (optional). |
offlt - Sperrzeit in Sekunden nachdem der Verbraucher ausgeschaltet oder unterbrochen wurde | |
onlt - Sperrzeit in Sekunden nachdem der Verbraucher eingeschaltet oder fortgesetzt wurde | |
Der Verbraucher wird erst wieder geschaltet wenn die entsprechende Sperrzeit abgelaufen ist. | |
Hinweis: Der Schalter 'locktime' ist nur im Automatik-Modus wirksam. | |
noshow | Verbraucher in Grafik ausblenden oder einblenden (optional). |
0 - der Verbraucher wird eingeblendet (default) | |
1 - der Verbraucher wird ausgeblendet | |
2 - der Verbraucher wird in der Verbraucherlegende ausgeblendet | |
3 - der Verbraucher wird in der Flußgrafik ausgeblendet | |
[Device:]Reading - Reading im Verbraucher oder optional einem alternativen Device. | |
Hat das Reading den Wert 0 oder ist nicht vorhanden, wird der Verbraucher eingeblendet. | |
Die Wirkung der möglichen Readingwerte 1, 2 und 3 ist wie beschrieben. |