Hauptmenü

Verständnisfrage zum Perl-Modus

Begonnen von h002, 30 September 2020, 10:19:49

Vorheriges Thema - Nächstes Thema

h002

Ich nutze im Ausführungsteil von DOIF Perlcode in der Art:


([05:45|AT] or [06:45|AT] or [12:00] or [07:00|WE])
(set lampe on)
DOELSEIF([lampe]){
my $var=ReadingsVal("lampe","state",0);
if($var == 13){
fhem("set lampe off");
}
if($var eq ""){
fhem("set lampe on");
fhem("msg Nachricht");
}
}


Der Code an sich hat keinen Sinn, sondern dient nur dazu, mein Verständnisproblem zu beschreiben?

Ich benutze also für den Bedingungsteil den FHEM-Modus und im Ausführungsteil den Perl-Modus? Oder nutze ich einfach nur im Ausführungsteil Perl-Code anstatt des Perl-Modus?

In der commandref steht das Beispiel
define di_rc_tv DOIF {if ([remotecontol:"on"]) {fhem_set"tv on"} else {fhem_set"tv off"}}
Hier wurde ja schon im Bedingungsteil Perl verwendet und Perl-Modus spezifische DOIF Kommandos wie fhem_set.

Für mich fühlt es sich irgendwie angenehmer an, die Bedingung im FHEM-Modus zu gestalten und dann Perl für umfangreichere Ausführungen zu nutzen.

Wenn ich also oben nicht den Perl-Modus, sondern nur Perl-Code im Ausführungsteil nutzen, welche Vor- und Nachteil hat dies? Ein Nachteil für mich ist z.B., dass ich im obigen Beispiel mittels der eckigen Klammern wie z.B. [lampe:state] im Ausführungsteil nicht direkt auf ein Reading zugreifen kann und dies vorher mit ReadingsVal() auslesen muss. Oder kann ich dies im obigen Beispiel auch in irgendeiner Art nutzen? So wie:


DOELSEIF([lampe]){
#my $var=ReadingsVal("lampe","state",0);
if([lampe:state] == 13){
fhem("set lampe off");
}


Ich hoffe ich konnte es einigermaßen klar formulieren. ;-)

Vielen Dank!



Damian

#1
FHEM-Modus arbeitet standardmäßig zustandsbasiert, dh. das Modul wiederholt nicht den gleichen Ausführungszweig (cmd_...), weiterhin setzt das Modul im FHEM-Modus den Status und einige Readings. Natürlich kann man im FHEM-Modus, wie in deinem Beispiel, Perlcode  ausführen lassen.

Im Perl-Modus kann man dagegen mehrere unabhängige Blöcke definieren, dh. man kann die Funktionalität mehrerer DOIFs in einem unterbringen, das ist im FHEM-Modus nicht ohne weiteres machbar, da im FHEM-Modus durch ein Event immer nur ein Zweig ausgeführt werden kann und nicht mehrere.

-man kann ebenfalls elegant im Perlmodus eigene sub-Routinen definieren, die im DOIF-Package gekapselt sind
-man kann beliebig viele Verzögerungstimer (mit Wiederholung) definieren
-man kann Instanzvariablen definieren, auf die man innerhalb eines Devices beliebig zugreifen kann. Sie behalten ihren Inhalt zur Laufzeit.
-man ist nicht auf if-else-Abfragen eingeschränkt
-man kann beliebige Tiefen definieren if (...){if(...){if(...){if....
-Triggerangaben in eckigen Klammern können an beliebiger Stelle stehen, z. B. schalte lamp1 mit dem Zustand von lamp2, wenn sich dieser ändert: DOIF {fhem_set("lamp1 ".[lamp2:state])}
-man kann Templates mit gleichem Steuer-Code für verschiedene Szenarien nutzen: https://wiki.fhem.de/wiki/DOIF/Templates
-man sollte etwas Perlkenntnis haben, da man zu 99% in Perl programmiert

All das ist unabdingbar, wenn man etwas mehr "programmieren" will, als nur Lampe abhängig einer Bedingung zu schalten - dafür ist der FHEM-Modus für einfache Aufgaben einfacher zu handhaben, weil man dem Benutzer eine wenn-dann-Reihenfolge vorgibt und ihm keine besonderen Perl-Kenntnisse abverlangt.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

h002

Sehr ausführliche und verständliche Antwort. Vielen Dank dafür!  :D