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;
}
}
}
}