Ich verstehe etwas nicht. Ich habe dieses einfache device
defmod Telefon DOIF ([02:31]) ({TelefonAus()})
(keine Attribute) und der Perlcode besteht aus
sub TelefonAus() {
my ($sec,$min,$hour,$dayn,$month,$year,$wday,$yday,$isdst) = localtime(time);
Log 1, "Fehlersuche Wtag=".$wday." hour".$hour;}
Ich habe aber weder um 2:31 noch danach Einträge im Logfile. Was mache ich da falsch?
die runden klammern sind überflüssig
defmod Telefon DOIF ([02:31]) ({TelefonAus})
Aber das kann doch nicht die Ursache für den Fehler sein, oder? Ich teste jetzt mal nebenan ein at und schaue, ob das auslöst. Merkwürdig. Im schlimmsten Fall ist irgendwo in den Tiefen meines FHEM was faul.
Zeig mal bitte ein List vom doif
Zitat von: andies am 19 Januar 2021, 11:25:32
Aber das kann doch nicht die Ursache für den Fehler sein, oder? Ich teste jetzt mal nebenan ein at und schaue, ob das auslöst. Merkwürdig. Im schlimmsten Fall ist irgendwo in den Tiefen meines FHEM was faul.
löst aus
defmod Telefon DOIF ([11:55]) ({TelefonAus})
attr Telefon DbLogExclude .*
setstate Telefon cmd_1
setstate Telefon 2021-01-19 11:55:00 cmd 1
setstate Telefon 2021-01-19 11:55:00 cmd_event timer_1
setstate Telefon 2021-01-19 11:55:00 cmd_nr 1
setstate Telefon 2021-01-19 11:54:32 mode enabled
setstate Telefon 2021-01-19 11:55:00 state cmd_1
setstate Telefon 2021-01-19 11:55:00 timer_01_c01 20.01.2021 11:55:00
und bringt diesen Log-Eintrag
2021.01.19 11:55:00 1: Fehlersuche Wtag=2 hour11
Ja, der löst aus - aber bei mir nur manchmal!
Internals:
CFGFN
DEF ([02:31]) ({TelefonAus})
FUUID 60046257-f33f-1115-d189-09a654f8b835a2a8
MODEL FHEM
NAME Telefon1
NOTIFYDEV global
NR 232377
NTFY_ORDER 50-Telefon1
STATE cmd_1
TYPE DOIF
VERSION 23418 2020-12-26 10:04:12
READINGS:
2021-01-19 11:17:22 cmd 0
2021-01-18 02:31:04 cmd_event timer_1
2021-01-18 02:31:04 cmd_nr 1
2021-01-19 11:17:22 mode enabled
2021-01-19 11:17:22 state initialized
2021-01-19 11:17:22 timer_01_c01 20.01.2021 02:31:00
Regex:
accu:
attr:
cmdState:
waitdel:
condition:
0 ::DOIF_time_once($hash,0,$wday)
days:
do:
0:
0 {TelefonAus}
1:
helper:
DEVFILTER ^global$
NOTIFYDEV global
globalinit 1
last_timer 1
sleeptimer -1
intervalfunc:
localtime:
0 1611106260
realtime:
0 02:31:00
time:
0 02:31:00
timeCond:
0 0
timer:
0 0
timers:
0 0
triggertime:
1611106260:
localtime 1611106260
hash:
uiState:
uiTable:
Attributes:
comment Telefon aus und danach anschalten
Mit meinen sehr begrenzten DOIF-"Kenntnissen" wage ich mal das Stichwort "do always" (bzw. einen weiteren Zweig) in den Raum zu werfen ::) .
attr Telefon do always
damit es auch am nächsten tag auslöst...
der zustand des DOIF ändert sich ja nicht, verharrt ja in cmd_1
und damit es auch morgen passiert, dieses attribut setzen
Wenn man ohne Zustandsauswertung arbeiten will und vor allem ohnehin Perlfunktionen nutzt, bietet sich der Perlmodus an. Hier kommt man meistens ohne Attribute aus, insbesondere gibt es kein do always - es gibt hier auch keine Zustände, die verwaltet werden.
DOIF {[02:31];::TelefonAus}
Edit:
Wenn die Perlfunktion nicht im DOIF-Package ist, sondern im Standard-Package main, so müssen zwei Doppelpunkte vor die eigene Funktion, es sei denn, man definiert die Funktion im DOIF-Package, das hat den Vorteil, dass man kurze Namen nehmen kann, ohne Gefahr zu laufen, dass die Funktion mit einer anderen Funktion gleichen Namens kollidiert.
Also doch do always, ich hatte es geahnt. Das habe ich nie richtig verstanden - ich dachte, ohne Zweige könnte ich darauf verzichten.