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