2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-10 09:16:53 +00:00

76_SolarForecast.pm: contrib 0.9.0

git-svn-id: https://svn.fhem.de/fhem/trunk@23947 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2021-03-13 14:48:27 +00:00
parent 8b0e31caa8
commit 5a3124c863

View File

@ -301,7 +301,10 @@ my $definve = 98.3;
my $kJtokWh = 0.00027778; # Umrechnungsfaktor kJ in kWh
my $defmaxvar = 0.5; # max. Varianz pro Tagesberechnung Autokorrekturfaktor
my $definterval = 70; # Standard Abfrageintervall
my $pvhcache = $attr{global}{modpath}."/FHEM/FhemUtils/PVH_SolarForecast_"; # Filename-Fragment für PV History (wird mit Devicename ergänzt)
my $pvrcache = $attr{global}{modpath}."/FHEM/FhemUtils/PVR_SolarForecast_"; # Filename-Fragment für PV Real (wird mit Devicename ergänzt)
my $calcmaxd = 30; # Anzahl Tage für Durchschnittermittlung zur Vorhersagekorrektur
my @dwdattrmust = qw(Rad1h TTT Neff R101 ww SunUp SunRise SunSet); # Werte die im Attr forecastProperties des DWD_Opendata Devices mindestens gesetzt sein müssen
my $whistrepeat = 900; # Wiederholungsintervall Schreiben historische Daten
@ -401,26 +404,51 @@ sub Define {
createNotifyDev ($hash);
my $file = $pvhcache.$name;
my ($error, @content) = FileRead ($file); # Cache File der PV History lesen wenn vorhanden
my $file = $pvhcache.$name; # Cache File PV History lesen wenn vorhanden
my $cachename = "pvhist";
$params->{file} = $file;
$params->{cachename} = $cachename;
_readCacheFile ($params);
$file = $pvrcache.$name; # Cache File PV Real lesen wenn vorhanden
$cachename = "pvreal";
$params->{file} = $file;
$params->{cachename} = $cachename;
_readCacheFile ($params);
readingsSingleUpdate($hash, "state", "initialized", 1);
centralTask ($hash); # Einstieg in Abfrage
InternalTimer (gettimeofday()+$whistrepeat, "FHEM::SolarForecast::periodicWriteCachefiles", $hash, 0); # Einstieg periodisches Schreiben historische Daten
return;
}
################################################################
# Cachefile lesen
################################################################
sub _readCacheFile {
my $paref = shift;
my $hash = $paref->{hash};
my $file = $paref->{file};
my $cachename = $paref->{cachename};
my $name = $hash->{NAME};
my ($error, @content) = FileRead ($file); # Cache File lesen wenn vorhanden
if(!$error) {
my $json = join "", @content;
my $success = evaljson ($hash, $json);
if($success) {
$data{$type}{$name}{pvhist} = decode_json ($json);
$data{$hash->{TYPE}}{$name}{$cachename} = decode_json ($json);
}
else {
Log3($name, 2, qq{$name - WARNING - the content of file "$file" is not readable and may be corrupt});
}
}
readingsSingleUpdate($hash, "state", "initialized", 1);
centralTask ($hash); # Einstieg in Abfrage
InternalTimer (gettimeofday()+$whistrepeat, "FHEM::SolarForecast::periodicWriteHistFile", $hash, 0); # Einstieg periodisches Schreiben historische Daten
return;
}
@ -770,8 +798,11 @@ return;
sub _setwriteHistory { ## no critic "not used"
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
my $ret = periodicWriteHistFile ($hash);
my $ret = writeCacheToFile ($hash, "pvhist", $pvhcache.$name); # Cache File für PV History schreiben
writeCacheToFile ($hash, "pvreal", $pvrcache.$name); # Cache File für PV Real schreiben
return $ret;
}
@ -955,7 +986,8 @@ sub Shutdown {
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
writeHistoryToFile ($hash); # Cache File für PV History schreiben
writeCacheToFile ($hash, "pvhist", $pvhcache.$name); # Cache File für PV History schreiben
writeCacheToFile ($hash, "pvreal", $pvrcache.$name); # Cache File für PV Real schreiben
return;
}
@ -1148,16 +1180,17 @@ return $interval;
################################################################
# Timer für historische Daten schreiben
################################################################
sub periodicWriteHistFile {
sub periodicWriteCachefiles {
my $hash = shift;
my $name = $hash->{NAME};
RemoveInternalTimer($hash, "FHEM::SolarForecast::periodicWriteHistFile");
InternalTimer (gettimeofday()+$whistrepeat, "FHEM::SolarForecast::periodicWriteHistFile", $hash, 0);
RemoveInternalTimer($hash, "FHEM::SolarForecast::periodicWriteCachefiles");
InternalTimer (gettimeofday()+$whistrepeat, "FHEM::SolarForecast::periodicWriteCachefiles", $hash, 0);
return if(IsDisabled($name));
writeHistoryToFile ($hash); # Cache File für PV History schreiben
writeCacheToFile ($hash, "pvhist", $pvhcache.$name); # Cache File für PV History schreiben
writeCacheToFile ($hash, "pvreal", $pvrcache.$name); # Cache File für PV Real schreiben
return;
}
@ -1165,19 +1198,19 @@ return;
################################################################
# historische Daten in File wegschreiben
################################################################
sub writeHistoryToFile {
sub writeCacheToFile {
my $hash = shift;
my $cachename = shift;
my $file = shift;
my $name = $hash->{NAME};
my $type = $hash->{TYPE};
if($data{$type}{$name}{pvhist}) {
my @pvh;
my $json = encode_json ($data{$type}{$name}{pvhist});
my $json = encode_json ($data{$type}{$name}{$cachename});
push @pvh, $json;
my $file = $pvhcache.$name;
my $error = FileWrite($file, @pvh);
if ($error) {
@ -1187,8 +1220,7 @@ sub writeHistoryToFile {
}
else {
my $lw = gettimeofday();
$hash->{HISTFILE} = "last write time: ".FmtTime($lw)." File: $file";
}
$hash->{HISTFILE} = "last write time: ".FmtTime($lw)." File: $file" if($cachename eq "pvhist");
}
return;