FHEM Forum

FHEM => Automatisierung => Perl für FHEM-User => Thema gestartet von: MartinD am 21 September 2025, 10:24:24

Titel: [GELÖST] Falscher Reading abfangen Teil 2
Beitrag von: MartinD am 21 September 2025, 10:24:24
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

Titel: Aw: Falscher Reading abfangen Teil 2
Beitrag von: Nobbynews am 21 September 2025, 12:08:06
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.jsDann sollten die Hinweise auf die Syntax-Fehler schon beim Abspeichern angezeigt werden.

Edit:
Das letzte else durch elseif ersetzt.
Titel: Aw: Falscher Reading abfangen Teil 2
Beitrag von: MartinD am 21 September 2025, 12:13:37
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 ";
                   }"
Titel: Aw: Falscher Reading abfangen Teil 2
Beitrag von: frober am 21 September 2025, 12:14:37
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!
Titel: Aw: Falscher Reading abfangen Teil 2
Beitrag von: Nobbynews am 21 September 2025, 12:16:02
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.
Titel: Aw: Falscher Reading abfangen Teil 2
Beitrag von: MartinD am 21 September 2025, 14:02:32
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