From 9a4b76398009cf76c508d61f7e48fb6f5cb7ac2d Mon Sep 17 00:00:00 2001
From: xm <1271024303@qq.com>
Date: 星期二, 21 七月 2020 09:46:53 +0800
Subject: [PATCH] 请合并最新多功能面板代码

---
 ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs |  555 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 555 insertions(+), 0 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs
new file mode 100755
index 0000000..8b2603c
--- /dev/null
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/Rollershade.cs
@@ -0,0 +1,555 @@
+锘縰sing System;
+using Newtonsoft.Json.Linq;
+
+namespace ZigBee.Device
+{
+    [System.Serializable]
+    public class Rollershade : CurtainBase
+    {
+        public Rollershade()
+        {
+            this.Type = DeviceType.WindowCoveringDevice;
+        }
+
+        /// <summary>
+        ///绐楀笜褰撳墠妯″紡.
+        /// WcdType=4锛氬紑鍚堝笜
+        /// WcdType=0锛氬嵎甯�
+        /// </summary>
+        public int WcdType = -1;
+        /// <summary>
+        /// 褰撳墠绐楀笜鎵�鍦ㄧ殑浣嶇疆(鐧惧垎姣�).
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public int WcdCurrentPositionLiftPercentage = 0;
+
+        /// <summary>
+        /// 璇诲彇褰撳墠绐楀笜鐨勬ā寮�
+        /// <para>AttriButeId=0 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public new void ReadWcdType()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.WindowCoveringType);
+        }
+
+        /// <summary>
+        /// 璇诲彇褰撳墠绐楀笜妯″紡
+        /// </summary>
+        /// <param name="commonDevice"></param>
+        /// <param name="action"></param>
+        public static void ReadWcdTypeAction(CommonDevice commonDevice, Action action)
+        {
+            new System.Threading.Thread(() =>
+            {
+                (commonDevice as Rollershade).ReadWcdType();
+                var dateTime = DateTime.Now;
+                while ((DateTime.Now - dateTime).TotalSeconds < 10)
+                {
+                    System.Threading.Thread.Sleep(100);
+                    if ((commonDevice as Rollershade).WcdType != -1)
+                    {
+                        break;
+                    }
+                }
+                action?.Invoke();
+            })
+            { IsBackground = true }.Start();
+        }
+
+        /// <summary>
+        /// 绐楀笜褰撳墠鍊炬枩搴︼紝鍗曚綅锛�0.1掳
+        /// <para>AttriButeId=3 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public void ReadWcdCurrentPositionLift()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.CurrentPositionLift);
+        }
+
+        /// <summary>
+        /// 璇诲彇褰撳墠绐楀笜鎵�鍦ㄧ殑浣嶇疆(鐧惧垎姣�)
+        /// <para>AttriButeId=8 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public void ReadWcdCurrentPositionLiftPercentage()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.CurrentPositionLiftPercentage);
+        }
+
+        /// <summary>
+        /// 绐楀笜鍏ㄥ紑鎵�鍦ㄧ殑浣嶇疆锛屽崟浣嶏細cm
+        /// <para>AttriButeId=16 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public void ReadWcdInstalledOpenLimitLift()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.InstalledOpenLimitLift);
+        }
+
+        /// <summary>
+        /// 绐楀笜鍏ㄥ紑鎵�鍦ㄧ殑瑙掑害锛屽崟浣嶏細0.1掳
+        /// <para>AttriButeId=17 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public void ReadWcdInstalledClosedLimitLift()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.InstalledClosedLimitLift);
+        }
+
+        /// <summary>
+        /// 绐楀笜鍏ㄥ叧鎵�鍦ㄧ殑浣嶇疆锛屽崟浣嶏細cm
+        /// <para>AttriButeId=18 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public void ReadWcdInstalledOpenLimitTilt()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.InstalledOpenLimitTilt);
+        }
+
+        /// <summary>
+        /// 绐楀笜鍏ㄥ叧鎵�鍦ㄧ殑瑙掑害锛屽崟浣嶏細0.1掳
+        /// <para>AttriButeId=19 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public void ReadWcdInstalledClosedLimitTilt()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.InstalledClosedLimitTilt);
+        }
+
+        /// <summary>
+        /// 璇诲彇褰撳墠绐楀笜鐨勬ā寮�
+        /// <para>AttriButeId=23 (鍏堣皟鐢ㄥ彂鐜板睘鎬ф帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙g殑灞炴�э級</para>
+        /// </summary>
+        public void ReadWcdCurrentMode()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.WindowCoveringMode);
+        }
+
+        /// <summary>
+        /// 璇诲彇寮�鍚堝笜鐢垫満鏂瑰悜/缁存姢妯″紡
+        /// </summary>
+        public void ReadCurtainDirectionAndMode()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.WindowCoveringMode);
+        }
+
+        /// <summary>
+        ///  璇诲彇寮�鍚堝笜闄愪綅寮�锛堜笂锛夐檺浣�
+        /// <para>绐楀笜鍏ㄥ紑鎵�鍦ㄧ殑浣嶇疆锛屽崟浣嶏細cm</para>
+        /// </summary>
+        public void ReadWcdInstalOpenLimit()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.InstalledOpenLimitLift);
+        }
+
+        /// <summary>
+        ///  璇诲彇寮�鍚堝笜鎬婚暱
+        /// <para>绐楀笜鎬荤殑闀垮害锛屽崟浣嶏細cm</para>
+        /// </summary>
+        public void ReadWcdLength()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.WindowCoveringLength);
+        }
+
+        /// <summary>
+        ///  璇诲彇寮�鍚堝笜闄愪綅鍏筹紙涓嬶級闄愪綅
+        /// <para>绐楀笜鍏ㄥ叧鎵�鍦ㄧ殑浣嶇疆锛屽崟浣嶏細cm</para>
+        /// </summary>
+        public void ReadWcdInstalCloseLimit()
+        {
+            ReadAttri(Device.Cluster_ID.WindowCovering, AttriButeId.InstalledClosedLimitLift);
+        }
+
+        ///<summary >
+        ///绐楀笜璁惧璋冩暣鍒版寚瀹氶珮搴�.
+        /// <para>comand=4 (鍏堣皟鐢ㄨ澶囧彂鐜板懡浠ゆ帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙e懡浠わ級</para>
+        ///<para>value:绐楀笜瑕佽皟鏁村埌鐨勯珮搴﹀�煎</para>
+        ///<para> 鍙傛暟闀垮害锛堝崰鐢ㄧ殑瀛楄妭鏁帮級锛�2</para>
+        /// </summary>
+        public void WcdGoToLiftValue(int value)
+        {
+            var jObject = new JObject {
+                { "DeviceAddr", DeviceAddr},
+                { "Epoint", DeviceEpoint},
+                    { "Cluster_ID", 258 },
+                    { "Command", 4},
+                    { "SendMode", 2 }
+                };
+            var data = new JObject {
+                    { "Value", value }
+                 };
+            jObject.Add("Data", data);
+            Gateway?.Send("DeviceControl", jObject.ToString());
+        }
+
+        ///<summary >
+        ///灏嗙獥甯樿皟鏁村埌鎸囧畾鐨勭櫨鍒嗘瘮澶勭殑浣嶇疆.
+        /// <para>comand=5 (鍏堣皟鐢ㄨ澶囧彂鐜板懡浠ゆ帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙e懡浠わ級</para>
+        ///<para>绐楀笜瑕佽皟鏁村埌鐨勭櫨鍒嗘瘮澶勶紝鑼冨洿锛�0~100琛ㄧず 0-100%</para>
+        ///<para>鍙傛暟闀垮害锛堝崰鐢ㄧ殑瀛楄妭鏁帮級锛�1</para>
+        /// </summary>
+        public void WcdGoToTiltValue(int value)
+        {
+            var jObject = new JObject {
+                { "DeviceAddr", DeviceAddr},
+                { "Epoint", DeviceEpoint},
+                    { "Cluster_ID",258},
+                    { "Command", 5},
+                    { "SendMode", 2 }
+                };
+            var data = new JObject {
+                    { "Value", value }
+                 };
+            jObject.Add("Data", data);
+            Gateway?.Send("DeviceControl", jObject.ToString());
+        }
+
+        ///<summary >
+        ///璁╃獥甯樿澶囧皢绐楀笜璋冩暣鍒版寚瀹氱殑鍊炬枩瑙�
+        /// <para>comand=7 (鍏堣皟鐢ㄨ澶囧彂鐜板懡浠ゆ帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙e懡浠わ級</para>
+        ///<para>value:绐楀笜瑕佽皟鏁村埌鐨勫�炬枩瑙掑 鍗曚綅锛�0.1掳锛�</para>
+        ///<para> 鍙傛暟闀垮害锛堝崰鐢ㄧ殑瀛楄妭鏁帮級锛�2</para>
+        /// </summary>
+        public void WcdGoToLiftPercentpage(int value)
+        {
+            var jObject = new JObject {
+                { "DeviceAddr", DeviceAddr},
+                { "Epoint", DeviceEpoint},
+                    { "Cluster_ID", 258 },
+                    { "Command", 7},
+                    { "SendMode", 2 }
+                };
+            var data = new JObject {
+                    { "Value", value }
+                };
+            jObject.Add("Data", data);
+            Gateway?.Send("DeviceControl", jObject.ToString());
+        }
+
+        ///<summary >
+        ///璁╃獥甯樿澶囧皢绐楀笜璋冩暣鍒版寚瀹氱殑鐧惧垎姣斿�炬枩搴�
+        /// <para>comand=8 (鍏堣皟鐢ㄨ澶囧彂鐜板懡浠ゆ帴鍙o紝鏌ョ湅璁惧鏄惁鏀寔璇ユ帴鍙e懡浠わ級</para>
+        ///<para>value:绐楀笜瑕佽皟鏁村埌鐨勭櫨鍒嗘瘮鍊炬枩搴�</para>
+        ///<para>鑼冨洿锛�0-100琛ㄧず0-100%</para>
+        /// <para>鍙傛暟闀垮害锛堝崰鐢ㄧ殑瀛楄妭鏁帮級锛�1</para>
+        /// </summary>
+        public void WcdGoToTiltPercentpage(int value)
+        {
+            var jObject = new JObject {
+                { "DeviceAddr", DeviceAddr},
+                { "Epoint", DeviceEpoint},
+                    { "Cluster_ID", 258},
+                    { "Command", 8},
+                    { "SendMode", 2 }
+                };
+            var data = new JObject {
+                    { "Value", value }
+                 };
+            jObject.Add("Data", data);
+            Gateway?.Send("DeviceControl", jObject.ToString());
+        }
+
+        #region 璁剧疆寮�鍚堝笜闄愪綅鍙傛暟.
+        /// <summary>
+        /// 璁剧疆寮�鍚堝笜涓婁笅闄愪綅
+        /// </summary>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetCurtainInstalledLimitAsync(CurtainPrivateInstalledLimi installedLimit)
+        {
+            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 temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.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 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
+                {
+                    int tempLimit = 0;
+                    switch (installedLimit)
+                    {
+                        case CurtainPrivateInstalledLimi.UpLimit:
+                            tempLimit = 2;
+                            break;
+                        case CurtainPrivateInstalledLimi.DownLimit:
+                            tempLimit = 1;
+                            break;
+                    }
+                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 258 }, { "Command", 120 } };
+                    var data = new JObject { { "Undivided", 0 }, { "AttributeId", 0xea01 }, { "AttributeDataType", 32 }, { "AttributeData", tempLimit } };
+                    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 CurtainPrivateInstalledLimi
+        {
+            /// <summary>
+            /// 绐楀笜鍏ㄥ紑鎵�鍦ㄧ殑浣嶇疆(涓婇檺浣�)
+            /// </summary>
+            UpLimit = 2,
+            /// <summary>
+            /// 绐楀笜鍏ㄥ叧鎵�鍦ㄧ殑浣嶇疆(涓嬮檺浣�)
+            /// </summary>
+            DownLimit = 1,
+
+        }
+        #endregion
+
+        #region 璁剧疆鎭㈠绐楀笜琛岀▼闄愪綅.
+        /// <summary>
+        /// 璁剧疆鎭㈠绐楀笜琛岀▼闄愪綅
+        /// </summary>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> RestoreCurtainLimitAsync()
+        {
+            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 temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.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 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", 258 }, { "Command", 120 } };
+                    var data = new JObject { { "Undivided", 0 }, { "AttributeId", 0xea02 }, { "AttributeDataType", 32 }, { "AttributeData", 1 } };
+                    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>
+        enum CurtainPrivateAttribute
+        {
+            /// <summary>
+            /// 绐楀笜琛岀▼闄愪綅
+            /// </summary>
+            AttributeLimit = 0xea01,
+            /// <summary>
+            /// 璁剧疆鎭㈠绐楀笜琛岀▼闄愪綅
+            /// </summary>
+            RestoreLimit = 0xea02,
+
+        }
+        #endregion
+
+        #region 鍒犻櫎绐楀笜闄愪綅
+        /// <summary>
+        /// 鍒犻櫎绐楀笜闄愪綅
+        /// </summary>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> DeleteCurtainLimitsAsync(LimiType limiType)
+        {
+            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 temp = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.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 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
+                {
+                    int tempLimit = 0;
+                    switch (limiType)
+                    {
+                        case LimiType.DownLimit:
+                            tempLimit = 2;
+                            break;
+                        case LimiType.UpLimit:
+                            tempLimit = 8;
+                            break;
+                    }
+                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 258 }, { "Command", 120 } };
+                    var data = new JObject { { "Undivided", 0 }, { "AttributeId", 0xea02 }, { "AttributeDataType", 32 }, { "AttributeData", tempLimit } };
+                    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 LimiType
+        {
+            /// <summary>
+            /// 鍒犻櫎绐楀笜涓婇檺浣�
+            /// </summary>
+            UpLimit = 0x08,
+            /// <summary>
+            /// 鍒犻櫎绐楀笜涓嬮檺浣�
+            /// </summary>
+            DownLimit = 0x02,
+
+        }
+        #endregion
+    }
+}

--
Gitblit v1.8.0