FHEM Forum

FHEM => Anfängerfragen => Thema gestartet von: SebastianStorb am 25 Februar 2020, 08:45:17

Titel: DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: SebastianStorb am 25 Februar 2020, 08:45:17
FHEM DOIF soll nur dann eine Nachricht schicken wenn ein Ereignis (z.B. Tür offen, Fenster offen, Temperatur im Kühlschrank abgefallen oder Lampe an) mindestens z.B. 30 Minuten lang besteht. Die Nachricht soll jedoch nicht geschickt werden, wenn das Ereignis in der Zwischenzeit nicht mehr besteht (Tür geschlossen, Fenster wieder zu, Temperatur im Kühlschrank wieder normal).

Was funktioniert:
Das Ereignis (Lampe an) wird ausgelöst.
Das Ereignis (Lampe an) wird zeitverzögert ausgelöst (z.B. 30 Sekunden).
Das Ereignis (Lampe an) wird per SMS auf mein Handy gesendet.

([Wohnzimmer] eq "on")
({system ("sudo gammu-smsd-inject TEXT +4917xxxxxxxx -text 'FHEM: Das Licht wurde eingeschaltet'")})


Hier vermutet ich, dass es funktioniert (getestete Zeit zu kurz um es genau sagen zu können):
Das Ereignis (Lampe an) wird zurückgesetzt wenn die Lampe zwischendurch ausgemacht wurde
attr doif_LampeAnSMS do resetwait
attr doif_LampeAnSMS wait 30 (<-wieder mit 30 Sekunden anstatt Minuten getestet)

Was nicht funktioniert:
Das Ereignis wird ausgelöst, obwohl sich der Status wieder geändert hat (Lampe aus).
Das Ereignis soll nach dem ersten Auslösen erst wieder nach einer weiteren (z.B. Stunde) Wartezeit per SMS verschickt werden (und nicht alle paar Minuten)

Kann mir jemand helfen? Ich habe gestern über 6 Stunden Anleitungen repeatcmd(DOELSEIF ([Wohnzimmer] eq "off" and [?$SELF:cmd] eq "1") und Hinweise aus Forum ausprobiert - ohne Erfolg - es funktioniert nicht.
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: rabehd am 25 Februar 2020, 08:59:13
Es ist immer gut, wenn man sich an das Problem rantastet. Es wird auch gern gesehen, wenn man Code als solchen darstellt (der Button mit # über den Editierfenster).

Willst Du auf alle diese Ereignisse nach einer Zeit mit der gleichen/Variablen Meldung reagieren?
ZitatEreignis (z.B. Tür offen, Fenster offen, Temperatur im Kühlschrank abgefallen oder Lampe an)

ZitatWas funktioniert:
Freut mich, aber wenn Du sagt wie es funktioniert (List des DOIF), dann hilft das mehr.
Das Problem in deinen ersten Satz ist schnell gelöst. Danach wird dein Text schwer verständlich.

Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: Ralli am 25 Februar 2020, 10:43:02
Zitat
Eine bereits ausgelöste Verzögerung wird zurückgesetzt, wenn während der Wartezeit ein Kommando eines anderen DO-Falls, ausgelöst durch ein neues Ereignis, ausgeführt werden soll.


def meindoif DOIF ([Wohnzimmer] eq "on")
({system ("sudo gammu-smsd-inject TEXT +4917xxxxxxxx -text 'FHEM: Das Licht wurde eingeschaltet'")})
DOELSE ()
attr meindoif wait 900:0
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: MadMax-FHEM am 25 Februar 2020, 10:51:32
Hallo,

keine Hilfe bzgl. DOIF ;)

(wobei bei der Beschreibung laut Thread-Titel hätte verm. Watchdog auch funktioniert / warum immer gleich DOIF ;)  )

Aber eine Anmerkung genereller Art im "Umgang" mit fhem:

Zitat
({system ("sudo gammu-smsd-inject TEXT +4917xxxxxxxx -text 'FHEM: Das Licht wurde eingeschaltet'")})

fhem ist "single-threaded" -> Aufrufe wie der von dir verwendete können fhem blockieren, je nachdem was der Aufruf macht bzw. wenn dieser blockieren kann (also länger dauern kann, z.B. Netzwerk "nicht da" etc.)

Besser (wenn kein Rückgabewert notwendig):


