Hauptmenü

Mail wenn Tür offen steht.

Begonnen von The Grue, 06 Oktober 2017, 18:26:02

Vorheriges Thema - Nächstes Thema

The Grue

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?

Ellert

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.

The Grue

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?

viegener

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

Kein Support über PM - Anfragen gerne im Forum - Damit auch andere profitieren und helfen können

Ellert

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.

The Grue

Zitat von: viegener am 06 Oktober 2017, 21:59:05
Eigentlich ist Dein Fall ein klassischer watchdog

Danke, damit funktioniert es jetzt :)

The Grue

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

Ellert

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.