Hauptmenü

[gelöst]Perl im Notify ?

Begonnen von sky64, 19 Februar 2022, 15:40:48

Vorheriges Thema - Nächstes Thema

sky64

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.
FHEM auf Ubuntu-VM (VMware), Heizung FHEM auf Raspi
Module: Volkszähler, ESPEASY, RFXtrx433, LaCrosseGateway, jeeLink, EMT7110, IRBlaster, LuftdatenInfo, MQTT, ESPDuino, Shelly, Abfallanzeige, (OilFox), Weatherman,  KeyValueProtocol
Modbus für Fronius Gen24-PV incl. ForeCast mit DWD und SolCast

Beta-User

Dein Suchwort ist "Quotes in Perl"...

Dreh' mal die doppelten und die einfachen um ;) .
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

sky64

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?


FHEM auf Ubuntu-VM (VMware), Heizung FHEM auf Raspi
Module: Volkszähler, ESPEASY, RFXtrx433, LaCrosseGateway, jeeLink, EMT7110, IRBlaster, LuftdatenInfo, MQTT, ESPDuino, Shelly, Abfallanzeige, (OilFox), Weatherman,  KeyValueProtocol
Modbus für Fronius Gen24-PV incl. ForeCast mit DWD und SolCast

Beta-User

was soll das printf da bei den Tests?
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors

sky64

Ich will ja wissen was in der Variable steht.
FHEM auf Ubuntu-VM (VMware), Heizung FHEM auf Raspi
Module: Volkszähler, ESPEASY, RFXtrx433, LaCrosseGateway, jeeLink, EMT7110, IRBlaster, LuftdatenInfo, MQTT, ESPDuino, Shelly, Abfallanzeige, (OilFox), Weatherman,  KeyValueProtocol
Modbus für Fronius Gen24-PV incl. ForeCast mit DWD und SolCast

sky64

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 ...

FHEM auf Ubuntu-VM (VMware), Heizung FHEM auf Raspi
Module: Volkszähler, ESPEASY, RFXtrx433, LaCrosseGateway, jeeLink, EMT7110, IRBlaster, LuftdatenInfo, MQTT, ESPDuino, Shelly, Abfallanzeige, (OilFox), Weatherman,  KeyValueProtocol
Modbus für Fronius Gen24-PV incl. ForeCast mit DWD und SolCast

Guybrush

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.

Beta-User

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!
Server: HP-elitedesk@Debian 12, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: ZigBee2mqtt, MiLight@ESP-GW, BT@OpenMQTTGw | ZWave | SIGNALduino | MapleCUN | RHASSPY
svn: u.a Weekday-&RandomTimer, Twilight,  div. attrTemplate-files, MySensors