Hallo,
ich versuche vergeblich in userReading eine umfassende Prüfung durchzuführen:
Dummy Tag_Nacht kann zwei state haben -> "Tag" oder "Nacht"
Meine userReading definition:
PV_Leistung_2:PV_Leistung-temp_2.* {
my $pwr = ReadingsNum ($name, 'PV_Leistung-temp_2', 0);
# in der Nacht gibt die PV keine Leistung, ab dann ist $pwr = 0
if {
ReadingsVal ('Tag_Nacht', 'state', '0') ne "Tag";
$pwr = 0;
};
# oder wenn $pwr < 0 dann soll $pwr = 0
elsif {
$pwr < 0;
$pwr = 0;
};
# und schließlich wenn $pwr > 7 dann soll $pwr=$pwr/10
else {
$pwr > 7;
$pwr = $pwr/10;
};
$pwr
}
Will nicht funktionieren.
Kann mir jemand auf die Sprünge helfen?
Mit besten Grüßen
Martin
Eigentlich müsste das haufenweise Syntax-Fehler erzeugen.
Ungetestet ungefähr so:
PV_Leistung_2:PV_Leistung-temp_2.* {
my $pwr = ReadingsNum ($name, 'PV_Leistung-temp_2', 0);
# in der Nacht gibt die PV keine Leistung, ab dann ist $pwr = 0
if (ReadingsVal ('Tag_Nacht', 'state', '0') ne "Tag"){
$pwr = 0;
}
# oder wenn $pwr < 0 dann soll $pwr = 0
elsif ($pwr < 0){
$pwr = 0;
};
# und schließlich wenn $pwr > 7 dann soll $pwr=$pwr/10
elseif ( $pwr > 7){
$pwr = $pwr/10;
};
return $pwr;
}
Tipp:
Folgenes Attribut setzen:
attr WEB JavaScripts codemirror/fhem_codemirror.js
Dann sollten die Hinweise auf die Syntax-Fehler schon beim Abspeichern angezeigt werden.
Edit:
Das letzte else durch elseif ersetzt.
Danke!
Leider geht noch nicht so.
Log sagt:
2025.09.21 12:11:36 1: Error evaluating SolarEdge userReading PV_Leistung_2: syntax error at (eval 833718) line 9, near ";
else"
Global symbol "$pwr" requires explicit package name (did you forget to declare "my $pwr"?) at (eval 833718) line 12.
syntax error at (eval 833718) line 13, near ";
}"
Zitat von: Nobbynews am 21 September 2025, 12:08:06PV_Leistung_2:PV_Leistung-temp_2.* {
my $pwr = ReadingsNum ($name, 'PV_Leistung-temp_2', 0);
# in der Nacht gibt die PV keine Leistung, ab dann ist $pwr = 0
if (ReadingsVal ('Tag_Nacht', 'state', '0') ne "Tag"){
$pwr = 0;
}
# oder wenn $pwr < 0 dann soll $pwr = 0
elsif ($pwr < 0){
$pwr = 0;
};
# und schließlich wenn $pwr > 7 dann soll $pwr=$pwr/10
else ( $pwr > 7){
$pwr = $pwr/10;
};
return $pwr;
}
Das letze else muss auch ein elsif sein!
Zitat von: frober am 21 September 2025, 12:14:37Das letze else muss auch ein elsif sein!
@Frober war schneller.
Das elseif ist mir durchgerutscht.
Danke!
das hat geholfen:
PV_Leistung_2:PV_Leistung-temp_2.* {
my $pwr = ReadingsNum ($name, 'PV_Leistung-temp_2', 0);
if (ReadingsVal ('Tag_Nacht', 'state', '0') ne "Tag"){
$pwr = 0;
}
elsif ($pwr < 0){
$pwr = 0;
} <------------------ ";" weg
elsif ( $pwr > 7){
$pwr = $pwr/10;
};
return $pwr;
}
Gruß
Martin