From 3272ca5b51e19f7f8a827b0f68400570a547fe60 Mon Sep 17 00:00:00 2001
From: 陈嘉乐 <cjl@hdlchina.com.cn>
Date: 星期二, 28 四月 2020 15:02:44 +0800
Subject: [PATCH] 2020-04-28-1

---
 ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs |  538 +++++++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 377 insertions(+), 161 deletions(-)

diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs
index 63fc904..653e1d9 100755
--- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceAttributeLogic.cs
@@ -7,18 +7,18 @@
 namespace Shared.Phone.UserCenter
 {
     /// <summary>
-    /// 璁惧灞炴�т笂鎶ョ殑閫昏緫绫�
+    /// 璁惧灞炴�х殑閫昏緫绫�
     /// </summary>
-    public class HdlDeviceAttributeLogic : ZigBee.Common.IStatus
+    public class HdlDeviceAttributeLogic
     {
         #region 鈻� 鍙橀噺澹版槑___________________________
 
         /// <summary>
-        /// 灞炴�т笂鎶ョ殑閫昏緫
+        /// 灞炴�х殑閫昏緫
         /// </summary>
         private static HdlDeviceAttributeLogic m_Current = null;
         /// <summary>
-        /// 灞炴�т笂鎶ョ殑閫昏緫
+        /// 灞炴�х殑閫昏緫
         /// </summary>
         public static HdlDeviceAttributeLogic Current
         {
@@ -36,172 +36,388 @@
             }
         }
 
-        /// <summary>
-        /// 浜嬩欢闆嗗悎
-        /// </summary>
-        private Dictionary<string, Action<CommonDevice>> dicEvent = new Dictionary<string, Action<CommonDevice>>();
-        /// <summary>
-        /// 鍛戒护鍖哄垎
-        /// </summary>
-        private Dictionary<string, string> dicCommandDiv = new Dictionary<string, string>();
-
         #endregion
 
-        #region 鈻� 娣诲姞浜嬩欢___________________________
+        #region 鈻� 鍐欏叆璁惧灞炴�______________________
 
         /// <summary>
-        /// 娣诲姞鑾峰彇璁惧灞炴�х殑浜嬩欢(鎺ㄩ�佸凡缁忓己鍒舵寚瀹氳繍琛屼簬涓荤嚎绋嬶紝灞炴�т笂鎶ョ殑瀵硅薄锛歞evice.DeviceStatusReport)
+        /// 璁剧疆绌鸿皟鐨勮嚜瀹氫箟妯″紡
         /// </summary>
-        /// <param name="mainKeys">鏍囪瘑浜嬩欢鐨勪富閿�(鍙互闅忎究濉�,涓昏鏄拡瀵瑰涓晫闈竴璧蜂娇鐢ㄧ殑鎯呭喌)</param>
-        /// <param name="comand">鍛戒护鍖哄垎,姣斿锛欴eviceStatusReport,IASInfoReport绛夌瓑</param>
-        /// <param name="action">褰撴帴鏀跺埌缃戝叧鍥炲涔嬪悗鐨勫洖璋冨嚱鏁�,灞炴�т笂鎶ョ殑瀵硅薄锛歞evice.DeviceStatusReport</param>
-        public void AddAttributeEvent(string mainKeys, string comand, Action<CommonDevice> action)
-        {
-            lock (this.dicEvent)
-            {
-                if (this.dicEvent.Count == 0)
-                {
-                    ZbGateway.StatusList.Add(this);
-                }
-                this.dicEvent[mainKeys] = action;
-                this.dicCommandDiv[mainKeys] = comand;
-            }
-        }
-
-        #endregion
-
-        #region 鈻� 绉婚櫎鐩戝惉___________________________
-
-        /// <summary>
-        /// 绉婚櫎浜嬩欢
-        /// </summary>
-        /// <param name="mainKeys">鏍囪瘑浜嬩欢鐨勪富閿�(鍙互闅忎究濉�,涓昏鏄拡瀵瑰涓晫闈竴璧蜂娇鐢ㄧ殑鎯呭喌)</param>
-        public void RemoveEvent(string mainKeys)
-        {
-            lock (this.dicEvent)
-            {
-                if (this.dicEvent.ContainsKey(mainKeys) == true)
-                {
-                    var action = this.dicEvent[mainKeys];
-                    this.dicEvent.Remove(mainKeys);
-                    this.dicCommandDiv.Remove(mainKeys);
-
-                    action = null;
-                }
-                if (this.dicEvent.Count == 0)
-                {
-                    ZbGateway.StatusList.Remove(this);
-                }
-            }
-        }
-
-        /// <summary>
-        /// 绉婚櫎鍏ㄩ儴鐨勪簨浠�
-        /// </summary>
-        public void RemoveAllEvent()
-        {
-            lock (this.dicEvent)
-            {
-                var list = new HashSet<string>();
-                foreach (var keys in this.dicEvent.Keys)
-                {
-                    list.Add(keys);
-                }
-                foreach (var keys in list)
-                {
-                    //闇�瑕佹參鎱竴涓竴涓殑閲婃斁Action,鍚
-                    this.RemoveEvent(keys);
-                }
-            }
-        }
-
-        #endregion
-
-        #region 鈻� 瀹炵幇鎺ュ彛___________________________
-
-        /// <summary>
-        /// 璁惧鐘舵�侀�氱煡
-        /// </summary>
-        /// <param name="common"></param>
-        /// <param name="typeTag"></param>
-        public void DeviceInfoChange(CommonDevice common, string typeTag)
-        {
-            if (common == null || string.IsNullOrEmpty(common.DeviceAddr) == true)
-            {
-                //鎴戜篃涓嶇煡閬撹繖鏈夋病鏈夊彲鑳�
-                return;
-            }
-
-            lock (this.dicEvent)
-            {
-                var list = new List<Action<CommonDevice>>();
-                foreach (string keys in this.dicEvent.Keys)
-                {
-                    if (this.dicCommandDiv[keys] != typeTag)
-                    {
-                        //鍛戒护鍖哄垎涓嶄竴鑷达紝鍒欎笉璋冪敤鍥炶皟鍑芥暟
-                        continue;
-                    }
-                    //鍛戒护鍖哄垎涓�鑷存椂锛屽垯璋冪敤鍥炶皟鍑芥暟
-                    list.Add(this.dicEvent[keys]);
-                }
-                //鏈夊彲鑳藉湪鍥炶皟鍑芥暟涓Щ闄や簡浜嬩欢锛屽鑷存姤閿欙紝鎵�浠ュ厛鏀堕泦锛屽啀璋冪敤
-                Application.RunOnMainThread(() =>
-                {
-                    foreach (var action in list)
-                    {
-                        try
-                        {
-                            action?.Invoke(common);
-                        }
-                        catch (Exception ex)
-                        {
-                            //Log鍑哄姏
-                            string msg = "褰撳墠婵�娲荤殑鐣岄潰[" + UserCenterResourse.NowActionFormID + "]";
-                            HdlLogLogic.Current.WriteLog(-1, msg);
-                            HdlLogLogic.Current.WriteLog(ex);
-                        }
-
-                    }
-                });
-            }
-        }
-
-        /// <summary>
-        /// 涓嶄娇鐢�
-        /// </summary>
-        /// <param name="common"></param>
-        public void Changed(CommonDevice common)
-        {
-        }
-
-        /// <summary>
-        /// 涓嶄娇鐢�
-        /// </summary>
-        public void ChangedILogicStatus(ZigBee.Device.Logic logic)
-        {
-        }
-
-        /// <summary>
-        /// 涓嶄娇鐢�
-        /// </summary>
-        public void ChangedISceneStatus(Scene scene)
-        {
-        }
-        #endregion
-
-        #region 鈻� 涓�鑸柟娉昣__________________________
-
-        /// <summary>
-        /// 鏄惁瀛樺湪鎸囧畾鐨勪簨浠�
-        /// </summary>
-        /// <param name="mainkeys"></param>
+        /// <param name="device">璁惧瀵硅薄</param>
+        /// <param name="clusterId">闀濱D</param>
+        /// <param name="attributeId">灞炴�D</param>
+        /// <param name="attributeDataType">鏁版嵁绫诲瀷</param>
+        /// <param name="attributeData">闇�瑕佸啓鍏ョ殑鏁版嵁(鏁板�兼垨鑰呭瓧绗︿覆)</param>
         /// <returns></returns>
-        public bool IsEsixt(string mainkeys)
+        public async System.Threading.Tasks.Task<CommonDevice.SetWritableValueResponAllData> WriteDeviceAttribute(CommonDevice device, int clusterId, int attributeId, int attributeDataType, object attributeData)
         {
-            return this.dicCommandDiv.ContainsKey(mainkeys);
+            var MyGateway = device.Gateway;
+            if (MyGateway == null)
+            {
+                return null;
+            }
+
+            CommonDevice.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<ZbGateway.ErrorResponData>(jobject["Data"].ToString());
+                    if (temp == null)
+                    {
+                        d = new CommonDevice.SetWritableValueResponAllData { errorMessageBase = "缃戝叧閿欒鍥炲锛屼笖鏁版嵁鏄┖" };
+                    }
+                    else
+                    {
+                        d = new CommonDevice.SetWritableValueResponAllData { errorResponData = temp, errorMessageBase = HdlCheckLogic.Current.CheckCommonErrorCode(temp.Error) };
+                    }
+                }
+
+                if (topic == gatewayID + "/" + "SetWritableValue_Respon")
+                {
+                    var tempData = Newtonsoft.Json.JsonConvert.DeserializeObject<CommonDevice.SetWritableValueResponData>(jobject["Data"].ToString());
+                    if (tempData == null)
+                    {
+                        d = new CommonDevice.SetWritableValueResponAllData { errorMessageBase = "缃戝叧杩斿洖鐨勬暟鎹负绌�" };
+                    }
+                    else
+                    {
+                        d = new CommonDevice.SetWritableValueResponAllData { setWritableValueResponData = tempData };
+                    }
+                }
+            };
+            MyGateway.Actions += action;
+            try
+            {
+                var jObject = new Newtonsoft.Json.Linq.JObject { { "DeviceAddr", device.DeviceAddr }, { "Epoint", device.DeviceEpoint }, { "Cluster_ID", clusterId }, { "Command", 120 } };
+                Newtonsoft.Json.Linq.JObject data = null;
+                if (attributeData is int)
+                {
+                    data = new Newtonsoft.Json.Linq.JObject { { "Undivided", 0 }, { "AttributeId", attributeId }, { "AttributeDataType", attributeDataType }, { "AttributeData", Convert.ToInt32(attributeData) } };
+                }
+                else
+                {
+                    data = new Newtonsoft.Json.Linq.JObject { { "Undivided", 0 }, { "AttributeId", attributeId }, { "AttributeDataType", attributeDataType }, { "AttributeData", attributeData.ToString() } };
+                }
+                jObject.Add("Data", data);
+                MyGateway.Send("SetWritableValue", jObject.ToString());
+            }
+            catch { }
+
+            var timeOut = 0;
+            while (timeOut <= 30)
+            {
+                await System.Threading.Tasks.Task.Delay(100);
+                if (d != null)
+                {
+                    break;
+                }
+                timeOut++;
+            }
+            if (timeOut > 30 && d == null)
+            {
+                d = new CommonDevice.SetWritableValueResponAllData { errorMessageBase = " 鍥炲瓒呮椂锛岃閲嶆柊鎿嶄綔" };
+            }
+            MyGateway.Actions -= action;
+            return d;
         }
 
         #endregion
