tweak presence detection
[svn42.git] / go / r3-eventbroker_zmq / presence.go
index 860a674..1a6f11c 100644 (file)
@@ -9,10 +9,10 @@ import (
     r3events "svn.spreadspace.org/realraum/go.svn/r3events"
     )
 
-func MetaEventRoutine_Presence(ps *pubsub.PubSub) {
+func MetaEventRoutine_Presence(ps *pubsub.PubSub, movement_timeout, button_timeout int64) {
     //~ var last_door_cmd *r3events.DoorCommandEvent
     var last_presence bool
-    var last_movement, last_buttonpress int64
+    var last_movement, last_buttonpress, last_frontlock_use int64
     var front_locked, front_shut, back_shut bool = true, true, true
 
     events_chan := ps.Sub("door", "doorcmd", "buttons", "movement")
@@ -28,6 +28,7 @@ func MetaEventRoutine_Presence(ps *pubsub.PubSub) {
                     last_movement = evnt.Ts
                 } else {
                     last_movement = 0
+                    if last_presence { Syslog_.Print("Presence: Mhh, SomethingReallyIsMoving{false} received but presence still true. Quite still a bunch we have here.") }
                 }
             case r3events.BoreDoomButtonPressEvent:
                 last_buttonpress = evnt.Ts
@@ -36,8 +37,13 @@ func MetaEventRoutine_Presence(ps *pubsub.PubSub) {
                 //~ last_door_cmd = &evnt
             case r3events.DoorLockUpdate:
                 front_locked = evnt.Locked
+                last_frontlock_use = evnt.Ts
             case r3events.DoorAjarUpdate:
-                front_shut = evnt.Shut
+                if front_shut == false && evnt.Shut && front_locked && evnt.Ts - last_frontlock_use > 2 {
+                    Syslog_.Print("Presence: ignoring frontdoor ajar event, since obviously someone is fooling around with the microswitch while the door is still open")
+                } else {
+                    front_shut = evnt.Shut
+                }
             case r3events.BackdoorAjarUpdate:
                 back_shut = evnt.Shut
         }
@@ -49,7 +55,7 @@ func MetaEventRoutine_Presence(ps *pubsub.PubSub) {
             //... skip state check .. we had a definite presence event
         } else if any_door_unlocked || any_door_ajar {
             new_presence = true
-        } else if last_movement != 0 || ts - last_buttonpress < 200 {
+        } else if ts - last_movement < movement_timeout || ts - last_buttonpress < button_timeout {
             new_presence = true
         } else {
             new_presence = false