X-Git-Url: https://git.realraum.at/?a=blobdiff_plain;f=go%2Fr3-netstatus%2Fmain.go;h=0bb8d0e24bf2fc52969d36280fffd4a892c4fa91;hb=4e6f754877a7061afe6ef56b21585c778db5b2c9;hp=cc63daa1b4f66f9933b7ce8e9983b853b87673f7;hpb=cb2342c75d929f11f901e6f8e3d44f6bdc0261b4;p=svn42.git diff --git a/go/r3-netstatus/main.go b/go/r3-netstatus/main.go index cc63daa..0bb8d0e 100644 --- a/go/r3-netstatus/main.go +++ b/go/r3-netstatus/main.go @@ -66,7 +66,7 @@ func composeDoorLockMessage(locked bool, frontshut r3events.DoorAjarUpdate, door } } -func EventToXMPP(events <- chan interface{}, xmpp_presence_events_chan chan <- interface{}) { +func EventToXMPP(bot *r3xmppbot.XmppBot, events <- chan interface{}, xmpp_presence_events_chan chan <- interface{}) { defer func() { if x := recover(); x != nil { @@ -108,7 +108,7 @@ func EventToXMPP(events <- chan interface{}, xmpp_presence_events_chan chan <- i 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: @@ -120,6 +120,10 @@ func EventToXMPP(events <- chan interface{}, xmpp_presence_events_chan chan <- i xmpp_presence_events_chan <- present_status last_buttonpress = 0 } + // Try to XMPP Ping the server and if that fails, quit XMPPBot + if bot.PingServer(900) == false && bot.PingServer(900) == false && bot.PingServer(900) == false && bot.PingServer(900) == false{ return } + 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} } } } @@ -128,17 +132,21 @@ 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 { + Syslog_.Printf("Successfully (re)started XMPP Bot") + // subscribe before QueryLatestEventsAndInjectThem and EventToXMPP + psevents := ps.Sub("presence","door","buttons","updateinterval") QueryLatestEventsAndInjectThem(ps, zmqctx) - EventToXMPP(psevents, xmpp_presence_events_chan) + EventToXMPP(bot, psevents, xmpp_presence_events_chan) + // unsubscribe right away, since we don't known when reconnect will succeed and we don't want to block PubSub + ps.Unsub(psevents, "presence","door","buttons","updateinterval") bot.StopBot() } else { Syslog_.Printf("Error starting XMPP Bot: %s", xmpperr.Error()) } - time.Sleep(5 * time.Second) + time.Sleep(10 * time.Second) } } @@ -151,12 +159,12 @@ func ParseZMQr3Event(lines [][]byte, ps *pubsub.PubSub) { func QueryLatestEventsAndInjectThem(ps *pubsub.PubSub, zmqctx *zmq.Context) { answ := ZmqsAskQuestionsAndClose(zmqctx, brain_connect_addr_, [][][]byte{ - [][]byte{[]byte("DoorCommandEvent")}, - [][]byte{[]byte("DoorLockUpdate")}, - [][]byte{[]byte("DoorAjarUpdate")}, - [][]byte{[]byte("BackdoorAjarUpdate")}, + [][]byte{[]byte("BackdoorAjarUpdate")}, + [][]byte{[]byte("DoorCommandEvent")}, + [][]byte{[]byte("DoorLockUpdate")}, + [][]byte{[]byte("DoorAjarUpdate")}, [][]byte{[]byte("PresenceUpdate")}, - [][]byte{[]byte("IlluminationSensorUpdate")}, + [][]byte{[]byte("IlluminationSensorUpdate")}, [][]byte{[]byte("TempSensorUpdate")}}) for _, a := range(answ) { ParseZMQr3Event(a, ps) @@ -183,10 +191,10 @@ func main() { go EventToWeb(ps) // --- get update on most recent events --- QueryLatestEventsAndInjectThem(ps, zmqctx) - go RunXMPPBot(ps, zmqctx) + go RunXMPPBot(ps, zmqctx) // --- receive and distribute events --- - ticker := time.NewTicker(time.Duration(7) * time.Minute) + ticker := time.NewTicker(time.Duration(6) * time.Minute) for { select { case e := <-zmqsub.In():