private void HandleRequestThermostatStatus(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) { if (Timeout) { return; } clsOL2MsgExtendedStatus MSG = new clsOL2MsgExtendedStatus(Controller.Connection, B); for (byte i = 0; i < MSG.ThermostatStatusCount(); i++) { lock (tstat_lock) { Controller.Thermostats[MSG.ObjectNumber(i)].CopyExtendedStatus(MSG, i); if (!tstats.ContainsKey(MSG.ObjectNumber(i))) { tstats.Add(MSG.ObjectNumber(i), DateTime.Now); } else { tstats[MSG.ObjectNumber(i)] = DateTime.Now; } if (Global.verbose_thermostat_timer) { log.Debug("Polling status received for Thermostat " + Controller.Thermostats[MSG.ObjectNumber(i)].Name); } } } }
private void HandleSetTime(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) { if (Timeout) { return; } log.Debug("Controller time has been successfully set"); }
private void HandleRequestAuxillaryStatus(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) { if (Timeout) { return; } clsOL2MsgExtendedStatus MSG = new clsOL2MsgExtendedStatus(Controller.Connection, B); for (byte i = 0; i < MSG.AuxStatusCount(); i++) { Controller.Zones[MSG.ObjectNumber(i)].CopyAuxExtendedStatus(MSG, i); } }
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 HandleRequestSystemStatus(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) { if (Timeout) { return; } tsync_check = DateTime.Now; clsOL2MsgSystemStatus MSG = new clsOL2MsgSystemStatus(OmniLink.Controller.Connection, B); DateTime time; try { // The controller uses 2 digit years and C# uses 4 digit years // Extract the 2 digit prefix to use when parsing the time int year = DateTime.Now.Year / 100; time = new DateTime((int)MSG.Year + (year * 100), (int)MSG.Month, (int)MSG.Day, (int)MSG.Hour, (int)MSG.Minute, (int)MSG.Second); } catch { log.Warning("Controller time could not be parsed"); DateTime now = DateTime.Now; OmniLink.Controller.Connection.Send(new clsOL2MsgSetTime(OmniLink.Controller.Connection, (byte)(now.Year % 100), (byte)now.Month, (byte)now.Day, (byte)now.DayOfWeek, (byte)now.Hour, (byte)now.Minute, (byte)(now.IsDaylightSavingTime() ? 1 : 0)), HandleSetTime); return; } double adj = (DateTime.Now - time).Duration().TotalSeconds; if (adj > Global.time_drift) { log.Warning("Controller time {controllerTime} out of sync by {driftSeconds} seconds", time.ToString("MM/dd/yyyy HH:mm:ss"), adj); DateTime now = DateTime.Now; OmniLink.Controller.Connection.Send(new clsOL2MsgSetTime(OmniLink.Controller.Connection, (byte)(now.Year % 100), (byte)now.Month, (byte)now.Day, (byte)now.DayOfWeek, (byte)now.Hour, (byte)now.Minute, (byte)(now.IsDaylightSavingTime() ? 1 : 0)), HandleSetTime); } }
private void HandleIdentifyController(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) { if (Timeout) { return; } if ((B.Length > 3) && (B[2] == (byte)enuOmniLink2MessageType.SystemInformation)) { clsOL2MsgSystemInformation MSG = new clsOL2MsgSystemInformation(Controller.Connection, B); foreach (enuModel enu in Enum.GetValues(typeof(enuModel))) { if (enu == MSG.ModelNumber) { Controller.Model = enu; break; } } if (Controller.Model == MSG.ModelNumber) { Controller.CopySystemInformation(MSG); using (LogContext.PushProperty("Telemetry", "Controller")) log.Information("Controller is {ControllerModel} firmware {ControllerVersion}", Controller.GetModelText(), Controller.GetVersionText()); _ = Connected(); return; } log.Error("Model does not match file"); Controller.Connection.Disconnect(); } }
private void HandleNamedPropertiesResponse(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) { if (Timeout) { return; } // does it look like a valid response if ((B.Length > 3) && (B[0] == 0x21)) { switch ((enuOmniLink2MessageType)B[2]) { case enuOmniLink2MessageType.EOD: nameWait.Set(); break; case enuOmniLink2MessageType.Properties: clsOL2MsgProperties MSG = new clsOL2MsgProperties(Controller.Connection, B); switch (MSG.ObjectType) { case enuObjectType.Area: Controller.Areas.CopyProperties(MSG); break; case enuObjectType.Zone: Controller.Zones.CopyProperties(MSG); 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; case enuObjectType.Thermostat: Controller.Thermostats.CopyProperties(MSG); if (!tstats.ContainsKey(MSG.ObjectNumber)) { tstats.Add(MSG.ObjectNumber, DateTime.MinValue); } else { tstats[MSG.ObjectNumber] = DateTime.MinValue; } Controller.Connection.Send(new clsOL2MsgRequestExtendedStatus(Controller.Connection, enuObjectType.Thermostat, MSG.ObjectNumber, MSG.ObjectNumber), HandleRequestThermostatStatus); log.Debug("Added thermostat to watch list " + Controller.Thermostats[MSG.ObjectNumber].Name); break; case enuObjectType.Unit: Controller.Units.CopyProperties(MSG); break; case enuObjectType.Message: Controller.Messages.CopyProperties(MSG); break; case enuObjectType.Button: Controller.Buttons.CopyProperties(MSG); break; default: break; } GetNextNamed(MSG.ObjectType, MSG.ObjectNumber); break; default: break; } } }
private void HandleNamedPropertiesResponse(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout) { if (Timeout) { return; } // does it look like a valid response if ((B.Length > 3) && (B[0] == 0x21)) { switch ((enuOmniLink2MessageType)B[2]) { case enuOmniLink2MessageType.EOD: nameWait.Set(); break; case enuOmniLink2MessageType.SystemFormats: var systemFormats = new clsOL2MsgSystemFormats(Controller.Connection, B); Controller.DateFormat = systemFormats.Date; Controller.TimeFormat = systemFormats.Time; Controller.TempFormat = systemFormats.Temp; using (LogContext.PushProperty("Telemetry", "TemperatureFormat")) log.Debug("Temperature format is {TemperatureFormat}", (Controller.TempFormat == enuTempFormat.Fahrenheit ? "Fahrenheit" : "Celsius")); nameWait.Set(); break; case enuOmniLink2MessageType.SystemTroubles: var systemTroubles = new clsOL2MsgSystemTroubles(Controller.Connection, B); TroublePhone = systemTroubles.Contains(enuTroubles.PhoneLine); TroubleAC = systemTroubles.Contains(enuTroubles.AC); TroubleBattery = systemTroubles.Contains(enuTroubles.BatteryLow); TroubleDCM = systemTroubles.Contains(enuTroubles.DCM); nameWait.Set(); break; case enuOmniLink2MessageType.Properties: clsOL2MsgProperties MSG = new clsOL2MsgProperties(Controller.Connection, B); switch (MSG.ObjectType) { case enuObjectType.Area: Controller.Areas.CopyProperties(MSG); break; case enuObjectType.Zone: Controller.Zones.CopyProperties(MSG); 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; case enuObjectType.Thermostat: Controller.Thermostats.CopyProperties(MSG); if (!tstats.ContainsKey(MSG.ObjectNumber)) { tstats.Add(MSG.ObjectNumber, DateTime.MinValue); } else { tstats[MSG.ObjectNumber] = DateTime.MinValue; } Controller.Connection.Send(new clsOL2MsgRequestExtendedStatus(Controller.Connection, enuObjectType.Thermostat, MSG.ObjectNumber, MSG.ObjectNumber), HandleRequestThermostatStatus); log.Debug("Added thermostat to watch list {thermostatName}", Controller.Thermostats[MSG.ObjectNumber].Name); break; case enuObjectType.Unit: Controller.Units.CopyProperties(MSG); break; case enuObjectType.Message: Controller.Messages.CopyProperties(MSG); break; case enuObjectType.Button: Controller.Buttons.CopyProperties(MSG); break; default: break; } GetNextNamed(MSG.ObjectType, MSG.ObjectNumber); break; default: break; } } }