using System; using System.Collections.Generic; using System.Text; using ZigBee.Device; using System.Threading.Tasks; using Newtonsoft.Json.Linq; namespace Shared.Phone.UserCenter { /// /// PIR传感器的逻辑 /// public class HdlDevicePirSensorLogic { #region ■ 变量声明___________________________ /// /// PIR传感器的逻辑 /// private static HdlDevicePirSensorLogic m_Current = null; /// /// PIR传感器的逻辑 /// public static HdlDevicePirSensorLogic Current { get { if (m_Current == null) { m_Current = new HdlDevicePirSensorLogic(); } return m_Current; } } #endregion #region ■ 光感等级总刻度_____________________ /// /// 获取PIR传感器的【光感等级总刻度】,错误时返回-1 /// /// /// public async Task GetPirLightAbilitySize(IASZone iASZone) { //如果当前住宅是虚拟住宅 if (Common.Config.Instance.Home.IsVirtually == true) { return 100; } var data = await iASZone.GetPIRLightAbilitySizeAsync(); //共通错误检测 string error = HdlCheckLogic.Current.CheckCommonErrorCode(data); if (error != null) { this.ShowErrorMsg(error); return -1; } if (data == null || data.errorMessageBase != null || data.LightLevelCount == -1) { //获取传感器光感等级失败 string msg = Language.StringByID(R.MyInternationalizationString.uGetPirSensorLightPerceptionRegulationFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, data); this.ShowErrorMsg(msg); return -1; } return data.LightLevelCount; } #endregion #region ■ 获取配置信息_______________________ /// /// 获取PIR传感器的【配置信息】,错误时返回null /// /// /// public IASZone.ConfigureParamates GetPirSensorLightSettion(IASZone iASZone) { var data = this.GetPIRSensorParamateAsync(iASZone); if (data == null || data.configureParamates == null) { //获取传感器设置信息失败 string msg = Language.StringByID(R.MyInternationalizationString.uGetPirSensorSettionFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, data); this.ShowErrorMsg(msg); return null; } return data.configureParamates; } /// /// 获取PIR传感器的【lux值】,错误时返回-1 /// /// /// /// public async Task GetPirSensorLux(IASZone iASZone, ShowErrorMode mode = ShowErrorMode.YES) { //如果当前住宅是虚拟住宅 if (Common.Config.Instance.Home.IsVirtually == true) { return 70; } var data = await iASZone.GetPirLuxAbilitySizeAsync(); if (data == null || data.pirLux == -1) { //获取传感器亮度值失败 string msg = Language.StringByID(R.MyInternationalizationString.uGetPirSensorLuxFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, data); if (mode == ShowErrorMode.YES) { this.ShowErrorMsg(msg); } return -1; } return data.pirLux; } /// ///PIR传感器参数配置 /// public IASZone.ParamatesInfo GetPIRSensorParamateAsync(CommonDevice device) { //如果当前住宅是虚拟住宅 if (Common.Config.Instance.Home.IsVirtually == true) { return ModelData.DeviceModelDataLogic.Current.GetPirSensorLightSettion(device); } var sendData = this.GetPirSensorParamateCommadText(device.DeviceAddr); var result = HdlDeviceCommonLogic.Current.SendJobjectDataToGateway2(device, sendData, "0302", 34, 9); if (result.ErrorMsg != null || result.ErrorMsgDiv == 0) { return null; } var data = result.ReceiptData; var tempD = new IASZone.ConfigureParamates(); var le = data[10].ToString() + data[11].ToString(); tempD.levelEnable = le == "01"; var size = data[12].ToString() + data[13].ToString(); tempD.levelSize = Convert.ToInt32(size, 16); var cdl = data[14].ToString() + data[15].ToString(); tempD.controlDevEnable = cdl == "01"; tempD.transitionTime = Convert.ToInt32(data[18].ToString() + data[19].ToString() + data[16].ToString() + data[17].ToString(), 16); tempD.iasReportPeriod = Convert.ToInt32(data[22].ToString() + data[23].ToString() + data[20].ToString() + data[21].ToString(), 16); tempD.mode = Convert.ToInt32(data[24].ToString() + data[25].ToString(), 16); tempD.type = Convert.ToInt32(data[26].ToString() + data[27].ToString(), 16); tempD.dimmerOnTime = Convert.ToInt32(data[28].ToString() + data[29].ToString(), 16); tempD.dimmerOffTime = Convert.ToInt32(data[30].ToString() + data[31].ToString(), 16); tempD.dimmerLevel = Convert.ToInt32(data[32].ToString() + data[33].ToString(), 16); return new IASZone.ParamatesInfo { configureParamates = tempD }; } /// /// 获取PIR传感器参数配置的命令字符 /// /// /// private string GetPirSensorParamateCommadText(string DeviceAddr) { var passData = "050103010101"; var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; var data = new JObject { { "PassData", passData } }; jObject.Add("Data", data); return jObject.ToString(); } #endregion #region ■ 设置配置信息_______________________ /// /// 设置PIR传感器的【配置信息】 /// /// 传感器对象 /// 灯光配置 /// public bool SetPirSensorSettion(CommonDevice device, IASZone.ConfigureParamates configure) { var result = this.SetPIRSensorParamateAsync(device, configure); if (result == null || result.responseData == null) { //设置传感器配置信息失败 string msg = Language.StringByID(R.MyInternationalizationString.uSetPirSensorSettionFail); //拼接上【网关回复超时】的Msg msg = UserCenterLogic.CombineGatewayTimeOutMsg(msg, result); this.ShowErrorMsg(msg); return false; } if (result.responseData.status != 0) { //设置传感器配置信息失败 string msg = Language.StringByID(R.MyInternationalizationString.uSetPirSensorSettionFail); this.ShowErrorMsg(msg); return false; } return true; } /// /// PIR传感器参数配置 /// /// /// /// public IASZone.ResponseAllData SetPIRSensorParamateAsync(CommonDevice device, IASZone.ConfigureParamates configureParamates) { //如果是虚拟住宅 if (Common.Config.Instance.Home.IsVirtually == true) { return ModelData.DeviceModelDataLogic.Current.SetPirSensorLightSettion(device, configureParamates, "ClientDataPassthrough"); } //发送数据 var sendData = this.GetPirSensorSettionCommandText(device.DeviceAddr, configureParamates); var result = HdlDeviceCommonLogic.Current.SendJobjectDataToGateway2(device, sendData, "0002", 16, 9); if (result.ErrorMsg != null || result.ErrorMsgDiv == 0) { return null; } string data = result.ReceiptData; var tempD = new IASZone.ResponseData(); tempD.command = data[12].ToString() + data[13].ToString() + data[10].ToString() + data[11].ToString(); tempD.status = Convert.ToInt32(data[14].ToString() + data[15].ToString(), 16); return new CommonDevice.ResponseAllData { responseData = tempD }; } /// /// 获取修改PIR传感器配置的命令字符 /// /// /// /// public string GetPirSensorSettionCommandText(string DeviceAddr, IASZone.ConfigureParamates configureParamates) { var passData = this.GetPIRSensorSettionPassData(configureParamates); var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } }; var data = new JObject { { "PassData", passData } }; jObject.Add("Data", data); return jObject.ToString(); } /// /// 获取修改PIR传感器配置的命令字符 /// private string GetPIRSensorSettionPassData(IASZone.ConfigureParamates configureParamates) { string data = ""; string dataLength = "10"; string dataComand1 = "00"; string dataComand2 = "03"; string dataSerialNum = "01"; string addDataLength = "0C"; string levelEnable = ""; string levelSize = ""; string controlDevEnable = ""; string transitionTime = ""; string iasReportPeriod = ""; string mode = ""; string type = ""; string dimmerOnTime = ""; string dimmerOffTime = ""; try { if (configureParamates != null) { //levelEnable if (configureParamates.levelEnable) { levelEnable = "01"; } else { levelEnable = "00"; } //光照等级 if (configureParamates.levelSize > 0) { var tempLevelEnable = Convert.ToString(configureParamates.levelSize, 16); levelSize = tempLevelEnable.ToString().PadLeft(2, '0'); } else { levelSize = "00"; } //controlDevEnable if (configureParamates.controlDevEnable) { controlDevEnable = "01"; } else { controlDevEnable = "00"; } //transitionTime,iasReportPeriod for (int j = 0; j < 2; j++) { var tempBytes = new byte[2]; if (j == 0) { for (int i = 0; i < 2; i++) { tempBytes[i] = (byte)(configureParamates.transitionTime >> (i * 8) & 0xff); } } else { for (int i = 0; i < 2; i++) { tempBytes[i] = (byte)(configureParamates.iasReportPeriod >> (i * 8) & 0xff); } } var time1 = Convert.ToString(tempBytes[0], 16); var time2 = Convert.ToString(tempBytes[1], 16); if (time1.Length == 1) { time1 = "0" + time1; } if (time2.Length == 1) { time2 = "0" + time2; } if (j == 0) { transitionTime = (time1 + time2).ToUpper(); } else { iasReportPeriod = (time1 + time2).ToUpper(); } } //mode if (configureParamates.mode == 1) { mode = "01"; } else { mode = "00"; } //type if (configureParamates.type == 1) { type = "01"; } else { type = "00"; } //dimmerOnTime if (configureParamates.dimmerOnTime > 0) { var tempDimmerOnTime = Convert.ToString(configureParamates.dimmerOnTime, 16); dimmerOnTime = tempDimmerOnTime.ToString().PadLeft(2, '0'); } else { dimmerOnTime = "00"; } dimmerOnTime = dimmerOnTime.ToUpper(); if (configureParamates.dimmerOffTime > 0) { var tempDimmerOffTime = Convert.ToString(configureParamates.dimmerOffTime, 16); dimmerOffTime = tempDimmerOffTime.ToString().PadLeft(2, '0'); } else { dimmerOffTime = "00"; } dimmerOffTime = dimmerOffTime.ToUpper(); //dimmerLevel string temp = ""; var sbString = new System.Text.StringBuilder(); string temp2 = Convert.ToString(configureParamates.dimmerLevel, 16); switch (temp2.Length) { case 1: temp = "0" + temp2; break; case 2: temp = temp2; break; } sbString.Append(temp.ToUpper()); data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + levelEnable + levelSize + controlDevEnable + transitionTime + iasReportPeriod + mode + type + dimmerOnTime + dimmerOffTime + sbString; } } catch { }; return data; } #endregion #region ■ 一般方法___________________________ /// /// 显示错误信息窗口 /// /// private void ShowErrorMsg(string msg) { Application.RunOnMainThread(() => { var contr = new ShowMsgControl(ShowMsgType.Error, msg); contr.Show(); }); } /// /// 显示Tip信息窗口 /// /// private void ShowTipMsg(string msg) { Application.RunOnMainThread(() => { var contr = new UserCenter.ShowMsgControl(ShowMsgType.Tip, msg); contr.Show(); }); } #endregion } }