From 22848bf095a575518f18169a923f236b7ba7da1c Mon Sep 17 00:00:00 2001 From: nasseeder1 Date: Thu, 14 Sep 2023 20:47:57 +0000 Subject: [PATCH] 76_SolarForecast: contrib 0.82.3 git-svn-id: https://svn.fhem.de/fhem/trunk@27963 2b470e98-0d58-463d-a4d8-8e2adae1ed80 --- fhem/contrib/DS_Starter/76_SolarForecast.pm | 110 +++++++++++--------- 1 file changed, 60 insertions(+), 50 deletions(-) diff --git a/fhem/contrib/DS_Starter/76_SolarForecast.pm b/fhem/contrib/DS_Starter/76_SolarForecast.pm index c829341a8..b02e41b06 100644 --- a/fhem/contrib/DS_Starter/76_SolarForecast.pm +++ b/fhem/contrib/DS_Starter/76_SolarForecast.pm @@ -42,7 +42,6 @@ use utf8; use HttpUtils; eval "use JSON;1;" or my $jsonabs = 'JSON'; ## no critic 'eval' # Debian: sudo apt-get install libjson-perl eval "use AI::DecisionTree;1;" or my $aidtabs = 'AI::DecisionTree'; ## no critic 'eval' -eval "use Test2::Tools::Class qw(isa_ok);1;" or my $t2sabs = 'Test2::Suite'; ## no critic 'eval' # Debian: sudo apt-get install libtest2-suite-perl use FHEM::SynoModules::SMUtils qw( evaljson @@ -140,6 +139,8 @@ BEGIN { # Versions History intern my %vNotesIntern = ( + "0.82.3" => "14.09.2023 more mouse over information in graphic header, ai support in autocorrection selectable ". + "substitute use of Test2::Suite ", "0.82.2" => "11.09.2023 activate implementation of DWD AI support, add runTimeTrainAI ", "0.82.1" => "08.09.2023 rebuild implementation of DWD AI support, some error fixing (FHEM restarts between 0 and 1) ", "0.82.0" => "02.09.2023 first implementation of DWD AI support, new ctrlDebug aiProcess aiData, reset aiData ", @@ -670,7 +671,7 @@ my %hqtxt = ( scnp => { EN => qq{The scheduling of the consumer is not provided}, DE => qq{Die Einplanung des Verbrauchers ist nicht vorgesehen} }, vrmcr => { EN => qq{Please set the Victron VRM Portal credentials with "set LINK vrmCredentials".}, - DE => qq{Bitte setzen sie die Victron VRM Portal Zugangsdaten mit "set LINK vrmCredentials". } }, + DE => qq{Bitte setzen sie die Victron VRM Portal Zugangsdaten mit "set LINK vrmCredentials". } }, awd => { EN => qq{LINK is waiting for solar forecast data ...

