Ejemplo n.º 1
0
        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);
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private void HandleSetTime(clsOmniLinkMessageQueueItem M, byte[] B, bool Timeout)
        {
            if (Timeout)
            {
                return;
            }

            log.Debug("Controller time has been successfully set");
        }
Ejemplo n.º 3
0
        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);
            }
        }
Ejemplo n.º 4
0
        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);
            }
        }
Ejemplo n.º 5
0
        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);
            }
        }
Ejemplo n.º 6
0
        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();
            }
        }
Ejemplo n.º 7
0
        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;
                }
            }
        }
Ejemplo n.º 8
0
        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;
                }
            }
        }