From fe66f608ece4c905876f607ecbcfa957db634bca Mon Sep 17 00:00:00 2001 From: Ryan Wagoner Date: Fri, 22 Nov 2019 21:26:34 -0500 Subject: [PATCH] 1.1.4 - Shutdown cleanly on linux or docker --- OmniLinkBridge/Modules/MQTTModule.cs | 27 +++++++++++++++++++++++---- OmniLinkBridge/Modules/OmniLinkII.cs | 4 ++++ OmniLinkBridge/OmniLinkBridge.csproj | 3 +++ OmniLinkBridge/Program.cs | 27 ++++++++++++++++++++++++++- README.md | 1 + 5 files changed, 57 insertions(+), 5 deletions(-) diff --git a/OmniLinkBridge/Modules/MQTTModule.cs b/OmniLinkBridge/Modules/MQTTModule.cs index ceb82a2..b19e24a 100644 --- a/OmniLinkBridge/Modules/MQTTModule.cs +++ b/OmniLinkBridge/Modules/MQTTModule.cs @@ -83,6 +83,7 @@ namespace OmniLinkBridge.Modules PublishConfig(); }; MqttClient.ConnectingFailed += (sender, e) => { log.Debug("Error connecting " + e.Exception.Message); }; + MqttClient.Disconnected += (sender, e) => { log.Debug("Disconnected"); }; MqttClient.StartAsync(manoptions); @@ -103,6 +104,8 @@ namespace OmniLinkBridge.Modules log.Debug("Publishing controller offline"); MqttClient.PublishAsync($"{Global.mqtt_prefix}/status", "offline", MqttQualityOfServiceLevel.AtMostOnce, true); + + MqttClient.StopAsync(); } private void MqttClient_ApplicationMessageReceived(object sender, MqttApplicationMessageReceivedEventArgs e) @@ -307,7 +310,8 @@ namespace OmniLinkBridge.Modules private void OmniLink_OnConnect(object sender, EventArgs e) { - PublishConfig(); + if(MqttClient.IsConnected) + PublishConfig(); ControllerConnected = true; } @@ -316,8 +320,11 @@ namespace OmniLinkBridge.Modules { ControllerConnected = false; - log.Debug("Publishing controller offline"); - MqttClient.PublishAsync($"{Global.mqtt_prefix}/status", "offline", MqttQualityOfServiceLevel.AtMostOnce, true); + if (MqttClient.IsConnected) + { + log.Debug("Publishing controller offline"); + MqttClient.PublishAsync($"{Global.mqtt_prefix}/status", "offline", MqttQualityOfServiceLevel.AtMostOnce, true); + } } private void PublishConfig() @@ -489,6 +496,9 @@ namespace OmniLinkBridge.Modules private void Omnilink_OnAreaStatus(object sender, AreaStatusEventArgs e) { + if (!MqttClient.IsConnected) + return; + PublishAreaState(e.Area); // Since the controller doesn't fire zone status change on area status change @@ -519,19 +529,28 @@ namespace OmniLinkBridge.Modules private void Omnilink_OnZoneStatus(object sender, ZoneStatusEventArgs e) { + if (!MqttClient.IsConnected) + return; + PublishZoneState(e.Zone); } private void Omnilink_OnUnitStatus(object sender, UnitStatusEventArgs e) { + if (!MqttClient.IsConnected) + return; + PublishUnitState(e.Unit); } private void Omnilink_OnThermostatStatus(object sender, ThermostatStatusEventArgs e) { + if (!MqttClient.IsConnected) + return; + // Ignore events fired by thermostat polling and when temperature is invalid // An invalid temperature can occur when a Zigbee thermostat is unreachable - if(!e.EventTimer && e.Thermostat.Temp > 0) + if (!e.EventTimer && e.Thermostat.Temp > 0) PublishThermostatState(e.Thermostat); } diff --git a/OmniLinkBridge/Modules/OmniLinkII.cs b/OmniLinkBridge/Modules/OmniLinkII.cs index 6205666..c7410bc 100644 --- a/OmniLinkBridge/Modules/OmniLinkII.cs +++ b/OmniLinkBridge/Modules/OmniLinkII.cs @@ -64,6 +64,8 @@ namespace OmniLinkBridge.Modules trigger.WaitOne(new TimeSpan(0, 0, 5)); } + + Disconnect(); } public void Shutdown() @@ -84,6 +86,8 @@ namespace OmniLinkBridge.Modules private void Disconnect() { + log.Info("CONNECTION STATUS: Disconnecting"); + if (Controller.Connection.ConnectionState != enuOmniLinkConnectionState.Offline) Controller.Connection.Disconnect(); } diff --git a/OmniLinkBridge/OmniLinkBridge.csproj b/OmniLinkBridge/OmniLinkBridge.csproj index 83abbd8..33d750d 100644 --- a/OmniLinkBridge/OmniLinkBridge.csproj +++ b/OmniLinkBridge/OmniLinkBridge.csproj @@ -156,6 +156,9 @@ 2.0.8 + + 4.5.0 + 2.8.4 diff --git a/OmniLinkBridge/Program.cs b/OmniLinkBridge/Program.cs index 63226d8..ec57534 100644 --- a/OmniLinkBridge/Program.cs +++ b/OmniLinkBridge/Program.cs @@ -1,8 +1,10 @@ -using System; +using Mono.Unix; +using System; using System.Diagnostics; using System.IO; using System.Reflection; using System.ServiceProcess; +using System.Threading.Tasks; namespace OmniLinkBridge { @@ -55,8 +57,26 @@ namespace OmniLinkBridge Environment.Exit(1); } + if (Environment.UserInteractive || interactive) { + if (IsRunningOnMono()) + { + UnixSignal[] signals = new UnixSignal[]{ + new UnixSignal(Mono.Unix.Native.Signum.SIGTERM), + new UnixSignal(Mono.Unix.Native.Signum.SIGINT), + new UnixSignal(Mono.Unix.Native.Signum.SIGUSR1) + }; + + Task.Factory.StartNew(() => + { + // Blocking call to wait for any kill signal + int index = UnixSignal.WaitAny(signals, -1); + + server.Shutdown(); + }); + } + Console.TreatControlCAsInput = false; Console.CancelKeyPress += new ConsoleCancelEventHandler(myHandler); @@ -86,6 +106,11 @@ namespace OmniLinkBridge args.Cancel = true; } + static bool IsRunningOnMono() + { + return Type.GetType("Mono.Runtime") != null; + } + static void ShowHelp() { Console.WriteLine( diff --git a/README.md b/README.md index 090af0a..34f538c 100644 --- a/README.md +++ b/README.md @@ -224,6 +224,7 @@ Version 1.1.4 - 2019-11-22 - Fix compatibility with Home Assistant 0.95.4 MQTT extra keys - Add Home Assistant MQTT device registry support - Add MQTT messages for controller disconnect and last will +- Shutdown cleanly on linux or docker Version 1.1.3 - 2019-02-10 - Publish config when reconnecting to MQTT