Пример #1
0
        private void tstat_timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            lock (tstat_lock)
            {
                foreach (KeyValuePair <ushort, DateTime> tstat in tstats)
                {
                    // Poll every 4 minutes if no prior update
                    if (RoundToMinute(tstat.Value).AddMinutes(4) <= RoundToMinute(DateTime.Now))
                    {
                        Controller.Connection.Send(new clsOL2MsgRequestExtendedStatus(Controller.Connection, enuObjectType.Thermostat, tstat.Key, tstat.Key), HandleRequestThermostatStatus);

                        if (Global.verbose_thermostat_timer)
                        {
                            log.Debug("Polling status for Thermostat {thermostatName}",
                                      Controller.Thermostats[tstat.Key].Name);
                        }
                    }

                    // Log every minute if update within 5 minutes and connected
                    if (RoundToMinute(tstat.Value).AddMinutes(5) > RoundToMinute(DateTime.Now) &&
                        (Controller.Connection.ConnectionState == enuOmniLinkConnectionState.Online ||
                         Controller.Connection.ConnectionState == enuOmniLinkConnectionState.OnlineSecure))
                    {
                        // Don't fire event when invalid temperature of 0 is sometimes received
                        if (Controller.Thermostats[tstat.Key].Temp > 0)
                        {
                            OnThermostatStatus?.Invoke(this, new ThermostatStatusEventArgs()
                            {
                                ID         = tstat.Key,
                                Thermostat = Controller.Thermostats[tstat.Key],
                                EventTimer = true
                            });
                        }
                        else if (Global.verbose_thermostat_timer)
                        {
                            log.Warning("Ignoring unknown temp for Thermostat {thermostatName}",
                                        Controller.Thermostats[tstat.Key].Name);
                        }
                    }
                    else if (Global.verbose_thermostat_timer)
                    {
                        log.Warning("Not logging out of date status for Thermostat {thermostatName}",
                                    Controller.Thermostats[tstat.Key].Name);
                    }
                }
            }

            tstat_timer.Interval = ThermostatTimerInterval();
            tstat_timer.Start();
        }
Пример #2
0
        private void HandleUnsolicitedExtendedStatus(byte[] B)
        {
            clsOL2MsgExtendedStatus MSG = new clsOL2MsgExtendedStatus(Controller.Connection, B);

            switch (MSG.ObjectType)
            {
            case enuObjectType.Area:
                for (byte i = 0; i < MSG.AreaCount(); i++)
                {
                    Controller.Areas[MSG.ObjectNumber(i)].CopyExtendedStatus(MSG, i);
                    OnAreaStatus?.Invoke(this, new AreaStatusEventArgs()
                    {
                        ID   = MSG.ObjectNumber(i),
                        Area = Controller.Areas[MSG.ObjectNumber(i)]
                    });
                }
                break;

            case enuObjectType.Auxillary:
                for (byte i = 0; i < MSG.AuxStatusCount(); i++)
                {
                    Controller.Zones[MSG.ObjectNumber(i)].CopyAuxExtendedStatus(MSG, i);
                    OnZoneStatus?.Invoke(this, new ZoneStatusEventArgs()
                    {
                        ID   = MSG.ObjectNumber(i),
                        Zone = Controller.Zones[MSG.ObjectNumber(i)]
                    });
                }
                break;

            case enuObjectType.Zone:
                for (byte i = 0; i < MSG.ZoneStatusCount(); i++)
                {
                    Controller.Zones[MSG.ObjectNumber(i)].CopyExtendedStatus(MSG, i);
                    OnZoneStatus?.Invoke(this, new ZoneStatusEventArgs()
                    {
                        ID   = MSG.ObjectNumber(i),
                        Zone = Controller.Zones[MSG.ObjectNumber(i)]
                    });
                }
                break;

            case enuObjectType.Thermostat:
                for (byte i = 0; i < MSG.ThermostatStatusCount(); i++)
                {
                    lock (tstat_lock)
                    {
                        Controller.Thermostats[MSG.ObjectNumber(i)].CopyExtendedStatus(MSG, i);
                        OnThermostatStatus?.Invoke(this, new ThermostatStatusEventArgs()
                        {
                            ID         = MSG.ObjectNumber(i),
                            Thermostat = Controller.Thermostats[MSG.ObjectNumber(i)],
                            EventTimer = false
                        });

                        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("Unsolicited status received for Thermostat " + Controller.Thermostats[MSG.ObjectNumber(i)].Name);
                        }
                    }
                }
                break;

            case enuObjectType.Unit:
                for (byte i = 0; i < MSG.UnitStatusCount(); i++)
                {
                    Controller.Units[MSG.ObjectNumber(i)].CopyExtendedStatus(MSG, i);
                    OnUnitStatus?.Invoke(this, new UnitStatusEventArgs()
                    {
                        ID   = MSG.ObjectNumber(i),
                        Unit = Controller.Units[MSG.ObjectNumber(i)]
                    });
                }
                break;

            case enuObjectType.Message:
                for (byte i = 0; i < MSG.MessageCount(); i++)
                {
                    Controller.Messages[MSG.ObjectNumber(i)].CopyExtendedStatus(MSG, i);
                    OnMessageStatus?.Invoke(this, new MessageStatusEventArgs()
                    {
                        ID      = MSG.ObjectNumber(i),
                        Message = Controller.Messages[MSG.ObjectNumber(i)]
                    });
                }
                break;

            default:
                if (Global.verbose_unhandled)
                {
                    StringBuilder sb = new StringBuilder();
                    foreach (byte b in MSG.ToByteArray())
                    {
                        sb.Append(b.ToString() + " ");
                    }

                    log.Debug("Unhandled ExtendedStatus" + MSG.ObjectType.ToString() + " " + sb.ToString());
                }
                break;
            }
        }