From 6fa9d69da922c8049f5acfcbb9ce9fd26811024c Mon Sep 17 00:00:00 2001
From: xm <1271024303@qq.com>
Date: 星期四, 16 四月 2020 17:10:57 +0800
Subject: [PATCH] 请合并代码

---
 ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs | 3286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 3,286 insertions(+), 0 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs
new file mode 100755
index 0000000..4de23e1
--- /dev/null
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs
@@ -0,0 +1,3286 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using MQTTnet;
+using Newtonsoft.Json.Linq;
+using Shared.Common;
+
+namespace ZigBee.Device
+{
+    [System.Serializable]
+    public class Panel : BindObj
+    {
+        public Panel()
+        {
+            this.Type = DeviceType.OnOffSwitch;
+        }
+        /// <summary>
+        /// 鎸夐敭妯″紡锛堢鏈夊姛鑳斤級
+        /// </summary>
+        public int panelMode = 65535;
+        /// <summary>
+        ///鎸夐敭寮�鐘舵�侊紙鎸囩ず锛変寒搴�
+        /// </summary>
+        public int panelDirectionsLevel = -1;
+
+        /// <summary>
+        /// 鎸夐敭鍏崇姸鎬侊紙鑳屽厜锛変寒搴�
+        /// </summary>
+        public int panelBacklightLevel = -1;
+
+        /// <summary>
+        /// 褰撳墠閫夋嫨妯″紡
+        /// </summary>
+        public string currentKeySelectModeText = "";
+        /// <summary>
+        /// 褰撳墠閫夋嫨鐨勬ゼ灞侷D
+        /// </summary>
+        public string currentSelectFloorId = string.Empty;
+        /// <summary>
+        /// 褰撳墠寮�鍏虫ā寮�
+        /// </summary>
+        public string CurrentSwitchMode = "";
+        /// <summary>
+        /// 褰撳墠灞炴�фā寮�
+        /// </summary>
+        public int currentClusterID;
+
+        /// <summary>
+        /// 褰撳墠璋冨厜妯″紡
+        /// </summary>
+        public string CurrentDimmerMode = "";
+
+        /// <summary>
+        /// 褰撳墠閬槼妯″紡
+        /// </summary>
+        public string CurrentCurtainMode = "";
+
+        /// <summary>
+        /// 褰撳墠鎴块棿ID
+        /// </summary>
+        public string RoomId = "";
+
+        /// <summary>
+        /// 褰撳墠閫変腑鐨勫満鏅疘D
+        /// </summary>
+        public string curSelectSceneID = "";
+
+        /// <summary>
+        /// 鏈湴妤煎眰鎴块棿缁戝畾鍒楄〃
+        /// </summary>
+        public Dictionary<int, FloorRoomBindObj> FloorRoomBindObjList = new Dictionary<int, FloorRoomBindObj> { };
+        /// <summary>
+        /// 缁戝畾鐨勬ゼ灞傛埧闂翠俊鎭�
+        /// </summary>
+        [System.Serializable]
+        public class FloorRoomBindObj
+        {
+            /// <summary>
+            /// 妤煎眰ID
+            /// </summary>
+            public string floodID;
+            /// <summary>
+            /// 妤煎眰鍚嶇О
+            /// </summary>
+            public string floodName;
+            /// <summary>
+            /// 鎴块棿ID
+            /// </summary>
+            public string roomID;
+            /// <summary>
+            /// 鎴块棿鍚嶇О
+            /// </summary>
+            public string roomName;
+            /// <summary>
+            /// 缁戝畾鐩爣ID
+            /// </summary>
+            public string BindID;
+            /// <summary>
+            /// 缁戝畾鐩爣鍚嶇О
+            /// </summary>
+            public string BindName;
+            /// <summary>
+            /// 鍥剧墖璺緞
+            /// </summary>
+            public string IconPath = "";
+
+        }
+
+        // <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> { };
+
+        /// <summary>
+        /// 绉佹湁鍔熻兘绫�
+        /// <para>256:Key,鎸夐敭绫荤被 </para>
+        /// <para>768:PIR,PIR绫�</para>
+        /// <para>1024:Light,鐏被</para>
+        /// </summary>
+        public List<int> privateFuncFirstLevelList = new List<int>();
+
+        /// <summary>
+        /// 绗簩绾т俊鎭�
+        /// <para>1:鐗规畩鍔熻兘</para>
+        /// <para>100:Switch,寮�鍏筹紙鎸夐敭绫伙級</para>
+        /// <para>200:Dimmer,璋冨厜锛堟寜閿被锛�</para>
+        /// <para>300:Curtain,绐楀笜锛堟寜閿被锛�</para>
+        /// <para>0:EnergySavingMode,鑺傝兘妯″紡锛堢伅绫伙級</para>
+        /// <para>1:SleepMode,鐫$湢妯″紡锛堢伅绫伙級</para>
+        /// <para>100:WhiteBalance,鐧藉钩琛★紙鐏被锛�</para>
+        /// <para>101:RGBColor,RGB鎸囩ず鐏鑹诧紙鐏被锛�</para>
+        /// <para>102:RGBLevel,RGB鎸囩ず鐏寒搴︼紙鐏被锛�</para>
+        /// </summary>
+        public List<int> privateFuncSecondLevelList = new List<int>();
+
+        /// <summary>
+        /// 绗笁绾т俊鎭�
+        /// <para>1:鍦烘櫙瑙﹀彂锛堢壒娈婂姛鑳斤級</para>
+        /// <para>65535:绂佹鍙戦�佸姛鑳斤紙鐗规畩鍔熻兘锛�</para>
+        /// <para>100:SwitchOpen,寮�鍏冲紑锛堟寜閿被锛�</para>
+        /// <para>101:SwitchClose,寮�鍏冲叧锛堟寜閿被锛�</para>
+        /// <para>102:SwitchChange,寮�鍏冲垏鎹紙鎸夐敭绫伙級</para>
+        /// <para>200:DimmerStepUp,澧炲ぇ璋冨厜锛堟寜閿被锛�</para>
+        /// <para>201:DimmerStepDown,闄嶄綆璋冨厜锛堟寜閿被锛�</para>
+        /// <para>202:DimmerStepChange,璋冨厜鍒囨崲锛堟寜閿被锛�</para>
+        /// <para>300:CurtainOpen,绐楀笜寮�锛堟寜閿被锛�</para>
+        /// <para>301:CurtainClose,绐楀笜鍏筹紙鎸夐敭绫伙級</para>
+        /// <para>302:CurtainStop,绐楀笜鍋�</para>
+        /// <para>303:CurtainUpStop,绐楀笜涓婂崌鍋�</para>
+        /// <para>304:CurtainDownstop,绐楀笜涓嬮檷鍋�</para>
+        /// </summary>
+        public List<int> privateFuncThirdLevelList = new List<int>();
+        #region 鑾峰彇闈㈡澘鐨勭鏈変俊鎭�.
+        /// <summary>
+        ///鑾峰彇闈㈡澘鐨勭鏈変俊鎭�
+        /// <para>娉ㄦ剰params浼犲叆鍙傛暟濡備笅锛�</para>
+        /// <para>鏂规硶1锛氬綋int[]浼犵┖锛岃繑鍥炲�兼槸鈥滈潰鏉垮叿鏈夌殑鍔熻兘澶х被,鍗宠繑鍥炩�滅涓�绾у埆銆�1024:鐏被锛�256:鎸夐敭绫伙紝768:PIR绫�</para>
+        /// <para>鏂规硶2锛氥�佸綋int[]鍊间负绗竴绾у埆PrivateFuncTypeFir涓�夋嫨涓�涓��</para>
+        /// <para>杩斿洖鍊兼槸鈥滈潰鎸夐敭鍙戦�佸姛鑳界被鈥濓紝鍗宠繑鍥炩�滅浜岀骇鍒��</para>
+        /// <para>1:鐗规畩鍔熻兘;100:Switch,寮�鍏筹紙鎸夐敭绫伙級;200:Dimmer,璋冨厜锛堟寜閿被锛�;300:Curtain,绐楀笜锛堟寜閿被锛�</para>
+        /// <para>0:EnergySavingMode,鑺傝兘妯″紡锛堢伅绫伙級;1:SleepMode,鐫$湢妯″紡锛堢伅绫伙級;100:WhiteBalance,鐧藉钩琛★紙鐏被锛�;101:RGBColor,RGB鎸囩ず鐏鑹诧紙鐏被锛�;102:RGBLevel,RGB鎸囩ず鐏寒搴︼紙鐏被锛�</para>
+        /// <para>鏂规硶3锛氬綋int[]鍊间负绗竴绾у埆PrivateFuncTypeFir涓�夋嫨涓�涓紝鎺ョ潃鍐嶉�夌浜岀骇鍒玃rivateFunTypeSec涓�夋嫨涓�涓� </para>
+        /// <para>杩斿洖鍊兼槸鈥滈潰鎸夐敭鍏蜂綋鍔熻兘閰嶇疆鈥濓紝鍗宠繑鍥炩�滅浜岀骇鍒��</para>
+        /// <para>1:鍦烘櫙瑙﹀彂;65535:绂佹鍙戦�佸姛鑳�
+        /// <para>100:SwitchOpen,寮�鍏冲紑锛堟寜閿被锛�;101:SwitchClose,寮�鍏冲叧锛堟寜閿被锛�;102:SwitchChange,寮�鍏冲垏鎹紙鎸夐敭绫伙級</para>
+        /// <para>200:DimmerStepUp,澧炲ぇ璋冨厜锛堟寜閿被锛�;201:DimmerStepDown,闄嶄綆璋冨厜锛堟寜閿被锛�;202:DimmerStepChange,璋冨厜鍒囨崲锛堟寜閿被锛�</para>
+        /// <para>300:CurtainOpen,绐楀笜寮�锛堟寜閿被锛�;301:CurtainClose,绐楀笜鍏筹紙鎸夐敭绫伙級;302:CurtainStop,绐楀笜鍋�;303:CurtainUpStop,绐楀笜涓婂崌鍋�;304:CurtainDownstop,绐楀笜涓嬮檷鍋�</para>
+        /// </summary>
+        public async System.Threading.Tasks.Task<PanelPrivateFunctionsResponseAllInfo> GetPanelPrivateFunctionsAsync(params int[] args)
+        {
+            PanelPrivateFunctionsResponseAllInfo result = null;
+            if (Gateway == null)
+            {
+                result = new PanelPrivateFunctionsResponseAllInfo { 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 PanelPrivateFunctionsResponseAllInfo { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
+                        }
+
+                        else
+                        {
+                            result = new PanelPrivateFunctionsResponseAllInfo { 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 PanelPrivateFunctionsResponseAllInfo { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
+                        }
+                        else
+                        {
+                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
+                            {
+                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
+
+                                if (data.Length > 12)
+                                {
+                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
+                                    if (command == "0004")
+                                    {
+                                        var tempD = new PanelPrivateFunctionsResponseInfo();
+                                        int len = 2 + 2 * Convert.ToInt32(data[0].ToString() + data[1].ToString(), 16);
+                                        int usefulLength = (len - 12);
+                                        tempD.funLevel = Convert.ToInt32(data[10].ToString() + data[11].ToString(), 16);
+                                        int tempCount = 0;
+                                        var listData = new List<string>();
+
+                                        switch (tempD.funLevel)
+                                        {
+                                            case 1:
+                                                while (tempCount < usefulLength)
+                                                {
+                                                    listData.Add(data[12 + tempCount].ToString());
+                                                    tempCount++;
+                                                }
+                                                for (int j = 0; j < listData.Count / 4; j++)
+                                                {
+                                                    int curIndex = 4 * j;
+                                                    tempD.privateFuncTypeLevelFirstList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                    //if (privateFuncFirstLevelList.Contains(256) == false)
+                                                    //{
+                                                    //    privateFuncFirstLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+
+                                                    //}
+                                                }
+                                                break;
+                                            case 2:
+                                                while (tempCount < usefulLength)
+                                                {
+                                                    listData.Add(data[12 + tempCount].ToString());
+                                                    tempCount++;
+                                                }
+                                                for (int j = 0; j < listData.Count / 4; j++)
+                                                {
+                                                    int curIndex = 4 * j;
+                                                    if (j == 0)
+                                                    {
+                                                        tempD.privateFuncTypeLevelFirstList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //if (privateFuncFirstLevelList.Contains(256) == false)
+                                                        //{
+                                                        //    privateFuncFirstLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //}
+                                                    }
+                                                    else
+                                                    {
+                                                        tempD.privateFuncTypeLevelSecondList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //if (privateFuncSecondLevelList.Contains(1) == false || privateFuncSecondLevelList.Contains(100) == false || privateFuncSecondLevelList.Contains(200) == false || privateFuncSecondLevelList.Contains(300) == false)
+                                                        //{
+                                                        //    privateFuncSecondLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //}
+                                                    }
+                                                }
+                                                break;
+                                            case 3:
+                                                while (tempCount < usefulLength)
+                                                {
+                                                    listData.Add(data[12 + tempCount].ToString());
+                                                    tempCount++;
+                                                }
+                                                for (int j = 0; j < listData.Count / 4; j++)
+                                                {
+                                                    int curIndex = 4 * j;
+                                                    if (j == 0)
+                                                    {
+                                                        tempD.privateFuncTypeLevelFirstList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //if (privateFuncFirstLevelList.Contains(256) == false)
+                                                        //{
+                                                        //    privateFuncFirstLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //}
+                                                    }
+                                                    else if (j == 1)
+                                                    {
+                                                        tempD.privateFuncTypeLevelSecondList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //if (privateFuncSecondLevelList.Contains(1) == false || privateFuncSecondLevelList.Contains(100) == false || privateFuncSecondLevelList.Contains(200) == false || privateFuncSecondLevelList.Contains(300) == false)
+                                                        //{
+                                                        //    privateFuncSecondLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //}
+                                                    }
+                                                    else
+                                                    {
+                                                        tempD.privateFuncTypeLevelThirdList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16));
+                                                        //if (privateFuncThirdLevelList.Contains(1) == false || privateFuncThirdLevelList.Contains(65535) == false || privateFuncThirdLevelList.Contains(100) == false || privateFuncThirdLevelList.Contains(101) == false || privateFuncThirdLevelList.Contains(102) == false || privateFuncThirdLevelList.Contains(200) == false || privateFuncThirdLevelList.Contains(201) == false || privateFuncThirdLevelList.Contains(202) == false || privateFuncThirdLevelList.Contains(300) == false || privateFuncThirdLevelList.Contains(301) == false || privateFuncThirdLevelList.Contains(302) == false || privateFuncThirdLevelList.Contains(303) == false || privateFuncThirdLevelList.Contains(304) == false)
+                                                        //{
+                                                        //    privateFuncThirdLevelList.Add(Convert.ToInt32(listData[curIndex + 2] + listData[curIndex + 3].ToString() + listData[curIndex].ToString() + listData[curIndex + 1].ToString(), 16)); ;
+                                                        //}
+                                                    }
+                                                }
+                                                break;
+                                        }
+                                        panelPrivateFunctionsResponseInfo = tempD;
+                                        result = new PanelPrivateFunctionsResponseAllInfo { panelPrivateFunctionsResponseInfo = tempD };
+                                        System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0003_{topic}");
+                                    }
+                                }
+                            }
+                        }
+                    }
+                };
+
+                Gateway.Actions += action;
+                System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString());
+
+                try
+                {
+                    var passData = SendPanelPrivateFunctions(args);
+                    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 PanelPrivateFunctionsResponseAllInfo { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
+                }
+                Gateway.Actions -= action;
+                System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString());
+
+                return result;
+            });
+        }
+
+        /// <summary>
+        /// PIR閰嶇疆鍙傛暟鍥炲
+        /// </summary>
+        [System.Serializable]
+        public class PanelPrivateFunctionsResponseAllInfo
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            /// <summary>
+            /// 鍏夋劅绛夌骇涓暟锛圠ux鑳藉姏锛�
+            /// <para>鏈夊嚑涓瓑绾у氨鏄剧ず鍑犱釜鍒诲害</para>
+            /// </summary>
+            public PanelPrivateFunctionsResponseInfo panelPrivateFunctionsResponseInfo;
+        }
+
+        /// <summary>
+        /// 閰嶇疆鍙傛暟鍥炲
+        /// </summary>
+        public PanelPrivateFunctionsResponseInfo panelPrivateFunctionsResponseInfo;
+        [System.Serializable]
+        public class PanelPrivateFunctionsResponseInfo
+        {
+            /// <summary>
+            /// 鍔熻兘绫荤骇鍒搴�
+            /// <para>1:绗竴绾у埆</para>
+            /// <para>2:绗簩绾у埆</para>
+            /// <para>3:绗笁绾у埆</para>
+            /// </summary>
+            public int funLevel = -1;
+
+            /// <summary>
+            /// 绉佹湁鍔熻兘绫�
+            /// <para>256:Key,鎸夐敭绫荤被 </para>
+            /// <para>768:PIR,PIR绫�</para>
+            /// <para>1024:Light,鐏被</para>
+            /// </summary>
+            public List<int> privateFuncTypeLevelFirstList = new List<int>();
+
+            /// <summary>
+            /// 绗簩绾т俊鎭�
+            /// <para>1:鐗规畩鍔熻兘</para>
+            /// <para>100:Switch,寮�鍏筹紙鎸夐敭绫伙級</para>
+            /// <para>200:Dimmer,璋冨厜锛堟寜閿被锛�</para>
+            /// <para>300:Curtain,绐楀笜锛堟寜閿被锛�</para>
+            /// <para>0:EnergySavingMode,鑺傝兘妯″紡锛堢伅绫伙級</para>
+            /// <para>1:SleepMode,鐫$湢妯″紡锛堢伅绫伙級</para>
+            /// <para>100:WhiteBalance,鐧藉钩琛★紙鐏被锛�</para>
+            /// <para>101:RGBColor,RGB鎸囩ず鐏鑹诧紙鐏被锛�</para>
+            /// <para>102:RGBLevel,RGB鎸囩ず鐏寒搴︼紙鐏被锛�</para>
+            /// </summary>
+            public List<int> privateFuncTypeLevelSecondList = new List<int>();
+
+            /// <summary>
+            /// 绗笁绾т俊鎭�
+            /// <para>1:鍦烘櫙瑙﹀彂锛堢壒娈婂姛鑳斤級</para>
+            /// <para>65535:绂佹鍙戦�佸姛鑳斤紙鐗规畩鍔熻兘锛�</para>
+            /// <para>100:SwitchOpen,寮�鍏冲紑锛堟寜閿被锛�</para>
+            /// <para>101:SwitchClose,寮�鍏冲叧锛堟寜閿被锛�</para>
+            /// <para>102:SwitchChange,寮�鍏冲垏鎹紙鎸夐敭绫伙級</para>
+            /// <para>200:DimmerStepUp,澧炲ぇ璋冨厜锛堟寜閿被锛�</para>
+            /// <para>201:DimmerStepDown,闄嶄綆璋冨厜锛堟寜閿被锛�</para>
+            /// <para>202:DimmerStepChange,璋冨厜鍒囨崲锛堟寜閿被锛�</para>
+            /// <para>300:CurtainOpen,绐楀笜寮�锛堟寜閿被锛�</para>
+            /// <para>301:CurtainClose,绐楀笜鍏筹紙鎸夐敭绫伙級</para>
+            /// <para>302:CurtainStop,绐楀笜鍋�</para>
+            /// <para>303:CurtainUpStop,绐楀笜涓婂崌鍋�</para>
+            /// <para>304:CurtainDownstop,绐楀笜涓嬮檷鍋�</para>
+            /// </summary>
+            public List<int> privateFuncTypeLevelThirdList = new List<int>();
+
+        }
+
+        /// <summary>
+        ///璇诲彇闈㈡澘鐨勭鏈変俊鎭�
+        /// <para>娉ㄦ剰params鍙栧�煎涓嬶細</para>
+        /// <para>1銆佸綋int[]浼犵┖锛岃繑鍥炲�兼槸鈥滈潰鏉垮叿鏈夌殑鍔熻兘澶х被鈥濓細1024:鐏被锛�256:鎸夐敭绫伙紝768:PIR绫�</para>
+        /// <para>2銆佸綋int[]鍊间负绗竴绾у埆PrivateFuncTypeFir涓�夋嫨涓�涓�傝繑鍥炲�兼槸鈥滈潰鎸夐敭鍙戦�佸姛鑳界被鈥�</para>
+        /// <para>3銆佸綋int[]鍊间负绗竴绾у埆PrivateFuncTypeFir涓�夋嫨涓�涓紝鎺ョ潃鍐嶉�夌浜岀骇鍒玃rivateFunTypeSec涓�夋嫨涓�涓紝杩斿洖鍊兼槸鈥滈潰鎸夐敭鍏蜂綋鍔熻兘閰嶇疆鈥�</para>
+        /// </summary>
+        string SendPanelPrivateFunctions(params int[] args)
+        {
+            string data = "";
+            string dataLength = "";
+            string dataComand1 = "03";
+            string dataComand2 = "00";
+            string dataSerialNum = "01";
+            string addDataLength = "";
+            string value0 = "";
+            string value1 = "";
+            string value2 = "";
+            try
+            {
+
+                if (args.Length != 0)
+                {
+                    if (Convert.ToString(2 * args.Length + 5, 16).Length == 1)
+                    {
+                        dataLength = string.Concat(0, 2 * args.Length + 5);
+                    }
+                    else
+                    {
+                        dataLength = Convert.ToString(2 * args.Length + 5, 16);
+                    }
+
+
+                    if (Convert.ToString(2 * args.Length, 16).Length == 1)
+                    {
+                        addDataLength = string.Concat(0, 2 * args.Length + 1);
+                    }
+                    else
+                    {
+                        addDataLength = Convert.ToString(2 * args.Length + 1, 16);
+                    }
+
+                    for (int i = 0; i < args.Length; i++)
+                    {
+                        switch (args.Length)
+                        {
+                            case 1:
+                                value0 = "02";
+                                switch (args[0])
+                                {
+                                    case 1024:
+                                        value1 = "0004";
+                                        break;
+                                    case 256:
+                                        value1 = "0001";
+                                        break;
+                                    case 768:
+                                        value1 = "0003";
+                                        break;
+                                }
+                                break;
+                            case 2:
+                                value0 = "03";
+                                switch (args[0])
+                                {
+                                    case 1024:
+                                        value1 = "0004";
+                                        switch (args[1])
+                                        {
+                                            case 0:
+                                                value2 = "0000";
+                                                break;
+                                            case 1:
+                                                value2 = "0100";
+                                                break;
+                                            case 100:
+                                                value2 = "6400";
+                                                break;
+                                            case 101:
+                                                value2 = "6500";
+                                                break;
+                                            case 102:
+                                                value2 = "6600";
+                                                break;
+                                        }
+                                        break;
+                                    case 256:
+                                        value1 = "0001";
+                                        switch (args[1])
+                                        {
+                                            case 1:
+                                                value2 = "0100";
+                                                break;
+                                            case 100:
+                                                value2 = "6400";
+                                                break;
+                                            case 200:
+                                                value2 = "C800";
+                                                break;
+                                            case 300:
+                                                value2 = "2C01";
+                                                break;
+                                        }
+                                        break;
+                                    case 768:
+                                        value1 = "0003";
+                                        break;
+                                }
+
+                                break;
+                        }
+                    }
+
+                }
+                else
+                {
+                    dataLength = "05";
+                    addDataLength = "01";
+                    value0 = "01";
+                }
+                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
+                        value0 + value1 + value2;
+            }
+            catch { };
+
+            return data;
+        }
+
+        /// <summary>
+        /// 绉佹湁鍔熻兘绫伙紙绗竴绾у埆锛変俊鎭�
+        /// </summary>
+        public class PrivateFuncTypeFir
+        {
+            /// <summary>
+            /// 绉佹湁鍔熻兘绫�
+            /// <para>256:Key,鎸夐敭绫荤被 </para>
+            /// <para>768:PIR,PIR绫�</para>
+            /// <para>1024:Light,鐏被</para>
+            /// </summary>
+            public int privateFuncTypeOne;
+        }
+
+        /// <summary>
+        /// 绉佹湁鍔熻兘绫伙紙绗簩绾у埆锛変俊鎭�
+        /// </summary>
+        public class PrivateFunTypeSec
+        {
+            /// <summary>
+            /// 绗簩绾т俊鎭�
+            /// <para>100:Switch,寮�鍏筹紙鎸夐敭绫伙級</para>
+            /// <para>200:Dimmer,璋冨厜锛堟寜閿被锛�</para>
+            /// <para>300:Curtain,绐楀笜锛堟寜閿被锛�</para>
+            /// <para>0:EnergySavingMode,鑺傝兘妯″紡锛堢伅绫伙級</para>
+            /// <para>1:SleepMode,鐫$湢妯″紡锛堢伅绫伙級</para>
+            /// <para>100:WhiteBalance,鐧藉钩琛★紙鐏被锛�</para>
+            /// <para>101:RGBColor,RGB鎸囩ず鐏鑹诧紙鐏被锛�</para>
+            /// <para>102:RGBLevel,RGB鎸囩ず鐏寒搴︼紙鐏被锛�</para>
+            /// </summary>
+            public int privateFuncTypeTwo;
+        }
+
+        /// <summary>
+        /// 绉佹湁鍔熻兘绫伙紙绗笁绾у埆锛変俊鎭�
+        /// </summary>
+        public class PrivateFunTypeThird
+        {
+            /// <summary>
+            /// 绗笁绾т俊鎭�
+            /// <para>0:EnergySavingModeOpenLevel,鑺傝兘妯″紡寮�浜害锛堢伅绫� 锛�</para>
+            /// <para>1:EnergySavingModeCloseLevel,鑺傝兘妯″紡鍏充寒搴︼紙鐏被锛�</para>
+            /// <para>1:鍦烘櫙瑙﹀彂;锛堢壒娈婂姛鑳斤級</para>
+            /// <para>65535:绂佹鍙戦�佸姛鑳斤紙鐗规畩鍔熻兘锛�</para>
+            /// <para>100:SwitchOpen,寮�鍏冲紑锛堟寜閿被锛�</para>
+            /// <para>101:SwitchClose,寮�鍏冲叧锛堟寜閿被锛�</para>
+            /// <para>102:SwitchChange,寮�鍏冲垏鎹紙鎸夐敭绫伙級</para>
+            /// <para>200:DimmerStepUp,澧炲ぇ璋冨厜锛堟寜閿被锛�</para>
+            /// <para>201:DimmerStepDown,闄嶄綆璋冨厜锛堟寜閿被锛�</para>
+            /// <para>202:DimmerStepChange,璋冨厜鍒囨崲锛堟寜閿被锛�</para>
+            /// <para>300:CurtainOpen,绐楀笜寮�锛堟寜閿被锛�</para>
+            /// <para>301:CurtainClose,绐楀笜鍏筹紙鎸夐敭绫伙級</para>
+            /// <para>302:CurtainStop,绐楀笜鍋�</para>
+            /// <para>303:CurtainUpStop,绐楀笜涓婂崌鍋�</para>
+            /// <para>304:CurtainDownstop,绐楀笜涓嬮檷鍋�</para>
+            /// </summary>
+            public int privateFuncTypeThird;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎸夐敭闈㈡澘鐨勭涓�绾у埆鍔熻兘鍔熻兘绯�(1024:鐏被锛�256:鎸夐敭绫伙紝768:PIR绫�)
+        /// </summary>
+        /// <param name="panel">鎸夐敭闈㈡澘鐨勬煇涓�涓洖璺�</param>
+        /// <returns></returns>
+        public async Task<List<int>> GetPanelDeviceFunctionLevel1()
+        {
+            var result = await GetPanelPrivateFunctionsAsync();
+            if (result == null || result.panelPrivateFunctionsResponseInfo == null)
+            {
+                return null;
+            }
+
+            return result.panelPrivateFunctionsResponseInfo.privateFuncTypeLevelFirstList;
+        }
+
+        /// <summary>
+        /// <para>鑾峰彇鎸夐敭闈㈡澘鐨勭浜岀骇鍒姛鑳藉姛鑳界郴(浠ヤ笅涓鸿繑鍥炲��)</para>
+        /// <para>100:Switch,寮�鍏筹紙鎸夐敭绫伙級</para>
+        /// <para>200:Dimmer,璋冨厜锛堟寜閿被锛�</para>
+        /// <para>300:Curtain,绐楀笜锛堟寜閿被锛�</para>
+        /// <para>0:EnergySavingMode,鑺傝兘妯″紡锛堢伅绫伙級</para>
+        /// <para>1:SleepMode,鐫$湢妯″紡锛堢伅绫伙級</para>
+        /// <para>100:WhiteBalance,鐧藉钩琛★紙鐏被锛�</para>
+        /// <para>101:RGBColor,RGB鎸囩ず鐏鑹诧紙鐏被锛�</para>
+        /// <para>102:RGBLevel,RGB鎸囩ず鐏寒搴︼紙鐏被锛�</para>
+        /// </summary>
+        /// <param name="panel">鎸夐敭闈㈡澘鐨勬煇涓�涓洖璺�</param>
+        /// <param name="level1">绗竴绾у埆鐨処D(1024:鐏被锛�256:鎸夐敭绫伙紝768:PIR绫�)</param>
+        /// <returns></returns>
+        public async Task<List<int>> GetPanelDeviceFunctionLevel2(int level1)
+        {
+            var result = await GetPanelPrivateFunctionsAsync(new int[] { level1 });
+            if (result == null || result.panelPrivateFunctionsResponseInfo == null)
+            {
+                return null;
+            }
+            return result.panelPrivateFunctionsResponseInfo.privateFuncTypeLevelSecondList;
+        }
+
+        /// <summary>
+        /// 鎸夐敭绫荤涓夌骇鍒涓嬶細
+        /// <para>1:鍦烘櫙瑙﹀彂;锛堢壒娈婂姛鑳斤級</para>
+        /// <para>65535:绂佹鍙戦�佸姛鑳斤紙鐗规畩鍔熻兘锛�</para>
+        /// <para>100:SwitchOpen,寮�鍏冲紑锛堟寜閿被锛�</para>
+        /// <para>101:SwitchClose,寮�鍏冲叧锛堟寜閿被锛�</para>
+        /// <para>102:SwitchChange,寮�鍏冲垏鎹紙鎸夐敭绫伙級</para>
+        /// <para>200:DimmerStepUp,澧炲ぇ璋冨厜锛堟寜閿被锛�</para>
+        /// <para>201:DimmerStepDown,闄嶄綆璋冨厜锛堟寜閿被锛�</para>
+        /// <para>202:DimmerStepChange,璋冨厜鍒囨崲锛堟寜閿被锛�</para>
+        /// <para>300:CurtainOpen,绐楀笜寮�锛堟寜閿被锛�</para>
+        /// <para>301:CurtainClose,绐楀笜鍏筹紙鎸夐敭绫伙級</para>
+        /// <para>302:CurtainStop,绐楀笜鍋�</para>
+        /// <para>303:CurtainUpStop,绐楀笜涓婂崌鍋�</para>
+        /// <para>304:CurtainDownstop,绐楀笜涓嬮檷鍋�</para>
+        /// </summary>
+        /// <param name="panel">鎸夐敭闈㈡澘鐨勬煇涓�涓洖璺�</param>
+        /// <param name="level1">绗竴绾у埆鐨処D(1024:鐏被锛�256:鎸夐敭绫伙紝768:PIR绫�)</param>
+        /// <param name="level2">绗簩绾у埆鐨処D(褰撶涓�绾у埆鏄寜閿被,1:鐗规畩鍔熻兘锛�100:鎸夐敭寮�鍏筹紝200:鎸夐敭璋冨厜锛�300:鎸夐敭绐楀笜)</param>
+        /// <returns></returns>
+        public async Task<List<int>> GetPanelDeviceFunctionLevel3(int level1, int level2)
+        {
+            var result = await GetPanelPrivateFunctionsAsync(new int[] { level1, level2 });
+            if (result == null || result.panelPrivateFunctionsResponseInfo == null)
+            {
+                return null;
+            }
+            return result.panelPrivateFunctionsResponseInfo.privateFuncTypeLevelThirdList;
+        }
+        #endregion
+
+        #region 鎺у埗鎸夐敭鎸囩ず鐏�.
+        ///<summary >
+        ///鎺у埗鎸夐敭鎸囩ず鐏�
+        /// </summary>
+        public async System.Threading.Tasks.Task<ResponseAllData> ControlKeyAsync(KeyNumStatus keyNum, KeyStatus keyStatus)
+        {
+            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 == "0400")
+                                        {
+                                            result = new ResponseAllData { responseData = tempD };
+                                            System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0400_{ topic}");
+                                        }
+
+                                    }
+                                }
+                            }
+                        }
+                    }
+                };
+
+                Gateway.Actions += action;
+                System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString());
+
+                try
+                {
+                    var passData = ControlKeyData(keyNum, keyStatus);
+                    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>
+        public enum KeyStatus
+        {
+            /// <summary>
+            /// 鍏�
+            /// </summary>
+            close = 0x00,
+            /// <summary>
+            /// 寮�
+            /// </summary>
+            open = 0x64,
+            /// <summary>
+            /// 鏃犳晥
+            /// </summary>
+            inValid = 0xff,
+        }
+
+        /// <summary>
+        /// 鎺у埗鎸夐敭鎸囩ず鐏�
+        /// </summary>
+        string ControlKeyData(KeyNumStatus keyNumStatus, KeyStatus keyStatus)
+        {
+            string data = "";
+            string dataLength = "07";
+            string dataComand1 = "00";
+            string dataComand2 = "04";
+            string dataSerialNum = "01";
+            string addDataLength = "03";
+            string kStatus = "";
+            string kNum = "";
+            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());
+
+                switch (keyStatus)
+                {
+                    case KeyStatus.close:
+                        kStatus = "00";
+                        break;
+                    case KeyStatus.open:
+                        kStatus = "64";
+                        break;
+                    case KeyStatus.inValid:
+                        kStatus = "ff";
+                        break;
+                }
+
+
+                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
+                    tempAttributeData + kStatus;
+            }
+            catch { };
+
+            return data;
+        }
+        #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>
+        /// 缁戝畾璁惧淇℃伅,缃戝叧鍙嶉淇℃伅
+        /// </summary>
+        [System.Serializable]
+        public class KeyColorDataResponseAllData
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            /// <summary>
+            /// 鎸夐敭鎸囩ず鐏鑹蹭俊鎭�
+            /// </summary>
+            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>
+        [System.Serializable]
+        public class KeyColorData
+        {
+            /// <summary>
+            /// 鎸囩ず鐏搴旈『搴忓彿
+            /// </summary>
+            public KeyNum keyNum;
+            /// <summary>
+            /// 寮�鐘舵�侀鑹睷(0-ff)
+            /// </summary>
+            public string OpenColorR;
+            /// <summary>
+            /// 寮�鐘舵�侀鑹睪(0-ff)
+            /// </summary>
+            public string OpenColorG;
+            /// <summary>
+            /// 寮�鐘舵�侀鑹睟(0-ff)
+            /// </summary>
+            public string OpenColorB;
+            /// <summary>
+            /// 鍏崇姸鎬侀鑹睷(0-ff)
+            /// </summary>
+            public string CloseColorR;
+            /// <summary>
+            /// 鍏崇姸鎬侀鑹睪(0-ff)
+            /// </summary>
+            public string CloseColorG;
+            /// <summary>
+            /// 鍏崇姸鎬侀鑹睟(0-ff)
+            /// </summary>
+            public string CloseColorB;
+        }
+
+        /// <summary>
+        /// 鎸夐敭鎸囩ず鐏鑹蹭俊鎭搴旈『搴忓彿
+        /// </summary>
+        public class KeyNumStatus
+        {
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key1;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key2;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key3;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key4;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key5;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key6;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key7;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key8;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key9;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key10;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key11;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key12;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key13;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key14;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key15;
+            /// <summary>
+            /// false:鍏�
+            /// true:寮�
+            /// </summary>
+            public bool Key16;
+        }
+        #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-ff</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 = "07";
+            string dataComand1 = "03";
+            string dataComand2 = "04";
+            string dataSerialNum = "01";
+            string addDataLength = "03";
+            string mode = "";
+            string time = "";
+            string level = "";
+            try
+            {
+                if (modeEnable)
+                {
+                    mode = "01";
+                }
+                else
+                {
+                    mode = "00";
+                }
+                var sbString1 = new System.Text.StringBuilder();
+                string temp = Convert.ToString(modeTime, 16);
+                switch (temp.Length)
+                {
+                    case 1:
+                        time = "0" + temp;
+                        break;
+                    case 2:
+                        time = temp;
+                        break;
+                }
+
+                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;
+                }
+
+                sbString1.Append(time.ToUpper());
+                sbString2.Append(level.ToUpper());
+                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
+                   mode + sbString1 + sbString2;
+            }
+            catch { };
+
+            return data;
+        }
+        #endregion
+
+        #region  閰嶇疆鎺ヨ繎浼犳劅
+        ///<summary >
+        /// 閰嶇疆鎺ヨ繎浼犳劅
+        /// <para>sensorEnable:浼犳劅鍣ㄤ娇鑳�</para> 
+        /// </summary>
+        public async System.Threading.Tasks.Task<ResponseAllData> SetProximitySensor(bool sensorEnable)
+        {
+            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 == "0500")
+                                        {
+                                            result = new ResponseAllData { responseData = tempD };
+                                            DebugPrintLog($"UI鏀跺埌閫氱煡鍚庣殑涓婚_command:0500_{ topic}");
+                                        }
+                                    }
+                                }
+                            }
+                        }
+                    }
+                };
+
+                Gateway.Actions += action;
+                System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString());
+
+                try
+                {
+                    var passData = SetProximitySensorData(sensorEnable);
+                    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>
+        /// 閰嶇疆鎺ヨ繎浼犳劅
+        /// [璇ユ潯鍗忚鍙﹀2涓弬鏁癠I鍜岃澶囬兘涓嶉渶瑕侊紝璁惧閮藉悓浜嬭姹備紶鎰熷櫒璺濈鍜屼紶鎰熷櫒瑙﹀彂寤惰繜鏃堕棿閮介粯璁ゆ槸FFFF]
+        /// </summary>
+        /// <param name="sensorEnable">浼犳劅鍣ㄤ娇鑳�  0-disable  1-enable</param> 
+        /// <returns></returns>
+        string SetProximitySensorData(bool sensorEnable)
+        {
+            string data = "";
+            string dataLength = "09";
+            string dataComand1 = "00";
+            string dataComand2 = "05";
+            string dataSerialNum = "01";
+            string addDataLength = "05";
+            string sEnable = "";
+            try
+            {
+                if (sensorEnable)
+                {
+                    sEnable = "01";
+                }
+                else
+                {
+                    sEnable = "00";
+                }
+
+                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
+                  sEnable + "FFFFFFFF";
+            }
+            catch { };
+
+            return data;
+        }
+        #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>
+        /// 鎸夐敭鎸囩ず鐏鑹蹭俊鎭搴旈『搴忓彿(鐫$湢缁勫彿)
+        /// </summary>
+        public enum KeyNum
+        {
+            Key1 = 1,
+            Key2 = 2,
+            Key3 = 3,
+            Key4 = 4,
+            Key5 = 5,
+            Key6 = 6,
+            Key7 = 7,
+            Key8 = 8,
+            Key9 = 9,
+            Key10 = 10,
+            Key11 = 11,
+            Key12 = 12,
+            Key13 = 13,
+            Key14 = 14,
+            Key15 = 15,
+            Key16 = 16,
+        }
+        #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>
+        /// 鎸夐敭鎸囩ず鐏潰鏉垮紑鍏充寒搴﹂厤缃洖澶�
+        /// </summary>
+        [System.Serializable]
+        public class PanelSwitchLevelInfo
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            /// <summary>
+            ///鎸夐敭寮�鐘舵�侊紙鎸囩ず锛変寒搴�(杩欎釜鏄偣鍑诲悗鐨勫��)
+            /// </summary>
+            public int panelDirectionsLevel = -1;
+
+            /// <summary>
+            /// 鎸夐敭鍏崇姸鎬侊紙鑳屽厜锛変寒搴�(杩欎釜鏄偣鍑诲墠鐨勫��)
+            /// </summary>
+            public int panelBacklightLevel = -1;
+        }
+        #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 == 16)
+                                {
+                                    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[12].ToString() + data[13].ToString(), 16);
+                                        tempR.level = Convert.ToInt32(data[14].ToString() + data[15].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>
+        /// 鑾峰彇鎸夐敭鑺傝兘妯″紡閰嶇疆鐘舵�佹暟鎹洖澶�
+        /// </summary>
+        [System.Serializable]
+        public class PanelSwitchLevelResponInfo
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>鑾峰彇鎸夐敭鑺傝兘妯″紡閰嶇疆鐘舵�佹暟鎹�</para>
+            /// </summary>
+            public PanelSaveEnergyModeInfo panelSaveEnergyModeInfo;
+        }
+
+        /// <summary>
+        /// 鎸夐敭鑺傝兘妯″紡淇℃伅
+        /// </summary>
+        public PanelSaveEnergyModeInfo panelSaveEnergyModeInfo;
+        /// <summary>
+        /// 鑾峰彇鎸夐敭鑺傝兘妯″紡閰嶇疆鐘舵�佹暟鎹�
+        /// </summary>
+        [System.Serializable]
+        public class PanelSaveEnergyModeInfo
+        {
+            /// <summary>
+            ///false-disable  true-enable
+            /// </summary>
+            public bool enable;
+            /// <summary>
+            ///鏃犳搷浣滆繘鍏ヨ妭鑳芥ā寮忔椂闂�(0-255 鍗曚綅绉�)
+            /// </summary>
+            public int time = -1;
+
+            /// <summary>
+            /// 鑺傝兘妯″紡浜害(0-100)
+            /// </summary>
+            public int level = -1;
+        }
+        #endregion
+
+        #region 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆
+        ///<summary >
+        ///鑾峰彇鎺ヨ繎浼犳劅閰嶇疆
+        /// </summary>
+        public async System.Threading.Tasks.Task<PanelProximitySensorResponInfo> GetProximitySensorAsync(string reserve = "01")
+        {
+            PanelProximitySensorResponInfo result = null;
+            if (Gateway == null)
+            {
+                result = new PanelProximitySensorResponInfo { 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 PanelProximitySensorResponInfo { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
+                        }
+
+                        else
+                        {
+                            result = new PanelProximitySensorResponInfo { 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 PanelProximitySensorResponInfo { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
+                        }
+                        else
+                        {
+                            if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
+                            {
+                                var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
+                                if (data.Length == 20)
+                                {
+                                    var command = data[4].ToString() + data[5].ToString() + data[2].ToString() + data[3].ToString();
+                                    if (command == "0502")
+                                    {
+                                        var tempR = new PanelProximitySensorInfo();
+                                        if (data[10].ToString() + data[11].ToString() == "01")
+                                        {
+                                            tempR.enable = true;
+                                        }
+                                        else
+                                        {
+                                            tempR.enable = false;
+                                        }
+                                        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}");
+                                    }
+                                }
+                            }
+                        }
+                    }
+                };
+
+                Gateway.Actions += action;
+                System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString());
+
+                try
+                {
+                    var passData = SendProiximitySensorData(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 PanelProximitySensorResponInfo { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
+                }
+                Gateway.Actions -= action;
+                System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString());
+
+                return result;
+            });
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁
+        /// </summary>
+        string SendProiximitySensorData(string reserve)
+        {
+            string data = "";
+            string dataLength = "05";
+            string dataComand1 = "01";
+            string dataComand2 = "05";
+            string dataSerialNum = "01";
+            string addDataLength = "01";
+            string reserveData = reserve;
+
+            try
+            {
+                data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
+                    reserveData;
+            }
+            catch { };
+
+            return data;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁鍥炲
+        /// </summary>
+        [System.Serializable]
+        public class PanelProximitySensorResponInfo
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            /// <summary>
+            /// <para>鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁</para>
+            /// </summary>
+            public PanelProximitySensorInfo panelProximitySensorInfo;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆 
+        /// </summary>
+        public PanelProximitySensorInfo panelProximitySensorInfo;
+        /// <summary>
+        /// 鑾峰彇鎺ヨ繎浼犳劅閰嶇疆鏁版嵁
+        /// </summary>
+        [System.Serializable]
+        public class PanelProximitySensorInfo
+        {
+            /// <summary>
+            /// 浼犳劅鍣ㄤ娇鑳�
+            ///false-disable  true-enable
+            /// </summary>
+            public bool enable;
+
+            /// <summary>
+            ///浼犳劅鍣ㄨ窛绂�
+            /// </summary> 
+            public int sensorDistance = -1;
+
+            /// <summary>
+            /// 浼犳劅鍣ㄨЕ鍙戝欢杩熸椂闂�
+            /// </summary>
+            public int sensorDelayTime = -1;
+        }
+        #endregion
+
+        #region 閰嶇疆鎸夐敭鎸囩ず鐏潯鐪犵粍鍒嗭紙鏆傛椂涓嶅仛锛�
+        ///<summary >
+        ///鑾峰彇鎸夐敭鎸囩ず鐏潯鐪犵粍
+        ///<para>sleepGroup:鐫$湢缁勫彿</para>
+        /// </summary>
+        //public async System.Threading.Tasks.Task<PanelSleepGroupResponseAllData> GetPanelSleepGroupAsync(SleepGroup sleepGroup)
+        //{
+        //    PanelSleepGroupResponseAllData result = null;
+        //    if (Gateway == null)
+        //    {
+        //        result = new PanelSleepGroupResponseAllData { 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 PanelSleepGroupResponseAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
+        //                }
+
+        //                else
+        //                {
+        //                    result = new PanelSleepGroupResponseAllData { 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 PanelSleepGroupResponseAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
+        //                }
+        //                else
+        //                {
+        //                    if (gatewayTemp.clientDataPassthroughResponseData?.PassData != null)
+        //                    {
+        //                        var data = gatewayTemp.clientDataPassthroughResponseData.PassData;
+        //                        if (data.Length == 14)
+        //                        {
+        //                            var tempR = new PanelSleepGroupResponseData();
+        //                            tempR.status = int.Parse(data[12].ToString() + data[13].ToString());
+        //                            switch (data[10].ToString() + data[11].ToString())
+        //                            {
+        //                                case "01":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group1;
+        //                                    break;
+        //                                case "02":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group2;
+        //                                    break;
+        //                                case "03":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group3;
+        //                                    break;
+        //                                case "04":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group4;
+        //                                    break;
+        //                                case "05":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group5;
+        //                                    break;
+        //                                case "06":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group6;
+        //                                    break;
+        //                                case "07":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group7;
+        //                                    break;
+        //                                case "08":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group8;
+        //                                    break;
+        //                                case "09":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group9;
+        //                                    break;
+        //                                case "0a":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group10;
+        //                                    break;
+        //                                case "0b":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group11;
+        //                                    break;
+        //                                case "0c":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group12;
+        //                                    break;
+        //                                case "0d":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group13;
+        //                                    break;
+        //                                case "0e":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group14;
+        //                                    break;
+        //                                case "0f":
+        //                                    tempR.sleepGroupNum = SleepGroupNum.Group15;
+        //                                    break;
+        //                            }
+        //                            result = new PanelSleepGroupResponseAllData { panelSleepGroupResponseData = tempR };
+        //                        }
+        //                    }
+        //                    System.Console.WriteLine($"UI鏀跺埌閫氱煡鍚庣殑涓婚_{ topic}");
+        //                }
+        //            }
+        //        };
+
+        //        Gateway.Actions += action;
+        //        System.Console.WriteLine("ClientDataPassthrough_Actions 鍚姩" + System.DateTime.Now.ToString());
+
+        //        try
+        //        {
+        //            OpenPassthroughControl(Gateway);
+        //            var passData = SetPanelSleepGroupData(sleepGroup);
+        //            var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", 200 }, { "Cluster_ID", 64513 }, { "Command", 0 } };
+        //            var data = new JObject { { "PassData", passData } };
+        //            jObject.Add("Data", data);
+        //            CurrentGateWayId = Gateway.getGatewayBaseInfo?.gwID;
+        //            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 > WaitReceiveDataTime)
+        //        {
+        //            result = new PanelSleepGroupResponseAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
+        //        }
+        //        Gateway.Actions -= action;
+        //        System.Console.WriteLine("ClientDataPassthrough_Actions 閫�鍑�" + System.DateTime.Now.ToString());
+
+        //        return result;
+        //    });
+        //}
+
+        ///// <summary>
+        ///// 缁戝畾璁惧淇℃伅,缃戝叧鍙嶉淇℃伅
+        ///// </summary>
+        //public PanelSleepGroupResponseAllData panelSleepGroupResponseAllData;
+        //[System.Serializable]
+        //public class PanelSleepGroupResponseAllData
+        //{
+        //    /// <summary>
+        //    /// 閿欒淇℃伅
+        //    /// </summary>
+        //    public string errorMessageBase;
+        //    /// <summary>
+        //    /// 缃戝叧淇℃伅閿欒鍙嶉
+        //    /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+        //    /// </summary>
+        //    public ErrorResponData errorResponData;
+        //    /// <summary>
+        //    /// 缁戝畾璁惧淇℃伅
+        //    /// </summary>
+        //    public PanelSleepGroupResponseData panelSleepGroupResponseData;
+        //}
+
+        ///// <summary>
+        ///// 缁戝畾璁惧淇℃伅,缃戝叧鍙嶉淇℃伅
+        ///// </summary>
+        //public PanelSleepGroupResponseData panelSleepGroupResponseData;
+        //[System.Serializable]
+        //public class PanelSleepGroupResponseData
+        //{
+        //    /// <summary>
+        //    /// 鐫$湢缁勫彿
+        //    /// </summary>
+        //    public SleepGroupNum sleepGroupNum;
+        //    /// <summary>
+        //    /// 鐘舵��
+        //    /// <para>0--鎵ц 1鈥斿敜閱�</para>
+        //    /// </summary>
+        //    public int status;
+        //}
+
+        ///// <summary>
+        ///// 閰嶇疆鎸夐敭鎸囩ず鐏潯鐪犵粍鍒嗗尯
+        ///// </summary>
+        //string SetPanelSleepGroupData(SleepGroup sleepGroup)
+        //{
+        //    string data = "";
+        //    string dataLength = "06";
+        //    string dataComand1 = "0a";
+        //    string dataComand2 = "04";
+        //    string dataSerialNum = "01";
+        //    string addDataLength = "02";
+        //    int attributeData = 0;
+
+        //    try
+        //    {
+        //        int bit0 = 0, bit1 = 0, bit2 = 0, bit3 = 0, bit4 = 0, bit5 = 0, bit6 = 0, bit7 = 0, bit8 = 0, bit9 = 0, bit10 = 0, bit11 = 0, bit12 = 0, bit13 = 0, bit14 = 0, bit15 = 0;
+        //        if (sleepGroup != null)
+        //        {
+        //            if (sleepGroup.bit0)
+        //            {
+        //                bit0 = 1;
+        //            }
+        //            if (sleepGroup.bit1)
+        //            {
+        //                bit1 = 1;
+        //            }
+        //            if (sleepGroup.bit2)
+        //            {
+        //                bit2 = 1;
+        //            }
+        //            if (sleepGroup.bit3)
+        //            {
+        //                bit3 = 1;
+        //            }
+        //            if (sleepGroup.bit4)
+        //            {
+        //                bit4 = 1;
+        //            }
+        //            if (sleepGroup.bit5)
+        //            {
+        //                bit5 = 1;
+        //            }
+        //            if (sleepGroup.bit6)
+        //            {
+        //                bit6 = 1;
+        //            }
+        //            if (sleepGroup.bit7)
+        //            {
+        //                bit7 = 1;
+        //            }
+        //            if (sleepGroup.bit8)
+        //            {
+        //                bit8 = 1;
+        //            }
+        //            if (sleepGroup.bit9)
+        //            {
+        //                bit9 = 1;
+        //            }
+        //            if (sleepGroup.bit10)
+        //            {
+        //                bit10 = 1;
+        //            }
+        //            if (sleepGroup.bit11)
+        //            {
+        //                bit11 = 1;
+        //            }
+        //            if (sleepGroup.bit12)
+        //            {
+        //                bit12 = 1;
+        //            }
+        //            if (sleepGroup.bit13)
+        //            {
+        //                bit13 = 1;
+        //            }
+        //            if (sleepGroup.bit14)
+        //            {
+        //                bit14 = 1;
+        //            }
+        //            if (sleepGroup.bit15)
+        //            {
+        //                bit15 = 1;
+        //            }
+        //            attributeData = bit0 * 1 + bit1 * 2 + bit2 * 4 + bit3 * 8 + bit4 * 16 + bit5 * 32 + bit6 * 64 + bit7 * 128 + bit8 * 256 + bit9 * 512 + bit10 * 1024 + bit11 * 2048 + bit12 * 4096 + bit13 * 8192 + bit14 * 16384 + bit15 * 32768;
+        //        }
+        //        string tempAttributeData = attributeData.ToString("X4");
+
+        //        if (sleepGroup != null)
+        //        {
+        //            data = dataLength + dataComand1 + dataComand2 + dataSerialNum + addDataLength +
+        //                   tempAttributeData;
+        //        }
+        //    }
+        //    catch { };
+
+        //    return data;
+        //}
+
+        ///// <summary>
+        ///// 鐫$湢缁勫彿锛堝彲浣嶆垨锛�
+        ///// </summary>
+        //public class SleepGroup
+        //{
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit0;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit1;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit2;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit3;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit4;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit5;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit6;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit7;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit8;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit9;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit10;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit11;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit12;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit13;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit14;
+        //    /// <summary>
+        //    /// false:鍏�
+        //    /// true:寮�
+        //    /// </summary>
+        //    public bool bit15;
+        //}
+
+        ///// <summary>
+        ///// 鎵ц鎸夐敭鎸囩ず鐏潯鐪犵粍
+        ///// </summary>
+        //public enum SleepGroupNum
+        //{
+        //    Group1 = 1,
+        //    Group2 = 2,
+        //    Group3 = 3,
+        //    Group4 = 4,
+        //    Group5 = 5,
+        //    Group6 = 6,
+        //    Group7 = 7,
+        //    Group8 = 8,
+        //    Group9 = 9,
+        //    Group10 = 10,
+        //    Group11 = 11,
+        //    Group12 = 12,
+        //    Group13 = 13,
+        //    Group14 = 14,
+        //    Group15 = 15,
+        //    Group16 = 16,
+        //}
+        #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>
+        /// 閰嶇疆闈㈡澘鐨勫姛鑳芥ā寮�
+        /// </summary>
+        public enum KeyMode
+        {
+            /// <summary>
+            /// 寮�鍏崇被鍨嬧�斺�斿紑.
+            /// </summary>
+            Scene_Trigger = 1,
+            /// <summary>
+            /// 寮�鍏崇被鍨嬧�斺�斿紑.
+            /// </summary>
+            OnOff_On = 100,
+            /// <summary>
+            /// 寮�鍏崇被鍨嬧�斺�斿叧.
+            /// </summary>
+            OnOff_oFF = 101,
+            /// <summary>
+            /// 寮�鍏崇被鍨嬧�斺�斿彇鍙�.
+            /// </summary>
+            OnOff_OnOff = 102,
+            /// <summary>
+            /// 浜害绫诲瀷鈥斺�旀寜绛夌骇璋冨ぇ.
+            /// </summary>
+            Level_Step_Up = 200,
+            /// <summary>
+            /// 浜害绫诲瀷鈥斺�旀寜绛夌骇璋冨皬.
+            /// </summary>
+            Level_Step_Down = 201,
+            /// <summary>
+            /// 浜害绫诲瀷鈥斺�旀寜绛夌骇鍙栧弽.
+            /// </summary>
+            Level_Step_Up_Down = 202,
+            /// <summary>
+            /// 浜害绫诲瀷鈥斺�斿彇鍙�.
+            /// </summary>
+            Level_Up = 203,
+            /// <summary>
+            /// 浜害绫诲瀷鈥斺�斿彇鍙�.
+            /// </summary>
+            Level_Down = 204,
+            /// <summary>
+            /// 浜害绫诲瀷鈥斺�斿彇鍙�.
+            /// </summary>
+            Level_Up_Down = 205,
+            /// <summary>
+            /// 绐楀笜绫诲瀷鈥斺�斿紑.
+            /// </summary>
+            Wcd_Up = 300,
+            /// <summary>
+            /// 绐楀笜绫诲瀷鈥斺�斿叧.
+            /// </summary>
+            Wcd_Down = 301,
+            /// <summary>
+            /// 绐楀笜绫诲瀷鈥斺�斿仠.
+            /// </summary>
+            Wcd_Stop = 302,
+            /// <summary>
+            /// 绐楀笜绫诲瀷鈥斺�斾笂鍗囧仠姝�.
+            /// </summary>
+            Wcd_Up_Stop = 303,
+            /// <summary>
+            /// 绐楀笜绫诲瀷鈥斺�斾笅闄嶅仠姝�.
+            /// </summary>
+            Wcd_Down_Stop = 304,
+            /// <summary>
+            /// 绐楀笜绫诲瀷鈥斺�斾笅闄嶅仠姝�.
+            /// </summary>
+            Default = 65535,
+        }
+        #endregion
+
+        /// <summary>
+        ///璇诲彇闈㈡澘鐨勯厤缃俊鎭�
+        /// </summary>
+        public void ReadPanelSupportAttribute()
+        {
+            ReadAttri(Device.Cluster_ID.HdlKey, AttriButeId.HdlKey);
+        }
+
+        #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];//缃戝叧杩斿洖鐨勭綉鍏矷D
+                    var reportStatus = topic.Split('/')[1];//涓婚涓鸿澶囦笂鎶ョ殑涓婚
+                    string addr = "";//涓婃姤鐨勮澶嘺ddr
+                    string epoint = "";//涓婃姤鐨勮澶噀point
+                    string cluID = "";//涓婃姤鐨勮澶嘽luID
+                    string attrId = "";//涓婃姤鐨勮澶嘺ttrId
+                    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>
+        /// 缃戝叧鎭㈠鍑哄巶璁剧疆杩斿洖鏁版嵁
+        /// </summary>
+        [System.Serializable]
+        public class PanelConfigureInfoResponAllData
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            ///<summary >
+            ///璁惧鏁版嵁
+            /// </summary>
+            public DeviceStatusReportData deviceStatusReportData;
+        }
+        #endregion
+
+        #region 鑾峰彇缃戝叧涓殑鍦烘櫙
+        /// <summary>
+        /// 鍙兘鑾峰彇鍦烘櫙淇℃伅锛屾病鏈夊満鏅腑鐨勮澶囦俊鎭�
+        /// </summary>
+        /// <returns></rxeturns>
+        public async System.Threading.Tasks.Task<GetOnlySceneAllData> GetSceneInfoAsync()
+        {
+            GetOnlySceneAllData result = null;
+            if (ZbGateway.MainGateWay == null)
+            {
+                result = new GetOnlySceneAllData { errorMessageBase = "娌℃湁涓荤綉鍏�" };
+            }
+            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 tempResult = Newtonsoft.Json.JsonConvert.DeserializeObject<ErrorResponData>(jobject["Data"].ToString());
+                        if (tempResult == null)
+                        {
+                            result = new GetOnlySceneAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
+                        }
+                        else
+                        {
+                            result = new GetOnlySceneAllData { errorResponData = tempResult };
+                        }
+                    }
+
+                    if (topic == gatewayID + "/" + "Scene/GetInfo_Respon")
+                    {
+                        var getSceneInfo = Newtonsoft.Json.JsonConvert.DeserializeObject<GetSceneInfo>(jobject["Data"].ToString());
+                        if (getSceneInfo == null)
+                        {
+                            result = new GetOnlySceneAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
+                        }
+                        else
+                        {
+                            result = new GetOnlySceneAllData { getSceneInfo = getSceneInfo };
+                        }
+                    }
+                };
+                ZbGateway.MainGateWay.Actions += action;
+                System.Console.WriteLine("Scene/GetInfo_Actions 鍚姩" + System.DateTime.Now.ToString());
+                var jobjectData = new JObject { { "Cluster_ID", 0 }, { "Command", 805 } };
+                await ZbGateway.MainGateWay.Send(("Scene/GetInfo"), System.Text.Encoding.UTF8.GetBytes(jobjectData.ToString()));
+
+                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 > WaitReceiveDataTime)
+                {
+                    result = new GetOnlySceneAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
+                }
+                return result;
+            });
+        }
+        /// <summary>
+        ///鑾峰彇鍦烘櫙淇℃伅,缃戝叧鍙嶉淇℃伅
+        /// </summary>
+        [System.Serializable]
+        public class GetOnlySceneAllData
+        {
+            /// <summary>
+            /// 閿欒淇℃伅
+            /// </summary>
+            public string errorMessageBase;
+            /// <summary>
+            /// 缃戝叧淇℃伅閿欒鍙嶉
+            /// <para>褰撶綉鍏虫帴鏀跺埌瀹㈡埛绔俊鎭悗锛屽嚭鐜颁互涓嬪紓甯告儏鍐靛皢鍙嶉閿欒銆�</para>
+            /// </summary>
+            public ErrorResponData errorResponData;
+            /// <summary>
+            /// 鑾峰彇鍦烘櫙淇℃伅
+            /// </summary>
+            public GetSceneInfo getSceneInfo;
+        }
+
+        /// <summary>
+        /// 鑾峰彇鍦烘櫙淇℃伅
+        /// </summary>
+        public GetSceneInfo sceneGetInfo;
+        /// <summary>
+        /// 鑾峰彇鍦烘櫙淇℃伅
+        /// </summary>
+        [System.Serializable]
+        public class GetSceneInfo
+        {
+            /// <summary>
+            ///鍦烘櫙鎬绘暟
+            /// </summary>
+            public int ScenesSum;
+
+            /// <summary>
+            /// 鍦烘櫙鍒楄〃
+            /// </summary>
+            public List<ScenesListInfo> ScenesList = new List<ScenesListInfo>();
+        }
+
+        /// <summary>
+        /// 鍦烘櫙鍒楄〃涓殑鍏蜂綋淇℃伅
+        /// </summary>
+        [System.Serializable]
+        public class ScenesListInfo
+        {
+            /// <summary>
+            /// 鍦烘櫙ID
+            /// </summary>
+            public int ScenesId;
+
+            /// <summary>
+            /// 鍚嶇О
+            /// </summary>
+            public string ScenesName;
+
+            /// <summary>
+            /// 鏄惁澶勪簬寮�鍚姸鎬�
+            ///0锛氬満鏅病鏈夎寮�鍚�
+            ///1锛氬満鏅浜庡紑鍚姸鎬�
+            /// </summary>
+            public int IsOpen;
+        }
+        #endregion
+    }
+}

--
Gitblit v1.8.0