FHEM Forum

FHEM => Automatisierung => DOIF => Thema gestartet von: lichtimc am 18 November 2021, 19:57:46

Titel: device Variablen pro DOIF-Definition
Beitrag von: lichtimc am 18 November 2021, 19:57:46
Wie kann ich eine Variable definieren, die, wie die Device-Variablen, während der Ausführung von FHEM erhalten bleibt, jedoch nur im Scope des aktuellen DOIFs gültig ist?

Ich habe bemerkt, dass, wenn ich dieselbe Device-Variable in zwei unterschiedlichen DOIFs definiere, diese sich gegenseitig beinflussen. (Die Variablen enthalten die Werte, die das zuletzt gespeicherte DOIF im init-Block gesetzt hat.)

Danke und lg
LichtiMC
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: Damian am 18 November 2021, 23:12:22
Du könntest dir ein eigenes package definieren.
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: lichtimc am 19 November 2021, 00:03:35
Hättest du ein Beispiel für mich?
Danke dir,
lg
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: Damian am 19 November 2021, 00:37:26
Zitat von: lichtimc am 19 November 2021, 00:03:35
Hättest du ein Beispiel für mich?
Danke dir,
lg

Ich sehe gerade, dass package für Device-Variablen nicht reicht, daher die einfache Lösung mit $SELF:

$_$SELF_test="bla";
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: Damian am 19 November 2021, 07:58:00
Zitat von: Damian am 19 November 2021, 00:37:26
Ich sehe gerade, dass package für Device-Variablen nicht reicht, daher die einfache Lösung mit $SELF:

$_$SELF_test="bla";

Die Sache mit $SELF ist, wie ich gerade feststelle, überflüssig.

Da Devicevariablen beginnend mit $_ nur im jeweiligen DOIF-Device gelten, da sie auf den jeweiligen Hash abgebildet werden.
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: lichtimc am 19 November 2021, 08:24:31
Hmmm... genau das mache ich ja. Ich hab 2 DOIFs und beide benutzen bspw. die Device-Variable $_test.

In beiden DOIFs wird die Variable im init-Block gesetzt, beim ersten soll der Wert bspw. "test1" sein und beim zweiten "test2".

Wenn ich nun beim ersten der DOIFs auf "DEF" klicke, etwas ändere und mit Modify wieder speichere, wird der Wert von $_test bei beiden DOIFs "test1".

Edit: Ich habs jetzt gerade mit genau dem oben beschriebenen Beispiel nachgestellt und da bleibt $_test wirklich für jedes DOIF individuell erhalten. Jetzt verstehe ich überhaupt nicht, wieso das bei meinem produktiven DOIF nicht so ist!? Ich werde mal ein paar Tests machen, vielleicht komme ich drauf.
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: Damian am 19 November 2021, 10:07:34
Zitat von: lichtimc am 19 November 2021, 08:24:31

Edit: Ich habs jetzt gerade mit genau dem oben beschriebenen Beispiel nachgestellt und da bleibt $_test wirklich für jedes DOIF individuell erhalten. Jetzt verstehe ich überhaupt nicht, wieso das bei meinem produktiven DOIF nicht so ist!? Ich werde mal ein paar Tests machen, vielleicht komme ich drauf.

Das kann auch nicht anders sein. Mit List siehst du wo dein $_test intern abgelegt ist und das ist $hash abhängig. Wenn das nicht funktionieren würde, dann dürfte das ganze FHEM nicht korrekt funktionieren ;)
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: lichtimc am 19 November 2021, 10:24:07
Ja, wird sicher so sein, danke.

Noch eine kurze Frage: Ich habe gesehen, dass $EVENT befüllt ist, wenn ein DOIF getriggert wird, z.B.:
last-sender: fhem,reldim-set: 100 %,100 %

Gibt es Variablen für die einzelnen Werte von $EVENT? Also z.b.: $EVENT-READINGNAME, $EVENT-READINGVALUE
Mir geht es darum, herauszufinden, welches Reading mit welchem Wert getriggert hat.

Danke und lg
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: Damian am 19 November 2021, 10:35:58
Zitat von: lichtimc am 19 November 2021, 10:24:07
Ja, wird sicher so sein, danke.

Noch eine kurze Frage: Ich habe gesehen, dass $EVENT befüllt ist, wenn ein DOIF getriggert wird, z.B.:
last-sender: fhem,reldim-set: 100 %,100 %

Gibt es Variablen für die einzelnen Werte von $EVENT? Also z.b.: $EVENT-READINGNAME, $EVENT-READINGVALUE
Mir geht es darum, herauszufinden, welches Reading mit welchem Wert getriggert hat.

Danke und lg

Zum $EVENT (im Perlmodus besser die Perlvariable $event benutzen), gibt es nur noch das passende Device $DEVICE bzw. $device.

in $EVENTS bzw. $events werden alle Events eines Eventblocks abgelegt.
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: lichtimc am 19 November 2021, 15:43:01
Danke, dann will ich es mit Regex versuchen...
my ($trigger_val) = $event =~ m/reldim-[gs]et:.?(-?\d+)/;

Das funktioniert aber wegen der eckigen Klammern auch nicht. Wie muss ich denn die escapen?

Danke und lg
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: lichtimc am 19 November 2021, 16:49:14
Hab jetzt rausgefunden, warum Variablen Werte aus einem anderen DOIF haben. Versuche mal folgende DOIFs anzulegen:
defmod test1 DOIF init {\
$_test = 1;;\
}\
subs {\
sub test {\
set_State($_test);;\
}\
}\
{\
if (["$SELF:go"]) {\
test();;\
}\
}
attr test1 webCmd go


defmod test1 DOIF init {\
$_test = 1;;\
}\
subs {\
sub test {\
set_State($_test);;\
}\
}\
{\
if (["$SELF:go"]) {\
test();;\
}\
}
attr test1 webCmd go


Hier wird die $_test durch die sub test() irgendwie manipuliert.
Gibt es hierfür irgendeine Lösung?
Titel: Antw:device Variablen pro DOIF-Definition
Beitrag von: Damian am 19 November 2021, 16:57:02
Bei subs sieht es anders aus. Subs befinden sich im gleichen package (DOIF) und überschreiben sich dadurch. Hier muss du entweder unterschiedliche Namen der Funktionen nehmen oder eben mit $SELF eindeutig machen

sub $SELF_test {...}