陈嘉乐
2020-07-10 48ba446936b51fffafa7c3600c0dadc6ac0e8c20
ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs
@@ -18,57 +18,23 @@
        /// 按键模式(私有功能)
        /// </summary>
        public int panelMode = 65535;
        /// <summary>
        ///按键开状态(指示)亮度
        /// </summary>
        public int panelDirectionsLevel = -1;
        /// <summary>
        /// 按键关状态(背光)亮度
        /// </summary>
        public int panelBacklightLevel = -1;
        /// <summary>
        /// 当前选择模式
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string currentKeySelectModeText = "";
        /// <summary>
        /// 当前选择的楼层ID
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string currentSelectFloorId = string.Empty;
        /// <summary>
        /// 当前开关模式
        /// 当前选择的房间ID【新风面板】
        /// </summary>
        public string CurrentSwitchMode = "";
        /// <summary>
        /// 当前属性模式
        /// </summary>
        public int currentClusterID;
        [Newtonsoft.Json.JsonIgnore]
        public string currentSelectRoomId = string.Empty;
        /// <summary>
        /// 当前调光模式
        /// </summary>
        public string CurrentDimmerMode = "";
        /// <summary>
        /// 当前遮阳模式
        /// </summary>
        public string CurrentCurtainMode = "";
        /// <summary>
        /// 当前房间ID
        /// </summary>
        public string RoomId = "";
        /// <summary>
        /// 当前选中的场景ID
        /// </summary>
        public string curSelectSceneID = "";
        /// <summary>
        /// 本地楼层房间绑定列表
        /// </summary>
        public Dictionary<int, FloorRoomBindObj> FloorRoomBindObjList = new Dictionary<int, FloorRoomBindObj> { };
        /// <summary>
        /// 绑定的楼层房间信息
        /// </summary>
@@ -109,12 +75,8 @@
        // <summary>
        /// 按键中被绑定的目标列表
        /// </summary>
        public System.Collections.Generic.List<BindListResponseObj> bindList = new System.Collections.Generic.List<BindListResponseObj> { };
        /// <summary>
        /// 按键支持的私有模式列表
        /// </summary>
        public System.Collections.Generic.Dictionary<int, string> priDeviceModeFunList = new System.Collections.Generic.Dictionary<int, string> { };
        [Newtonsoft.Json.JsonIgnore]
        public List<BindListResponseObj> bindList = new List<BindListResponseObj>();
        /// <summary>
        /// 私有功能类