+
+        #region 鈻� 绌鸿皟_______________________________
+
+        /// <summary>
+        /// SendACStatuComand
+        /// </summary>
+        /// <param name="device">璁惧</param>
+        public void SendACStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            new System.Threading.Thread(() =>
+            {
+                SendFanStatuComand(device);
+                System.Threading.Thread.Sleep(300);
+                SendThermostatStatuComand(device);
+            })
+            { IsBackground = true }.Start();
+        }
+
+        /// <summary>
+        /// SendThermostatStatuComand
+        /// </summary>
+        /// <param name="device">璁惧</param>
+        public void SendThermostatStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject
+            {
+                { "DeviceAddr",device.DeviceAddr },
+                { "Epoint", device.DeviceEpoint },
+                { "Cluster_ID", (int)Cluster_ID.Thermostat },
+                { "Command", 108 }
+            };
+            var attriBute = new Newtonsoft.Json.Linq.JArray
+            {
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.LocalTemperature}
+               },
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.CoolingSetpoint}
+               },
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.HeatingSetpoint}
+               },
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.AutoSetpoint}
+               },
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.SystemMode}
+               },
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.AcModeSupport}
+               },
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.CleanStatu}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send(("GetDeviceStatus"), jObject.ToString());
+        }
+
+        /// <summary>
+        /// SendFanStatuComand
+        /// </summary>
+        /// <param name="device">璁惧</param>
+        private void SendFanStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject
+            {
+                { "DeviceAddr",device.DeviceAddr },
+                { "Epoint", device.DeviceEpoint },
+                { "Cluster_ID", (int)Cluster_ID.FanControl },
+                { "Command", 108 }
+            };
+            var attriBute = new Newtonsoft.Json.Linq.JArray
+            {
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.FanMode}
+               },
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.FanSwing}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send("GetDeviceStatus", jObject.ToString());
+        }
+
+        #endregion
+
+        #region 鈻� 绐楀笜_______________________________
+        /// <summary>
+        /// 鍙戦�佽幏鍙栫獥甯樼姸鎬佸懡浠�
+        /// </summary>
+        /// <param name="device">绐楀笜</param>
+        public void SendCurtainStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject
+            {
+                { "DeviceAddr",device.DeviceAddr },
+                { "Epoint", device.DeviceEpoint },
+                { "Cluster_ID", (int)Cluster_ID.WindowCovering },
+                { "Command", 108 }
+            };
+            var attriBute = new Newtonsoft.Json.Linq.JArray
+            {
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.CurrentPositionLiftPercentage}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send(("GetDeviceStatus"), jObject.ToString());
+        }
+
+        #endregion
+
+        #region 鈻� 鐏厜_______________________________
+
+        /// <summary>
+        /// Light
+        /// </summary>
+        /// <param name="device"></param>
+        public void SendLightStatuComand(CommonDevice device)
+        {
+            SendSwitchStatuComand(device);
+        }
+
+        /// <summary>
+        /// Light
+        /// </summary>
+        /// <param name="device"></param>
+        public void SendDimmableLightStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            new System.Threading.Thread(() =>
+            {
+                SendSwitchStatuComand(device);
+                System.Threading.Thread.Sleep(300);
+                SendLevelStatuComand(device);
+            })
+            { IsBackground = true }.Start();
+        }
+
+        /// <summary>
+        /// 鍙戦�佽幏鍙栫伅鍏夌姸鎬佸懡浠�
+        /// </summary>
+        /// <param name="device">绐楀笜</param>
+        private void SendSwitchStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject
+            {
+                { "DeviceAddr",device.DeviceAddr },
+                { "Epoint", device.DeviceEpoint },
+                { "Cluster_ID", (int)Cluster_ID.Switch },
+                { "Command", 108 }
+            };
+            var attriBute = new Newtonsoft.Json.Linq.JArray
+            {
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.Switch}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send(("GetDeviceStatus"), jObject.ToString());
+        }
+
+        /// <summary>
+        /// 鍙戦�佽幏鍙栫伅鍏夌姸鎬佸懡浠�
+        /// </summary>
+        /// <param name="device">绐楀笜</param>
+        private void SendLevelStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject
+            {
+                { "DeviceAddr",device.DeviceAddr },
+                { "Epoint", device.DeviceEpoint },
+                { "Cluster_ID", (int)Cluster_ID.LevelControl },
+                { "Command", 108 }
+            };
+            var attriBute = new Newtonsoft.Json.Linq.JArray
+            {
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.LevelControl}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send(("GetDeviceStatus"), jObject.ToString());
+        }
+
+        #endregion
+
+        #region 鈻� 娓╂箍搴____________________________
+
+        /// <summary>
+        /// 璇诲彇娓╁害
+        /// </summary>
+        /// <param name="device"></param>
+        public void SendTemperatureStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject
+            {
+                { "DeviceAddr",device.DeviceAddr },
+                { "Epoint", device.DeviceEpoint },
+                { "Cluster_ID", (int)Cluster_ID.TemperatureMeasurement },
+                { "Command", 108 }
+            };
+            var attriBute = new Newtonsoft.Json.Linq.JArray
+            {
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.MeasuredValue}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send(("GetDeviceStatus"), jObject.ToString());
+        }
+
+        /// <summary>
+        /// 璇诲彇婀垮害
+        /// </summary>
+        /// <param name="device"></param>
+        public void SendHumidityStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            var jObject = new Newtonsoft.Json.Linq.JObject
+            {
+                { "DeviceAddr",device.DeviceAddr },
+                { "Epoint", device.DeviceEpoint },
+                { "Cluster_ID", (int)Cluster_ID.RelativeHumidityMeasurement },
+                { "Command", 108 }
+            };
+            var attriBute = new Newtonsoft.Json.Linq.JArray
+            {
+               new Newtonsoft.Json.Linq.JObject
+               {
+                 { "AttriButeId", (int)AttriButeId.MeasuredValue}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send(("GetDeviceStatus"), jObject.ToString());
+        }
+
+        #endregion
     }
 }

--
Gitblit v1.8.0