1 // (c) Bernhard Tittelbach, 2013
8 pubsub "github.com/tuxychandru/pubsub"
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
19 events_chan := ps.Sub("door", "doorcmd", "buttons", "movement")
20 defer ps.Unsub(events_chan, "door", "doorcmd", "buttons", "movement")
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:
29 last_movement = evnt.Ts
33 case r3events.BoreDoomButtonPressEvent:
34 last_buttonpress = evnt.Ts
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:
46 any_door_unlocked := ! front_locked
47 any_door_ajar := ! (front_shut && back_shut)
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 {
53 } else if last_movement != 0 || ts - last_buttonpress < 200 {
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")