Hallo Zusammen,
ich versuche gerade mit DOIF die Temperatur zu überwachen. Sobald die Temperatur unter einen Wert (z.B. 18 Grad) für länger als x Sekunden fällt, soll eine Nachricht verschickt werden. Die Nachricht sollte solange die Temperatur noch unter dem Schwellwert liegt 3 mal wiederholt werden. Ich habe mich an folgendes Beispiel in der Commandref gehalten:
Anwendungsbeispiel: Nach dem Eintreffen des Ereignisses wird die push-Meldung stündlich wiederholt, bis Frost ungleich "on" ist.
define di_push DOIF ([frost] eq "on")(set pushmsg "danger of frost")
attr di_push repeatcmd 3600
Eine Begrenzung der Wiederholungen kann mit dem Attribut repeatsame vorgenommen werden
attr di_push repeatsame 3
Die Verzögerung habe ich mit wait realisiert:
Anwendungsbeispiel: Benachrichtung "Waschmaschine fertig", wenn Verbrauch mindestens 5 Minuten unter 2 Watt (Perl-Code wird in geschweifte Klammern gesetzt):
define di_washer DOIF ([power:watt]<2) ({system("wmail washer finished")})
attr di_washer wait 300
Leider funktioniert es nicht so wie gewünscht. Zunächst wird das DO trotzdem ausgeführt, obwohl die Temperatur während der wait-Zeit wieder über dem Schwellwert liegt. Er führt die DO unabhängig vom Schwellwert repeatsame Mal aus. Außerdem reagiert er danach nicht mehr auf das unterschreiten des Schwellwerts. D.h. wenn die Temperatur unter den Schwellwert fällt wird DO nicht mehr ausgefürt. Nach der wait Zeit geht der wait_timer wieder auf no timer zurück. Ich benutzte die folgende Konfig:
Internals:
CFGFN
DEF ([TempTest:temperature]<18)(set Push msg 'Achtung' 'Die Temperatur im Bad ist zur Zeit [TempTest:temperature]°C' 'Christian' 0 '')
NAME triggerBadTempLow
NR 3991
NTFY_ORDER 50-triggerBadTempLow
STATE cmd_1
TYPE DOIF
Readings:
2016-02-10 21:30:24 Device TempTest
2016-02-10 21:33:11 cmd_count 3
2016-02-10 21:33:11 cmd_event TempTest
2016-02-10 21:33:11 cmd_nr 1
2016-02-10 21:30:24 e_TempTest_temperature 20
2016-02-10 21:33:11 state cmd_1
2016-02-10 21:34:11 wait_timer no timer
Condition:
0 ReadingValDoIf('TempTest','temperature','')<18
Devices:
0 TempTest
all TempTest
Do:
0:
0 set Push msg 'Achtung' 'Die Temperatur im Bad ist zur Zeit [TempTest:temperature]°C' 'Christian' 0 ''
1:
Helper:
globalinit 1
last_timer 0
sleepdevice TempTest
sleepsubtimer -1
sleeptimer -1
Internals:
Itimer:
Readings:
0 TempTest:temperature
all TempTest:temperature
State:
Timerfunc:
Trigger:
Attributes:
repeatcmd 60
repeatsame 3
room LaCrosse
wait 60
Vielleicht kann einer der Profis mal drüber schauen. Irgendwie muss ich die Beispiele in der Commandref falsch verstanden haben.
Danke und Gruß
Christian