Zitat von: erdnar am 12 Januar 2026, 13:28:16OT Apropos wenig Wissen: Du benutzt KeyValue("store","Gemini... für den Key. Da dies bei mir zu Undefined subroutine &main::KeyValue called at (eval... führte, habe ich es auf die Schnelle in einen Dummy gelegt und von da geholt.Dazu gibt es im Forum und Wiki natürlich mehr Infosattr Gemini_AI replacement01Value { ReadingsVal("Gemini_Config","api_key","") }Wie komme ich zum KeyValue ?
Danke
ErdnaR

######################################################
# {KeyValue("read|store","PW_PV_Anlage_1_API_user","<passwort>")}
# {KeyValue("store","PW_PV_Anlage_1_API_user",undef)} # zum löschen
######################################################
sub KeyValue {
my ($step, $index, $value) = @_;
my $key = getUniqueId().$index;
my $e_value = "";
my $error;
if (eval "use Digest::MD5;1") {
$key = Digest::MD5::md5_hex(unpack "H*", $key);
$key .= Digest::MD5::md5_hex($key);
}
if ($step eq "read") {
($error, $value) = getKeyValue($index);
if ( defined($error) ) {
Log3 $index,3, "$index, can't read key from FhemUtils/uniqueID: $error";
return undef;
}
if ( defined($value) ) {
my $dec_value = '';
for my $char (map { pack('C', hex($_)) } ($value =~ /(..)/g)) {
my $decode = chop($key);
$dec_value .= chr(ord($char)^ord($decode));
$key = $decode.$key;
}
return $dec_value;
}
else {
Log3 $index,3,"$index, no key found in FhemUtils/uniqueID";
return undef;
}
}
if ($step eq "store") {
for my $char (split //, $value) {
my $encode = chop($key);
$e_value .= sprintf("%.2x",ord($char)^ord($encode));
$key = $encode.$key;
}
$error = setKeyValue($index, $e_value);
return "error while saving key : $error" if(defined($error));
return "Key successfully saved in FhemUtils/uniqueID Key $index";
}
};
=== Modellparameter ===
Normierungsgrenzen: PV=8888 Wh, Hausverbrauch: Min=0 Wh / Max=12741 Wh
Trainingsdaten: 6210 Datensätze (Training=4968, Validierung=1242)
Architektur: Inputs=39, Hidden Layers=80-40-20, Outputs=1
Hyperparameter: Learning Rate=0.005, Momentum=0.5, BitFail-Limit=0.35
Aktivierungen: Hidden=SIGMOID, Steilheit=0.9, Output=LINEAR
Trainingsalgorithmus: INCREMENTAL, Registry Version=v1_common
Zufallsgenerator: Mode=2, Periode=10
=== Trainingsmetriken ===
bestes Modell bei Epoche: 1069 (von max. 15000)
Training MSE: 0.000461
Validation MSE: 0.000289
Validation MSE Average: 0.000518
Validation MSE Standard Deviation: 0.000072
Validation Bit_Fail: 0
Model Bias: 83 Wh
Model Slope: 0.8
Trainingsbewertung: Retrain
=== Fehlermaße der Prognosen ===
MAE: 136.48 Wh
MedAE: 86.30 Wh
RMSE: 176.37 Wh
RMSE relative: 31 %
RMSE Rating: weak
MAPE: 18.53 %
MdAPE: 15.28 %
R²: 0.90
=== Drift-Kennzahlen ===
Drift Score: 2.09
Drift RMSE relative: 93.71
Drift Bias: 60.92
Drift Slope: 0.134
Drift Bewertung: severe
Zitat von: DS_Starter am 12 Januar 2026, 11:35:09Wenn ihr (TheTrumpeter, Stefan) eure Trainingslogs und einen Screenshot der Balkengrafik mit der Verbrauchsprognose der nächsten Stunden (soviel wie es geht) an eure Posts anhängt, kann ich das Ergebnis von der KI analysieren lassen und ggf. Verbesserungen im Profil einbauen.Ich habe dann nach dem obigen Ergebnis auf "v1_heatpump_active_pv" umgestellt und das Training neu gestartet... läuft immer noch. Aktueller Zwischenstand:
2026.01.12 13:21:49 1: mySolarForecast DEBUG> Early stopping bei Epoche 4370 (no improvement since 1000 epochs)
2026.01.12 13:21:49 1: === Snapshot-Statistik ===
2026.01.12 13:21:49 1: Metric-Improvement Snapshots: 66 (letzte Epoche: 3370)
2026.01.12 13:21:49 1: Weighted-RMSE-Proxy-Improvement Snapshots: 59 (letzte Epoche: 3302)
2026.01.12 13:21:49 1: Bit-Improvement Snapshots: 0 (letzte Epoche: 0)
2026.01.12 13:21:49 1: Bit-Tradeoff Snapshots: 0 (letzte Epoche: 0)
2026.01.12 13:21:49 1: mySolarForecast DEBUG> Best Snapshot reloaded from Epoche 3370: Train MSE=0.001108, Val MSE=0.002496, Val MAE=0.025909, Val MedAE=0.007147, Bit_Fail=0,
2026.01.12 13:21:49 1: mySolarForecast DEBUG> Run Validation Test with 20% of Input data ...
2026.01.12 13:21:49 1: mySolarForecast DEBUG> Validation finished - Best Training MSE=0.001108, Validation MSE=0.002496, Validation Bit_Fail=0
2026.01.12 13:21:49 1: mySolarForecast DEBUG> Retrain check ->
-- In Normalization Space: --
Train MSE=0.001108
Val MSE=0.002496
Val Mean=0.0023810494
VAL/TRAIN MSE Ratio=2.253010 (limit=2.5)
Diff=0.001388 (limit=0.005)
ValStd=0.0000926900 (limit=0.000595262357462899)
-- At Original Scale: --
MAE=165.81584353369
RMSE/MAE=1.4742 (limit=1.5)
Slope=0.841794 (limit=0.7 .. 1.3)
Bias=59.55 (limit=+-248.723765300536)
R2=0.89
P95=800.6679 (limit=663.263374134762)
P99=1287.0716 (limit=1326.52674826952)
-- Robustness Indicators: --
RMSE relative=79 (limit=20)
BitFail=0 (limit=5)
BitFailRate=0.0000 (limit=0.1)
Forecast Quality Score=39
-> Retrain decision=Retrain
2026.01.12 13:21:49 1: mySolarForecast DEBUG> Retry attempt 3 with Seed=6829023
2026.01.12 13:21:49 1: mySolarForecast DEBUG> AI FANN Training started with Params:
input datasets=8020,
Registry version=v1_heatpump_active_pv,
training algo=FANN_TRAIN_INCREMENTAL,
output AF=LINEAR,
hidden AF=SIGMOID,
hidden Neurons=80-40-20,
hidden steepness=0.5,
Epoches=15000,
mse_error=0.001,
learning rate=0.00500,
learning momentum=0.8,
Data sharing=split after shuffle of training data and use AI internal shuffle (Train=6416, Test=1603),
Data shuffle=2 (period=10)Zitat von: ch.eick am 12 Januar 2026, 10:35:52Dort kann man auch auf "View usage" gehen und sieht unter Fehler "429 TooManyRequests", wenn man im Diagramm über den roten Balken geht die Anzahl von 21.
Du darfst diesen Dateianhang nicht ansehen.
VG Christian
.attr Gemini_AI replacement01Value { ReadingsVal("Gemini_Config","api_key","") } Wie komme ich zum KeyValue ?ZitatSeltsamer weise habe ich keine Drift zahlen.Drift wird in der Nacht gerechnet, wenn das Modell läuft. Also erst morgen.
Aber eigentlich sieht die Vorhersage gut aus!