mirror of
https://github.com/fhem/fhem-mirror.git
synced 2025-03-10 03:06:37 +00:00
76_SolarForecast.pm: contrib 0.72.1
git-svn-id: https://svn.fhem.de/fhem/trunk@26628 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
parent
484e77dae4
commit
b236b20c63
@ -1,5 +1,5 @@
|
|||||||
########################################################################################################################
|
########################################################################################################################
|
||||||
# $Id: 76_SolarForecast.pm 21735 2022-10-30 23:53:24Z DS_Starter $
|
# $Id: 76_SolarForecast.pm 21735 2022-10-31 23:53:24Z DS_Starter $
|
||||||
#########################################################################################################################
|
#########################################################################################################################
|
||||||
# 76_SolarForecast.pm
|
# 76_SolarForecast.pm
|
||||||
#
|
#
|
||||||
@ -130,7 +130,7 @@ BEGIN {
|
|||||||
|
|
||||||
# Versions History intern
|
# Versions History intern
|
||||||
my %vNotesIntern = (
|
my %vNotesIntern = (
|
||||||
"0.72.1" => "30.10.2022 fix 'connection lost ...' issue again, global language check in checkPlantConfig ",
|
"0.72.1" => "31.10.2022 fix 'connection lost ...' issue again, global language check in checkPlantConfig ",
|
||||||
"0.72.0" => "30.10.2022 rename some graphic attributes ",
|
"0.72.0" => "30.10.2022 rename some graphic attributes ",
|
||||||
"0.71.4" => "29.10.2022 flowgraphic some changes (https://forum.fhem.de/index.php/topic,117864.msg1241836.html#msg1241836) ",
|
"0.71.4" => "29.10.2022 flowgraphic some changes (https://forum.fhem.de/index.php/topic,117864.msg1241836.html#msg1241836) ",
|
||||||
"0.71.3" => "28.10.2022 new circular keys tdayDvtn, ydayDvtn for calculation PV forecast/generation in header ",
|
"0.71.3" => "28.10.2022 new circular keys tdayDvtn, ydayDvtn for calculation PV forecast/generation in header ",
|
||||||
@ -931,7 +931,7 @@ sub Define {
|
|||||||
$params->{cachename} = "solcastapi";
|
$params->{cachename} = "solcastapi";
|
||||||
_readCacheFile ($params);
|
_readCacheFile ($params);
|
||||||
|
|
||||||
readingsSingleUpdate($hash, "state", "initialized", 1);
|
singleUpdateState ( {hash => $hash, state => 'initialized', evt => 1} );
|
||||||
|
|
||||||
centralTask ($hash); # Einstieg in Abfrage
|
centralTask ($hash); # Einstieg in Abfrage
|
||||||
InternalTimer (gettimeofday()+$whistrepeat, "FHEM::SolarForecast::periodicWriteCachefiles", $hash, 0); # Einstieg periodisches Schreiben historische Daten
|
InternalTimer (gettimeofday()+$whistrepeat, "FHEM::SolarForecast::periodicWriteCachefiles", $hash, 0); # Einstieg periodisches Schreiben historische Daten
|
||||||
@ -1639,7 +1639,7 @@ sub _setpvCorrectionFactor { ## no critic "not used"
|
|||||||
my $cfnum = (split "_", $opt)[1];
|
my $cfnum = (split "_", $opt)[1];
|
||||||
deleteReadingspec ($hash, "pvCorrectionFactor_${cfnum}_autocalc");
|
deleteReadingspec ($hash, "pvCorrectionFactor_${cfnum}_autocalc");
|
||||||
|
|
||||||
centralTask ($hash);
|
centralTask ($hash, 0);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -1663,7 +1663,7 @@ sub _setpvSolCastPercentile { ## no critic "not used"
|
|||||||
my $cfnum = (split "_", $opt)[1];
|
my $cfnum = (split "_", $opt)[1];
|
||||||
deleteReadingspec ($hash, "pvSolCastPercentile_${cfnum}_autocalc");
|
deleteReadingspec ($hash, "pvSolCastPercentile_${cfnum}_autocalc");
|
||||||
|
|
||||||
centralTask ($hash);
|
centralTask ($hash, 0);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2087,7 +2087,7 @@ sub __solCast_ApiRequest {
|
|||||||
|
|
||||||
if(!$roofid || !$apikey) {
|
if(!$roofid || !$apikey) {
|
||||||
my $err = qq{The roofIdentPair "$pk" of String "$string" has no Rooftop-ID and/or SolCast-API key assigned !};
|
my $err = qq{The roofIdentPair "$pk" of String "$string" has no Rooftop-ID and/or SolCast-API key assigned !};
|
||||||
readingsSingleUpdate($hash, "state", $err, 1);
|
singleUpdateState ( {hash => $hash, state => $err, evt => 1} );
|
||||||
return $err;
|
return $err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2148,7 +2148,7 @@ sub __solCast_ApiResponse {
|
|||||||
|
|
||||||
$data{$type}{$name}{solcastapi}{'?All'}{'?All'}{response_message} = $err;
|
$data{$type}{$name}{solcastapi}{'?All'}{'?All'}{response_message} = $err;
|
||||||
|
|
||||||
readingsSingleUpdate($hash, "state", $msg, 1);
|
singleUpdateState ( {hash => $hash, state => $msg, evt => 1} );
|
||||||
$data{$type}{$name}{current}{runTimeLastAPIProc} = sprintf "%.4f", tv_interval($sta); # Verarbeitungszeit ermitteln
|
$data{$type}{$name}{current}{runTimeLastAPIProc} = sprintf "%.4f", tv_interval($sta); # Verarbeitungszeit ermitteln
|
||||||
$data{$type}{$name}{current}{runTimeLastAPIAnswer} = sprintf "%.4f", (tv_interval($stc) - tv_interval($sta)); # API Laufzeit ermitteln
|
$data{$type}{$name}{current}{runTimeLastAPIAnswer} = sprintf "%.4f", (tv_interval($stc) - tv_interval($sta)); # API Laufzeit ermitteln
|
||||||
|
|
||||||
@ -2162,7 +2162,7 @@ sub __solCast_ApiResponse {
|
|||||||
|
|
||||||
Log3 ($name, 2, "$name - $msg");
|
Log3 ($name, 2, "$name - $msg");
|
||||||
|
|
||||||
readingsSingleUpdate($hash, "state", $msg, 1);
|
singleUpdateState ( {hash => $hash, state => $msg, evt => 1} );
|
||||||
$data{$type}{$name}{current}{runTimeLastAPIProc} = sprintf "%.4f", tv_interval($sta); # Verarbeitungszeit ermitteln
|
$data{$type}{$name}{current}{runTimeLastAPIProc} = sprintf "%.4f", tv_interval($sta); # Verarbeitungszeit ermitteln
|
||||||
$data{$type}{$name}{current}{runTimeLastAPIAnswer} = sprintf "%.4f", (tv_interval($stc) - tv_interval($sta)); # API Laufzeit ermitteln
|
$data{$type}{$name}{current}{runTimeLastAPIAnswer} = sprintf "%.4f", (tv_interval($stc) - tv_interval($sta)); # API Laufzeit ermitteln
|
||||||
|
|
||||||
@ -2193,7 +2193,7 @@ sub __solCast_ApiResponse {
|
|||||||
|
|
||||||
$data{$type}{$name}{solcastapi}{'?All'}{'?All'}{response_message} = $jdata->{'response_status'}{'message'};
|
$data{$type}{$name}{solcastapi}{'?All'}{'?All'}{response_message} = $jdata->{'response_status'}{'message'};
|
||||||
|
|
||||||
readingsSingleUpdate($hash, "state", $msg, 1);
|
singleUpdateState ( {hash => $hash, state => $msg, evt => 1} );
|
||||||
$data{$type}{$name}{current}{runTimeLastAPIProc} = sprintf "%.4f", tv_interval($sta); # Verarbeitungszeit ermitteln
|
$data{$type}{$name}{current}{runTimeLastAPIProc} = sprintf "%.4f", tv_interval($sta); # Verarbeitungszeit ermitteln
|
||||||
$data{$type}{$name}{current}{runTimeLastAPIAnswer} = sprintf "%.4f", (tv_interval($stc) - tv_interval($sta)); # API Laufzeit ermitteln
|
$data{$type}{$name}{current}{runTimeLastAPIAnswer} = sprintf "%.4f", (tv_interval($stc) - tv_interval($sta)); # API Laufzeit ermitteln
|
||||||
|
|
||||||
@ -2240,7 +2240,7 @@ sub __solCast_ApiResponse {
|
|||||||
if ($err) {
|
if ($err) {
|
||||||
Log3 ($name, 2, "$name - $err");
|
Log3 ($name, 2, "$name - $err");
|
||||||
|
|
||||||
readingsSingleUpdate($hash, "state", $err, 1);
|
singleUpdateState ( {hash => $hash, state => $err, evt => 1} );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2531,7 +2531,7 @@ sub Attr {
|
|||||||
}
|
}
|
||||||
$do = 0 if($cmd eq "del");
|
$do = 0 if($cmd eq "del");
|
||||||
$val = ($do == 1 ? "disabled" : "initialized");
|
$val = ($do == 1 ? "disabled" : "initialized");
|
||||||
readingsSingleUpdate($hash, "state", $val, 1);
|
singleUpdateState ( {hash => $hash, state => $val, evt => 1} );
|
||||||
}
|
}
|
||||||
|
|
||||||
if($aName eq "createTomorrowPVFcReadings") {
|
if($aName eq "createTomorrowPVFcReadings") {
|
||||||
@ -2936,13 +2936,13 @@ sub writeDataToFile {
|
|||||||
if ($error) {
|
if ($error) {
|
||||||
my $err = qq{ERROR writing cache file "$file": $error};
|
my $err = qq{ERROR writing cache file "$file": $error};
|
||||||
Log3 ($name, 1, "$name - $err");
|
Log3 ($name, 1, "$name - $err");
|
||||||
readingsSingleUpdate($hash, "state", "ERROR writing cache file $file - $error", 1);
|
singleUpdateState ( {hash => $hash, state => "ERROR writing cache file $file - $error", evt => 1} );
|
||||||
return $err;
|
return $err;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
my $lw = gettimeofday();
|
my $lw = gettimeofday();
|
||||||
$hash->{HISTFILE} = "last write time: ".FmtTime($lw)." File: $file" if($cachename eq "pvhist");
|
$hash->{HISTFILE} = "last write time: ".FmtTime($lw)." File: $file" if($cachename eq "pvhist");
|
||||||
readingsSingleUpdate($hash, "state", "wrote cachefile $cachename successfully", 1);
|
singleUpdateState ( {hash => $hash, state => "wrote cachefile $cachename successfully", evt => 1} );
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
@ -2987,14 +2987,14 @@ return @pvconf;
|
|||||||
################################################################
|
################################################################
|
||||||
sub centralTask {
|
sub centralTask {
|
||||||
my $hash = shift;
|
my $hash = shift;
|
||||||
my $evt = shift // 1; # Readings Event (state nicht gesteuert)
|
my $evt = shift // 1; # Readings Event generieren
|
||||||
|
|
||||||
my $name = $hash->{NAME};
|
my $name = $hash->{NAME};
|
||||||
my $type = $hash->{TYPE};
|
my $type = $hash->{TYPE};
|
||||||
my $cst = [gettimeofday]; # Zyklus-Startzeit
|
my $cst = [gettimeofday]; # Zyklus-Startzeit
|
||||||
|
|
||||||
RemoveInternalTimer($hash, "FHEM::SolarForecast::centralTask");
|
RemoveInternalTimer($hash, "FHEM::SolarForecast::centralTask");
|
||||||
RemoveInternalTimer($hash, "FHEM::SolarForecast::_writeState");
|
RemoveInternalTimer($hash, "FHEM::SolarForecast::singleUpdateState");
|
||||||
|
|
||||||
### nicht mehr benötigte Readings/Daten löschen - kann später wieder raus !!
|
### nicht mehr benötigte Readings/Daten löschen - kann später wieder raus !!
|
||||||
#for my $i (keys %{$data{$type}{$name}{pvhist}}) {
|
#for my $i (keys %{$data{$type}{$name}{pvhist}}) {
|
||||||
@ -3039,13 +3039,11 @@ sub centralTask {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return if(IsDisabled($name));
|
return if(IsDisabled($name));
|
||||||
|
|
||||||
readingsSingleUpdate($hash, 'state', 'running', 0); # vermeidet 'connection lost ...'
|
|
||||||
|
|
||||||
my $ret = createStringConfig ($hash); # die String Konfiguration erstellen
|
my $ret = createStringConfig ($hash); # die String Konfiguration erstellen
|
||||||
if ($ret) {
|
if ($ret) {
|
||||||
readingsSingleUpdate($hash, 'state', $ret, 1);
|
singleUpdateState ( {hash => $hash, state => $ret, evt => 1} );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3066,7 +3064,8 @@ sub centralTask {
|
|||||||
chour => $chour,
|
chour => $chour,
|
||||||
day => $day,
|
day => $day,
|
||||||
dayname => $dayname,
|
dayname => $dayname,
|
||||||
state => "updated",
|
state => 'running',
|
||||||
|
evt => 0,
|
||||||
daref => \@da
|
daref => \@da
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -3074,6 +3073,9 @@ sub centralTask {
|
|||||||
Log3 ($name, 4, "$name - ### New data collection cycle ###");
|
Log3 ($name, 4, "$name - ### New data collection cycle ###");
|
||||||
Log3 ($name, 4, "$name - ################################################################");
|
Log3 ($name, 4, "$name - ################################################################");
|
||||||
Log3 ($name, 4, "$name - current hour of day: ".($chour+1));
|
Log3 ($name, 4, "$name - current hour of day: ".($chour+1));
|
||||||
|
|
||||||
|
singleUpdateState ($centpars);
|
||||||
|
$centpars->{state} = 'updated';
|
||||||
|
|
||||||
collectAllRegConsumers ($centpars); # alle Verbraucher Infos laden
|
collectAllRegConsumers ($centpars); # alle Verbraucher Infos laden
|
||||||
_specialActivities ($centpars); # zusätzliche Events generieren + Sonderaufgaben
|
_specialActivities ($centpars); # zusätzliche Events generieren + Sonderaufgaben
|
||||||
@ -3114,11 +3116,13 @@ sub centralTask {
|
|||||||
|
|
||||||
createReadingsFromArray ($hash, \@da, $evt); # Readings erzeugen
|
createReadingsFromArray ($hash, \@da, $evt); # Readings erzeugen
|
||||||
|
|
||||||
if ($evt) {
|
if ($evt) {
|
||||||
InternalTimer(gettimeofday()+1, "FHEM::SolarForecast::_writeState", $centpars, 0);
|
$centpars->{evt} = $evt;
|
||||||
|
InternalTimer(gettimeofday()+1, "FHEM::SolarForecast::singleUpdateState", $centpars, 0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
_writeState ($centpars);
|
$centpars->{evt} = 1;
|
||||||
|
singleUpdateState ($centpars);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@ -3128,18 +3132,6 @@ sub centralTask {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
################################################################
|
|
||||||
# "state" updaten
|
|
||||||
################################################################
|
|
||||||
sub _writeState {
|
|
||||||
my $paref = shift;
|
|
||||||
my $hash = $paref->{hash};
|
|
||||||
|
|
||||||
readingsSingleUpdate ($hash, 'state', $paref->{state}, 1); # Abschluß state
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# Erstellen der Stringkonfiguration
|
# Erstellen der Stringkonfiguration
|
||||||
# Stringhash: $data{$type}{$name}{strings}
|
# Stringhash: $data{$type}{$name}{strings}
|
||||||
@ -9512,6 +9504,21 @@ sub createReadingsFromArray {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
################################################################
|
||||||
|
# "state" updaten
|
||||||
|
################################################################
|
||||||
|
sub singleUpdateState {
|
||||||
|
my $paref = shift;
|
||||||
|
|
||||||
|
my $hash = $paref->{hash};
|
||||||
|
my $val = $paref->{state} // 'unknown';
|
||||||
|
my $evt = $paref->{evt} // 0;
|
||||||
|
|
||||||
|
readingsSingleUpdate ($hash, 'state', $val, $evt);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
################################################################
|
################################################################
|
||||||
# alle Readings eines Devices oder nur Reading-Regex
|
# alle Readings eines Devices oder nur Reading-Regex
|
||||||
# löschen
|
# löschen
|
||||||
|
Loading…
x
Reference in New Issue
Block a user