Fenster offen -> nach 10 min. Mail

Begonnen von Charles, 27 November 2013, 16:44:54

Vorheriges Thema - Nächstes Thema

andies

Ich lasse die Nachricht nach einer Weile auch löschen und prüfe vorher, wie kalt es draussen ist bzw was die vorhergesagte Minimaltemperatur des Tages ist. Dann kriege ich eine Telegramnachricht die mir anbietet, mit einem Kurzbefehl (hier /o2) noch eine Mail zu versenden:

defmod BadUntenfensterMail DOIF ([BadUntenfenster:state] =~ "open" and [BresserTemeo_1:temperature]<12 and [MeinWetter:fc0_tempMax]<14) (set TelegramBot _msg Badezimmerfenster unten ist offen! [emoji394] mit /o2;;sleep 2;; defmod BaduntenMailWeg at +1:00:00 set TelegramBot msgDelete [TelegramBot:sentMsgId])




Gesendet von iPad mit Tapatalk Pro
FHEM 6.1 auf RaspPi3 (Raspbian:  6.1.21-v8+; Perl: v5.32.1)
SIGNALduino (433 MHz) und HM-UART (868 MHz), Sonoff, Blitzwolf, Somfy RTS, CAME-Gartentor, Volkszähler, Keyence-Sensor, Homematic-Sensoren und -thermostat, Ferraris-Zähler für Wasseruhr, Openlink-Nachbau Viessmann

eddso

Danke für die Anregungen,
die Aufgabe ist ja im Beitragnamen. Lösungen:
a) Habe zuvor mit einem watchdog für alle Fenster hantiert das Problem war das ich im <command> watchdog keine Variablen wie $DEVICE, $EVENT, usw. benutzen kann und damit nicht weis von welchem Fenster der Event kommt. Watchdog wäre eigentlich das richtige dafür.
Damit bleibt mit watchdog nur die Lösung für jedes Fenster eigenen watchdog:

define wd_Fenster_HWR watchdog Fenster_HWR:contact:.open 00:05:00 Fenster_HWR:contact:.close {
if ( ReadingsVal('_WEATHER', 'temperature', 25) < 15 ) {
    fhem('set _TELEGRAM send @@eddso36 Das Fenster HWR ist schon seit mindestens 5 Minuten offen')
}
}


b) Immer AT Devices anlegen ist nicht zweckmäßig.

c) DOIF kann das <command> verzögern aber falls das Fenster innerhalb der erlaubter Zeit offen ist dann wird das DOIF trotzdem ausgeführt was nicht erwünscht ist. Ich hoffe das die laufenden verzögerten DOIFs stören sich nicht untereinander da habe ich wenig Erfahrung mit. Etwa so: nach wait 5 min noch mal prüfen ob Fenster immer noch offen erst dann Senden.

defmod di_FensterStatusOpened DOIF (["^Fenster_:open"] and [_WEATHER:temperature] < 15) {
if ( ReadingsVal($DEVICE, 'contact', 'close') eq 'open' ) {
    fhem("set _TELEGRAM send @@eddso36 Das Fenster $DEVICE ist schon seit mindestens 5 Minuten offen")
}
}
attr di_FensterStatusOpened wait 300


Würde die Variante c) Probleme machen? Ist das $DEVICE immer vom richtigem Gerät? Fehlauslösung sehe ich nur wenn ich Fenster für 1 min öffne und nach 4 Minuten wieder für 1 Minute öffne.
Gibt es noch jemanden der es schöner gelöst hat?
MfG Edu

amenomade

#32
Zitat von: eddso am 13 November 2019, 22:15:29
DOIF kann das <command> verzögern aber falls das Fenster innerhalb der erlaubter Zeit offen ist dann wird das DOIF trotzdem ausgeführt was nicht erwünscht ist.
Nicht wenn eine Zustandsänderung erfolgt. In dem Fall wird der Timer abgebrochen, und das Kommando nicht ausgeführt.

Das flexibelste ist warhscheinlich DOIF im Perl Modus mit set_Exec wie schon erwähnt: Du kannst genannte Timers pro Device setzen und löschen. Es gibt sogar im CommandRef ein Beispiel, was ungefähr macht, was Du möchstest: siehe "Verzögerte Fenster-offen-Meldung mit Wiederholung für mehrere Fenster"
Pi 3B, Alexa, CUL868+Selbstbau 1/2λ-Dipol-Antenne, USB Optolink / Vitotronic, Debmatic und HM / HmIP Komponenten, Rademacher Duofern Jalousien, Fritz!Dect Thermostaten, Proteus

eddso

vielen dank amenomade, das ist wirklich guter schubs an die richtige stelle. Das Teste ich mal.
MfG Edu