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