using System; using System.Collections; using System.Collections.Generic; using System.Linq; using ZigBee.Device; namespace Shared.Common { /// /// 设备(和UI相关,和device有区别) /// [System.Serializable] public class DeviceUI { #region ◆ 变量____________________________ /// /// 设备MAC地址 /// public string DeviceAddr = string.Empty; /// /// 设备端点 /// public int DeviceEpoint = 0; /// /// 设备文件 /// /// The name of the file. [Newtonsoft.Json.JsonIgnore] public string FileName { get { var myDevice = Common.LocalDevice.Current.GetDevice(DeviceAddr, DeviceEpoint); if (myDevice != null) { return myDevice.FilePath; } return $"Device_Unkwon"; } } [Newtonsoft.Json.JsonIgnore] public ZigBee.Device.CommonDevice CommonDevice { get { return Common.LocalDevice.Current.GetDevice(DeviceAddr, DeviceEpoint); } } /// /// 是否是自定义图片 /// [Newtonsoft.Json.JsonIgnore] public bool IsCustomizeImage { get { var myDevice = Common.LocalDevice.Current.GetDevice(DeviceAddr, DeviceEpoint); if (myDevice != null) { return myDevice.IsCustomizeImage; } return false; } } /// /// 设备图片 /// [Newtonsoft.Json.JsonIgnore] public string IconPath { get { var myDevice = Common.LocalDevice.Current.GetDevice(DeviceAddr, DeviceEpoint); if (myDevice != null) { return myDevice.IconPath; } return string.Empty; } } /// /// 设备图片--在线或者选中状态 /// /// The online icon path. [Newtonsoft.Json.JsonIgnore] public string OnlineIconPath { get { var myDevice = Common.LocalDevice.Current.GetDevice(DeviceAddr, DeviceEpoint); if (myDevice != null) { return myDevice.OnlineIconPath; } return string.Empty; } } /// /// 控制延时默认反馈的线程列表 /// public static List threads = new List { }; #endregion #region ◆ 发送控制命令延时反馈______________ /// /// 发送控制命令延时反馈 /// /// Common device. /// Action. /// Delay time. public static void SendCommandDelayAction(CommonDevice commonDevice, Action action, int delayTime = 3) { var threadName = commonDevice.GetHashCode().ToString(); if (threads.Find((obj) => obj.Name == threadName) == null) { var thread = new System.Threading.Thread(() => { var dateTime = DateTime.Now; while ((DateTime.Now - dateTime).TotalSeconds < delayTime) { System.Threading.Thread.Sleep(100); } lock (threads) { threads.RemoveAll((obj) => obj.Name == threadName); } action?.Invoke(); }) { IsBackground = true, Name = threadName }; lock (threads) { threads.Add(thread); } thread.Start(); } } #endregion #region ◆ 显示控制设备是否成功的提示_________ /// /// 显示控制设备是否成功的提示 /// /// The red component. public static void ShowStatuTip(int r) { Application.RunOnMainThread(() => { string msg = Language.StringByID(r); var tip = new Phone.UserCenter.ShowMsgControl(Phone.UserCenter.ShowMsgType.Tip, msg); tip.Show(); }); } #endregion #region ◆ 获取设备类型图片__________________ /// /// 通过设备类型获取通用的设备类型图片 /// /// The device type un selected image path. /// Device type. public static string GetDeviceTypeUnSelectedImagePath(ZigBee.Device.DeviceType deviceType) { string ImagePath; //窗帘 switch (deviceType) { case DeviceType.OnOffSwitch: //控制面板 ImagePath = "Device/DryContact.png"; break; case DeviceType.OnOffOutput: //继电器 ImagePath = "Device/Relay.png"; break; case DeviceType.DimmableLight: //调光灯 ImagePath = "Device/DimmableLight.png"; break; case DeviceType.WindowCoveringDevice: //窗帘 ImagePath = "Device/Curtain.png"; break; case DeviceType.Thermostat: //空调 ImagePath = "Device/AirConditioner.png"; break; case DeviceType.IASZone: //传感器 ImagePath = "Device/Sensor.png"; break; case DeviceType.AirSwitch: //空气开关 ImagePath = "Device/AirSwitch.png"; break; case DeviceType.Repeater: //中继器 ImagePath = "Device/AirSwitch.png"; break; case DeviceType.TemperatureSensor: //温湿度传感器 ImagePath = "Device/Sensor.png"; break; default: ImagePath = "Device/Relay.png"; break; } return ImagePath; } /// /// 通过设备类型获取通用的选中状态的设备类型图片 /// /// The device type un selected image path. /// Device type. public static string GetDeviceTypeSelectedImagePath(ZigBee.Device.DeviceType deviceType) { string ImagePath; switch (deviceType) { case DeviceType.OnOffSwitch: //控制面板 ImagePath = "Device/DryContactSelected.png"; break; case DeviceType.OnOffOutput: //继电器 ImagePath = "Device/RelaySelected.png"; break; case DeviceType.DimmableLight: //调光灯 ImagePath = "Device/DimmableLightSelected.png"; break; case DeviceType.WindowCoveringDevice: //窗帘 ImagePath = "Device/CurtainSelected.png"; break; case DeviceType.Thermostat: //空调 ImagePath = "Device/AirConditionerSelected.png"; break; case DeviceType.IASZone: //传感器 ImagePath = "Device/SensorSelected.png"; break; case DeviceType.AirSwitch: //空气开关 ImagePath = "Device/AirSwitchSelected.png"; break; case DeviceType.Repeater: //中继器--还没图片 ImagePath = "Device/AirSwitchSelected.png"; break; default: ImagePath = "Device/RelaySelected.png"; break; } return ImagePath; } #endregion #region ◆ 获取设备类型名称__________________ public static string GetDeviceTypeName(ZigBee.Device.DeviceType deviceType) { int deviceTypeR; switch (deviceType) { case DeviceType.OnOffSwitch: //控制面板 deviceTypeR = R.MyInternationalizationString.OnOffSwitch; break; case DeviceType.OnOffOutput: //继电器--灯 deviceTypeR = R.MyInternationalizationString.OnOffOutput; break; case DeviceType.DimmableLight: //调光灯 deviceTypeR = R.MyInternationalizationString.DimmableLight; break; case DeviceType.WindowCoveringDevice: //窗帘 deviceTypeR = R.MyInternationalizationString.WindowCoveringDevice; break; case DeviceType.Thermostat: //空调 deviceTypeR = R.MyInternationalizationString.Thermostat; break; case DeviceType.IASZone: //传感器 deviceTypeR = R.MyInternationalizationString.IASZone; break; case DeviceType.AirSwitch: //空气开关 deviceTypeR = R.MyInternationalizationString.AirSwitch; break; case DeviceType.Repeater: //中继器 deviceTypeR = R.MyInternationalizationString.Repeater; break; case DeviceType.DoorLock: //门锁 deviceTypeR = R.MyInternationalizationString.DoorLock; break; case DeviceType.TemperatureSensor: //温度传感器 deviceTypeR = R.MyInternationalizationString.TemperatureAndHumiditySensor; break; default: deviceTypeR = R.MyInternationalizationString.UnknowDevice; break; } return Language.StringByID(deviceTypeR); } #endregion #region ◆ 通过id获取设备区域_____________ /// /// GetZone /// /// public string GetZone() { var room = Room.CurrentRoom.GetRoomByDevice(CommonDevice); if (room == null) { return Language.StringByID(R.MyInternationalizationString.UnallocatedArea); } if(string.IsNullOrEmpty(room.FloorId)) { return room.Name; } var floorName = Config.Instance.Home.GetFloorNameById(room.FloorId); if (floorName == null) { return room.Name; } return $"{floorName},{room.Name}"; } #endregion /// /// GetDeviceStatu /// /// public string GetDeviceStatu() { var device = CommonDevice; if (device.Type == DeviceType.OnOffOutput) { if ((device as ToggleLight).OnOffStatus == 1) { return Language.StringByID(R.MyInternationalizationString.Open); } return Language.StringByID(R.MyInternationalizationString.Shut); } else if (device.Type == DeviceType.AirSwitch) { if ((device as ZigBee.Device.AirSwitch).OnOffStatus == 1) { return Language.StringByID(R.MyInternationalizationString.Open); } return Language.StringByID(R.MyInternationalizationString.Shut); } else if (device.Type == DeviceType.DimmableLight) { if ((device as DimmableLight).OnOffStatus == 0 || (device as DimmableLight).Level == 0) { return Language.StringByID(R.MyInternationalizationString.Shut); } return $"{(int)((device as DimmableLight).Level * 1.0 / 254 * 100)}%"; } else if (device.Type == DeviceType.WindowCoveringDevice) { if ((device as Rollershade).WcdCurrentPositionLiftPercentage == 0) { return Language.StringByID(R.MyInternationalizationString.Shut); } return $"{(device as Rollershade).WcdCurrentPositionLiftPercentage}%"; } else if (device.Type == DeviceType.Thermostat) { //温度,模式,风速 string tempareture = string.Empty; string model = string.Empty; string wind = string.Empty; var ac = CommonDevice as AC; if (ac.currentSystemMode == 0) { return Language.StringByID(R.MyInternationalizationString.Shut); } else if (ac.currentSystemMode == 1) { model = Language.StringByID(R.MyInternationalizationString.Mode_Auto); tempareture = $"{ac.currentCoolingSetpoint} ℃"; } else if (ac.currentSystemMode == 3) { model = Language.StringByID(R.MyInternationalizationString.Mode_Cool); tempareture = $"{ac.currentCoolingSetpoint} ℃"; } else if (ac.currentSystemMode == 4) { model = Language.StringByID(R.MyInternationalizationString.Mode_Heat); tempareture = $"{ac.currentHeatingSetpoint} ℃"; } else if (ac.currentSystemMode == 7) { model = Language.StringByID(R.MyInternationalizationString.Mode_FanOnly); } else if (ac.currentSystemMode == 8) { model = Language.StringByID(R.MyInternationalizationString.Mode_Dry); tempareture = $"{ac.currentCoolingSetpoint} ℃"; } if (ac.currentFanMode == 1) { wind = Language.StringByID(R.MyInternationalizationString.Fan_Low); } else if (ac.currentFanMode == 2) { wind = Language.StringByID(R.MyInternationalizationString.Fan_Middle); } else { wind = Language.StringByID(R.MyInternationalizationString.Fan_Height); } if (string.IsNullOrEmpty(tempareture)) { return $"{model},{wind}"; } return $"{model},{wind},{tempareture}"; } else if (device.Type == DeviceType.IASZone) { var ias = CommonDevice as IASZone; //区分传感器具体类型 var info = Common.LocalDevice.Current.GetNotHdlMyDeviceEnumInfo(new List { device },false); if (info.ConcreteType == DeviceConcreteType.Sensor_Infrared) { //红外 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_HavePerson); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_NoPerson); } else if (info.ConcreteType == DeviceConcreteType.Sensor_Water) { //水浸 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_HaveWater); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Normal); } else if (info.ConcreteType == DeviceConcreteType.Sensor_DoorWindow) { //门窗 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Open); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Close); } else if (info.ConcreteType == DeviceConcreteType.Sensor_CarbonMonoxide) { //燃气 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Alarm); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Safe); } else if (info.ConcreteType == DeviceConcreteType.Sensor_Fire) { //烟雾 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Alarm); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Safe); } else if (info.ConcreteType == DeviceConcreteType.Sensor_Pir) { //pir if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Alarm); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Safe); } else if (info.ConcreteType == DeviceConcreteType.Sensor_Keyfob) { //钥匙扣 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Alarm); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Normal); } else if (info.ConcreteType == DeviceConcreteType.Sensor_Motion) { //运动传感器 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Alarm); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Normal); } else if (info.ConcreteType == DeviceConcreteType.Sensor_EmergencyButton) { //紧急按钮 if (ias.iASInfo?.Alarm1 == 1) { return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Alarm); } return Language.StringByID(R.MyInternationalizationString.IASZone_Statu_Normal); } return null; } else if (device.Type == DeviceType.TemperatureSensor) { var tempera = CommonDevice as TemperatureSensor; if(tempera.SensorDiv==1) { if (tempera.Temperatrue == 0) { return "--℃"; } return $"{tempera.Temperatrue}℃"; } else if(tempera.SensorDiv==2) { if (tempera.Humidity == 0) { return "--%"; } return $"{tempera.Humidity}%"; } return null; } else { return null; } } } }