2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-02 00:48:53 +00:00

76_SolarForecast.pm: contrib 0.70.1

git-svn-id: https://svn.fhem.de/fhem/trunk@26537 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2022-10-15 08:50:33 +00:00
parent 566d148388
commit d8b95ee03d

View File

@ -27,7 +27,7 @@ use strict;
use warnings;
use POSIX;
use GPUtils qw(GP_Import GP_Export); # wird für den Import der FHEM Funktionen aus der fhem.pl benötigt
use Time::HiRes qw(gettimeofday);
use Time::HiRes qw(gettimeofday tv_interval);
eval "use FHEM::Meta;1" or my $modMetaAbsent = 1; ## no critic 'eval'
eval "use FHEM::Utility::CTZ qw(:all);1" or my $ctzAbsent = 1; ## no critic 'eval'
@ -126,6 +126,7 @@ BEGIN {
# Versions History intern
my %vNotesIntern = (
"0.70.1 "=> "14.10.2022 new function setTimeTracking ",
"0.70.0 "=> "13.10.2022 delete Attr solCastPercentile, new manual Setter pvSolCastPercentile_XX ",
"0.69.0 "=> "12.10.2022 Autocorrection function for model SolCast-API, __solCast_ApiRequest: request only 48 hours ",
"0.68.7 "=> "07.10.2022 new function _calcCAQwithSolCastPercentil, check missed modules in _getRoofTopData ",
@ -1861,6 +1862,9 @@ sub _getRoofTopData {
$paref->{allstrings} = ReadingsVal($name, "inverterStrings", "");
my $type = $hash->{TYPE};
delete $data{$type}{$name}{current}{runTimeAPIResponseProc};
__solCast_ApiRequest ($paref);
return;
@ -1942,6 +1946,8 @@ sub __solCast_ApiResponse {
my $t = time;
my ($msg,$starttmstr);
my $sta = [gettimeofday]; # Start Response Verarbeitung
if ($err ne "") {
$msg = 'SolCast API server response: '.$err;
@ -1949,7 +1955,10 @@ sub __solCast_ApiResponse {
Log3 ($name, 2, "$name - $msg");
$data{$type}{$name}{solcastapi}{'?All'}{'?All'}{response_message} = $err;
readingsSingleUpdate($hash, "state", $msg, 1);
$data{$type}{$name}{current}{runTimeAPIResponseProc} += sprintf "%.4f", tv_interval($sta); # API Laufzeit ermitteln
return;
}
elsif ($myjson ne "") { # Evaluiere ob Daten im JSON-Format empfangen wurden
@ -1961,6 +1970,7 @@ sub __solCast_ApiResponse {
Log3 ($name, 2, "$name - $msg");
readingsSingleUpdate($hash, "state", $msg, 1);
$data{$type}{$name}{current}{runTimeAPIResponseProc} += sprintf "%.4f", tv_interval($sta); # API Laufzeit ermitteln
return;
}
@ -1987,16 +1997,19 @@ sub __solCast_ApiResponse {
___setLastAPIcallKeyData ($hash, $t);
$data{$type}{$name}{solcastapi}{'?All'}{'?All'}{response_message} = $jdata->{'response_status'}{'message'};
readingsSingleUpdate($hash, "state", $msg, 1);
$data{$type}{$name}{current}{runTimeAPIResponseProc} += sprintf "%.4f", tv_interval($sta); # API Laufzeit ermitteln
return;
}
my $k = 0;
while ($jdata->{'forecasts'}[$k]) { # vorhandene Startzeiten Schlüssel im SolCast API Hash löschen
my $petstr = $jdata->{'forecasts'}[$k]{'period_end'};
while ($jdata->{'forecasts'}[$k]) { # vorhandene Startzeiten Schlüssel im SolCast API Hash löschen
my $petstr = $jdata->{'forecasts'}[$k]{'period_end'};
if(!$k && $petstr =~ /T\d{2}:00/xs) { # ersten Datensatz überspringen wenn period_end auf volle Stunde fällt (es fehlt dann der erste Teil der Stunde)
if(!$k && $petstr =~ /T\d{2}:00/xs) { # ersten Datensatz überspringen wenn period_end auf volle Stunde fällt (es fehlt dann der erste Teil der Stunde)
$k += 1;
next;
}
@ -2015,7 +2028,7 @@ sub __solCast_ApiResponse {
while ($jdata->{'forecasts'}[$k]) {
my $petstr = $jdata->{'forecasts'}[$k]{'period_end'};
if(!$k && $petstr =~ /T\d{2}:00/xs) { # ersten Datanesatz überspringen wenn period_end auf volle Stunde fällt (es fehlt dann der erste Teil der Stunde)
if(!$k && $petstr =~ /T\d{2}:00/xs) { # ersten Datanesatz überspringen wenn period_end auf volle Stunde fällt (es fehlt dann der erste Teil der Stunde)
$k += 1;
next;
}
@ -2035,7 +2048,7 @@ sub __solCast_ApiResponse {
return;
}
if($debug) { # nur für Debugging
if($debug) { # nur für Debugging
if (exists $data{$type}{$name}{solcastapi}{$string}{$starttmstr}) {
Log (1, qq{DEBUG> $name SolCast API Hash - Start Date/Time: }. $starttmstr);
Log (1, qq{DEBUG> $name SolCast API Hash - pv_estimate50 add: }.(sprintf "%.0f", ($pvest50 * ($period/60) * 1000)).qq{, contains already: }.SolCastAPIVal ($hash, $string, $starttmstr, 'pv_estimate50', 0));
@ -2075,6 +2088,8 @@ sub __solCast_ApiResponse {
allstrings => $allstrings
};
$data{$type}{$name}{current}{runTimeAPIResponseProc} += sprintf "%.4f", tv_interval($sta); # API Laufzeit ermitteln
return &$caller($param);
}
@ -2740,7 +2755,9 @@ return @pvconf;
sub centralTask {
my $hash = shift;
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
my $type = $hash->{TYPE};
my $cst = [gettimeofday]; # Zyklus-Startzeit
RemoveInternalTimer($hash, "FHEM::SolarForecast::centralTask");
@ -2859,6 +2876,8 @@ sub centralTask {
InternalTimer(gettimeofday()+5, "FHEM::SolarForecast::centralTask", $hash, 0);
}
setTimeTracking ($hash, $cst, 'runTimeCycleSummary'); # Zyklus-Laufzeit ermitteln
return;
}
@ -8056,7 +8075,7 @@ sub _calcCAQwithSolCastPercentil {
$data{$type}{$name}{circular}{sprintf("%02d",$h)}{pvcorrf}{percentile} = $perc; # bestes Percentil für die jeweilige Stunde speichern
$data{$type}{$name}{circular}{sprintf("%02d",$h)}{quality}{percentile} = $dnum; # Percentil Qualität
push @$daref, "pvSolCastPercentile_".sprintf("%02d",$h)."<>".$perc." (automatic - old percentile: $oldperc)";
push @$daref, "pvSolCastPercentile_".sprintf("%02d",$h)."<>".$perc." (automatic - old percentile: $oldperc, average days: $dnum)";
push @$daref, "pvSolCastPercentile_".sprintf("%02d",$h)."_autocalc<>done";
}
@ -9179,6 +9198,22 @@ sub setModel {
return;
}
################################################################
# Laufzeit Ergebnis erfassen und speichern
################################################################
sub setTimeTracking {
my $hash = shift;
my $st = shift; # Startzeitstempel
my $tkn = shift; # Name des Zeitschlüssels
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
$data{$type}{$name}{current}{$tkn} = sprintf "%.4f", tv_interval($st);
return;
}
################################################################
# Funktion liefert 1 wenn Consumer physisch "eingeschaltet"
# ist, d.h. der Wert onreg des Readings rswstate wahr ist