(The configuration can be checked with "set LINK plantConfiguration check".)}, DE => qq{LINK wartet auf Solarvorhersagedaten ...

(Die Konfiguration kann mit "set LINK plantConfiguration check" geprüft werden.)} }, strok => { EN => qq{Congratulations 😊, the system configuration is error-free. Please note any information ().}, @@ -716,8 +717,8 @@ my %htitles = ( DE => qq{Aktuelle Zeit liegt innerhalb der Verbrauchsplanung, Vorrangladen Batterie ist aktiv} }, connorec => { EN => qq{Consumption planning is outside current time\n(Click for immediate planning)}, DE => qq{Verbrauchsplanung liegt ausserhalb aktueller Zeit\n(Klick für sofortige Einplanung)} }, - akorron => { EN => qq{Enable auto correction with:\nset pvCorrectionFactor_Auto on*}, - DE => qq{Einschalten Autokorrektur mit:\nset pvCorrectionFactor_Auto on*} }, + akorron => { EN => qq{switched off\nenable auto correction with:\nset pvCorrectionFactor_Auto on*}, + DE => qq{ausgeschaltet\nAutokorrektur einschalten mit:\nset pvCorrectionFactor_Auto on*} }, splus => { EN => qq{PV surplus sufficient}, DE => qq{PV-Überschuß ausreichend} }, nosplus => { EN => qq{PV surplus insufficient}, @@ -742,6 +743,8 @@ my %htitles = ( DE => qq{API Schlüssel existiert nicht} }, scrsdne => { EN => qq{Rooftop site does not exist or is not accessible}, DE => qq{Rooftop ID existiert nicht oder ist nicht abrufbar} }, + norate => { EN => qq{not rated}, + DE => qq{nicht bewertet} }, pstate => { EN => qq{Planning status: \n\nOn: \nOff: \nRemaining lock time:  seconds}, DE => qq{Planungsstatus: \n\nEin: \nAus: \nverbleibende Sperrzeit:  Sekunden} }, ); @@ -1137,10 +1140,9 @@ sub _readCacheFile { my ($err, $dtree) = fileRetrieve ($file); if (!$err && $dtree) { - return if($t2sabs); # Modul Test2::Suite ist nicht installiert - my $valid = isa_ok($dtree, 'AI::DecisionTree'); + my $valid = $dtree->isa('AI::DecisionTree'); - if ($valid == 1) { + if ($valid) { $data{$type}{$name}{aidectree}{aitrained} = $dtree; $data{$type}{$name}{current}{aitrainstate} = 'ok'; Log3($name, 3, qq{$name - cached data "$cachename" restored}); @@ -1250,7 +1252,7 @@ sub Set { "modulePeakString ". "plantConfiguration:check,save,restore ". "powerTrigger:textField-long ". - "pvCorrectionFactor_Auto:on_simple,on_complex,off ". + "pvCorrectionFactor_Auto:on_simple,on_simple_ai,on_complex,on_complex_ai,off ". "reset:$resets ". "writeHistory:noArg ". $cf." " @@ -8543,20 +8545,25 @@ sub _graphicHeader { ## Autokorrektur-Icon ###################### - my $acicon; + my $aciimg; + my $acitit = q{}; + if ($acu =~ /on/xs) { - $acicon = FW_makeImage('10px-kreis-gruen.png', $htitles{on}{$lang}." ($acu)"); + $aciimg = FW_makeImage('10px-kreis-gruen.png', $htitles{on}{$lang}." ($acu)"); } elsif ($acu =~ /standby/ixs) { my $pcfa = ReadingsVal ($name, 'pvCorrectionFactor_Auto', 'off'); my ($rtime) = $pcfa =~ /for (.*?) hours/x; $img = FW_makeImage('10px-kreis-gelb.png', $htitles{dela}{$lang}); - $acicon = "$img (Start in ".$rtime." h)"; + $aciimg = "$img (Start in ".$rtime." h)"; } else { - $htitles{akorron}{$lang} =~ s//$name/xs; - $acicon = FW_makeImage('-', $htitles{akorron}{$lang}); + $acitit = $htitles{akorron}{$lang}; + $acitit =~ s//$name/xs; + $aciimg = '-'; } + + my $acicon = qq{$aciimg}; ## Solare API Sektion ######################## @@ -8659,9 +8666,15 @@ sub _graphicHeader { $pcq < 0.60 ? FW_makeImage ('10px-kreis-rot.png', $pvcanz) : $pcq < 0.80 ? FW_makeImage ('10px-kreis-gelb.png', $pvcanz) : FW_makeImage ('10px-kreis-gruen.png', $pvcanz); - - $pcqimg = "-" if(!$pvfc00 || $pcq == -1); - my $pcqicon = "$pcqimg"; + + my $pcqtit = q(); + + if(!$pvfc00 || $pcq == -1) { + $pcqimg = "-"; + $pcqtit = $htitles{norate}{$lang}; + } + + my $pcqicon = qq{$pcqimg}; ## KI Status ############## @@ -8669,14 +8682,12 @@ sub _graphicHeader { my $aitst = CurrentVal ($hash, 'aitrainstate', 'ok'); my $aihit = NexthoursVal ($hash, 'NextHour00', 'aihit', 0); - my $aitit = $aidtabs ? $hqtxt{aimstt}{$lang} : - $t2sabs ? $hqtxt{aimmts}{$lang} : + my $aitit = $aidtabs ? $hqtxt{aimstt}{$lang} : $aicanuse ne 'ok' ? $hqtxt{ainuse}{$lang} : q{}; - my $aiimg = $aidtabs ? FW_makeImage ('--', $aitit) : - $t2sabs ? FW_makeImage ('--', $aitit) : - $aicanuse ne 'ok' ? FW_makeImage ('-', $aitit) : + my $aiimg = $aidtabs ? '--' : + $aicanuse ne 'ok' ? '-' : $aitst ne 'ok' ? FW_makeImage ('10px-kreis-rot.png', $aitst) : $aihit ? FW_makeImage ('10px-kreis-gruen.png', $hqtxt{aiwhit}{$lang}) : FW_makeImage ('10px-kreis-gelb.png', $hqtxt{aiwook}{$lang}); @@ -10636,8 +10647,8 @@ sub aiAddInstance { ## no critic "not used" my $hod = AiRawdataVal ($hash, $idx, 'hod', undef); next if(!defined $hod); - my $rad1h = AiRawdataVal ($hash, $idx, 'rad1h', undef); - next if(!$rad1h); + my $rad1h = AiRawdataVal ($hash, $idx, 'rad1h', 0); + next if($rad1h <= 0); my $temp = AiRawdataVal ($hash, $idx, 'temp', 20); my $wcc = AiRawdataVal ($hash, $idx, 'wcc', 0); @@ -10725,7 +10736,7 @@ sub aiGetResult { ## no critic "not used" my $hod = $paref->{hod}; my $nhidx = $paref->{nhidx}; - return 'no AI decition possible' if(!isPrepared4AI ($hash) || !$hod || !$nhidx); + return 'no AI decition possible' if(!isPrepared4AI ($hash) || !$hod || !$nhidx); my $dtree = AiDetreeVal ($hash, 'aitrained', undef); @@ -11571,7 +11582,7 @@ sub checkPlantConfig { my $type = $hash->{TYPE}; my $lang = AttrVal ($name, 'ctrlLanguage', AttrVal ('global', 'language', $deflang)); - my $pcf = ReadingsVal ($name, 'pvCorrectionFactor_Auto', ''); + my $pcf = ReadingsVal ($name, 'pvCorrectionFactor_Auto', ''); my $acu = isAutoCorrUsed ($name); my $cf = 0; # config fault: 1 -> Konfig fehlerhaft, 0 -> Konfig ok @@ -11862,13 +11873,6 @@ sub checkPlantConfig { $result->{'Common Settings'}{note} .= qq{If you want use AI support, please install it with e.g. "sudo apt-get install libai-decisiontree-perl".
}; $result->{'Common Settings'}{info} = 1; } - - if ($t2sabs) { - $result->{'Common Settings'}{state} = $info; - $result->{'Common Settings'}{result} .= qq{The Perl module Test2::Suite is missing.
}; - $result->{'Common Settings'}{note} .= qq{If you want use AI support, please install it with e.g. "sudo apt-get install libtest2-suite-perl".
}; - $result->{'Common Settings'}{info} = 1; - } if (!$pcf || $pcf !~ /on/xs) { $result->{'Common Settings'}{state} = $info; @@ -11881,7 +11885,7 @@ sub checkPlantConfig { $result->{'Common Settings'}{note} .= qq{checked parameters:
}; $result->{'Common Settings'}{note} .= qq{pvCorrectionFactor_Auto, event-on-change-reading, ctrlLanguage, global language
}; $result->{'Common Settings'}{note} .= qq{checked Perl modules:
}; - $result->{'Common Settings'}{note} .= qq{AI::DecisionTree, Test2::Suite
}; + $result->{'Common Settings'}{note} .= qq{AI::DecisionTree
}; } } @@ -12311,18 +12315,19 @@ sub isPrepared4AI { my $name = $hash->{NAME}; my $type = $hash->{TYPE}; + my $acu = isAutoCorrUsed ($name); my $err; if(!isDWDUsed ($hash)) { - $err = qq(With the used SolarForecast model it's not possible to use the AI support); + $err = qq(The selected SolarForecast model cannot use the AI support); } elsif ($aidtabs) { $err = qq(The Perl module AI::DecisionTree is missing. Please install it with e.g. "sudo apt-get install libai-decisiontree-perl" for AI support); } - elsif ($t2sabs) { - $err = qq(The Perl module Test2::Suite is missing. Please install it with e.g. "sudo apt-get install libtest2-suite-perl"); - } + elsif ($acu !~ /ai/xs) { + $err = 'the selected autocorrect mode does not contain AI support'; + } if ($err) { $data{$type}{$name}{current}{aicanuse} = $err; @@ -12748,10 +12753,12 @@ sub isAutoCorrUsed { my $cauto = ReadingsVal ($name, 'pvCorrectionFactor_Auto', 'off'); - my $ret = $cauto =~ /on_simple/xs ? 'on_simple' : - $cauto =~ /on_complex/xs ? 'on_complex' : - $cauto =~ /standby/xs ? 'standby' : - $cauto =~ /on/xs ? 'on_simple' : + my $ret = $cauto =~ /on_simple_ai/xs ? 'on_simple_ai' : + $cauto =~ /on_simple/xs ? 'on_simple' : + $cauto =~ /on_complex_ai/xs ? 'on_complex_ai' : + $cauto =~ /on_complex/xs ? 'on_complex' : + $cauto =~ /standby/xs ? 'standby' : + $cauto =~ /on/xs ? 'on_simple' : q{}; return $ret; @@ -14104,18 +14111,22 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.

- on_simple:
+ on_simple(_ai):
Bei dieser Methode wird die stündlich vorhergesagte mit der real erzeugten Energiemenge verglichen und daraus ein für die Zukunft verwendeter Korrekturfaktor für die jeweilige Stunde erstellt. Die von der gewählten API gelieferten Prognosedaten werden nicht zusätzlich mit weiteren Bedingungen wie den Bewölkungszustand oder Temperaturen in - Beziehung gesetzt. + Beziehung gesetzt.
+ Ist die KI-Unterstützung eingeschaltet (on_simple_ai) und wird durch die KI ein PV-Prognosewert geliefert, wird dieser Wert + anstatt des API-Wertes verwendet.

- on_complex:
+ on_complex(_ai):
Bei dieser Methode wird die stündlich vorhergesagte mit der real erzeugten Energiemenge verglichen und daraus ein für die Zukunft verwendeter Korrekturfaktor für die jeweilige Stunde erstellt. Die von der gewählten API gelieferten Prognosedaten werden außerdem zusätzlich mit weiteren Bedingungen wie den Bewölkungszustand oder Temperaturen - verknüpft. + verknüpft.
+ Ist die KI-Unterstützung eingeschaltet (on_complex_ai) und wird durch die KI ein PV-Prognosewert geliefert, wird dieser Wert + anstatt des API-Wertes verwendet.

Hinweis: Die automatische Vorhersagekorrektur ist lernend und benötigt Zeit um die Korrekturwerte zu optimieren. @@ -14157,8 +14168,8 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.

Model VictronKiAPI:
- Dieses Model basiert auf einer KI gestützten Prognose. Eine zusätzliche Autokorrektur wird nicht empfohlen, d.h. - die empfohlene Autokorrekturmethode ist off.

+ Dieses Model basiert auf der KI gestützten API von Victron Energy. + Eine zusätzliche Autokorrektur wird nicht empfohlen, d.h. die empfohlene Autokorrekturmethode ist off.

Model DWD:
Die empfohlene Autokorrekturmethode ist on_complex.

@@ -14538,7 +14549,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden. - + @@ -15346,8 +15357,7 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden. "FHEM::SynoModules::SMUtils": 1.0220, "Time::HiRes": 0, "MIME::Base64": 0, - "Storable": 0, - "Test2::Suite": 0 + "Storable": 0 }, "recommends": { "FHEM::Meta": 0,
aiRawData - Die aktuell für die KI gespeicherten PV-, Strahlungs- und Umweltdaten.
aiRuleStrings - Gibt eine Liste zurück, die den Entscheidungsbaum der KI in Form von Regeln beschreiben.
aiRuleStrings - Gibt eine Liste zurück, die den Entscheidungsbaum der KI in Form von Regeln beschreibt.
  Hinweis: Die Reihenfolge der Regeln ist zwar nicht vorhersehbar, die
  Reihenfolge der Kriterien innerhalb jeder Regel spiegelt jedoch die Reihenfolge
  wider, in der die Kriterien bei der Entscheidungsfindung geprüft werden.