rename PanicButton to BoreDooomButton and eliminate door id
[svn42.git] / go / r3-eventbroker_zmq / presence.go
1 // (c) Bernhard Tittelbach, 2013
2
3 package main
4
5 import (
6     "time"
7     //~ "./brain"
8     pubsub "github.com/tuxychandru/pubsub"
9     "./r3events"
10     //~ "log"
11     )
12
13 func MetaEventRoutine_Presence(ps *pubsub.PubSub) {
14     //~ var last_door_cmd *DoorCommandEvent
15     var last_presence bool
16     var last_movement, last_buttonpress int64
17     var front_locked, front_shut, back_shut bool = true, true, true
18
19     events_chan := ps.Sub("door", "doorcmd", "buttons", "movement")
20     defer ps.Unsub(events_chan, "door", "doorcmd", "buttons", "movement")
21
22     for event := range(events_chan) {
23         //~ log.Printf("Presence: %s - %s", event, doorstatemap)
24         new_presence := last_presence
25         ts := time.Now().Unix()
26         switch evnt := event.(type) {
27             case r3events.SomethingReallyIsMoving:
28                 if evnt.Movement {
29                     last_movement = evnt.Ts
30                 } else {
31                     last_movement = 0
32                 }
33             case r3events.BoreDoomButtonPressEvent:
34                 last_buttonpress = evnt.Ts
35                 new_presence = true
36             //~ case DoorCommandEvent:
37                 //~ last_door_cmd = &evnt
38             case r3events.DoorLockUpdate:
39                 front_locked = evnt.Locked
40             case r3events.DoorAjarUpdate:
41                 front_shut = evnt.Shut
42             case r3events.BackdoorAjarUpdate:
43                 back_shut = evnt.Shut
44         }
45
46         any_door_unlocked := ! front_locked
47         any_door_ajar := ! (front_shut && back_shut)
48
49         if new_presence != last_presence {
50             //... skip state check .. we had a definite presence event
51         } else if any_door_unlocked || any_door_ajar {
52             new_presence = true
53         } else if last_movement != 0 || ts - last_buttonpress < 200 {
54             new_presence = true
55         } else {
56             new_presence = false
57         }
58         //~ log.Printf("Presence: new: %s , last:%s", new_presence, last_presence)
59         if new_presence != last_presence {
60             last_presence = new_presence
61             ps.Pub(r3events.PresenceUpdate{new_presence, ts} , "presence")
62         }
63     }
64 }