2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-04-21 07:56:03 +00:00

76_SolarForecast.pm: contrib 0.67.6

git-svn-id: https://svn.fhem.de/fhem/trunk@26372 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2022-09-02 17:57:54 +00:00
parent 6d4b2b4f7e
commit b39d4937ca
6 changed files with 110 additions and 46819 deletions

View File

@ -120,6 +120,7 @@ BEGIN {
# Versions History intern # Versions History intern
my %vNotesIntern = ( my %vNotesIntern = (
"0.67.6 "=> "02.09.2022 add ___setPlanningDeleteMeth, consumer can be planned across daily boundaries ",
"0.67.5 "=> "28.08.2022 add checkRegex ", "0.67.5 "=> "28.08.2022 add checkRegex ",
"0.67.4 "=> "28.08.2022 ___switchConsumerOn -> no switch on if additional switch off condition is true ". "0.67.4 "=> "28.08.2022 ___switchConsumerOn -> no switch on if additional switch off condition is true ".
"__setConsRcmdState -> Consumer can be switched on in case of missing PV power if key power=0 is set ". "__setConsRcmdState -> Consumer can be switched on in case of missing PV power if key power=0 is set ".
@ -885,6 +886,7 @@ sub _setconsumerImmediatePlanning { ## no critic "not used"
$paref->{stopts} = $stopts; # Unix Timestamp für geplanten Switch off $paref->{stopts} = $stopts; # Unix Timestamp für geplanten Switch off
___setConsumerPlanningState ($paref); ___setConsumerPlanningState ($paref);
___setPlanningDeleteMeth ($paref);
my $planstate = ConsumerVal ($hash, $c, "planstate", ""); my $planstate = ConsumerVal ($hash, $c, "planstate", "");
my $calias = ConsumerVal ($hash, $c, "alias", ""); my $calias = ConsumerVal ($hash, $c, "alias", "");
@ -1437,14 +1439,10 @@ sub _setreset { ## no critic "not used"
if ($c) { if ($c) {
deleteConsumerPlanning ($hash, $c); deleteConsumerPlanning ($hash, $c);
my $calias = ConsumerVal ($hash, $c, "alias", "");
Log3($name, 3, qq{$name - Consumer planning of "$calias" deleted});
} }
else { else {
for my $cs (keys %{$data{$type}{$name}{consumers}}) { for my $cs (keys %{$data{$type}{$name}{consumers}}) {
deleteConsumerPlanning ($hash, $cs); deleteConsumerPlanning ($hash, $cs);
my $calias = ConsumerVal ($hash, $cs, "alias", "");
Log3($name, 3, qq{$name - Consumer planning of "$calias" deleted});
} }
} }
@ -2319,6 +2317,24 @@ sub _specialActivities {
$gcon = ReadingsNum($name, "Today_Hour".sprintf("%02d",$chour)."_GridConsumption", 0); $gcon = ReadingsNum($name, "Today_Hour".sprintf("%02d",$chour)."_GridConsumption", 0);
push @$daref, "LastHourGridconsumptionReal<>".$gcon." Wh<>".$ts1; push @$daref, "LastHourGridconsumptionReal<>".$gcon." Wh<>".$ts1;
## Planungsdaten spezifisch löschen (Anfang und Ende nicht am selben Tag)
##########################################################################
for my $c (keys %{$data{$type}{$name}{consumers}}) {
next if(ConsumerVal ($hash, $c, "plandelete", "regular") eq "regular");
my $planswitchoff = ConsumerVal ($hash, $c, "planswitchoff", $t);
my $pstate = simplifyCstate (ConsumerVal ($hash, $c, "planstate", ""));
if ($t > $planswitchoff && $pstate =~ /planned|finished|unknown/xs) {
deleteConsumerPlanning ($hash, $c);
$data{$type}{$name}{consumers}{$c}{minutesOn} = 0;
$data{$type}{$name}{consumers}{$c}{numberDayStarts} = 0;
$data{$type}{$name}{consumers}{$c}{onoff} = "off";
}
}
## zusätzliche Events erzeugen - PV Vorhersage bis Ende des kommenden Tages ## zusätzliche Events erzeugen - PV Vorhersage bis Ende des kommenden Tages
############################################################################# #############################################################################
for my $idx (sort keys %{$data{$type}{$name}{nexthours}}) { for my $idx (sort keys %{$data{$type}{$name}{nexthours}}) {
@ -2332,6 +2348,7 @@ sub _specialActivities {
## bestimmte einmalige Aktionen ## bestimmte einmalige Aktionen
################################## ##################################
my $tlim = "00"; my $tlim = "00";
if($chour =~ /^($tlim)$/x) { if($chour =~ /^($tlim)$/x) {
if(!exists $hash->{HELPER}{H00DONE}) { if(!exists $hash->{HELPER}{H00DONE}) {
@ -2367,18 +2384,16 @@ sub _specialActivities {
delete $data{$type}{$name}{pvhist}{$day}; # den (alten) aktuellen Tag löschen delete $data{$type}{$name}{pvhist}{$day}; # den (alten) aktuellen Tag löschen
Log3 ($name, 3, qq{$name - history day "$day" deleted}); Log3 ($name, 3, qq{$name - history day "$day" deleted});
for my $c (keys %{$data{$type}{$name}{consumers}}) { for my $c (keys %{$data{$type}{$name}{consumers}}) { # Planungsdaten regulär löschen
next if(ConsumerVal ($hash, $c, "plandelete", "regular") ne "regular");
deleteConsumerPlanning ($hash, $c); deleteConsumerPlanning ($hash, $c);
my $calias = ConsumerVal ($hash, $c, "alias", "");
Log3 ($name, 3, qq{$name - Consumer planning of "$calias" deleted});
$data{$type}{$name}{consumers}{$c}{minutesOn} = 0; $data{$type}{$name}{consumers}{$c}{minutesOn} = 0;
$data{$type}{$name}{consumers}{$c}{numberDayStarts} = 0; $data{$type}{$name}{consumers}{$c}{numberDayStarts} = 0;
$data{$type}{$name}{consumers}{$c}{onoff} = "off"; $data{$type}{$name}{consumers}{$c}{onoff} = "off";
} }
# deleteReadingspec ($hash, "consumer.*_planned.*");
writeDataToFile ($hash, "consumers", $csmcache.$name); # Cache File Consumer schreiben writeDataToFile ($hash, "consumers", $csmcache.$name); # Cache File Consumer schreiben
$hash->{HELPER}{H00DONE} = 1; $hash->{HELPER}{H00DONE} = 1;
@ -3298,13 +3313,58 @@ sub __planSwitchTimes {
my $planstate = ConsumerVal ($hash, $c, "planstate", ""); my $planstate = ConsumerVal ($hash, $c, "planstate", "");
if($planstate) {
Log3 ($name, 3, qq{$name - Consumer "$calias" $planstate});
}
writeDataToFile ($hash, "consumers", $csmcache.$name); # Cache File Consumer schreiben writeDataToFile ($hash, "consumers", $csmcache.$name); # Cache File Consumer schreiben
Log3 ($name, 3, qq{$name - Consumer "$calias" $planstate}) if($planstate); ___setPlanningDeleteMeth ($paref);
return; return;
} }
################################################################
# Consumer Zeiten MUST planen
################################################################
sub ___planMust {
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $c = $paref->{consumer};
my $maxref = $paref->{maxref};
my $elem = $paref->{elem};
my $mintime = $paref->{mintime};
my $stopdiff = $paref->{stopdiff};
my $type = $hash->{TYPE};
my $maxts = timestringToTimestamp ($maxref->{$elem}{starttime}); # Unix Timestamp des max. Überschusses heute
my $half = ceil ($mintime / 2 / 60); # die halbe Gesamtlaufzeit in h als Vorlaufzeit einkalkulieren
my $startts = $maxts - ($half * 3600);
my (undef,undef,undef,$starttime) = timestampToTimestring ($startts);
$paref->{starttime} = $starttime;
$starttime = ___switchonTimelimits ($paref);
delete $paref->{starttime};
$startts = timestringToTimestamp ($starttime);
my $stopts = $startts + $stopdiff;
$paref->{ps} = "planned:";
$paref->{startts} = $startts; # Unix Timestamp für geplanten Switch on
$paref->{stopts} = $stopts; # Unix Timestamp für geplanten Switch off
___setConsumerPlanningState ($paref);
delete $paref->{ps};
delete $paref->{startts};
delete $paref->{stopts};
return;
}
################################################################ ################################################################
# Planungsdaten bzw. aktuelle Planungszustände setzen # Planungsdaten bzw. aktuelle Planungszustände setzen
################################################################ ################################################################
@ -3352,46 +3412,6 @@ sub ___setConsumerPlanningState {
return; return;
} }
################################################################
# Consumer Zeiten MUST planen
################################################################
sub ___planMust {
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $c = $paref->{consumer};
my $maxref = $paref->{maxref};
my $elem = $paref->{elem};
my $mintime = $paref->{mintime};
my $stopdiff = $paref->{stopdiff};
my $type = $hash->{TYPE};
my $maxts = timestringToTimestamp ($maxref->{$elem}{starttime}); # Unix Timestamp des max. Überschusses heute
my $half = ceil ($mintime / 2 / 60); # die halbe Gesamtlaufzeit in h als Vorlaufzeit einkalkulieren
my $startts = $maxts - ($half * 3600);
my (undef,undef,undef,$starttime) = timestampToTimestring ($startts);
$paref->{starttime} = $starttime;
$starttime = ___switchonTimelimits ($paref);
delete $paref->{starttime};
$startts = timestringToTimestamp ($starttime);
my $stopts = $startts + $stopdiff;
$paref->{ps} = "planned:";
$paref->{startts} = $startts; # Unix Timestamp für geplanten Switch on
$paref->{stopts} = $stopts; # Unix Timestamp für geplanten Switch off
___setConsumerPlanningState ($paref);
delete $paref->{ps};
delete $paref->{startts};
delete $paref->{stopts};
return;
}
################################################################ ################################################################
# Einschaltgrenzen berücksichtigen und Korrektur # Einschaltgrenzen berücksichtigen und Korrektur
# zurück liefern # zurück liefern
@ -3431,6 +3451,35 @@ sub ___switchonTimelimits {
return $starttime; return $starttime;
} }
################################################################
# Löschmethode der Planungsdaten setzen
################################################################
sub ___setPlanningDeleteMeth {
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $c = $paref->{consumer};
my $type = $hash->{TYPE};
my $sonkey = ConsumerVal ($hash, $c, "planswitchon", "");
my $soffkey = ConsumerVal ($hash, $c, "planswitchoff", "");
if($sonkey && $soffkey) {
my $onday = strftime "%d", localtime($sonkey);
my $offday = strftime "%d", localtime($soffkey);
if ($offday ne $onday) { # Planungsdaten spezifische Löschmethode
$data{$type}{$name}{consumers}{$c}{plandelete} = "specific";
}
else { # Planungsdaten Löschmethode jeden Tag in Stunde 0 (_specialActivities)
$data{$type}{$name}{consumers}{$c}{plandelete} = "regular";
}
}
return;
}
################################################################ ################################################################
# Timeframe Status ermitteln # Timeframe Status ermitteln
################################################################ ################################################################
@ -5812,8 +5861,8 @@ sub __weatherOnBeam {
weather_icon($hfcg->{$i}{weather}-100) : weather_icon($hfcg->{$i}{weather}-100) :
weather_icon($hfcg->{$i}{weather}); weather_icon($hfcg->{$i}{weather});
my $wcc = $hfcg->{$i}{wcc}; # Bewölkungsgrad ergänzen #my $wcc = $hfcg->{$i}{wcc}; # Bewölkungsgrad ergänzen
$title .= ': '.$wcc; #$title .= ': '.$wcc;
if($icon_name eq 'unknown') { if($icon_name eq 'unknown') {
Log3 ($name, 4, "$name - unknown weather id: ".$hfcg->{$i}{weather}.", please inform the maintainer"); Log3 ($name, 4, "$name - unknown weather id: ".$hfcg->{$i}{weather}.", please inform the maintainer");
@ -7513,15 +7562,17 @@ sub deleteConsumerPlanning {
my $type = $hash->{TYPE}; my $type = $hash->{TYPE};
my $name = $hash->{NAME}; my $name = $hash->{NAME};
my $calias = ConsumerVal ($hash, $c, "alias", "");
delete $data{$type}{$name}{consumers}{$c}{planstate}; delete $data{$type}{$name}{consumers}{$c}{planstate};
delete $data{$type}{$name}{consumers}{$c}{planswitchon}; delete $data{$type}{$name}{consumers}{$c}{planswitchon};
delete $data{$type}{$name}{consumers}{$c}{planswitchoff}; delete $data{$type}{$name}{consumers}{$c}{planswitchoff};
delete $data{$type}{$name}{consumers}{$c}{plandelete};
# $data{$type}{$name}{consumers}{$c}{isIntimeframe} = 0;
deleteReadingspec ($hash, "consumer${c}.*" ); deleteReadingspec ($hash, "consumer${c}.*" );
Log3($name, 3, qq{$name - Consumer planning of "$calias" deleted});
return; return;
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff