Servus,
zur Übung wollte ich mir ein DOIF erstellen, daß mir eine Mail schreibt, wenn eine Tür eine Zeit lang offen steht. Das kam dabei heraus:
defmod Speisekammer.Tuer.Ueberwachung DOIF ([Speisekammer.Tuer:"open"]) ({DebianMail('markus@irgendwo.de',"Offene Tür", "Die Tür $DEVICE steht seit Minuten offen. Ist das Absicht?")})
attr Speisekammer.Tuer.Ueberwachung room Maschinenraum
attr Speisekammer.Tuer.Ueberwachung wait 60
setstate Speisekammer.Tuer.Ueberwachung cmd_2
setstate Speisekammer.Tuer.Ueberwachung 2017-10-06 18:07:33 Device Speisekammer.Tuer
setstate Speisekammer.Tuer.Ueberwachung 2017-10-06 18:07:33 cmd 2
setstate Speisekammer.Tuer.Ueberwachung 2017-10-06 18:07:33 cmd_event Speisekammer.Tuer
setstate Speisekammer.Tuer.Ueberwachung 2017-10-06 18:07:33 cmd_nr 2
setstate Speisekammer.Tuer.Ueberwachung 2017-10-06 18:07:33 e_Speisekammer.Tuer_events basicSet: 255
setstate Speisekammer.Tuer.Ueberwachung 2017-10-06 18:07:33 state cmd_2
setstate Speisekammer.Tuer.Ueberwachung 2017-10-06 18:14:40 wait_timer no timer
Das hier steht im Logfile, wenn die Tür aufgeht:
Zitat
2017-10-06_17:13:59 Speisekammer.Tuer alarm: AccessControl: Window/Door is open
2017-10-06_17:13:59 Speisekammer.Tuer basicSet: 255
2017-10-06_17:13:59 Speisekammer.Tuer basicSet: 255
2017-10-06_17:14:15 Speisekammer.Tuer alarm: AccessControl: Window/Door is closed
Mail bekomme ich aber keine... Das Mail-Verschicken sollte funktionieren, hab ich schon mehrfach ausprobiert. Wo hakt es denn?
Jedes Event das "open" folgt (Tuer basicSet: 255) schaltet nach cmd_2, daher ist Bedingung nie 60s lang wahr.
Ich würde einen DOELSEIF Zweig mit dem "closed" Event einbauen.
Hallo Ellert
danke für Deine Erklärung! Leider verstehe ich sie noch nicht ganz. Ich habe versucht, mit Hilfe der Kommandoreferenz zu DOIF dahinter zu kommen... aber ich kapier's noch nicht.
Ein DOIF ist also nicht nicht das Gleiche bzw. mehr als ein "normales" if... else ...?
Das "wait" funktioniert nur, wenn nach der Bedingung in DOIF gar kein weiteres event folgt? Aber dann verstehe ich das (funktionierende) Beispiel mit der Waschmaschine nicht:
ZitatAnwendungsbeispiel: Benachrichtigung "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
Hmm, aber das ist ja hier kein Event. Funktioniert das deshalb?
Könntest du mir bitte noch ein Beispiel geben, wie Du das mit dem "closed" Event meinst?
Dein Problem ist, dass ein anderer als der open event den timer wieder zurücksetzt, im commandref beispiel steht deshalb bei Deinem Beispiel:
ZitatEine erneute Benachrichtigung wird erst wieder ausgelöst, wenn zwischendurch der Verbrauch über 2 Watt angestiegen war.
Eigentlich ist Dein Fall ein klassischer watchdog - bei der eine Warnung ausgegeben werden soll, wenn nach einem Event in einer bestimmten Zeit ein Ereignis NICHT eintritt
ZitatEin DOIF ist also nicht nicht das Gleiche bzw. mehr als ein "normales" if... else ...?
Genau, aber es gibt eben auch Gemeinsamkeiten.
Mit "closed" Event meine ich, das Event, wenn die Tür geschlossen wird, das soll ja den Timer abbrechen, damit keine Mail versand wird, wenn die Tür nicht lange genug geöffnet ist.
ZitatKönntest du mir bitte noch ein Beispiel geben, wie Du das mit dem "closed" Event meinst?
Wenn Du den DOIF Zweig und die Eventabfrage für "Tür geöffnet" formulieren konntest, wo liegen da Deine Schwierigkeiten einen DOELSEIF-Zweig zu formulieren, mit dem Event "Tür geschlossen"?
ZitatHmm, aber das ist ja hier kein Event. Funktioniert das deshalb?
Ja, es wird bei jedem Event geprüt, aber immer das Reading abgefragt.
Zitat von: viegener am 06 Oktober 2017, 21:59:05
Eigentlich ist Dein Fall ein klassischer watchdog
Danke, damit funktioniert es jetzt :)
Zitat von: Ellert am 06 Oktober 2017, 23:20:59
Wenn Du den DOIF Zweig und die Eventabfrage für "Tür geöffnet" formulieren konntest, wo liegen da Deine Schwierigkeiten einen DOELSEIF-Zweig zu formulieren, mit dem Event "Tür geschlossen"?
Mein Problem ist, daß ich zwar weiss, wie das Kommando im DOIF-Zwei aussehen soll (DebianMail...), aber keine Ahnung habe, wie das Kommando im DOELSEIF-Zweig aussehen soll.
cu
Markus
Das hängt davon ab, welche Events Speisekammer.Tuer erzeugt.
Du willst ja nichts ausführen, also kannst Du den Befehl weglassen.
(Bedingung) (Befehl)
DOELSEIF (andere Bedingung)
Wenn DOIF in den 2. Zweig wechselt, wird der Waittimer gelöscht.