2
0
mirror of https://github.com/fhem/fhem-mirror.git synced 2025-05-03 07:35:22 +00:00

76_SolarForecast: contrib 0.82.1

git-svn-id: https://svn.fhem.de/fhem/trunk@27940 2b470e98-0d58-463d-a4d8-8e2adae1ed80
This commit is contained in:
nasseeder1 2023-09-08 19:04:30 +00:00
parent 6bef274ea9
commit 6d7bd995bf

View File

@ -916,8 +916,8 @@ my %hcsr = (
# $data{$type}{$name}{strings} # Stringkonfiguration Hash # $data{$type}{$name}{strings} # Stringkonfiguration Hash
# $data{$type}{$name}{solcastapi} # Zwischenspeicher API-Daten # $data{$type}{$name}{solcastapi} # Zwischenspeicher API-Daten
# $data{$type}{$name}{aidectree}{object} # AI Decision Tree Object # $data{$type}{$name}{aidectree}{object} # AI Decision Tree Object
# $data{$type}{$name}{aidectree}{aitrained} # AI Decision Tree trainierte Daten # {aidectree}{aitrained} # AI Decision Tree trainierte Daten
# $data{$type}{$name}{aidectree}{airaw} # Rohdaten für AI Input = Raw Trainigsdaten # {aidectree}{airaw} # Rohdaten für AI Input = Raw Trainigsdaten
################################################################ ################################################################
# Init Fn # Init Fn
@ -1111,6 +1111,10 @@ sub Define {
$params->{cachename} = 'aitrained'; $params->{cachename} = 'aitrained';
_readCacheFile ($params); _readCacheFile ($params);
$params->{file} = $airaw.$name; # AI Rawdaten File einlesen wenn vorhanden
$params->{cachename} = 'airaw';
_readCacheFile ($params);
singleUpdateState ( {hash => $hash, state => 'initialized', evt => 1} ); singleUpdateState ( {hash => $hash, state => 'initialized', evt => 1} );
centralTask ($hash); # Einstieg in Abfrage centralTask ($hash); # Einstieg in Abfrage
@ -1147,6 +1151,18 @@ sub _readCacheFile {
return; return;
} }
if ($cachename eq 'airaw') {
my ($err, $data) = fileRetrieve ($file);
if (!$err && $data) {
$data{$type}{$name}{aidectree}{airaw} = $data;
$data{$type}{$name}{current}{aitrawstate} = 'ok';
Log3($name, 3, qq{$name - cached data "$cachename" restored});
}
return;
}
my ($error, @content) = FileRead ($file); my ($error, @content) = FileRead ($file);
if(!$error) { if(!$error) {
@ -1265,11 +1281,9 @@ sub Set {
## KI spezifische Setter ## KI spezifische Setter
########################## ##########################
my $aiist = CurrentVal ($hash, 'aiinitstate', ''); if (isDWDUsed ($hash)) {
#if ($aiist eq 'ok') {
$setlist .= "aiDecTree:addInstances,addRawData,train "; $setlist .= "aiDecTree:addInstances,addRawData,train ";
#} }
my $params = { my $params = {
hash => $hash, hash => $hash,
@ -2086,11 +2100,20 @@ sub _setreset { ## no critic "not used"
delete $data{$type}{$name}{current}{aitrainstate}; delete $data{$type}{$name}{current}{aitrainstate};
delete $data{$type}{$name}{current}{aiaddistate}; delete $data{$type}{$name}{current}{aiaddistate};
delete $data{$type}{$name}{current}{aigetresult}; delete $data{$type}{$name}{current}{aigetresult};
#my $dtree = AiDetreeVal ($hash, 'object', undef);
#if ($dtree) { my @ftd = ( $airaw.$name,
$aitrained.$name
);
for my $f (@ftd) {
my $err = FileDelete($f);
if ($err) {
Log3 ($name, 1, qq{$name - Message while deleting file "$f": $err});
}
}
aiInit ($paref); aiInit ($paref);
#}
return; return;
} }
@ -2352,9 +2375,9 @@ sub Get {
## KI spezifische Getter ## KI spezifische Getter
########################## ##########################
my $aiist = CurrentVal ($hash, 'aiinitstate', ''); my $airst = CurrentVal ($hash, 'aitrawstate', '');
if ($aiist eq 'ok') { if ($airst eq 'ok') {
$getlist .= "valDecTree:aiRawData "; $getlist .= "valDecTree:aiRawData ";
} }
@ -4226,10 +4249,6 @@ sub Shutdown {
writeCacheToFile ($hash, "consumers", $csmcache.$name); # Cache File Consumer schreiben writeCacheToFile ($hash, "consumers", $csmcache.$name); # Cache File Consumer schreiben
writeCacheToFile ($hash, "solcastapi", $scpicache.$name); # Cache File SolCast API Werte schreiben writeCacheToFile ($hash, "solcastapi", $scpicache.$name); # Cache File SolCast API Werte schreiben
if (CurrentVal ($hash, 'aitrainstate', '') eq 'ok') {
writeCacheToFile ($hash, "aidectree", $aitrained.$name); # AI Cache schreiben
}
return; return;
} }
@ -4271,6 +4290,7 @@ sub Delete {
$plantcfg.$name, $plantcfg.$name,
$csmcache.$name, $csmcache.$name,
$scpicache.$name, $scpicache.$name,
$airaw.$name,
$aitrained.$name $aitrained.$name
); );
@ -8600,7 +8620,7 @@ sub _graphicHeader {
## KI Status ## KI Status
############## ##############
my $aiist = CurrentVal ($hash, 'aiinitstate', ''); my $aiist = CurrentVal ($hash, 'aiinitstate', 'ok');
my $aitst = CurrentVal ($hash, 'aitrainstate', 'ok'); my $aitst = CurrentVal ($hash, 'aitrainstate', 'ok');
my $aiast = CurrentVal ($hash, 'aiaddistate', 'ok'); my $aiast = CurrentVal ($hash, 'aiaddistate', 'ok');
@ -10297,8 +10317,7 @@ sub _addHourAiInstance {
$paref->{ood} = 1; $paref->{ood} = 1;
$paref->{rho} = $rho; $paref->{rho} = $rho;
aiAddInstance ($paref); # AI Instanz hinzufügen aiAddRawData ($paref); # Raw Daten für AI hinzufügen und sichern
aiAddRawData ($paref);
delete $paref->{ood}; delete $paref->{ood};
delete $paref->{rho}; delete $paref->{rho};
@ -10542,15 +10561,14 @@ return $hdv;
} }
################################################################ ################################################################
# KI Instanz hinzufügen # KI Instanz(en) aus Raw Daten Hash
# $data{$type}{$name}{aidectree}{airaw} hinzufügen
################################################################ ################################################################
sub aiAddInstance { ## no critic "not used" sub aiAddInstance { ## no critic "not used"
my $paref = shift; my $paref = shift;
my $hash = $paref->{hash}; my $hash = $paref->{hash};
my $name = $paref->{name}; my $name = $paref->{name};
my $type = $paref->{type}; my $type = $paref->{type};
my $ood = $paref->{ood} // 0; # only one (cuurent) day
my $rho = $paref->{rho}; # only this hour of day
my $taa = $paref->{taa}; # do train after add my $taa = $paref->{taa}; # do train after add
return if(!isDWDUsed ($hash)); return if(!isDWDUsed ($hash));
@ -10564,35 +10582,24 @@ sub aiAddInstance { ## no critic "not used"
$dtree = AiDetreeVal ($hash, 'object', undef); $dtree = AiDetreeVal ($hash, 'object', undef);
} }
my ($pvrl, $temp, $wcc, $wrp, $rad1h); for my $idx (sort keys %{$data{$type}{$name}{aidectree}{airaw}}) {
next if(!$idx);
for my $pvd (sort keys %{$data{$type}{$name}{pvhist}}) { my $pvrl = AiRawdataVal ($hash, $idx, 'pvrl', undef);
next if(!$pvd);
if ($ood) {
next if($pvd ne $paref->{day});
}
for my $hod (sort keys %{$data{$type}{$name}{pvhist}{$pvd}}) {
next if($hod eq '99' || ($rho && $hod ne $rho));
$pvrl = HistoryVal ($hash, $pvd, $hod, 'pvrl', undef);
next if(!defined $pvrl); next if(!defined $pvrl);
$rad1h = HistoryVal ($hash, $pvd, $hod, 'rad1h', undef); my $hod = AiRawdataVal ($hash, $idx, 'hod', undef);
next if(!defined $rad1h); next if(!defined $hod);
$temp = HistoryVal ($hash, $pvd, $hod, 'temp', 20); my $rad1h = AiRawdataVal ($hash, $idx, 'rad1h', 0);
$wcc = HistoryVal ($hash, $pvd, $hod, 'wcc', 0); my $temp = AiRawdataVal ($hash, $idx, 'temp', 20);
$wrp = HistoryVal ($hash, $pvd, $hod, 'wrp', 0); my $wcc = AiRawdataVal ($hash, $idx, 'wcc', 0);
my $wrp = AiRawdataVal ($hash, $idx, 'wrp', 0);
my $tbin = temp2bin ($temp);
my $cbin = cloud2bin ($wcc);
my $rbin = rain2bin ($wrp);
eval { $dtree->add_instance (attributes => { rad1h => $rad1h, eval { $dtree->add_instance (attributes => { rad1h => $rad1h,
temp => $tbin, temp => $temp,
wcc => $cbin, wcc => $wcc,
wrp => $rbin, wrp => $wrp,
hod => $hod hod => $hod
}, },
result => $pvrl result => $pvrl
@ -10603,12 +10610,11 @@ sub aiAddInstance { ## no critic "not used"
return; return;
}; };
debugLog ($paref, 'aiProcess', qq{AI Instance added - day: $pvd, hod: $hod, rad1h: $rad1h, pvrl: $pvrl, wcc: $cbin, wrp: $rbin, temp: $tbin}); debugLog ($paref, 'aiProcess', qq{AI Instance added - hod: $hod, rad1h: $rad1h, pvrl: $pvrl, wcc: $wcc, wrp: $wrp, temp: $temp});
} }
$data{$type}{$name}{aidectree}{object} = $dtree; $data{$type}{$name}{aidectree}{object} = $dtree;
$data{$type}{$name}{current}{aiaddistate} = 'ok'; $data{$type}{$name}{current}{aiaddistate} = 'ok';
}
if ($taa) { if ($taa) {
aiTrain ($paref); aiTrain ($paref);
@ -10645,7 +10651,7 @@ sub aiTrain { ## no critic "not used"
}; };
$data{$type}{$name}{aidectree}{aitrained} = $dtree; $data{$type}{$name}{aidectree}{aitrained} = $dtree;
$err = writeCacheToFile ($hash, 'aitrained', $aitrained.$name); # AI Cache schreiben $err = writeCacheToFile ($hash, 'aitrained', $aitrained.$name);
if (!$err) { if (!$err) {
debugLog ($paref, 'aiData', qq{AI trained: }.Dumper $data{$type}{$name}{aidectree}{aitrained}); debugLog ($paref, 'aiData', qq{AI trained: }.Dumper $data{$type}{$name}{aidectree}{aitrained});
@ -10670,9 +10676,7 @@ sub aiGetResult { ## no critic "not used"
my $hod = $paref->{hod}; my $hod = $paref->{hod};
my $nhidx = $paref->{nhidx}; my $nhidx = $paref->{nhidx};
my $err = 'no decition delivered'; return 'no AI decition possible' if(!isDWDUsed ($hash) || !$hod || !$nhidx);
return $err if(!isDWDUsed ($hash) || !$hod || !$nhidx);
my $dtree = AiDetreeVal ($hash, 'aitrained', undef); my $dtree = AiDetreeVal ($hash, 'aitrained', undef);
@ -10712,7 +10716,7 @@ sub aiGetResult { ## no critic "not used"
return ('', $pvaifc); return ('', $pvaifc);
} }
return $err; return 'no decition delivered';
} }
################################################################ ################################################################
@ -10724,6 +10728,8 @@ sub aiInit { ## no critic "not used"
my $name = $paref->{name}; my $name = $paref->{name};
my $type = $paref->{type}; my $type = $paref->{type};
return if(!isDWDUsed ($hash));
my $err; my $err;
if ($aidtabs || $t2sabs) { if ($aidtabs || $t2sabs) {
@ -10769,7 +10775,7 @@ sub aiAddRawData { ## no critic "not used"
my $ood = $paref->{ood} // 0; # only one (cuurent) day my $ood = $paref->{ood} // 0; # only one (cuurent) day
my $rho = $paref->{rho}; # only this hour of day my $rho = $paref->{rho}; # only this hour of day
my ($pvrl, $temp, $wcc, $wrp, $rad1h); delete $data{$type}{$name}{current}{aitrawstate};
for my $pvd (sort keys %{$data{$type}{$name}{pvhist}}) { for my $pvd (sort keys %{$data{$type}{$name}{pvhist}}) {
next if(!$pvd); next if(!$pvd);
@ -10782,15 +10788,15 @@ sub aiAddRawData { ## no critic "not used"
my $ridx = aiMakeIdxRaw ($pvd, $hod); my $ridx = aiMakeIdxRaw ($pvd, $hod);
$pvrl = HistoryVal ($hash, $pvd, $hod, 'pvrl', undef); my $pvrl = HistoryVal ($hash, $pvd, $hod, 'pvrl', undef);
next if(!$pvrl); next if(!$pvrl);
$rad1h = HistoryVal ($hash, $pvd, $hod, 'rad1h', undef); my $rad1h = HistoryVal ($hash, $pvd, $hod, 'rad1h', undef);
next if(!$rad1h); next if(!$rad1h);
$temp = HistoryVal ($hash, $pvd, $hod, 'temp', 20); my $temp = HistoryVal ($hash, $pvd, $hod, 'temp', 20);
$wcc = HistoryVal ($hash, $pvd, $hod, 'wcc', 0); my $wcc = HistoryVal ($hash, $pvd, $hod, 'wcc', 0);
$wrp = HistoryVal ($hash, $pvd, $hod, 'wrp', 0); my $wrp = HistoryVal ($hash, $pvd, $hod, 'wrp', 0);
my $tbin = temp2bin ($temp); my $tbin = temp2bin ($temp);
my $cbin = cloud2bin ($wcc); my $cbin = cloud2bin ($wcc);
@ -10810,6 +10816,7 @@ sub aiAddRawData { ## no critic "not used"
my $err = writeCacheToFile ($hash, 'airaw', $airaw.$name); my $err = writeCacheToFile ($hash, 'airaw', $airaw.$name);
if (!$err) { if (!$err) {
$data{$type}{$name}{current}{aitrawstate} = 'ok';
debugLog ($paref, 'aiProcess', qq{AI raw data saved into file: }.$airaw.$name); debugLog ($paref, 'aiProcess', qq{AI raw data saved into file: }.$airaw.$name);
} }
@ -13586,14 +13593,18 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
<a id="SolarForecast-set-aiDecTree"></a> <a id="SolarForecast-set-aiDecTree"></a>
<li><b>aiDecTree </b> <br><br> <li><b>aiDecTree </b> <br><br>
Ist der KI Support im SolarForecast Device aktiviert, können mit verschiedene KI-Aktionen ausgeführt werden: Ist der KI Support im SolarForecast Device aktiviert, können verschiedene KI-Aktionen manuell ausgeführt werden.
Die manuelle Ausführung der KI Aktionen ist im Allgemeinen nicht notwendig, da die Abarbeitung aller nötigen Schritte
bereits automatisch im Modul vorgenommen wird.
<br><br> <br><br>
<ul> <ul>
<table> <table>
<colgroup> <col width="15%"> <col width="85%"> </colgroup> <colgroup> <col width="10%"> <col width="90%"> </colgroup>
<tr><td> <b>addInstances</b> </td><td>Die KI wird mit den aktuell gespeicherten PV- und Wetterdaten angereichert. </td></tr> <tr><td> <b>addInstances</b> </td><td>- Die KI wird mit den aktuell vorhandenen PV-, Strahlungs- und Umweltdaten angereichert. </td></tr>
<tr><td> <b>train</b> </td><td>Die KI wird mit neu hinzugefügten Daten trainiert. Bei Erfolg werden die Entscheidungsdaten im Filesystem gespeichert. </td></tr> <tr><td> <b>addRawData</b> </td><td>- Relevante PV-, Strahlungs- und Umweltdaten werden extrahiert und für die spätere Verwendung gespeichert. </td></tr>
<tr><td> <b>train</b> </td><td>- Die KI wird mit den verfügbaren Daten trainiert. </td></tr>
<tr><td> </td><td>&nbsp;&nbsp;Erfolgreich generierte Entscheidungsdaten werden im Filesystem gespeichert. </td></tr>
</table> </table>
</ul> </ul>
</li> </li>
@ -14420,6 +14431,23 @@ die ordnungsgemäße Anlagenkonfiguration geprüft werden.
</ul> </ul>
<br> <br>
<ul>
<a id="SolarForecast-get-valDecTree"></a>
<li><b>valDecTree </b> <br><br>
Ist der KI Support im SolarForecast Device aktiviert, können verschiedene KI relevante Daten angezeigt werden:
<br><br>
<ul>
<table>
<colgroup> <col width="15%"> <col width="95%"> </colgroup>
<tr><td> <b>aiRawData</b> </td><td>- Die aktuell für die KI gespeicherten PV-, Strahlungs- und Umweltdaten. </td></tr>
</table>
</ul>
</li>
</ul>
<br>
</ul> </ul>
<br> <br>