Zitat von: rudolfkoenig am 15 März 2026, 11:03:52Was schwebt Dir vor?Vielleicht sollten wir auch bei Gelegenheit klären, wer "Dir" ist, bzw. wer welche Zielsetzung(en) hat.
.Zitat von: DS_Starter am 15 März 2026, 11:48:03@300P,ZitatDie andere Sache ... zeige mal bitte den Wert von pvInverterCapSum aus "get .. valCurrent".Problem erkannt ... Problem gebanntLiegt im contrib.
Leider erst nach neuem Training aktiviert.
Zitat von: DS_Starter am 15 März 2026, 11:48:03@300P,ZitatDie Peaks kommen (glaub ich) eher von der Wärmepumpe bei der 2-maligen täglichen WW-AufbereitungJa durchaus. Die Rekalibrierung benötigt einen rmse_rel_ratio und bias_var unter einem vorgebénen Schwellenwert.
Sonst ändert man auf einen neuen Bias der zu sehr von den Ausreißern geprägt ist. Die Schwellenwerte beobachte ich aber weiter.
#+ 300P
#+
################################################################
# Attr setupHPDev pu
################################################################
sub _attrHPDev { ## no critic "not used"
my $paref = shift;
my $name = $paref->{name};
my $aVal = $paref->{aVal};
my $aName = $paref->{aName};
return if(!$init_done);
my $hash = $defs{$name};
my $valid = {
hpspf => { comp => '', act => 0 }, ##+ noch nicht aktiv
hptempflow => { comp => '', act => 0 }, ##+ noch nicht aktiv
hptempreturn => { comp => '', act => 0 }, ##+ noch nicht aktiv
hpmodeheat => { comp => '', act => 0 }, ##+
hpmodehwater => { comp => '', act => 0 }, ##+
hpmodedefrost => { comp => '', act => 0 }, ##+
hpmodeoff => { comp => '', act => 0 }, ##+
hpmodecool => { comp => '', act => 0 }, ##+
hpmodepool => { comp => '', act => 0 }, ##+
hpmodepoolheat => { comp => '', act => 0 }, ##+
};
my ($a, $h) = parseParams ($aVal);
if ($paref->{cmd} eq 'set') {
for my $key (keys %{$h}) {
return 'The keys entered must not contain square brackets [...]' if($key =~ /[\[\]]+/xs); # Absturzschutz!
if (!grep /^$key$/, keys %{$valid}) {
return qq{The key '$key' is not a valid key in attribute '$aName'};
}
}
for my $akey (keys %{$h}) {
my $comp = $valid->{$akey}{comp};
if ($comp && $h->{$akey} !~ /^$comp$/xs) {
return "The key '$akey=$h->{$akey}' is not specified correctly. Please refer to the command reference.";
}
my ($dv, $rd, $regex) = split ':', $h->{$akey};
my ($err) = isDeviceValid ( { name => $name, obj => $dv, method => 'string' } );
return $err if($err);
my $val = ReadingsVal ($dv, $rd, undef);
if (!defined $val) {
return "The reading '$rd' of device '$dv' is invalid or doesn't contain a defined value";
}
if (defined $regex) {
$err = checkRegex ($regex);
return "$akey Regex check failed: $err" if($err);
}
}
}
elsif ($paref->{cmd} eq 'del') {
}
InternalTimer (gettimeofday() + 2, 'FHEM::SolarForecast::createAssociatedWith', $hash, 0);
InternalTimer (gettimeofday() + 3, 'FHEM::SolarForecast::writeCacheToFile', [$name, 'plantconfig', $plantcfg.$name], 0); # Anlagenkonfiguration File schreiben
return;
}
################################################################
# Parse setupHPDev 300P
################################################################
sub __parseAttrHPDev { ##+
my $name = shift; ##+
my $hpm = AttrVal ($name, 'setupHPDev', '');##+
return if(!$hpm);##+
my ($pa, $ph) = parseParams ($hpm);##+
##+
my ($hpspfdev, $hpspfrdg) = split (':', $ph->{hpspf}, 2) if(defined $ph->{hpspf});##+
my ($hptempflowdev, $hptempflowrdg) = split (':', $ph->{hptempflow}, 2) if(defined $ph->{hptempflow});##+
my ($hptempreturndev, $hptempreturnrdg) = split (':', $ph->{hptempreturn}, 2) if(defined $ph->{hptempreturn});##+
my ($hpmodeheatdev, $hpmodeheatrdg) = split (':', $ph->{hpmodeheat}, 2) if(defined $ph->{hpmodeheat}); ##+
my ($hpmodehwaterdev, $hpmodehwaterrdg) = split (':', $ph->{hpmodehwater}, 2) if(defined $ph->{hpmodehwater}); ##+
my ($hpmodedefrostdev, $hpmodedefrostrdg) = split (':', $ph->{hpmodedefrost}, 2) if(defined $ph->{hpmodedefrost}); ##+
my ($hpmodeoffdev, $hpmodeoffrdg) = split (':', $ph->{hpmodeoff}, 2) if(defined $ph->{hpmodeoff}); ##+
my ($hpmodecooldev, $hpmodecoolrdg) = split (':', $ph->{hpmodecool}, 2) if(defined $ph->{hpmodecool}); ##+
my ($hpmodepooldev, $hpmodepoolrdg) = split (':', $ph->{hpmodepool}, 2) if(defined $ph->{hpmodepool}); ##+
my ($hpmodepoolheatdev, $hpmodepoolheatrdg) = split (':', $ph->{hpmodepoolheat}, 2) if(defined $ph->{hpmodepoolheat}); ##+
# Moeggliche wpmode-werte sind "off","heating","cooling","hot water","pool","pool heating","defrost","compressor alarm" not used ##+
##+ Ein Modus Alarm wird in SF nicht bewertet
##+
my $parsed = { ##+
hpspfDev => $hpspfdev, ##+
hpspfRdg => $hpspfrdg, ##+
hptempflowDev => $hptempflowdev, ##+
hptempflowRdg => $hptempflowrdg, ##+
hptempreturnDev => $hptempreturndev, ##+
hptempreturnRdg => $hptempreturnrdg, ##+
hpmodeheatDev => $hpmodeheatdev, ##+
hpmodeheatRdg => $hpmodeheatrdg, ##+
hpmodehwaterDev => $hpmodehwaterdev, ##+
hpmodehwaterRdg => $hpmodehwaterrdg, ##+
hpmodedefrostDev => $hpmodedefrostdev, ##+
hpmodedefrostRdg => $hpmodedefrostrdg, ##+
hpmodeoffDev => $hpmodeoffdev, ##+
hpmodeoffRdg => $hpmodeoffrdg, ##+
hpmodecoolDev => $hpmodecooldev, ##+
hpmodecoolRdg => $hpmodecoolrdg, ##+
hpmodepoolDev => $hpmodepooldev, ##+
hpmodepoolRdg => $hpmodepoolrdg, ##+
hpmodepoolheatDev => $hpmodepoolheatdev, ##+
hpmodepoolheatRdg => $hpmodepoolheatrdg, ##+
};
##+ Debuglog HPDev
################
##+ if ($debug =~ /aiProcess/xs) {
#Log3 ($name, 2, "$name DEBUG> parseAttrHPDev hpmodeheat: $hpmodeheatdev - hpmodewater : $hpmodehwaterdev - hpmodedefrost : $hpmodedefrostdev -hpmodeoff : $hpmodeoffdev ");
#Log3 ($name, 2, "$name DEBUG> parseAttrHPDev hpmodeheat: $hpmodeheatrdg - hpmodewater : $hpmodehwaterrdg - hpmodedefrost : $hpmodedefrostrdg -hpmodeoff : $hpmodeoffrdg ");
##+ }
return $parsed;
}
<a id="SolarForecast-attr-setupHPDev"></a>
<li><b>setupHPDev <key=value> <key=value> ... </b><br>
By optionally specifying the 'key=value' pairs listed below, various
heatpump data / sensor can be integrated.
The entry can be made on multiple lines.
<br><br>
##+ 300P
<br><br>
<br> <tr><td> English missing !!!!!!! </td><td> </td></tr>
</li>
<br>
<a id="SolarForecast-attr-setupHPDev"></a>
<li><b>setupHPDev <key=value> <key=value> ... </b><br>
Durch die optionale Angabe der nachfolgend aufgeführten 'Schlüssel=Wert' Paare können verschiedene
WP-Messwerte und Zustaende eingebunden werden.
Die Eingabe kann mehrzeilig erfolgen. Dieses Setuop wird aktuell nur bei Auswahl der AI:FANN mit der Version V1_heatpump_pv_buderus genutzt
<br><br>
<br><br>
##+ 300P
<br><br>
<ul>
<table>
<colgroup> <col width="15%"> <col width="77%"> </colgroup>
<tr><td> <b>hpspf</b> </td><td>deutsche JAZ = erzeugte Waermemenge / Energiegesamteinsatz - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hptempflow</b> </td><td>Vorlauftemperatur vom Aussengeraet - nicht vom Heizkreis - ca. 34.0 Grad - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hptempreturn</b> </td><td>Ruecklauftemperatur zum Aussengeraet - nicht vom Heizkreis = hptempflow-(delta 4.5 K --> Differenz VL/RL) </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hpmodeheat</b> </td><td>WP laeuft im Heizmodus - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hpmodehwater</b> </td><td>WP laeuft im Heizmodus - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hpmodedefrost</b> </td><td>WP laeuft im Abtaumodus - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hpmodeoff</b> </td><td>WP ist AUS - OFF - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hpmodecool</b> </td><td>WP laeuft im Kuehlmodus - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hpmodepool</b> </td><td>WP laeuft im Poolmodus - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> <b>hpmodepoolheat</b> </td><td>WP laeuft im Poolheatmodus - keine Pflichtangabe </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> </td><td>Eine <Gerät>:<Reading> Kombination, die die jeweiligen aktuellen Werte der Waermepumpe liefert. </td></tr>
<tr><td> </td><td>Syntax: <Device>:<Reading> </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> </td><td> noch nicht vorhanden...... </td></tr>
<tr><td> </td><td> </td></tr>
<tr><td> </td><td>Eine <Gerät>:<Reading>:<Regex> Kombination, die den aktuellen Kompressormodus für "heating" liefert. </td></tr>
<tr><td> </td><td>Der angegebene reguläre Ausdruck muß 'true' für den Status 'heating|cooling|hotwater|defrost|off|pool|poolheating' ergeben, sonst 'false'.</td></tr>
<tr><td> </td><td>Syntax: <Gerät>:<Reading>:<Regex> </td></tr>
<tr><td> </td></tr>
<tr><td> </td></tr>
<tr><td> </td></tr>
</table>
</ul>
<ul>
<b>Beispiel: </b> <br>
attr <name> setupHPDev hpmodeheat=Forecast:user_hpmodeheating <br>
hpmodehwater=Forecast:user_hpmodehwater <br>
hpmodedefrost=Forecast:user_hpmodedefrost <br>
hpmodeoff=Forecast:user_hpmodeoff <br>
<br><br>
Userreading als Beispiel: (Device/Reading anpassen)<br>
user_hpmodeheating {if(ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "heating") {return "1"} else {return 0}},
user_hpmodehwater {if(ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "hot water") {return "1"} else {return 0}},
user_hpmodeoff {if(ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "off") {return "1"} else {return 0}},
user_hpmodedefrost {if(ReadingsVal("MQTT_EMSwp","boiler_data_hpactivity","") eq "off") {return "1"} else {return 0}},
</ul>
</li>
<br>
https://192.168.202.153:8083/fhem?cmd=set%20DaikinCloud%20AuthCode%20&fwcsrf=csrf_xxx_geheim