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:
parent
6bef274ea9
commit
6d7bd995bf
@ -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> 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>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user