2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-03-13 17:26:34 +00:00

76_SolarForecast.pm: contrib 0.3.0

git-svn-id: https://svn.fhem.de/fhem/trunk@23594 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2021-01-23 11:46:54 +00:00
parent 2c198174f3
commit 1ee051e6dc

View File

@ -38,6 +38,7 @@ eval "use JSON;1;" or my $jsonabs = "JSON"; ## no critic 'eval' #
use FHEM::SynoModules::SMUtils qw( evaljson
moduleVersion
trim
); # Hilfsroutinen Modul
use Data::Dumper;
@ -293,6 +294,7 @@ my $defmaxvar = 0.5;
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 $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 $cloudslope = 0.55; # Steilheit des Korrekturfaktors bzgl. effektiver Bewölkung, siehe: https://www.energie-experten.org/erneuerbare-energien/photovoltaik/planung/sonnenstunden
my $cloud_base = 0; # Fußpunktverschiebung bzgl. effektiver Bewölkung
@ -939,8 +941,12 @@ sub centralTask {
daref => \@da
};
Log3 ($name, 5, "$name - ################################################################");
Log3 ($name, 5, "$name - ### New data collection cycle ###");
Log3 ($name, 5, "$name - ################################################################");
_transferDWDForecastValues ($params); # Forecast Werte übertragen
_transWeatherValues ($params); # Wetterwerte übertragen
_transferWeatherValues ($params); # Wetterwerte übertragen
_transferInverterValues ($params); # WR Werte übertragen
_transferMeterValues ($params);
@ -988,6 +994,11 @@ sub _transferDWDForecastValues {
my ($time_str,$epoche);
my @aneeded = checkdwdattr ($fcname);
if (@aneeded) {
Log3($name, 2, qq{$name - ERROR - the attribute "forecastProperties" of device "$fcname" needs to contain: }.join ",",@aneeded);
}
# deleteReadingspec ($hash, "NextHour.*");
for my $num (0..47) {
@ -1033,7 +1044,7 @@ return;
################################################################
# Wetter Werte aus dem angebenen Wetterdevice extrahieren
################################################################
sub _transWeatherValues {
sub _transferWeatherValues {
my $paref = shift;
my $hash = $paref->{hash};
my $name = $paref->{name};
@ -1090,7 +1101,7 @@ sub _transWeatherValues {
my $txt = ReadingsVal($fcname, "fc${fd}_${fh}_wwd", '');
Log3($name, 5, "$name - collect Weather data: device=$fcname, wid=fc${fd}_${fh}_ww, val=$wid, txt=$txt, cc=$neff");
Log3($name, 5, "$name - collect Weather data: device=$fcname, wid=fc${fd}_${fh}_ww, val=$wid, txt=$txt, cc=$neff, rp=$r101");
$hash->{HELPER}{"${time_str}_WeatherId"} = $wid;
$hash->{HELPER}{"${time_str}_WeatherTxt"} = $txt;
@ -2150,6 +2161,25 @@ sub TimeAdjust {
}
}
################################################################
# benötigte Attribute im DWD Device checken
################################################################
sub checkdwdattr {
my $dwddev = shift;
my @fcprop = map { trim($_) } split ",", AttrVal($dwddev, "forecastProperties", "pattern");
# my @trimed = map { trim($_) } @fcprop;
my @aneeded;
for my $am (@dwdattrmust) {
next if($am ~~ @fcprop);
push @aneeded, $am;
}
return @aneeded;
}
##################################################################################################
# PV Forecast Rad1h in kWh / Wh
# Für die Umrechnung in einen kWh/Wh-Wert benötigt man einen entsprechenden Faktorwert: