FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: dirk.k am 01 Januar 2021, 17:57:32

Titel: [gelöst] Variablen im DoIf cmd und weiterer Definition
Beitrag von: dirk.k am 01 Januar 2021, 17:57:32
Hallo zusammen,
erst mal wünsche ich ein gesundes neues Jahr!
ich möchte für verschiedene Geräte das Reading "NoSleep" nach 1 Stunde auf 0 setzen, nachdem es auf 1 gesetzt wurde.
Ich habe es mit DoIf für ein einzelnes Gerät hinbekommen, stecke hier aber fest ...
hier mein Ansatz:
defmod di_noSleep DOIF ([$DEVICE:NoSleep] = 1) (defmod at_NoSleepAus_NAME at +02:03:00 set my_devicename NoSleep 0)
attr di_noSleep do always


nun möchte ich für jedes Gerät ein eigenes DoIf definieren lassen, aber die Erweiterung des Namens klappt so nicht:
defmod at_NoSleepAus_$NAME at ....


auch die Definition des Gerätes in welchem aus dem AT heraus das Reading gesetzt werden soll passt nicht
at +02:03:00 set $NAME NoSleep 0

ich bräuchte mal ein paar Tips oder Hinweise, wie man es richtig/besser macht.
Titel: Antw:Variablen im DoIf cmd und weiterer Definition
Beitrag von: xenos1984 am 01 Januar 2021, 18:33:56
Ich würde es vermutlich über Templates realisieren:

http://wiki.fhem.de/wiki/DOIF/Templates
Titel: Antw:Variablen im DoIf cmd und weiterer Definition
Beitrag von: Damian am 01 Januar 2021, 19:02:19
oder:

DOIF ([":^NoSleep"] and [$DEVICE:NoSleep] == 1) (defmod at_NoSleepAus_$DEVICE at +02:03:00 set my_devicename NoSleep 0)

Ich würde es im Perl-Modus mit set_Exec lösen, damit kann man benannte Timer definieren.
Titel: Antw:Variablen im DoIf cmd und weiterer Definition
Beitrag von: dirk.k am 01 Januar 2021, 20:23:22
Vielen Dank, so geht es!
defmod di_noSleep DOIF ([":^NoSleep"] and [$DEVICE:NoSleep] == 1) (defmod at_NoSleepAus_$DEVICE at +02:03:00 set $DEVICE NoSleep 0)
attr di_noSleep do always
Titel: Antw:Variablen im DoIf cmd und weiterer Definition
Beitrag von: Damian am 01 Januar 2021, 23:09:31
Zitat von: dirk.k am 01 Januar 2021, 20:23:22
Vielen Dank, so geht es!
defmod di_noSleep DOIF ([":^NoSleep"] and [$DEVICE:NoSleep] == 1) (defmod at_NoSleepAus_$DEVICE at +02:03:00 set $DEVICE NoSleep 0)
attr di_noSleep do always


Wenn du einiges an Systemperformance einsparen willst, solltest du versuchen, die betroffenen Devices hier [":^NoSleep"] genauer zu spezifizieren, ansonsten triggert jedes Event des System dein DOIF.
Titel: Antw:[gelöst] Variablen im DoIf cmd und weiterer Definition
Beitrag von: dirk.k am 02 Januar 2021, 09:50:13
Hi Damian,
ich habe noch ein paar Verständnisfragen ...
meinst du noch genauer als [":^NoSleep"]?
Ich könnte noch ["^WeMos:^NoSleep"] nehmen, da alle betroffenen Gerätenamen mit "WeMos" anfangen.
Andererseits gibt es keine anderen Geräte mit einem Event auf "NoSleep".

und wo ist der Unterschied zwischen
defmod di_noSleep DOIF ([":^NoSleep"] and [$DEVICE:NoSleep] == 1) (
und
defmod di_noSleep DOIF ([":^NoSleep"] == 1) (

doif ist so gewaltig, ich möchte die Details wirklich verstehen ... und Wiki sowie Forum habe ich durch ...

Titel: Antw:[gelöst] Variablen im DoIf cmd und weiterer Definition
Beitrag von: Damian am 02 Januar 2021, 09:59:42
Bei ["^WeMos:^NoSleep"] wird DOIF vom Hauptprozess nur geweckt, wenn Events von WeMos kommen.

[":^NoSleep"] oder ["^WeMos:^NoSleep"] sind reine Ereignistrigger, sie liefern nur wahr oder falsch und keinen Inhalt eines Readings, siehe Commandref.