FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: sky64 am 19 Februar 2022, 15:40:48

Titel: [gelöst]Perl im Notify ?
Beitrag von: sky64 am 19 Februar 2022, 15:40:48
Hallo

Bitte seht es mir nach, aber ich begreife nicht was ich hier falsch mache.
Ziel ist es ein Reading um einen Betrag zu erhöhen.

Das war der 1. Ansatz:


define set_BatLoad_plus notify EML_Zaehler_E:energy_avg.* {if($EVTPART1 > 4600) \
{ fhem('set Modbus_Fronius BYD_max_charge {ReadingsNum("Modbus_Fronius","BYD_max_charge",0)+5')}}


Das funktionierte nicht.
Also habe ich es umgebaut zu:
EML_Zaehler_E:energy_avg.* {if($EVTPART1 > 4600) {my $temp=ReadingsNum("Modbus_Fronius","BYD_max_charge",0)+5;; fhem('set Modbus_Fronius BYD_max_charge $temp')}}


Auch das funktioniert nicht und ich weiß nicht warum.
Wenn ich auf der CLI zum Test das aufrufe ist alles richtig (BYD_max_charge ist aktuell "35")
fhem> {ReadingsNum("Modbus_Fronius","BYD_max_charge",0)+5}
40

Wenn ich aber das so aufrufen kommt Müll raus:

fhem> {my $temp=ReadingsNum("Modbus_Fronius","BYD_max_charge",0)+5;; printf $temp}
1


Vieleicht geht das auch viel schöner über andere Wege.
Auch mit einem DOIF könnte ich mir vorstellen.
Leider findet man in Beispielen im Wiki o.ä. solche Berechnungen oder die Nutzung von weiteren Readings in der Ausführung praktisch nicht.
Es wird meist mit "on/off" oder festen Werten gearbeitet.
Titel: Antw:Perl im Notify ?
Beitrag von: Beta-User am 19 Februar 2022, 15:43:41
Dein Suchwort ist "Quotes in Perl"...

Dreh' mal die doppelten und die einfachen um ;) .
Titel: Antw:Perl im Notify ?
Beitrag von: sky64 am 19 Februar 2022, 16:08:12
Danke für den Tip, aber leider funktioniert es damit auch nicht.

Wenn ich die " und ' tauschen den Ausführungsteil auf der CLI eingeben kommt das:
fhem> { fhem("set Modbus_Fronius BYD_max_charge {ReadingsNum('Modbus_Fronius','BYD_max_charge',0)+5}")}
value {ReadingsNum('Modbus_Fronius','BYD_max_charge',0)+5} is not within defined min/max range

Die Meldung "not within defined min/max range" kommt daher das nur Werte zwischen 10..100 erlaubt sind.
Hier wird offenbar wieder versucht nur eine "1" zu schreiben.

Auch ein
fhem> {my $temp=ReadingsNum('Modbus_Fronius','BYD_max_charge',0)+5;; printf $temp}
1

Funtioniert ja weiterhin nicht.
Gerade das verstehen ich nicht. Ohne Hilfsvariable gehts, mit nicht.

Aber ich habe offenbar noch weiteren Denkfehler:

fhem> {my $temp=123;; printf $temp}
1
fhem> {my $temp="123";; printf $temp}
1
fhem> {my $temp='123';; printf $temp}
1


Welchen?


Titel: Antw:Perl im Notify ?
Beitrag von: Beta-User am 19 Februar 2022, 16:15:42
was soll das printf da bei den Tests?
Titel: Antw:Perl im Notify ?
Beitrag von: sky64 am 19 Februar 2022, 16:17:12
Ich will ja wissen was in der Variable steht.
Titel: Antw:Perl im Notify ?
Beitrag von: sky64 am 19 Februar 2022, 16:23:29
Ok

Ich habs jetzt hinbekommen
{my $temp=ReadingsNum("Modbus_Fronius","BYD_max_charge",0)+5;; fhem("set Modbus_Fronius BYD_max_charge $temp");;}
funktioniert. Vermutlich die fehlenden ;; und keine sonst zu wenig Ahnung um zu testen ...

Titel: Antw:[gelöst]Perl im Notify ?
Beitrag von: Guybrush am 21 Februar 2022, 09:15:39
wie schon geschrieben, sind deine quotes falsch. so sollte es gehen:

define set_BatLoad_plus notify EML_Zaehler_E:energy_avg.* {if($EVTPART1 > 4600) \
{ fhem("set Modbus_Fronius BYD_max_charge ".(ReadingsNum("Modbus_Fronius","BYD_max_charge",0)+5) )}}


fhem($string), daher musst du auch deine set syntax wie einen string behandeln. grundsätzlich ist es auch ratsam lieber eine klammer zuviel zu setzen.
Titel: Antw:[gelöst]Perl im Notify ?
Beitrag von: Beta-User am 21 Februar 2022, 09:22:07
Zitat von: Guybrush am 21 Februar 2022, 09:15:39
wie schon geschrieben, sind deine quotes falsch. so sollte es gehen:

define set_BatLoad_plus notify EML_Zaehler_E:energy_avg.* {if($EVTPART1 > 4600) \
{ fhem("set Modbus_Fronius BYD_max_charge ".(ReadingsNum("Modbus_Fronius","BYD_max_charge",0)+5) )}}


fhem($string), daher musst du auch deine set syntax wie einen string behandeln. grundsätzlich ist es auch ratsam lieber eine klammer zuviel zu setzen.
...diese concats innerhalb eines Funktionsaufrufs sind unschön zu lesen und grausam zu debuggen...

Und Klammern: Weglassen, was geht!
Das macht es nur unübersichtlicher und es kann dazu führen, dass der Datentyp sich "unbeabsichtigt" ändert, wenn man an der falschen Stelle die falsche Klammer erwischt...
Ausnahme: "Pseudo-Built-in"-Funktionen die aus dem fhem.pl-Kontext oder myUtils (z.B. Log) kommen. Da IMMER Klammern setzen!