X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fr3-netstatus%2Fmain.go;h=c897e2953867df3b89ff709be16667cc839a34f2;hb=36c81737d355f02eb05b150472c9bf44fbf46120;hp=85309ae4d863ff3326b77717c70f90c0cca3da04;hpb=69489156ce4eb5fac36d965a2f851ad764f58e64;p=svn42.git diff --git a/go/r3-netstatus/main.go b/go/r3-netstatus/main.go index 85309ae..c897e29 100644 --- a/go/r3-netstatus/main.go +++ b/go/r3-netstatus/main.go @@ -10,6 +10,7 @@ import ( "fmt" //~ "./brain" r3events "svn.spreadspace.org/realraum/go.svn/r3events" + zmq "github.com/vaughan0/go-zmq" ) type SpaceState struct { @@ -65,11 +66,9 @@ func composeDoorLockMessage(locked bool, frontshut r3events.DoorAjarUpdate, door } } -func EventToXMPP(ps *pubsub.PubSub, xmpp_presence_events_chan chan <- interface{}) { - events := ps.Sub("presence","door","buttons","updateinterval") +func EventToXMPP(events <- chan interface{}, xmpp_presence_events_chan chan <- interface{}) { defer func() { - ps.Unsub(events, "presence","door","buttons","updateinterval") if x := recover(); x != nil { //defer ist called _after_ EventToXMPP function has returned. Thus we recover after returning from this function. Syslog_.Printf("handleIncomingXMPPStanzas: run time panic: %v", x) @@ -109,7 +108,7 @@ func EventToXMPP(ps *pubsub.PubSub, xmpp_presence_events_chan chan <- interface{ if last_frontdoor_ajar.Shut != event.Shut { xmpp_presence_events_chan <- r3xmppbot.XMPPMsgEvent{Msg: fmt.Sprintf("Frontdoor is %s (%s)",IfThenElseStr(event.Shut,"now shut.","ajar."),time.Unix(event.Ts,0).String()), DistributeLevel: r3xmppbot.R3DebugInfo, RememberAsStatus: false} } - last_frontdoor_ajar = event + last_frontdoor_ajar = event case r3events.BackdoorAjarUpdate: xmpp_presence_events_chan <- r3xmppbot.XMPPMsgEvent{Msg: fmt.Sprintf("Backdoor is %s (%s)",IfThenElseStr(event.Shut,"now shut.","ajar!"),time.Unix(event.Ts,0).String()), DistributeLevel: r3xmppbot.R3OnlineOnlyInfo, RememberAsStatus: false} case r3events.BoreDoomButtonPressEvent: @@ -121,18 +120,22 @@ func EventToXMPP(ps *pubsub.PubSub, xmpp_presence_events_chan chan <- interface{ xmpp_presence_events_chan <- present_status last_buttonpress = 0 } + case r3events.DoorProblemEvent: + xmpp_presence_events_chan <- r3xmppbot.XMPPMsgEvent{Msg: fmt.Sprintf("Door Problem: %s. SeverityLevel: %d (%s)",event.Problem, event.Severity, time.Unix(event.Ts,0).String()), DistributeLevel: r3xmppbot.R3OnlineOnlyInfo, RememberAsStatus: false} } } } -func RunXMPPBot(ps *pubsub.PubSub) { +func RunXMPPBot(ps *pubsub.PubSub, zmqctx *zmq.Context) { var xmpperr error var bot *r3xmppbot.XmppBot var xmpp_presence_events_chan chan interface{} + psevents := ps.Sub("presence","door","buttons","updateinterval") for { bot, xmpp_presence_events_chan, xmpperr = r3xmppbot.NewStartedBot(xmpp_login_.jid, xmpp_login_.pass, xmpp_bot_authstring_, xmpp_state_save_dir_, true) if xmpperr == nil { - EventToXMPP(ps, xmpp_presence_events_chan) + QueryLatestEventsAndInjectThem(ps, zmqctx) + EventToXMPP(psevents, xmpp_presence_events_chan) bot.StopBot() } else { Syslog_.Printf("Error starting XMPP Bot: %s", xmpperr.Error()) @@ -148,6 +151,20 @@ func ParseZMQr3Event(lines [][]byte, ps *pubsub.PubSub) { ps.Pub(evnt, pubsubcat) } +func QueryLatestEventsAndInjectThem(ps *pubsub.PubSub, zmqctx *zmq.Context) { + answ := ZmqsAskQuestionsAndClose(zmqctx, brain_connect_addr_, [][][]byte{ + [][]byte{[]byte("BackdoorAjarUpdate")}, + [][]byte{[]byte("DoorCommandEvent")}, + [][]byte{[]byte("DoorLockUpdate")}, + [][]byte{[]byte("DoorAjarUpdate")}, + [][]byte{[]byte("PresenceUpdate")}, + [][]byte{[]byte("IlluminationSensorUpdate")}, + [][]byte{[]byte("TempSensorUpdate")}}) + for _, a := range(answ) { + ParseZMQr3Event(a, ps) + } +} + func main() { if enable_syslog_ { LogEnableSyslog(); r3xmppbot.LogEnableSyslog() } if enable_debug_ { LogEnableDebuglog(); r3xmppbot.LogEnableDebuglog() } @@ -160,19 +177,15 @@ func main() { panic("zmq sockets must not be nil !!") } - ps := pubsub.New(1) + ps := pubsub.New(10) defer ps.Shutdown() //~ brn := brain.New() //~ defer brn.Shutdown() go EventToWeb(ps) - go RunXMPPBot(ps) - // --- get update on most recent events --- - answ := ZmqsAskQuestionsAndClose(zmqctx, brain_connect_addr_, [][][]byte{[][]byte{[]byte("DoorCommandEvent")}, [][]byte{[]byte("DoorLockUpdate")}, [][]byte{[]byte("DoorAjarUpdate")}, [][]byte{[]byte("PresenceUpdate")}, [][]byte{[]byte("IlluminationSensorUpdate")}, [][]byte{[]byte("TempSensorUpdate")}}) - for _, a := range(answ) { - ParseZMQr3Event(a, ps) - } + QueryLatestEventsAndInjectThem(ps, zmqctx) + go RunXMPPBot(ps, zmqctx) // --- receive and distribute events --- ticker := time.NewTicker(time.Duration(7) * time.Minute)