Bewegungsalarm mit DOIF (Reset nach Zeit)

Begonnen von dustbln, 19 März 2019, 23:10:18

Vorheriges Thema - Nächstes Thema

dustbln

Hi zusammen!

Ich versuche folgendes mit DOIF hinzubekommen und weder Commandref noch Google helfen mir weiter:

Ich habe einen Bewegungsmelder. Wenn der auslöst, dann soll eine Nachricht ausgelöst werden. Eine erneute Benachrichtigung soll erst erfolgen, wenn für eine bestimmte Zeit keine Bewegung festgestellt wurde. Ich habe das folgendermaßen gelöst:

def di_HUEMotion1_Bewegung DOIF ([HUEMotion1_Presence:"motion"]) (set XY message ALARM)

def di_HUEMotion1_Keine_Bewegung DOIF ([HUEMotion1_Presence:"nomotion"]) (set di_HUEMotion1_Bewegung initialize) DOELSE
attr di_HUEMotion1_Keine_Bewegung do resetwait
attr di_HUEMotion1_Keine_Bewegung wait 600


Das Ganze kommt mir extrem dreckig vor und ich bin neugierig, vermutlich sehe ich den Wald vor lauter Bäumen nicht. Wie geht es besser?

Danke und viele Grüße
Stefan

rabehd

Warum nicht ein DOIF ?
Wie wäre es mit DOELSEIF?
Auch funktionierende Lösungen kann man hinterfragen.

dustbln

Du meinst bei "Bewegung"? Weil er dann jedes mal auslösen würde, wenn das Event "motion" erneut auftritt, da er ja von vorher cmd_1 auf cmd_2 wechseln würde. Ich möchte aber, dass das erst passiert, wenn für eine gewisse Zeit "nomotion" gegolten hat.

rabehd

#3
ZitatBewegungsmelder. Wenn der auslöst, dann soll eine Nachricht ausgelöst werden. Eine erneute Benachrichtigung soll erst erfolgen, wenn für eine bestimmte Zeit keine Bewegung festgestellt wurde.

Dein Problem leigt wahrscheinlich in
ZitatEine erneute Benachrichtigung soll erst erfolgen, wenn für eine bestimmte Zeit keine Bewegung festgestellt wurde.
Meinst Du: "Eine erneute Auslösung (Benachrichtigung) soll erst nach einer bestimmten Zeit möglich sein."?

Was ist das für ein Bewegungsmelder? Wann liefert der das Event "nomotion"?

ergänzend, wenn man sich die Mühe macht die DOIF-Beschreibung zu lesen.
ZitatZwangspause für das Ausführen eines Kommandos seit der letzten Zustandsänderung   back

Mit dem Attribut cmdpause <Sekunden für cmd_1>:<Sekunden für cmd_2>:... wird die Zeitspanne in Sekunden angegeben für eine Zwangspause seit der letzten Zustandsänderung. In der angegebenen Zeitspanne wird ein Kommando nicht ausgeführt, auch wenn die dazugehörige Bedingung wahr wird.

Anwendungsbeispiel: Meldung über Frostgefahr alle 60 Minuten

define di_frost DOIF ([outdoor:temperature] < 0) (set pushmsg "danger of frost")
attr di_frost cmdpause 3600
attr di_frost do always

Begrenzung von Wiederholungen eines Kommandos   back

Mit dem Attribut repeatsame <maximale Anzahl von cmd_1>:<maximale Anzahl von cmd_2>:... wird die maximale Anzahl hintereinander folgenden Ausführungen festgelegt.

Anwendungsbeispiel: Die Meldung soll maximal dreimal erfolgen mit einer Pause von mindestens 10 Minuten

define di_washer DOIF ([Watt]<2) (set pushmeldung "washer finished")
attr di_washer repeatsame 3
attr di_washer cmdpause 600

Das Attribut repeatsame lässt sich mit do always oder do resetwait kombinieren. Wenn die maximale Anzahl für ein Kommando ausgelassen oder auf Null gesetzt wird, so gilt für dieses Kommando der Defaultwert "einmalige Wiederholung"; in Kombination mit do always bzw. do resetwait gilt für dieses Kommando "beliebige Wiederholung".

Anwendungsbeispiel: cmd_1 soll beliebig oft wiederholt werden, cmd_2 maximal zweimal

attr di_repeat repeatsame 0:2
attr di_repeat do always
Auch funktionierende Lösungen kann man hinterfragen.

dustbln

Hi! Es ist ein HUE Bewegungsmelder. Er liefert einmal das Event "motion" und bleibt in dem State solange Bewegung erkannt wird. Wenn keine Bewegung mehr erkannt wird wechselt er kurz darauf in den State "nomotion" und bleibt dabei bis wieder Bewegung erkannt wird.

Ich möchte eine Nachricht (und wirklich nur eine) bekommen, wenn das Device in den Zustand "motion" wechselt, aber nur, wenn es zuvor für eine bestimmte Zeit im Zustand "nomotion" war. Das muss natürlich nicht für die erstmalige Auslösung gelten, tut es in meiner dreckigen Lösung ja auch nicht.

Ich hoffe ich konnte das Problem verständlich machen. ;)

Danke und Grüße
Stefan

dustbln

Über deinem Auszug habe ich wie erwähnt länger gebrütet. Ich sehe dort keine Lösung für mein Problem.

Damian

Du kannst dich im DOIF Perl-Modus beliebig nicht "dreckig", sondern "sauber" austoben. ;)

Im FHEM-Modus würde ich mit Zwischenzuständen arbeiten.

Zur Vorgehensweise: Du definierst zwei Zweige in einem DOIF. Im "nomotion" Zweig definierst du zwei Sequenzen, die erste ohne Inhalt, die zweite wird verzögert ausgeführt, im Zweig "motion" fragst du zusätzlich ab, ob sich das Modul noch in der ersten Sequenz im Zweig "nomotion" befindet.

Programmierte FHEM-Module: DOIF-FHEM, DOIF-Perl, DOIF-uiTable, THRESHOLD, FHEM-Befehl: IF

dustbln

#7
Das ist dann aber schon DOIF im Endstadium ;)

Das klingt nach einer interessanten Lösung, werde ich mir angucken! Dachte bisher, dass Zustandsabfragen nur im Perl Modus gehen, gut zu wissen.

Danke!