({fhem("\"sudo gammu-smsd-inject TEXT +4917xxxxxxxx -text 'FHEM: Das Licht wurde eingeschaltet'\"")})


Siehe auch: http://heinz-otto.blogspot.com/2018/02/in-fhem-externe-programme-aufrufen.html

Andere Variante: den Aufruf auf "Non-Blocking-Call" umbauen. Aber sehr aufwendig (verglichen mit "einfach Anführungszeichen verwenden"), siehe auch: https://wiki.fhem.de/wiki/Blocking_Call

Gruß, Joachim
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: CoolTux am 25 Februar 2020, 11:06:38
Hier mal ein Watchdog Beispiel

Internals:
   CMD        set pushmsg msg title="Wohnungsstatus krittisch" priority=1 device=handy-marko Achtung! Seit 30min wurde die Wohnungstür nicht geschlossen
   DEF        TuerKontaktFlur_Wohnungstuer.open 00:30 TuerKontaktFlur_Wohnungstuer.closed set pushmsg msg title="Wohnungsstatus krittisch" priority=1 device=handy-marko Achtung! Seit 30min wurde die Wohnungstür nicht geschlossen
   FUUID      5c485fb1-f33f-fc06-60e0-cce34b6fb1cc8c32
   NAME       wd_WgTuereNichtZu
   NR         416
   NTFY_ORDER 50-wd_WgTuereNichtZu
   RE1        TuerKontaktFlur_Wohnungstuer.open
   RE2        TuerKontaktFlur_Wohnungstuer.closed
   STATE      defined
   TO         1800
   TYPE       watchdog
   READINGS:
     2020-02-25 07:01:56   Activated       activated
     2020-02-25 07:01:59   Reset           reset
     2019-10-25 13:02:13   Triggered       triggered
Attributes:
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: Pfriemler am 25 Februar 2020, 11:14:19
genau, Watchdog.
Anderenfalls ist zunächst eine Zustandsmaschine erforderlich. Wie beim Watchdog für jedes Device ein DOIF, zwei Zweige (je nach Zustand "Countdown für Nachricht" oder "Ereignis hat sich erledigt". Benachrichtigung verzögern, fertig.

Die übrigen Dinge wie wiederholte Benachrichtigung und Sperrzeiten hängen sehr davon ab welche Events die überwachten Geräte liefern (einmalig, wiederholt, Abstand).

Mehr Hilfe bei mehr Details.
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: Beta-User am 25 Februar 2020, 11:19:12
Ebenfalls ohne DOIF...
Benni's Code für eine "Globale und flexible Fenster- und Türüberwachung", https://forum.fhem.de/index.php/topic,36504.msg287778.html#msg287778
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: SebastianStorb am 25 Februar 2020, 16:07:41
Vielen herzlichen Dank für die Vielen Antworten und Anregungen!

Es scheint jetzt gut zu funktionieren, daher wollte ich noch meine Attributes Einstellungen mitteilen (wie oben empfohlen):
do resetwaitdeleteattr
room
System
deleteattr
wait
30
deleteattr
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: SebastianStorb am 25 Februar 2020, 16:09:38
Vielen herzlichen Dank für die vielen Antworten und Anregungen!

Es scheint jetzt gut zu funktionieren, daher wollte ich noch meine Attributes Einstellungen mitteilen (wie oben empfohlen):

([Wohnzimmer] eq "on")
({fhem("\"sudo gammu-smsd-inject TEXT +4917xxxxxxxx -text 'FHEM: Das Licht wurde eingeschaltet'\"")})
DOELSE ()
attr doif_LampeAnSMS wait 30:0


do resetwait
room System
wait 30


Die o.g. Änderung für den SMS Versand habe ich sofort einpflegt! Hierdurch wird der Versand auch sofort versendet (und nicht mit Verzögerung von 30 Sekunden) und auf 900:0 einstellen!
Titel: Antw:DOIF nur wenn Tür mindestens 15 Minuten lang offen.
Beitrag von: Beta-User am 25 Februar 2020, 16:12:36
Neben dem Hinweis auf [gelöst](?) vielleicht noch zwei Lesetipps, mit denen du das etwas ungeschickte Rauskopieren aus der WEB-Darstellung optimieren kannst:

https://fhem.de/commandref_modular.html#list
https://wiki.fhem.de/wiki/Import_von_Code_Snippets