interessante DOIF Wifilight Konstellation

Begonnen von herrmannj, 28 September 2015, 23:13:15

Vorheriges Thema - Nächstes Thema

herrmannj

Hallo,

ich hab eben einen Zeitlang einen vermeintlichen Fehler DOIF/Wifilight gesucht und wollte die findings kurz teilen:

Ausgang
DOIF soll durch einen Bewegungsmelder einen Lampe anschalten wenn sie aus ist und nach 20 Sekunden wieder ausschalten.

Setup DOIF
Einschalten bei Bewegungsmelder "on" && lampe "off" && Dunkel.
Ausschalten 20 Sekunden nach "off" (wait)

In beiden Fällen Abfrage auf Bewegungsmelder "state"

Das hat manchmal nicht funktioniert und Wifilight hat komischerweise sogar angezeigt "Lampe an". zuerst habe ich einen Fehler in Wifilight gesucht.

Die Lösung war dann aber:
Bei mehrfachen Bewegungen im Raum entsteht folgendes,
- bm "on" && lampe "off" -> Lampe geht an
- bm sendet off, DOIF geht in waittimer 20 Sekunden
- erneute Bewegung, bm "on"
- 20 Sekunden um, DOIF schaltet Lampe ab sendet event "off".

Damit wird im DOIF Bedingung 1 (bm "on" && lampe "off") wahr WÄHREND wifilight innerhalb ReadingsUpdate ist und DOIF schaltet die Lampe SOFORT erneut an. Da sich wifilight noch im ReadingsUpdate (bzw an dessen ende) befindet kommt es zu dem undefinierten Zustand. fhem.pl verhindert glücklicherweise die Rekursion in der eventloop.

Lösung war danach simpel: auf Events des bm umzustellen.

Das soll jetzt wirklich kein pointing in Richtung DOIF (oder Wifilight? ;) ) sein - ich wüsste ad-hoc noch nicht einmal wie man das einfach verhindert.

Mir geht es darum aufzuzeigen eine derartige Situation entstehen kann und man das bei einer Fehlersuche (oder support für andere hier im forum) mit "auf der Uhr" haben sollte - gilt genauso bestimmt auch für andere module.

vg
joerg

Nachtrag:
doch - innerhalb von wifilight könnte ich das vmtl verhindern indem ich readingsEndUpdate an das Ende des "set" lege. Weiß nicht wie das bei anderen ist, ich zumindest habe bisher so eine Konstellation nicht durchdacht oder behandelt ...

Nachtrag 2:
nee, würde nicht reichen wenn das aus einer getimten queue kommt. readingsEndUpdate müsste dann auch der letzte Befehl in der timer routine sein ...