@@ -189,8 +151,7 @@
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
@@ -205,18 +166,17 @@
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        if (clientDataPassthroughResponseData == null)
                        {
                            result = new PanelPrivateFunctionsResponseAllInfo { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            if (clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                var data = clientDataPassthroughResponseData.PassData;
                                if (data.Length > 12)
                                {
@@ -312,7 +272,6 @@
                                                }
                                                break;
                                        }
                                        panelPrivateFunctionsResponseInfo = tempD;
                                        result = new PanelPrivateFunctionsResponseAllInfo { panelPrivateFunctionsResponseInfo = tempD };
                                        System.Console.WriteLine($"UI收到通知后的主题_command:0003_{topic}");
                                    }
@@ -359,17 +318,8 @@
        /// PIR配置参数回复
        /// </summary>
        [System.Serializable]
        public class PanelPrivateFunctionsResponseAllInfo
        public class PanelPrivateFunctionsResponseAllInfo:ErrorResponCommon
        {
            /// <summary>
            /// 错误信息
            /// </summary>
            public string errorMessageBase;
            /// <summary>
            /// 网关信息错误反馈
            /// <para>当网关接收到客户端信息后,出现以下异常情况将反馈错误。</para>
            /// </summary>
            public ErrorResponData errorResponData;
            /// <summary>
            /// 光感等级个数(Lux能力)
            /// <para>有几个等级就显示几个刻度</para>
@@ -380,7 +330,6 @@
        /// <summary>
        /// 配置参数回复
        /// </summary>
        public PanelPrivateFunctionsResponseInfo panelPrivateFunctionsResponseInfo;
        [System.Serializable]
        public class PanelPrivateFunctionsResponseInfo
        {
@@ -713,8 +662,7 @@
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
@@ -729,18 +677,17 @@
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        if (clientDataPassthroughResponseData == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            if (clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                var data = clientDataPassthroughResponseData.PassData;
                                if (data.Length == 16)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
@@ -826,7 +773,6 @@
            string dataSerialNum = "01";
            string addDataLength = "03";
            string kStatus = "";
            string kNum = "";
            int attributeData = 0;
            try
@@ -872,105 +818,6 @@
        #endregion
        #region 配置按键指示灯颜色.
        ///<summary >
        ///配置按键指示灯颜色
        /// </summary>
        public async System.Threading.Tasks.Task<ResponseAllData> SetPanelColorInfoAsync(KeyColorData keyColorData, KeyNumStatus keyNumStatus)
        {
            ResponseAllData result = null;
            if (Gateway == null)
            {
                result = new ResponseAllData { errorMessageBase = "当前没有网关" };
                return result;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new ResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 16)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0002")
                                    {
                                        var tempD = new 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);
                                        if (tempD.command == "0401")
                                        {
                                            result = new ResponseAllData { responseData = tempD };
                                            DebugPrintLog($"UI收到通知后的主题_command:0401_{ topic}");
                                        }
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = SetPanelColorData(keyColorData, keyNumStatus);
                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                    var data = new JObject { { "PassData", passData } };
                    jObject.Add("Data", data);
                    Gateway.Send(("ClientDataPassthrough"), jObject.ToString());
                }
                catch { }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                {
                    result = new ResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 绑定设备信息,网关反馈信息
@@ -993,136 +840,6 @@
            public KeyColorData keyColorData;
        }
        /// <summary>
        /// 配置按键指示灯颜色数据
        /// <para>发配置按键指示灯颜色命令时,此时为发送到网关的透传数据</para>
        /// </summary>
        /// <returns>The passthorugh data.</returns>
        /// <param name="keyColorData">Key color data.</param>
        /// <param name="keyNum">Key number.</param>
        string SetPanelColorData(KeyColorData keyColorData, KeyNumStatus keyNumStatus)
        {
            string data = "";
            string dataLength = "0c";
            string dataComand1 = "01";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "08";
            int attributeData = 0;
            try
            {
                for (int i = 1; i <= 16; i++)
                {
                    Type type = keyNumStatus.GetType();
                    var obj = type.InvokeMember("Key" + i, System.Reflection.BindingFlags.GetField, null, keyNumStatus, null);
                    int value0 = 0;
                    if (Convert.ToBoolean(obj) == true)
                    {
                        value0 = 1;
                    }
                    int v = (int)Math.Pow(2, i - 1);
                    attributeData += value0 * v;
                }
                string td = attributeData.ToString("X4");
                char[] td1 = td.ToCharArray();
                string tempAttributeData = string.Concat(td1[2].ToString(), td1[3].ToString(), td1[0].ToString(), td1[1].ToString());
                string temp = "";
                var tempColor1 = keyColorData.OpenColorR.ToString();
                var sbString1 = new System.Text.StringBuilder();
                switch (tempColor1.Length)
                {
                    case 1:
                        temp = "0" + tempColor1;
                        break;
                    case 2:
                        temp = tempColor1;
                        break;
                }
                sbString1.Append(temp.ToUpper());
                var tempColor2 = keyColorData.OpenColorG.ToString();
                var sbString2 = new System.Text.StringBuilder();
                switch (tempColor2.Length)
                {
                    case 1:
                        temp = "0" + tempColor2;
                        break;
                    case 2:
                        temp = tempColor2;
                        break;
                }
                sbString2.Append(temp.ToUpper());
                var tempColor3 = keyColorData.OpenColorB.ToString();
                var sbString3 = new System.Text.StringBuilder();
                switch (tempColor3.Length)
                {
                    case 1:
                        temp = "0" + tempColor3;
                        break;
                    case 2:
                        temp = tempColor3;
                        break;
                }
                sbString3.Append(temp.ToUpper());
                var tempColor4 = keyColorData.CloseColorR.ToString();
                var sbString4 = new System.Text.StringBuilder();
                switch (tempColor3.Length)
                {
                    case 1:
                        temp = "0" + tempColor4;
                        break;
                    case 2:
                        temp = tempColor4;
                        break;
                }
                sbString4.Append(temp.ToUpper());
                var tempColor5 = keyColorData.CloseColorG.ToString();
                var sbString5 = new System.Text.StringBuilder();
                switch (tempColor5.Length)
                {
                    case 1:
                        temp = "0" + tempColor5;
                        break;
                    case 2:
                        temp = tempColor5;
                        break;
                }
                sbString5.Append(temp.ToUpper());
                var tempColor6 = keyColorData.CloseColorB.ToString();
                var sbString6 = new System.Text.StringBuilder();
                switch (tempColor6.Length)
                {
                    case 1:
                        temp = "0" + tempColor6;
                        break;
                    case 2:
                        temp = tempColor6;
                        break;
                }
                sbString6.Append(temp.ToUpper());
                if (keyColorData != null)
                {
                    data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                           tempAttributeData + sbString1 + sbString2 + sbString3 +
                           sbString4 + sbString5 + sbString6;
                }
            }
            catch { };
            return data;
        }
        /// <summary>
        /// 按键指示灯颜色信息
        /// </summary>
        public KeyColorData keyColorData;
        // <summary>
        /// 按键指示灯颜色信息
        /// </summary>
@@ -1247,334 +964,6 @@
        }
        #endregion
        #region 配置按键指示灯面板亮度属性.
        ///<summary >
        ///配置按键指示灯面板亮度属性
        /// <para>directionsLevel:指示灯亮度 0-100(这个是点击后的值)</para>
        /// <para>backlightLevel:背光灯亮度 0-100(这个是点击前的值)</para>
        /// </summary>
        public async System.Threading.Tasks.Task<ResponseAllData> SetKeyLevelAsync(int directionsLevel, int backlightLevel)
        {
            ResponseAllData result = null;
            if (Gateway == null)
            {
                result = new ResponseAllData { errorMessageBase = "当前没有网关" };
                return result;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new ResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 16)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0002")
                                    {
                                        var tempD = new 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);
                                        if (tempD.command == "0402")
                                        {
                                            result = new ResponseAllData { responseData = tempD };
                                            DebugPrintLog($"UI收到通知后的主题_command:0402_{ topic}");
                                        }
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = SetPanelLevelData(directionsLevel, backlightLevel);
                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                    var data = new JObject { { "PassData", passData } };
                    jObject.Add("Data", data);
                    Gateway.Send(("ClientDataPassthrough"), jObject.ToString());
                }
                catch { }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                {
                    result = new ResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 控制按键指示灯
        /// </summary>
        string SetPanelLevelData(int level1, int level2)
        {
            string data = "";
            string dataLength = "06";
            string dataComand1 = "02";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "02";
            string l1 = "";
            string l2 = "";
            try
            {
                var sbString1 = new System.Text.StringBuilder();
                var sbString2 = new System.Text.StringBuilder();
                string temp1 = Convert.ToString(level1, 16);
                string temp2 = Convert.ToString(level2, 16);
                switch (temp1.Length)
                {
                    case 1:
                        l1 = "0" + temp1;
                        break;
                    case 2:
                        l1 = temp1;
                        break;
                }
                switch (temp2.Length)
                {
                    case 1:
                        l2 = "0" + temp2;
                        break;
                    case 2:
                        l2 = temp2;
                        break;
                }
                sbString1.Append(l1.ToString().ToUpper());
                sbString2.Append(l2.ToString().ToUpper());
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                    sbString1 + sbString2;
            }
            catch { };
            return data;
        }
        #endregion
        #region  配置按键指示灯面板节能模式.
        ///<summary >
        /// 配置按键指示灯面板节能模式
        /// <para>modeEnable:节能模式使能</para>
        /// <para>modeTime:无操作进入节能模式时间 0-ffff</para>
        /// <para>节能模式亮度:0-100</para>
        /// </summary>
        public async System.Threading.Tasks.Task<ResponseAllData> SetKeyModeAsync(bool modeEnable, int modeTime, int level)
        {
            ResponseAllData result = null;
            if (Gateway == null)
            {
                result = new ResponseAllData { errorMessageBase = "当前没有网关" };
                return result;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new ResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 16)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0002")
                                    {
                                        var tempD = new 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);
                                        if (tempD.command == "0403")
                                        {
                                            result = new ResponseAllData { responseData = tempD };
                                            System.Console.WriteLine($"UI收到通知后的主题_command:0403_{ topic}");
                                        }
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = SetPanelModeModeData(modeEnable, modeTime, level);
                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                    var data = new JObject { { "PassData", passData } };
                    jObject.Add("Data", data);
                    Gateway.Send(("ClientDataPassthrough"), jObject.ToString());
                }
                catch { }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                {
                    result = new ResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 配置按键指示灯面板节能模式
        /// </summary>
        string SetPanelModeModeData(bool modeEnable, int modeTime, int modelevel)
        {
            string data = "";
            string dataLength = "08";
            string dataComand1 = "03";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "04";
            string mode = "";
            string time = "";
            string level = "";
            try
            {
                if (modeEnable)
                {
                    mode = "01";
                }
                else
                {
                    mode = "00";
                }
                if (modeTime == -1)
                {
                    //当节能模式没有给时间,默认给60秒
                    modeTime = 60;
                }
                var tempBytes = new byte[2];
                for (int i = 0; i < 2; i++)
                {
                    tempBytes[i] = (byte)(modeTime >> (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;
                }
                time = (time1 + time2).ToUpper();
                var sbString2 = new System.Text.StringBuilder();
                string temp2 = Convert.ToString(modelevel, 16);
                switch (temp2.Length)
                {
                    case 1:
                        level = "0" + temp2;
                        break;
                    case 2:
                        level = temp2;
                        break;
                }
                sbString2.Append(level.ToUpper());
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                   mode + time + sbString2;
            }
            catch { };
            return data;
        }
        #endregion
        #region  配置接近传感
        ///<summary >
        /// 配置接近传感
@@ -1597,8 +986,7 @@
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
@@ -1613,18 +1001,17 @@
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        if (clientDataPassthroughResponseData == null)
                        {
                            result = new ResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            if (clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                var data = clientDataPassthroughResponseData.PassData;
                                if (data.Length == 16)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
@@ -1714,233 +1101,6 @@
        #endregion
        #region 获取按键指示灯开关颜色.
        ///<summary >
        ///获取按键指示灯开关颜色.
        /// </summary>
        public async System.Threading.Tasks.Task<KeyColorDataResponseAllData> GetPanelColorInfoAsync(KeyNum keyNum)
        {
            KeyColorDataResponseAllData result = null;
            if (Gateway == null)
            {
                result = new KeyColorDataResponseAllData { errorMessageBase = "当前没有网关" };
                return result;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new KeyColorDataResponseAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new KeyColorDataResponseAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new KeyColorDataResponseAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 24)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0405")
                                    {
                                        var key1 = data[10] + data[11];
                                        var key = data[10].ToString() + data[11].ToString();
                                        var tempR = new KeyColorData();
                                        tempR.OpenColorR = data[12].ToString() + data[13].ToString(); ;
                                        tempR.OpenColorG = data[14].ToString() + data[15].ToString(); ;
                                        tempR.OpenColorB = data[16].ToString() + data[17].ToString(); ;
                                        tempR.CloseColorR = data[18].ToString() + data[19].ToString(); ;
                                        tempR.CloseColorG = data[20].ToString() + data[21].ToString(); ;
                                        tempR.CloseColorB = data[22].ToString() + data[23].ToString(); ;
                                        switch (key)
                                        {
                                            case "01":
                                                tempR.keyNum = KeyNum.Key1;
                                                break;
                                            case "02":
                                                tempR.keyNum = KeyNum.Key2;
                                                break;
                                            case "03":
                                                tempR.keyNum = KeyNum.Key3;
                                                break;
                                            case "04":
                                                tempR.keyNum = KeyNum.Key4;
                                                break;
                                            case "05":
                                                tempR.keyNum = KeyNum.Key5;
                                                break;
                                            case "06":
                                                tempR.keyNum = KeyNum.Key6;
                                                break;
                                            case "07":
                                                tempR.keyNum = KeyNum.Key7;
                                                break;
                                            case "08":
                                                tempR.keyNum = KeyNum.Key8;
                                                break;
                                            case "09":
                                                tempR.keyNum = KeyNum.Key9;
                                                break;
                                            case "0a":
                                                tempR.keyNum = KeyNum.Key10;
                                                break;
                                            case "0b":
                                                tempR.keyNum = KeyNum.Key11;
                                                break;
                                            case "0c":
                                                tempR.keyNum = KeyNum.Key12;
                                                break;
                                            case "0d":
                                                tempR.keyNum = KeyNum.Key13;
                                                break;
                                            case "0e":
                                                tempR.keyNum = KeyNum.Key14;
                                                break;
                                            case "0f":
                                                tempR.keyNum = KeyNum.Key15;
                                                break;
                                        }
                                        keyColorData = tempR;
                                        result = new KeyColorDataResponseAllData { keyColorData = tempR };
                                        System.Console.WriteLine($"UI收到通知后的主题_command:0404_{ topic}");
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = GetkeyColorData(keyNum);
                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                    var data = new JObject { { "PassData", passData } };
                    jObject.Add("Data", data);
                    Gateway.Send(("ClientDataPassthrough"), jObject.ToString());
                }
                catch { }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)// WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                {
                    result = new KeyColorDataResponseAllData { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 获取按键指示灯开关颜色
        /// </summary>
        string GetkeyColorData(KeyNum keyNum)
        {
            string data = "";
            string dataLength = "05";
            string dataComand1 = "04";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "01";
            string kNum = "";
            try
            {
                switch (keyNum)
                {
                    case KeyNum.Key1:
                        kNum = "01";
                        break;
                    case KeyNum.Key2:
                        kNum = "02";
                        break;
                    case KeyNum.Key3:
                        kNum = "03";
                        break;
                    case KeyNum.Key4:
                        kNum = "04";
                        break;
                    case KeyNum.Key5:
                        kNum = "05";
                        break;
                    case KeyNum.Key6:
                        kNum = "06";
                        break;
                    case KeyNum.Key7:
                        kNum = "07";
                        break;
                    case KeyNum.Key8:
                        kNum = "08";
                        break;
                    case KeyNum.Key9:
                        kNum = "09";
                        break;
                    case KeyNum.Key10:
                        kNum = "0A";
                        break;
                    case KeyNum.Key11:
                        kNum = "0B";
                        break;
                    case KeyNum.Key12:
                        kNum = "0C";
                        break;
                    case KeyNum.Key13:
                        kNum = "0D";
                        break;
                    case KeyNum.Key14:
                        kNum = "0E";
                        break;
                    case KeyNum.Key15:
                        kNum = "0F";
                        break;
                    case KeyNum.Key16:
                        kNum = "10";
                        break;
                }
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength + kNum;
            }
            catch { };
            return data;
        }
        /// <summary>
        /// 按键指示灯颜色信息对应顺序号(睡眠组号)
@@ -1967,128 +1127,6 @@
        #endregion
        #region 获取按键指示灯面板开关亮度配置.
        ///<summary >
        ///获取按键指示灯面板开关亮度配置
        /// </summary>
        public async System.Threading.Tasks.Task<PanelSwitchLevelInfo> GetPanelSwitchLevelAsync(string reserve = "01")
        {
            PanelSwitchLevelInfo result = null;
            if (Gateway == null)
            {
                result = new PanelSwitchLevelInfo { errorMessageBase = "当前没有网关" };
                return result;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new PanelSwitchLevelInfo { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new PanelSwitchLevelInfo { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new PanelSwitchLevelInfo { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 14)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0407")
                                    {
                                        var level1 = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16);
                                        var level2 = Convert.ToInt32(data[12].ToString() + data[13].ToString(), 16);
                                        panelDirectionsLevel = level1;
                                        panelBacklightLevel = level2;
                                        result = new PanelSwitchLevelInfo { panelDirectionsLevel = level1, panelBacklightLevel = level2 };
                                        System.Console.WriteLine($"UI收到通知后的主题_command:0406_{ topic}");
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = SendPanelSwitchLevelData(reserve);
                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                    var data = new JObject { { "PassData", passData } };
                    jObject.Add("Data", data);
                    Gateway.Send(("ClientDataPassthrough"), jObject.ToString());
                }
                catch { }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < 9000)//WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                {
                    result = new PanelSwitchLevelInfo { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 获取按键指示灯面板开关亮度配置数据
        /// <para>发配置按键指示灯颜色命令时,此时为发送到网关的透传数据</para>
        /// </summary>
        string SendPanelSwitchLevelData(string reserve)
        {
            string data = "";
            string dataLength = "05";
            string dataComand1 = "06";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "01";
            string reserveData = reserve;
            try
            {
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                    reserveData;
            }
            catch { };
            return data;
        }
        /// <summary>
        /// 按键指示灯面板开关亮度配置回复
@@ -2118,135 +1156,6 @@
        #endregion
        #region 获取按键节能模式配置状态.
        ///<summary >
        ///获取按键节能模式配置状态
        /// </summary>
        public async System.Threading.Tasks.Task<PanelSwitchLevelResponInfo> GetPanelSaveEnergyModeAsync(string reserve = "01")
        {
            PanelSwitchLevelResponInfo result = null;
            if (Gateway == null)
            {
                result = new PanelSwitchLevelResponInfo { errorMessageBase = "当前没有网关" };
                return result;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            result = new PanelSwitchLevelResponInfo { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            result = new PanelSwitchLevelResponInfo { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        {
                            result = new PanelSwitchLevelResponInfo { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                if (data.Length == 18)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
                                    if (command == "0409")
                                    {
                                        var tempR = new PanelSaveEnergyModeInfo();
                                        if (data[10].ToString() + data[11].ToString() == "01")
                                        {
                                            tempR.enable = true;
                                        }
                                        else
                                        {
                                            tempR.enable = false;
                                        }
                                        tempR.time = Convert.ToInt32(data[14].ToString() + data[15].ToString() + data[12].ToString() + data[13].ToString(), 16);
                                        tempR.level = Convert.ToInt32(data[16].ToString() + data[17].ToString(), 16);
                                        panelSaveEnergyModeInfo = tempR;
                                        result = new PanelSwitchLevelResponInfo { panelSaveEnergyModeInfo = tempR };
                                        System.Console.WriteLine($"UI收到通知后的主题_command:0408_{ topic}");
                                    }
                                }
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var passData = SendPanelSaveEnergyModeData(reserve);
                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
                    var data = new JObject { { "PassData", passData } };
                    jObject.Add("Data", data);
                    Gateway.Send(("ClientDataPassthrough"), jObject.ToString());
                }
                catch { }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (result != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > 9000)// WaitReceiveDataTime)
                {
                    result = new PanelSwitchLevelResponInfo { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("ClientDataPassthrough_Actions 退出" + System.DateTime.Now.ToString());
                return result;
            });
        }
        /// <summary>
        /// 获取按键节能模式配置状态数据
        /// </summary>
        string SendPanelSaveEnergyModeData(string reserve)
        {
            string data = "";
            string dataLength = "05";
            string dataComand1 = "08";
            string dataComand2 = "04";
            string dataSerialNum = "01";
            string addDataLength = "01";
            string reserveData = reserve;
            try
            {
                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
                    reserveData;
            }
            catch { };
            return data;
        }
        /// <summary>
        /// 获取按键节能模式配置状态数据回复
@@ -2270,10 +1179,6 @@
            public PanelSaveEnergyModeInfo panelSaveEnergyModeInfo;
        }
        /// <summary>
        /// 按键节能模式信息
        /// </summary>
        public PanelSaveEnergyModeInfo panelSaveEnergyModeInfo;
        /// <summary>
        /// 获取按键节能模式配置状态数据
        /// </summary>
@@ -2317,8 +1222,7 @@
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
@@ -2333,18 +1237,17 @@
                    if (topic == gatewayID + "/" + "ZbDataPassthrough")
                    {
                        var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
                        gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
                        if (gatewayTemp.clientDataPassthroughResponseData == null)
                        if (clientDataPassthroughResponseData == null)
                        {
                            result = new PanelProximitySensorResponInfo { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
                            if (clientDataPassthroughResponseData?.PassData != null)
                            {
                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
                                var data = clientDataPassthroughResponseData.PassData;
                                if (data.Length == 20)
                                {
                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
@@ -2361,7 +1264,6 @@
                                        }
                                        tempR.sensorDistance = Convert.ToInt32(data[14].ToString() + data[15].ToString() + data[12].ToString() + data[13].ToString(), 16);
                                        tempR.sensorDelayTime = Convert.ToInt32(data[18].ToString() + data[19].ToString() + data[16].ToString() + data[17].ToString(), 16);
                                        panelProximitySensorInfo = tempR;
                                        result = new PanelProximitySensorResponInfo { panelProximitySensorInfo = tempR };
                                        System.Console.WriteLine($"UI收到通知后的主题_command:0408_{ topic}");
                                    }
@@ -2449,10 +1351,6 @@
        }
        /// <summary>
        /// 获取接近传感配置
        /// </summary>
        public PanelProximitySensorInfo panelProximitySensorInfo;
        /// <summary>
        /// 获取接近传感配置数据
        /// </summary>
        [System.Serializable]
@@ -2498,8 +1396,7 @@
        //            if (topic == gatewayID + "/" + "Error_Respon")
        //            {
        //                var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
        //                var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
        //                var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.ErrorResponData>(jobject["Data"].ToString());
        //                if (temp == null)
        //                {
@@ -2513,18 +1410,17 @@
        //            }
        //            if (topic == gatewayID + "/" + "ZbDataPassthrough")
        //            {
        //                var gatewayTemp = new ZbGateway() { DataID = jobject.Value<int>("Data_ID") };
        //                gatewayTemp.clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
        //                var clientDataPassthroughResponseData = Newtonsoft.Json.JsonConvert.DeserializeObject<ClientDataPassthroughResponseData>(jobject["Data"].ToString());
        //                if (gatewayTemp.clientDataPassthroughResponseData == null)
        //                if (clientDataPassthroughResponseData == null)
        //                {
        //                    result = new PanelSleepGroupResponseAllData { errorMessageBase = "网关返回的数据为空" };
        //                }
        //                else
        //                {
        //                    if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
        //                    if (clientDataPassthroughResponseData?.PassData != null)
        //                    {
        //                        var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
        //                        var data = clientDataPassthroughResponseData.PassData;
        //                        if (data.Length == 14)
        //                        {
        //                            var tempR = new PanelSleepGroupResponseData();
@@ -2869,84 +1765,6 @@
        #endregion
        #region 配置面板功能
        ///<summary >
        ///配置面板功能
        ///<para>value:给面板配置的模式</para>
        /// </summary>
        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> ConfigureHdlKeyValueAsync(KeyMode value, int clusterID = 6)
        {
            if (Gateway == null)
            {
                return null;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                SetWritableValueResponAllData d = null;
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            d = new SetWritableValueResponAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            d = new SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    if (topic == gatewayID + "/" + "SetWritableValue_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { DeviceID = jobject.Value<int>("Device_ID"), DeviceAddr = jobject.Value<string>("DeviceAddr"), DeviceEpoint = jobject.Value<int>("Epoint"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject<SetWritableValueResponData>(jobject["Data"].ToString());
                        if (tempData == null)
                        {
                            d = new SetWritableValueResponAllData { errorMessageBase = "网关返回的数据为空" };
                        }
                        else
                        {
                            d = new SetWritableValueResponAllData { setWritableValueResponData = tempData };
                            System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("SetWritableValue_Actions 启动" + "_" + System.DateTime.Now.ToString());
                try
                {
                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", clusterID }, { "Command", 120 } };
                    var data = new JObject { { "Undivided", 0 }, { "AttributeId", 6533 }, { "AttributeDataType", 33 }, { "AttributeData", (int)value } };
                    jObject.Add("Data", data);
                    Gateway.Send("SetWritableValue", jObject.ToString());
                }
                catch { }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (d != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                {
                    d = new SetWritableValueResponAllData { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("SetWritableValue_Actions 退出" + System.DateTime.Now.ToString());
                return d;
            });
        }
        /// <summary>
        /// 配置面板的功能模式
@@ -3029,118 +1847,6 @@
        }
        #region  读取面板的配置信息
        /// <summary>
        /// 读取面板的配置信息
        /// </summary>
        public async System.Threading.Tasks.Task<PanelConfigureInfoResponAllData> ReadPanelConfigureInfoAsync(params int[] args)
        {
            if (Gateway == null)
            {
                return null;
            }
            return await System.Threading.Tasks.Task.Run(async () =>
            {
                PanelConfigureInfoResponAllData d = null;
                Action<string, string> action = (topic, message) =>
                {
                    var gatewayID = topic.Split('/')[0];//网关返回的网关ID
                    var reportStatus = topic.Split('/')[1];//主题为设备上报的主题
                    string addr = "";//上报的设备addr
                    string epoint = "";//上报的设备epoint
                    string cluID = "";//上报的设备cluID
                    string attrId = "";//上报的设备attrId
                    if (reportStatus == "DeviceStatusReport")
                    {
                        addr = topic.Split('/')[2];
                        epoint = topic.Split('/')[3];
                        cluID = topic.Split('/')[4];
                        attrId = topic.Split('/')[5];
                    }
                    var jobject = Newtonsoft.Json.Linq.JObject.Parse(message);
                    if (topic == gatewayID + "/" + "Error_Respon")
                    {
                        var gatewayTemp = new ZbGateway() { Time = jobject.Value<int>("Time"), DataID = jobject.Value<int>("Data_ID"), CurrentGateWayId = Gateway.getGatewayBaseInfo.gwID };
                        var temp = Newtonsoft.Json.JsonConvert.DeserializeObject<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
                        if (temp == null)
                        {
                            d = new PanelConfigureInfoResponAllData { errorMessageBase = "网关错误回复,且数据是空" };
                        }
                        else
                        {
                            d = new PanelConfigureInfoResponAllData { errorResponData = temp, errorMessageBase = ErrorMess(temp.Error) };
                        }
                    }
                    else if (topic == gatewayID + "/" + "DeviceStatusReport" + "/" + addr + "/" + epoint + "/" + cluID + "/" + attrId)
                    {
                        var deviceID = jobject.Value<int>("Device_ID");
                        var deviceAddr = jobject.Value<string>("DeviceAddr");
                        var tempEpoint = jobject.Value<int>("Epoint");
                        var dataId = jobject.Value<int>("Data_ID");
                        var lightSwitch = new Panel { DeviceID = deviceID, DeviceAddr = deviceAddr, DeviceEpoint = tempEpoint, DataID = dataId };
                        lightSwitch.DeviceStatusReport = Newtonsoft.Json.JsonConvert.DeserializeObject<Panel.DeviceStatusReportData>(jobject["Data"].ToString());
                        if ((DeviceType)(deviceID) == DeviceType.OnOffSwitch)
                        {
                            var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject<Panel.DeviceStatusReportData>(jobject["Data"].ToString());
                            if (tempData == null)
                            {
                                d = new PanelConfigureInfoResponAllData { errorMessageBase = "网关错误回复,且数据是空" };
                            }
                            else
                            {
                                d = new PanelConfigureInfoResponAllData { deviceStatusReportData = tempData };
                                System.Console.WriteLine($"UI收到通知后的主题_{ topic}");
                            }
                        }
                    }
                };
                Gateway.Actions += action;
                System.Console.WriteLine("GetDeviceStatus_Actions 启动" + System.DateTime.Now.ToString());
                try
                {
                    var JObject = new JObject {
                { "DeviceAddr",DeviceAddr },
                { "Epoint", DeviceEpoint },
                { "Cluster_ID", (int)Device.Cluster_ID.HdlKey },
                { "Command", 108 }
                    };
                    var attriBute = new JArray{
                  new JObject {
                    { "AttriButeId", (int)AttriButeId.HdlKey}
                   }
                    };
                    var data = new JObject { { "AttriBute", attriBute } };
                    JObject.Add("Data", data);
                    Gateway?.Send(("GetDeviceStatus"), JObject.ToString());
                }
                catch
                {
                }
                var dateTime = DateTime.Now;
                while ((DateTime.Now - dateTime).TotalMilliseconds < WaitReceiveDataTime)
                {
                    await System.Threading.Tasks.Task.Delay(10);
                    if (d != null)
                    {
                        break;
                    }
                }
                if ((DateTime.Now - dateTime).TotalMilliseconds > WaitReceiveDataTime)
                {
                    d = new PanelConfigureInfoResponAllData { errorMessageBase = " 回复超时,请重新操作" };
                }
                Gateway.Actions -= action;
                System.Console.WriteLine("GetDeviceStatus_Actions 退出" + System.DateTime.Now.ToString());
                return d;
            });
        }
        /// <summary>
        /// 网关恢复出厂设置返回数据
@@ -3250,10 +1956,6 @@
            public GetSceneInfo getSceneInfo;
        }
        /// <summary>
        /// 获取场景信息
        /// </summary>
        public GetSceneInfo sceneGetInfo;
        /// <summary>
        /// 获取场景信息
        /// </summary>