From e44d628886563adaeafcbe557a7bf421ccbbc979 Mon Sep 17 00:00:00 2001 From: Ryan Wagoner Date: Tue, 23 Oct 2018 21:19:28 -0400 Subject: [PATCH] - Request zone status update on area status change --- OmniLinkBridge/Modules/MQTTModule.cs | 25 +++++++++++++++++++++++++ OmniLinkBridge/Modules/OmniLinkII.cs | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/OmniLinkBridge/Modules/MQTTModule.cs b/OmniLinkBridge/Modules/MQTTModule.cs index 36ab64a..e27bd65 100644 --- a/OmniLinkBridge/Modules/MQTTModule.cs +++ b/OmniLinkBridge/Modules/MQTTModule.cs @@ -394,6 +394,31 @@ namespace OmniLinkBridge.Modules private void Omnilink_OnAreaStatus(object sender, AreaStatusEventArgs e) { PublishAreaState(e.Area); + + // Since the controller doesn't fire zone status change on area status change + // request update so armed, tripped, and secure statuses are correct + for (ushort i = 1; i < OmniLink.Controller.Zones.Count; i++) + { + clsZone zone = OmniLink.Controller.Zones[i]; + + if (zone.DefaultProperties == false && zone.Area == e.Area.Number) + OmniLink.Controller.Connection.Send(new clsOL2MsgRequestExtendedStatus(OmniLink.Controller.Connection, enuObjectType.Zone, i, i), HandleRequestZoneStatus); + } + } + + private void HandleRequestZoneStatus(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) + { + if (Timeout) + return; + + clsOL2MsgExtendedStatus MSG = new clsOL2MsgExtendedStatus(OmniLink.Controller.Connection, B); + + for (byte i = 0; i < MSG.ZoneStatusCount(); i++) + { + clsZone zone = OmniLink.Controller.Zones[MSG.ObjectNumber(i)]; + zone.CopyExtendedStatus(MSG, i); + MqttClient.PublishAsync(zone.ToTopic(Topic.state), zone.ToState(), MqttQualityOfServiceLevel.AtMostOnce, true); + } } private void Omnilink_OnZoneStatus(object sender, ZoneStatusEventArgs e) diff --git a/OmniLinkBridge/Modules/OmniLinkII.cs b/OmniLinkBridge/Modules/OmniLinkII.cs index b7cfba7..5929177 100644 --- a/OmniLinkBridge/Modules/OmniLinkII.cs +++ b/OmniLinkBridge/Modules/OmniLinkII.cs @@ -391,7 +391,7 @@ namespace OmniLinkBridge.Modules case enuObjectType.Zone: Controller.Zones.CopyProperties(MSG); - if (Controller.Zones[MSG.ObjectNumber].IsTemperatureZone()) + if (Controller.Zones[MSG.ObjectNumber].IsTemperatureZone() || Controller.Zones[MSG.ObjectNumber].IsHumidityZone()) Controller.Connection.Send(new clsOL2MsgRequestExtendedStatus(Controller.Connection, enuObjectType.Auxillary, MSG.ObjectNumber, MSG.ObjectNumber), HandleRequestAuxillaryStatus); break;