From dfd3bdc07c49fab66b38382e0bbe7c91bdf4f15b Mon Sep 17 00:00:00 2001
From: xm <1271024303@qq.com>
Date: 星期二, 28 四月 2020 15:03:43 +0800
Subject: [PATCH] 合并新代码,提供逻辑需要的门锁接口

---
 ZigbeeApp/Home.Ios/Resources/Language.ini                                                  |    2 
 ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirButtonSettionForm.cs    |   15 
 ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs                         |    2 
 ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs               |  108 ++-
 ZigbeeApp/Home.Ios/Home.IOS.csproj                                                         |    6 
 ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs                      |   52 +
 ZigbeeApp/Shared/Phone/ZigBee/Device/HumiditySensor.cs                                     |    1 
 ZigbeeApp/Shared/R.cs                                                                      |   12 
 ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs                        |   12 
 ZigbeeApp/Shared/Phone/Category/CategoryMainForm.cs                                        |   14 
 ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected2.png                      |    0 
 ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceAcDetailCardForm.cs                      |    5 
 ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected.png                       |    0 
 ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs                              |   11 
 ZigbeeApp/Shared/Phone/ZigBee/Device/FreshAir.cs                                           |  171 ++++--
 ZigbeeApp/Shared/Common/Device.cs                                                          |   43 
 ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs                           |  506 +++++++++++++-----
 ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs                                           |    3 
 ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLighWithSensorForm.cs              |    2 
 ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirPic.png                                |    0 
 ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs                             |   51 +
 ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirBackLightSettionForm.cs |    2 
 ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs                                              |    1 
 ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceFreshAirDetailCardForm.cs                |  322 ++++++++++++
 ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceOtherLogic.cs                  |   29 +
 ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs                      |   52 +
 ZigbeeApp/Shared/Shared.projitems                                                          |    2 
 ZigbeeApp/Shared/Phone/Category/Controls/DeviceRow/DeviceFreshAirRowControl.cs             |  105 ++++
 ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs                                       |   10 
 ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpoint.png                               |    0 
 ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirRealDevicePic.png                      |    0 
 ZigbeeApp/Shared/Phone/MainPage/DeviceDetailInfoForm.cs                                    |   14 
 ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs                                         |    2 
 33 files changed, 1,253 insertions(+), 302 deletions(-)

diff --git a/ZigbeeApp/Home.Ios/Home.IOS.csproj b/ZigbeeApp/Home.Ios/Home.IOS.csproj
index 308ee69..d98b09b 100644
--- a/ZigbeeApp/Home.Ios/Home.IOS.csproj
+++ b/ZigbeeApp/Home.Ios/Home.IOS.csproj
@@ -108,6 +108,7 @@
     </ItemGroup>
     <ItemGroup>
         <Folder Include="Resources\" />
+        <Folder Include="Resources\Phone\FreshAir\" />
     </ItemGroup>
     <ItemGroup>
         <InterfaceDefinition Include="LaunchScreen.storyboard" />
@@ -1009,6 +1010,11 @@
       <BundleResource Include="Resources\Phone\Gateway\WiredGateway.png" />
       <BundleResource Include="Resources\Phone\Gateway\WirelessGateway.png" />
       <BundleResource Include="Resources\Phone\Gateway\AddGatewaySuccess.png" />
+      <BundleResource Include="Resources\Phone\FreshAir\FreshAirPic.png" />
+      <BundleResource Include="Resources\Phone\Device\FreshAirEpoint.png" />
+      <BundleResource Include="Resources\Phone\Device\FreshAirEpointSelected.png" />
+      <BundleResource Include="Resources\Phone\Device\FreshAirEpointSelected2.png" />
+      <BundleResource Include="Resources\Phone\FreshAir\FreshAirRealDevicePic.png" />
     </ItemGroup>
     <Import Project="..\Shared\Shared.projitems" Label="Shared" Condition="Exists('..\Shared\Shared.projitems')" />
     <Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.iOS.CSharp.targets" />
diff --git a/ZigbeeApp/Home.Ios/Resources/Language.ini b/ZigbeeApp/Home.Ios/Resources/Language.ini
index 05fabd8..eac7933 100755
--- a/ZigbeeApp/Home.Ios/Resources/Language.ini
+++ b/ZigbeeApp/Home.Ios/Resources/Language.ini
@@ -313,6 +313,7 @@
 308=璀﹀憡锛佹椂鏁堟�у父寮�鍒犻櫎澶辫触銆�
 309=鏃舵晥鎬у父寮�鍒犻櫎澶辫触锛岀户缁�滃父寮�妯″紡鈥濊鍓嶅線闂ㄩ攣鐢ㄦ埛鐣岄潰璁剧疆;
 310=璇疯緭鍏ュ悎娉曠殑鏁板瓧
+311=鎵嬪姩
 
 5097=鍙栨秷
 5098=纭畾
@@ -1951,6 +1952,7 @@
 40015=鎻掑骇
 40016=鐏厜
 40017=骞叉帴鐐�
+40018=鏂伴
 
 ;鈽呪槄鈽呪槄涓嬮潰杩欎簺鏄ā鍧桰D鐨勮澶囬粯璁ゅ娉ㄥ悕瀛�,浠�50000寮�濮�.娉�:瀹冨苟涓嶉渶瑕佸啀R.cs鏂囦欢涓畾涔夆槄鈽呪槄鈽�
 50000=绱ф�ユ寜閽�
diff --git a/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpoint.png b/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpoint.png
new file mode 100644
index 0000000..c637e9b
--- /dev/null
+++ b/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpoint.png
Binary files differ
diff --git a/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected.png b/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected.png
new file mode 100644
index 0000000..d028074
--- /dev/null
+++ b/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected.png
Binary files differ
diff --git a/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected2.png b/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected2.png
new file mode 100644
index 0000000..14d38c3
--- /dev/null
+++ b/ZigbeeApp/Home.Ios/Resources/Phone/Device/FreshAirEpointSelected2.png
Binary files differ
diff --git a/ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirPic.png b/ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirPic.png
new file mode 100644
index 0000000..fc08f7b
--- /dev/null
+++ b/ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirPic.png
Binary files differ
diff --git a/ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirRealDevicePic.png b/ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirRealDevicePic.png
new file mode 100644
index 0000000..721a5dd
--- /dev/null
+++ b/ZigbeeApp/Home.Ios/Resources/Phone/FreshAir/FreshAirRealDevicePic.png
Binary files differ
diff --git a/ZigbeeApp/Shared/Common/Device.cs b/ZigbeeApp/Shared/Common/Device.cs
index 15dcb3c..197639c 100644
--- a/ZigbeeApp/Shared/Common/Device.cs
+++ b/ZigbeeApp/Shared/Common/Device.cs
@@ -1770,7 +1770,7 @@
             //14鏂伴璁惧
             else if (dicType.ContainsKey(DeviceType.FreshAir) == true)
             {
-                info.ConcreteTextId = R.MyInternationalizationString.DeviceModelId2310;
+                info.ConcreteTextId = R.MyInternationalizationString.uDeviceModelId2310;
                 info.BeloneType = DeviceBeloneType.A鏂伴;
                 info.ConcreteType = DeviceConcreteType.Relay_FangyueFreshAirModul;
                 info.ObjectTypeNameId = 60011;//鏂伴
@@ -2024,14 +2024,14 @@
             list.Add(DeviceBeloneType.A鎻掑骇);
             list.Add(DeviceBeloneType.A璋冨厜鍣�);
             list.Add(DeviceBeloneType.A绐楀笜);
+            list.Add(DeviceBeloneType.A鏂伴);
             list.Add(DeviceBeloneType.A绌鸿皟);
             list.Add(DeviceBeloneType.A缁х數鍣�);
             list.Add(DeviceBeloneType.A骞叉帴鐐�);
             list.Add(DeviceBeloneType.A鏅鸿兘闂ㄩ攣);
             list.Add(DeviceBeloneType.A鏅鸿兘绌哄紑);
-            list.Add(DeviceBeloneType.A浼犳劅鍣�);
-
-            //鍏朵粬鐨勭湅鐫�鍔炲憲,閮芥槸鎺掑湪鍚庨潰鐨�,閮藉綊涓鸿繖涓睘鎬�
+            list.Add(DeviceBeloneType.A浼犳劅鍣�);
+            //鍏朵粬鐨勭湅鐫�鍔炲憲,閮芥槸鎺掑湪鍚庨潰鐨�,閮藉綊涓鸿繖涓睘鎬�
             list.Add(DeviceBeloneType.A鏈煡璁惧);
 
             return list;
@@ -2509,7 +2509,10 @@
             else if (deviceType == DeviceType.FreshAir) { device = new FreshAir(); }
             else if (deviceType == DeviceType.DoorLock) { device = new DoorLock(); }
             else if (deviceType == DeviceType.TemperatureSensor) { device = new TemperatureSensor(); }
-            else if (deviceType == DeviceType.FreshAirHumiditySensor) { device = new HumiditySensor(); }
+            else if (deviceType == DeviceType.FreshAirHumiditySensor)
+            {
+                device = new HumiditySensor();
+            }
             else if (deviceType == DeviceType.OtaDevice || deviceType == DeviceType.OtaPanelDevice) { device = new OTADevice(); }
             else { return null; }
 
@@ -2648,13 +2651,12 @@
             this.dicDeviceModelIdChanged["MULTI-FIRE--EA05"] = "MSS01/M-ZB.10";//鐑熼浘浼犳劅鍣�
             this.dicDeviceModelIdChanged["MULTI-MOTI--EA04"] = "MSPIR01/M-ZB.10";//绾㈠浼犳劅鍣�
             this.dicDeviceModelIdChanged["MULTI-WATE--EA02"] = "MSW01/M-ZB.10";//姘存蹈浼犳劅鍣�
-            this.dicDeviceModelIdChanged["MULTI-BURO--EA06"] = "MBU01/M-ZB.10";//绱ф�ユ寜閿�
-
-
-
-            //鉁┾湬鉁┾湬鉁╅渶瑕佸叡鏈夌殑鍥剧墖瀵硅薄鉁┾湬鉁┾湬鉁�
-            //涓よ�呴兘鏄疍eviceConcreteType
-            //Keys:鎸囧畾鐨勮澶�    value:娌跨敤鐨勫浘鐗囨槸鍝璁惧鐨�
+            this.dicDeviceModelIdChanged["MULTI-BURO--EA06"] = "MBU01/M-ZB.10";//绱ф�ユ寜閿�
+
+
+            //鉁┾湬鉁┾湬鉁╅渶瑕佸叡鏈夌殑鍥剧墖瀵硅薄鉁┾湬鉁┾湬鉁�
+            //涓よ�呴兘鏄疍eviceConcreteType
+            //Keys:鎸囧畾鐨勮澶�    value:娌跨敤鐨勫浘鐗囨槸鍝璁惧鐨�
             this.dicPictrueShard = new Dictionary<string, string>();
             this.dicPictrueShard["ButtonPanel_SimpleFour"] = "ButtonPanel_Four";//绠�绾�4鎸夐敭闈㈡澘 娌跨敤 4鎸夐敭鐨勫浘鏍�
             this.dicPictrueShard["ButtonPanel_SimpleThree"] = "ButtonPanel_Three";//绠�绾�3鎸夐敭闈㈡澘 娌跨敤 3鎸夐敭鐨勫浘鏍�
@@ -2822,6 +2824,11 @@
         /// </summary>
         Sensor_Humidity = -1310,
 
+        /// <summary>
+        /// PM2.5浼犳劅鍣�
+        /// </summary>
+        Sensor_PM = -1311,
+
         //=========鈽呪槄缁х數鍣ㄧ被(2300-2499)鈽呪槄=========
         /// <summary>
         /// 缁х數鍣�
@@ -2946,7 +2953,7 @@
         /// <summary>
         /// 鎸夐敭闈㈡澘(200-1199)
         /// </summary>
-        A鎸夐敭闈㈡澘 = 200,
+        A鎸夐敭闈㈡澘 = 200,
         /// <summary>
         /// 浼犳劅鍣�(1200-2299)
         /// </summary>
@@ -2954,7 +2961,11 @@
         /// <summary>
         /// 缁х數鍣�(2300-2499)
         /// </summary>
-        A缁х數鍣� = 2300,
+        A缁х數鍣� = 2300,
+        /// <summary>
+        /// 鏂伴
+        /// </summary>
+        A鏂伴 = 2310,
         /// <summary>
         /// 璋冨厜鍣�(2500-2799)
         /// </summary>
@@ -3011,10 +3022,6 @@
         /// 骞叉帴鐐�
         /// </summary>
         A骞叉帴鐐� = 16,
-        /// <summary>
-        /// 鏂伴
-        /// </summary>
-        A鏂伴 = 17
     }
 
     #endregion
diff --git a/ZigbeeApp/Shared/Phone/Category/CategoryMainForm.cs b/ZigbeeApp/Shared/Phone/Category/CategoryMainForm.cs
index 913be70..2e14264 100644
--- a/ZigbeeApp/Shared/Phone/Category/CategoryMainForm.cs
+++ b/ZigbeeApp/Shared/Phone/Category/CategoryMainForm.cs
@@ -525,8 +525,8 @@
                     }
                     // 鏂伴
                     else if (device.Type == DeviceType.FreshAir)
-                    {
-                        cardContr = new Controls.DeviceAcRowControl(listView.rowSpace / 2);
+                    {
+                        cardContr = new Controls.DeviceFreshAirRowControl(listView.rowSpace / 2);
                     }
                     //褰╃伅(璋冨厜鍣�)
                     else if (device.Type == DeviceType.DimmableLight)
@@ -780,6 +780,11 @@
                             //绌鸿皟鏄壒娈婄殑,瀹冪殑寮�鍏虫槸灞炴�т笂鎶ユ潵鐫�.宸茬粡鎺ユ敹鍒扮綉鍏崇殑鍙嶉
                             this.dicDeviceRowControl[mainKeys].SetHadGetResponeResultStatu();
                         }
+                        if (report.DeviceStatusReport.CluterID == 514 && report.DeviceStatusReport.AttriBute[0].AttributeId == 0)
+                        {
+                            //鏂伴鏄壒娈婄殑,瀹冪殑寮�鍏虫槸灞炴�т笂鎶ユ潵鐫�.宸茬粡鎺ユ敹鍒扮綉鍏崇殑鍙嶉
+                            this.dicDeviceRowControl[mainKeys].SetHadGetResponeResultStatu();
+                        }
                         this.dicDeviceRowControl[mainKeys].RefreshControlInfo(locadevice);
                     }
                 }, ShowErrorMode.NO);
@@ -886,6 +891,11 @@
                     LocalDevice.Current.GetDeviceObjectIcon(typeInfo.ConcreteType, ref path1, ref path2);
                     dic[typeInfo.BeloneTextId].IconPath = path1;
                     dic[typeInfo.BeloneTextId].IconPathSelected = path2;
+                    if (device.Type == DeviceType.FreshAir)
+                    {
+                        dic[typeInfo.BeloneTextId].IconPath = "Device/FreshAirEpoint.png";
+                        dic[typeInfo.BeloneTextId].IconPathSelected = "Device/FreshAirEpointSelected.png";
+                    }
                     dic[typeInfo.BeloneTextId].TextId = typeInfo.BeloneTextId;
                 }
                 dic[typeInfo.BeloneTextId].listDeviceKeys.Add(LocalDevice.Current.GetDeviceMainKeys(device));
diff --git a/ZigbeeApp/Shared/Phone/Category/Controls/DeviceRow/DeviceFreshAirRowControl.cs b/ZigbeeApp/Shared/Phone/Category/Controls/DeviceRow/DeviceFreshAirRowControl.cs
new file mode 100644
index 0000000..c2ab4b8
--- /dev/null
+++ b/ZigbeeApp/Shared/Phone/Category/Controls/DeviceRow/DeviceFreshAirRowControl.cs
@@ -0,0 +1,105 @@
+锘縰sing System;
+using Shared.Phone.UserCenter;
+using ZigBee.Device;
+
+namespace Shared.Phone.Category.Controls
+{
+    /// <summary>
+    /// 鍒嗙被鐣岄潰鐨勬柊椋庤澶囪鎺т欢
+    /// </summary>
+    public class DeviceFreshAirRowControl : DeviceRowCommon
+    {
+        /// <summary>
+        /// 鍒嗙被鐣岄潰鐨勬柊椋庤澶囪鎺т欢
+        /// </summary>
+        /// <param name="i_ChidrenYaxis">瀛愭帶浠禮杞村亸绉婚噺(鐪熷疄鍊�,鏈変簺鐣岄潰闇�瑕佽繖绉嶇壒娈婃搷浣�)</param>
+        public DeviceFreshAirRowControl(int i_ChidrenYaxis = 0) : base(i_ChidrenYaxis)
+        {
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨帶浠�
+        /// </summary>
+        /// <param name="i_device"></param>
+        public override void InitControl(CommonDevice i_device)
+        {
+            base.InitControl(i_device);
+
+            //娣诲姞璺宠浆娣卞害鍗$墖淇℃伅浜嬩欢
+            this.AddDetailInfoEvent(i_device);
+
+            //娣诲姞寮�鍏虫帶浠�
+            var btnSwitch = this.AddSwitchControl();
+            btnSwitch.ButtonClickEvent += (sender, e) =>
+            {
+                bool setStatu = !btnSwitch.IsSelected;
+                //鍙樻洿鍗$墖鐘舵��
+                this.SetRowOpenStatu(setStatu);
+                //妫�娴嬫槸鍚﹁幏鍙栫綉鍏冲弽棣堢殑缁撴灉,濡傛灉缃戝叧娌℃湁鍥炲,鍒欎細寮瑰嚭娑堟伅
+                this.StartCheckResponeResult(!setStatu);
+
+                if (setStatu == true)
+                {
+                    //鎵撳紑
+                    this.SetDeviceStatuText(Language.StringByID(R.MyInternationalizationString.uOpen1));
+                    (i_device as FreshAir).Open();
+                }
+                else
+                {
+                    //鍏抽棴
+                    this.SetDeviceStatuText(Language.StringByID(R.MyInternationalizationString.Close));
+                    (i_device as FreshAir).Close();
+                }
+            };
+        }
+
+        #region 鈻� 娣卞害鍗$墖淇℃伅_______________________
+
+        /// <summary>
+        /// 娣诲姞璺宠浆娣卞害鍗$墖淇℃伅浜嬩欢
+        /// </summary>
+        private void AddDetailInfoEvent(CommonDevice i_device)
+        {
+            //娣卞害鍗$墖淇℃伅
+            this.frameTable.ButtonClickEvent += (sender, e) =>
+            {
+                //鏂伴绫诲瀷鐨勬繁搴﹀崱鐗囩晫闈�
+                var form = new MainPage.ControlForm.DeviceFreshAirDetailCardForm();
+                form.AddForm(i_device, HdlRoomLogic.Current.CurrentRoom, 965, 1374);
+                form.FormCloseEvent += this.CardDetailInfoBackEvent;
+            };
+        }
+
+        #endregion
+
+        #region 鈻� 妫�娴嬭澶囨墦寮�鐘舵�乢__________________
+
+        /// <summary>
+        /// 妫�娴嬭澶囨墦寮�鐘舵��
+        /// </summary>
+        /// <param name="i_device"></param>
+        /// <returns></returns>
+        public override bool CheckIsOpenStatu(CommonDevice i_device)
+        {
+            return ((FreshAir)i_device).currentFanStatus != 0;
+        }
+
+        #endregion
+
+        #region 鈻� 鍙戦�佽幏鍙栫姸鎬佸懡浠__________________
+
+        /// <summary>
+        /// 鍙戦�佽幏鍙栫姸鎬佸懡浠�
+        /// </summary>
+        public override void SendStatuComand()
+        {
+            //妫�娴嬭兘鍚﹀彂閫佽幏鍙栫姸鎬佸懡浠�
+            if (this.CheckCanSendStatuComand() == true)
+            {
+                Device.DeviceLogic.ReadDeviceAttributeLogic.Instance.SendFreshAirStatuComand(this.device);
+            }
+        }
+
+        #endregion
+    }
+}
diff --git a/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs b/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs
old mode 100755
new mode 100644
index 0515eab..746a189
--- a/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs
+++ b/ZigbeeApp/Shared/Phone/Device/DeviceLogic/ReadDeviceAttributeLogic.cs
@@ -17,7 +17,7 @@
         {
             get
             {
-                if(_instance == null)
+                if (_instance == null)
                 {
                     _instance = new ReadDeviceAttributeLogic();
                 }
@@ -27,6 +27,56 @@
 
         #endregion
 
+        #region 鈼� 鏂伴____________________________
+        /// <summary>
+        /// SendFreshAirStatuComand
+        /// </summary>
+        /// <param name="device">璁惧</param>
+        public void SendFreshAirStatuComand(CommonDevice device)
+        {
+            if (device == null)
+            {
+                return;
+            }
+            new System.Threading.Thread(() =>
+            {
+                SendFreshAirFanStatuComand(device);
+                System.Threading.Thread.Sleep(300);
+            })
+            { IsBackground = true }.Start();
+        }
+
+        /// <summary>
+        /// SendFanStatuComand
+        /// </summary>
+        /// <param name="device">璁惧</param>
+        private void SendFreshAirFanStatuComand(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}
+               }
+            };
+            var data = new Newtonsoft.Json.Linq.JObject { { "AttriBute", attriBute } };
+            jObject.Add("Data", data);
+            device.Gateway?.Send("GetDeviceStatus", jObject.ToString());
+        }
+
+        #endregion
+
         #region 鈼� 绌鸿皟____________________________
 
         /// <summary>
diff --git a/ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceAcDetailCardForm.cs b/ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceAcDetailCardForm.cs
old mode 100755
new mode 100644
index 9631854..a8c383d
--- a/ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceAcDetailCardForm.cs
+++ b/ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceAcDetailCardForm.cs
@@ -13,8 +13,7 @@
     /// </summary>
     public class DeviceAcDetailCardForm : DeviceDetailCardCommonForm
     {
-        #region 鈻� 鍙橀噺澹版槑___________________________
-
+        #region 鈻� 鍙橀噺澹版槑___________________________ 
         /// <summary>
         /// 鐣岄潰涓婂彲浠ユ搷浣滅殑鎺т欢
         /// </summary>
@@ -67,7 +66,7 @@
         public override void InitMiddleFrameAfter(FrameLayout frameWhiteBack)
         {
             //宸︽粦涓嶈兘
-            this.ScrollEnabled = false;
+            this.ScrollEnabled = true;
             this.deviceAc = (AC)this.device;
             //鍏堟竻绌�
             this.listControl = new List<ButtonBase>();
diff --git a/ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceFreshAirDetailCardForm.cs b/ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceFreshAirDetailCardForm.cs
new file mode 100644
index 0000000..32925fc
--- /dev/null
+++ b/ZigbeeApp/Shared/Phone/MainPage/ControlForm/DeviceFreshAirDetailCardForm.cs
@@ -0,0 +1,322 @@
+锘縰sing System;
+using System.Collections.Generic;
+using Shared.Common;
+using Shared.Phone.UserCenter;
+using ZigBee.Device;
+
+namespace Shared.Phone.MainPage.ControlForm
+{
+    /// <summary>
+    /// 鏂伴绫诲瀷鐨勬繁搴﹀崱鐗囩晫闈�
+    /// </summary>
+    public class DeviceFreshAirDetailCardForm : DeviceDetailCardCommonForm
+    {
+        #region 鈻� 鍙橀噺澹版槑___________________________ 
+        /// <summary>
+        /// 鐣岄潰涓婂彲浠ユ搷浣滅殑鎺т欢
+        /// </summary>
+        private List<ButtonBase> listControl = new List<ButtonBase>();
+        /// <summary>
+        /// 鎺т欢
+        /// </summary>
+        private FreshAir FreshAirDev = null;
+        /// <summary>
+        /// 鐘舵�佹帶浠�
+        /// </summary>
+        private NormalViewControl btnStatu = null;
+        /// <summary>
+        /// 褰撳墠鐨勬枃鏈�
+        /// </summary>
+        private string CurrentText = string.Empty;
+
+        /// <summary>
+        /// 璁惧鍚嶇О鎺т欢
+        /// </summary>
+        private NormalViewControl btnDeviceName = null;
+
+        #endregion
+
+
+        #region 鈻� 鍒濆鍖朹____________________________
+        public override void InitMiddleFrameAfter(FrameLayout frameWhiteBack)
+        {
+
+            //宸︽粦涓嶈兘
+            this.ScrollEnabled = true;
+            this.FreshAirDev = (FreshAir)this.device;
+            //鍏堟竻绌�
+            this.listControl = new List<ButtonBase>();
+            InitFreshAirControl(frameWhiteBack);
+            UpdateStatus();
+        }
+
+        /// <summary>
+        /// 鍒濆鍖栨柊椋庢帶浠�
+        /// </summary>
+        /// <param name="frameWhiteBack"></param>
+        private void InitFreshAirControl(FrameLayout frameWhiteBack)
+        {
+            //鏂伴鎺т欢鐨勫鍣�
+            var frameAcBack = new FrameLayout();
+            frameAcBack.Y = Application.GetRealHeight(262);
+            frameAcBack.Width = Application.GetMinRealAverage(444);
+            frameAcBack.Height = Application.GetMinRealAverage(444);
+            frameAcBack.Gravity = Gravity.CenterHorizontal;
+            frameAcBack.BackgroundImagePath = "FreshAir/FreshAirPic.png";
+            frameWhiteBack.AddChidren(frameAcBack);
+
+            // 鑷姩锛堢1涓紝listControl銆�0銆戯級
+            var btnAuto = new NormalViewControl(213, 63, true);
+            btnAuto.X = Application.GetRealWidth(275);
+            btnAuto.Y = Application.GetRealHeight(821);
+            btnAuto.TextID = R.MyInternationalizationString.Mode_Auto;
+            btnAuto.TextColor = ZigbeeColor.Current.XMGray3;
+            btnAuto.IsBold = false;
+            btnAuto.TextAlignment = TextAlignment.Center;
+            frameWhiteBack.AddChidren(btnAuto);
+            this.listControl.Add(btnAuto);
+            btnAuto.ButtonClickEvent += (sender, e) =>
+            {
+                if (!btnAuto.IsSelected)
+                {
+                    this.SetFanComand(5);
+                }
+            };
+
+            //鑷姩涓嬪垝绾匡紙绗�2涓紝listControl銆�1銆戯級
+            var btnAutoLine = new NormalViewControl(72, 12, true);
+            btnAutoLine.X = Application.GetRealWidth(346);
+            btnAutoLine.Y = Application.GetRealHeight(896);
+            btnAutoLine.BackgroundColor = ZigbeeColor.Current.XMOrange;
+            btnAutoLine.Visible = false;
+            frameWhiteBack.AddChidren(btnAutoLine);
+            this.listControl.Add(btnAutoLine);
+
+            //鎵嬪姩锛堢3涓紝listControl銆�2銆戯級
+            var btnManual = new NormalViewControl(213, 63, true);
+            btnManual.X = Application.GetRealWidth(488);
+            btnManual.Y = btnAuto.Y;
+            btnManual.TextID = R.MyInternationalizationString.Manual;
+            btnManual.TextColor = ZigbeeColor.Current.XMGray3;
+            btnManual.IsBold = false;
+            btnManual.TextAlignment = TextAlignment.Center;
+            frameWhiteBack.AddChidren(btnManual);
+            this.listControl.Add(btnManual);
+            btnManual.ButtonClickEvent += (sender, e) =>
+            {
+                if (!btnManual.IsSelected)
+                {
+                    this.SetFanComand(7);
+                }
+            };
+
+            //鎵嬪姩涓嬪垝绾匡紙绗�4涓紝listControl銆�3銆戯級
+            var btnManualLine = new NormalViewControl(72, 12, true);
+            btnManualLine.X = Application.GetRealWidth(560);
+            btnManualLine.BackgroundColor = ZigbeeColor.Current.XMOrange;
+            btnManualLine.Y = btnAutoLine.Y;
+            btnManualLine.Visible = false;
+            frameWhiteBack.AddChidren(btnManualLine);
+            this.listControl.Add(btnManualLine);
+
+            //楂橀锛堢5涓紝listControl銆�4銆戯級
+            var btnHighSpeed = new IconViewControl(81);
+            btnHighSpeed.X = Application.GetRealWidth(207);
+            btnHighSpeed.Y = Application.GetRealHeight(999);
+            btnHighSpeed.UnSelectedImagePath = "AC/Fan_Height.png";
+            btnHighSpeed.SelectedImagePath = "AC/Fan_HeightSelected.png";
+            frameWhiteBack.AddChidren(btnHighSpeed);
+            this.listControl.Add(btnHighSpeed);
+            btnHighSpeed.ButtonClickEvent += (sender, e) =>
+            {
+                if (!btnHighSpeed.IsSelected)
+                {
+                    this.SetFanComand(3);
+                }
+            };
+
+            //寮�鍏筹紙绗�6涓紝listControl銆�5銆戯級
+            var btnSwitch = new IconViewControl(81);
+            btnSwitch.X = Application.GetRealWidth(444);
+            btnSwitch.Y = btnHighSpeed.Y;
+            btnSwitch.UnSelectedImagePath = "AC/OpenOrClose.png";
+            btnSwitch.SelectedImagePath = "AC/OpenOrCloseSelected.png";
+            frameWhiteBack.AddChidren(btnSwitch);
+            this.listControl.Add(btnSwitch);
+            btnSwitch.ButtonClickEvent += (sender, e) =>
+            {
+                btnSwitch.IsSelected = !btnSwitch.IsSelected;
+                if (btnSwitch.IsSelected)
+                {
+                    this.SetFanComand(4);
+                }
+                else
+                {
+                    this.SetFanComand(0);
+                }
+            };
+
+            //浣庨锛堢7涓紝listControl銆�6銆戯級
+            var btnLowSpeed = new IconViewControl(81);
+            btnLowSpeed.X = Application.GetRealWidth(677);
+            btnLowSpeed.Y = btnHighSpeed.Y;
+            btnLowSpeed.UnSelectedImagePath = "AC/Fan_Low.png";
+            btnLowSpeed.SelectedImagePath = "AC/Fan_LowSelected.png";
+            frameWhiteBack.AddChidren(btnLowSpeed);
+            this.listControl.Add(btnLowSpeed);
+            btnLowSpeed.ButtonClickEvent += (sender, e) =>
+            {
+                if (!btnLowSpeed.IsSelected)
+                {
+                    this.SetFanComand(1);
+                }
+            };
+        }
+        #endregion 
+
+        #region 鈻� 鏄惁鑾峰彇缃戝叧鍙嶉鐨勭粨鏋淿____________
+
+        /// <summary>
+        /// 妫�娴嬬綉鍏崇殑鍙嶉缁撴灉(灞炴�т笂鎶ョ殑瀵硅薄锛歞evice.DeviceStatusReport)
+        /// </summary>
+        /// <param name="comandDiv">鍛戒护鍖哄垎</param>
+        /// <param name="report">涓婃姤鏁版嵁</param>
+        /// <returns></returns>
+        public override bool CheckResponeResultStatu(ReceiveComandDiv comandDiv, CommonDevice report)
+        {
+            if (comandDiv == ReceiveComandDiv.A璁惧灞炴�т笂鎶�)
+            {
+                if (report.DeviceStatusReport.CluterID == 514)
+                {
+                    var attriButeList = report.DeviceStatusReport.AttriBute;
+                    foreach (var attList in attriButeList)
+                    {
+                        if (attList.AttributeId == 0)
+                        {
+                            //椋庨��
+                            HdlThreadLogic.Current.RunMain(() =>
+                            {
+                                UpdateStatus();
+                            });
+
+                            //宸茬粡鎺ユ敹鍒扮綉鍏崇殑鍙嶉
+                            return true;
+                        }
+                    }
+                }
+            }
+            return false;
+        }
+        #endregion
+
+        #region 鈻� 璁剧疆鏂规硶 
+        /// <summary>
+        ///鍛戒护
+        ///0:Off
+        ///1:Low
+        ///3:High
+        ///4:On
+        ///5:Auto
+        /// 7:Manual
+        /// </summary> 
+        private void SetFanComand(int command)
+        {
+            //妫�娴嬫槸鍚﹁幏鍙栫綉鍏冲弽棣堢殑缁撴灉,濡傛灉缃戝叧娌℃湁鍥炲,鍒欎細寮瑰嚭娑堟伅
+            this.StartCheckResponeResult(this.listControl, (result) =>
+            {
+                //鎺ユ敹鍒扮綉鍏冲洖澶�
+                if (result == true)
+                {
+                }
+            });
+
+            switch (command)
+            {
+                case 0:
+                    FreshAirDev.Close();
+                    break;
+                case 1:
+                    FreshAirDev.SetLowSpeed();
+                    break;
+                case 3:
+                    FreshAirDev.SetHighSpeed();
+                    break;
+                case 4:
+                    FreshAirDev.Open();
+                    break;
+                case 5:
+                    FreshAirDev.SetAuto();
+                    break;
+                case 7:
+                    FreshAirDev.SetManual();
+                    break;
+            }
+        }
+        #endregion
+
+        #region 鈻� 鍒锋柊鐘舵�乢____________
+        /// <summary>
+        /// 鍒锋柊鐘舵��
+        /// </summary>
+        private void UpdateStatus()
+        {
+            //璁剧疆鐘舵�佹枃瀛�
+            if (FreshAirDev.currentFanStatus == 4)
+            {
+                //鎵撳紑
+                this.listControl[5].IsSelected = true;
+                //璁剧疆鐘舵�佹枃瀛� 
+                this.SetStatuText(Language.StringByID(R.MyInternationalizationString.uOpen1));
+            }
+            if (FreshAirDev.currentFanStatus == 0)
+            {
+                //鍏抽棴
+                this.listControl[0].TextColor = ZigbeeColor.Current.XMGray3;
+                this.listControl[0].IsBold = false;
+                this.listControl[1].Visible = false;
+                this.listControl[2].TextColor = ZigbeeColor.Current.XMGray3;
+                this.listControl[2].IsBold = false;
+                this.listControl[3].Visible = false;
+                this.listControl[4].IsSelected = false;
+                this.listControl[5].IsSelected = false;
+                this.listControl[6].IsSelected = false;
+                //璁剧疆鐘舵�佹枃瀛� 
+                this.SetStatuText(Language.StringByID(R.MyInternationalizationString.Close));
+                return;
+            }
+
+            //璁剧疆妯″紡
+            if (FreshAirDev.currentFanMode == 5)
+            {
+                this.listControl[0].TextColor = ZigbeeColor.Current.XMGray1;
+                this.listControl[0].IsBold = true;
+                this.listControl[1].Visible = true;
+                this.listControl[2].TextColor = ZigbeeColor.Current.XMGray3;
+                this.listControl[2].IsBold = false;
+                this.listControl[3].Visible = false;
+            }
+            else if (FreshAirDev.currentFanMode == 7)
+            {
+                this.listControl[0].TextColor = ZigbeeColor.Current.XMGray3;
+                this.listControl[0].IsBold = false;
+                this.listControl[1].Visible = false;
+                this.listControl[2].TextColor = ZigbeeColor.Current.XMGray1;
+                this.listControl[2].IsBold = true;
+                this.listControl[3].Visible = true;
+            }
+
+            //璁剧疆椋庨��
+            if (FreshAirDev.currentFanSpeed == 1)
+            {
+                this.listControl[4].IsSelected = false;
+                this.listControl[6].IsSelected = true;
+            }
+            else if (FreshAirDev.currentFanSpeed == 3)
+            {
+                this.listControl[4].IsSelected = true;
+                this.listControl[6].IsSelected = false;
+            }
+        }
+        #endregion
+    }
+}
diff --git a/ZigbeeApp/Shared/Phone/MainPage/DeviceDetailInfoForm.cs b/ZigbeeApp/Shared/Phone/MainPage/DeviceDetailInfoForm.cs
old mode 100755
new mode 100644
index 3f52cff..cf7e7a4
--- a/ZigbeeApp/Shared/Phone/MainPage/DeviceDetailInfoForm.cs
+++ b/ZigbeeApp/Shared/Phone/MainPage/DeviceDetailInfoForm.cs
@@ -360,6 +360,20 @@
                     };
                 }
             }
+
+            //濡傛灉鏄柊椋�
+            if (device.Type == DeviceType.FreshAir)
+            {
+                //鍔熻兘绫诲瀷
+                string caption = Language.StringByID(R.MyInternationalizationString.uFunctionType);
+                string strType = Language.StringByID(R.MyInternationalizationString.FreshAir);
+                var btnFunction = new FrameCaptionViewControl(caption, strType, listview.rowSpace / 2);
+                btnFunction.UseClickStatu = false;
+                listview.AddChidren(btnFunction);
+                btnFunction.InitControl();
+                //搴曠嚎
+                btnFunction.AddBottomLine();
+            }
         }
 
         /// <summary>
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceOtherLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceOtherLogic.cs
old mode 100755
new mode 100644
index 179faf5..89e7821
--- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceOtherLogic.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlDeviceOtherLogic.cs
@@ -154,6 +154,35 @@
                 }
                 return $"{(device as Rollershade).WcdCurrentPositionLiftPercentage}%";
             }
+            else if (device.Type == DeviceType.FreshAir)
+            {
+                //鍦ㄧ綉鍏虫病鏈夊洖澶嶄箣鍓�,榛樿绂荤嚎
+                if (device.HadReadDeviceStatu == false)
+                {
+                    return Language.StringByID(R.MyInternationalizationString.uOffLine);
+                }
+
+                //妯″紡
+                string wind = string.Empty;
+                var freshAir = device as FreshAir;
+                if (freshAir.currentFanStatus == 0)
+                {
+                    return Language.StringByID(R.MyInternationalizationString.Close);
+                }
+                if (freshAir.currentFanSpeed == 1)
+                {
+                    wind = Language.StringByID(R.MyInternationalizationString.Fan_Low);
+                }
+                else if (freshAir.currentFanSpeed == 2)
+                {
+                    wind = Language.StringByID(R.MyInternationalizationString.Fan_Middle);
+                }
+                else if (freshAir.currentFanSpeed == 3)
+                {
+                    wind = Language.StringByID(R.MyInternationalizationString.Fan_Height);
+                }
+                return $"{wind}";
+            }
             else if (device.Type == DeviceType.Thermostat)
             {
                 //鍦ㄧ綉鍏虫病鏈夊洖澶嶄箣鍓�,榛樿绂荤嚎
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs
old mode 100755
new mode 100644
index 3d4e330..5c00a59
--- a/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Logic/HdlGatewayReceiveLogic.cs
@@ -274,7 +274,7 @@
                 }
                 #endregion
 
-                #region 鈻� 绌鸿皟鏁版嵁
+                #region 鈻� 绌鸿皟鍜屾柊椋庢暟鎹�
                 //绌鸿皟鏁版嵁
                 else if (report.DeviceStatusReport.CluterID == 513)
                 {
@@ -339,40 +339,70 @@
                 }
                 //绌鸿皟鏁版嵁
                 else if (report.DeviceStatusReport.CluterID == 514)
-                {
+                {
                     locadevice.DeviceStatusReport = report.DeviceStatusReport;
                     foreach (var attData in report.DeviceStatusReport.AttriBute)
-                    {
-                        if (attData.AttributeId == 0)
-                        {
-                            //椋庢墖妯″紡
-                            ((AC)locadevice).currentFanMode = attData.AttriButeData;
-                            //宸茬粡鎺ユ敹鍒扮姸鎬�
-                            locadevice.HadReadDeviceStatu = true;
-                        }
-                        else if (attData.AttributeId == 4096)
-                        {
-                            //椋庢墖鎵
-                            ((AC)locadevice).currentFanSwingMode = attData.AttriButeData;
-                            //宸茬粡鎺ユ敹鍒扮姸鎬�
-                            locadevice.HadReadDeviceStatu = true;
-                        }
-                        else if (attData.AttributeId == 4097)
-                        {
-                            //杞崲涓轰簩杩涘埗
-                            var value = Convert.ToString(attData.AttriButeData, 2).PadLeft(16, '0');
-                            //杩欎釜璁剧疆鏄斁鍦ㄥ悗闈㈢殑
-                            value = value.Substring(value.Length - 1, 1);
-                            //鍚敤鎽嗛鍔熻兘
-                            ((AC)locadevice).UseSwingFunction = value == "1";
-                            locadevice.ReSave();
-                        }
+                    {
+                        //鍖哄垎鏄┖璋冭繕鏄柊椋�
+                        var device = Shared.Common.LocalDevice.Current.GetDevice(report.DeviceAddr, report.DeviceEpoint);
+
+                        if (device.Type == DeviceType.FreshAir)
+                        {
+                            if (attData.AttributeId == 0)
+                            {
+                                switch (attData.AttriButeData)
+                                {
+                                    case 0:
+                                    case 4:
+                                        ((FreshAir)locadevice).currentFanStatus = attData.AttriButeData;
+                                        break;
+                                    case 1:
+                                    case 2:
+                                    case 3:
+                                        ((FreshAir)locadevice).currentFanSpeed = attData.AttriButeData;
+                                        break;
+                                    case 5:
+                                    case 7:
+                                        ((FreshAir)locadevice).currentFanMode = attData.AttriButeData;
+                                        break;
+                                }
+                                //宸茬粡鎺ユ敹鍒扮姸鎬�
+                                locadevice.HadReadDeviceStatu = true;
+                            }
+                        }
+                        else
+                        {
+                            if (attData.AttributeId == 0)
+                            {
+                                //椋庢墖妯″紡
+                                ((AC)locadevice).currentFanMode = attData.AttriButeData;
+                                //宸茬粡鎺ユ敹鍒扮姸鎬�
+                                locadevice.HadReadDeviceStatu = true;
+                            }
+                            else if (attData.AttributeId == 4096)
+                            {
+                                //椋庢墖鎵
+                                ((AC)locadevice).currentFanSwingMode = attData.AttriButeData;
+                                //宸茬粡鎺ユ敹鍒扮姸鎬�
+                                locadevice.HadReadDeviceStatu = true;
+                            }
+                            else if (attData.AttributeId == 4097)
+                            {
+                                //杞崲涓轰簩杩涘埗
+                                var value = Convert.ToString(attData.AttriButeData, 2).PadLeft(16, '0');
+                                //杩欎釜璁剧疆鏄斁鍦ㄥ悗闈㈢殑
+                                value = value.Substring(value.Length - 1, 1);
+                                //鍚敤鎽嗛鍔熻兘
+                                ((AC)locadevice).UseSwingFunction = value == "1";
+                                locadevice.ReSave();
+                            }
+                        }
                     }
-                }
+                }
                 #endregion
-
+
                 #region 鈻� 浜害鏁版嵁
-                //浜害鏁版嵁
+                //浜害鏁版嵁
                 else if (report.DeviceStatusReport.CluterID == 8)
                 {
                     locadevice.DeviceStatusReport = report.DeviceStatusReport;
@@ -512,7 +542,21 @@
                     //甯稿紑妯″紡寮�鍚�
                     if (info.AlarmCode == 216)
                     {
-                        DoorLock.DoorLockCommonInfo.NomallyOpenModeInvalidDialog((ZigBee.Device.DoorLock)device, DoorLock.DoorLockCommonInfo.DoorLockMessType.ServicePush, null);
+                        //娓╁眳鍩庣殑瑕佺綉鍏充腑鏄惁鏈夐�昏緫瀛樺湪 
+                        Application.RunOnMainThread(async () =>
+                        {
+                            var resTemp = await Shared.Phone.Device.Logic.SkipView.Exist();
+                            if (resTemp == 1)
+                            {
+                                DoorLock.DoorLockCommonInfo.NomallyOpenModeInvalidDialog((ZigBee.Device.DoorLock)device, DoorLock.DoorLockCommonInfo.DoorLockMessType.ServicePush, true, null);
+                            }
+                            else if (resTemp == 0)
+                            {
+                                DoorLock.DoorLockCommonInfo.NomallyOpenModeInvalidDialog((ZigBee.Device.DoorLock)device, DoorLock.DoorLockCommonInfo.DoorLockMessType.ServicePush, false, null);
+                            }
+
+
+                        });
                     }
                 }
             }
@@ -528,7 +572,7 @@
         /// 璁惧鍦ㄧ嚎鐘舵�佹洿鏂板弽棣�
         /// </summary>
         /// <param name="receiveData"></param>
-        private void DeviceOnlineChangePush (JObject receiveData)
+        private void DeviceOnlineChangePush(JObject receiveData)
         {
             if (this.dicDeviceEvent.Count == 0)
             {
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs b/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs
old mode 100755
new mode 100644
index b38dd82..ea3f30e
--- a/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceFunctionSettionForm.cs
@@ -87,12 +87,12 @@
 
             //鍒濆鍖栨甯�
             this.tableContr = new InformationEditorControl();
-            this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uDeviceEditor), 1128);
-
-            //鍒濆鍖栬澶囧洖璺浘鏍�
-            this.InitDeviceEpointIcon(listBackControl);
-
-            //淇濆瓨
+            this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uDeviceEditor), 1128);
+
+            //鍒濆鍖栬澶囧洖璺浘鏍�
+            this.InitDeviceEpointIcon(listBackControl);
+
+            //淇濆瓨
             var btnFinish = new BottomClickButton();
             btnFinish.TextID = R.MyInternationalizationString.uSave;
             bodyFrameLayout.AddChidren(btnFinish);
@@ -316,8 +316,8 @@
                 {
                     strType = Language.StringByID(R.MyInternationalizationString.uSocket1);
                     nowSelectNo = 2;
-                }
-
+                }
+
                 var btnFunction = new FrameCaptionViewControl(caption, strType, listview.rowSpace / 2);
                 btnFunction.UseClickStatu = false;
                 listview.AddChidren(btnFunction);
@@ -377,6 +377,20 @@
                     };
                 }
             }
+
+            //濡傛灉鏄柊椋�
+            if (nowSelectDevice.Type == DeviceType.FreshAir)
+            {
+                //鍔熻兘绫诲瀷
+                string caption = Language.StringByID(R.MyInternationalizationString.uFunctionType);
+                string strType = Language.StringByID(R.MyInternationalizationString.FreshAir);
+                var btnFunction = new FrameCaptionViewControl(caption, strType, listview.rowSpace / 2);
+                btnFunction.UseClickStatu = false;
+                listview.AddChidren(btnFunction);
+                btnFunction.InitControl();
+                //搴曠嚎
+                btnFunction.AddBottomLine();
+            }
         }
 
         #endregion
@@ -414,7 +428,7 @@
             else
             {
                 //涓嶉渶瑕佹粦鍔ㄦ帶浠�
-                frameBorder.AddChidren(frameBack);
+                frameBorder.AddChidren(frameBack);
             }
 
             int index = 0;
@@ -429,7 +443,17 @@
 
                 if (listIcon.Count == 1)
                 {
-                    frame.Gravity = Gravity.CenterVertical;
+                    frame.Gravity = Gravity.CenterVertical;
+
+                    //濡傛灉鏄柊椋�
+                    if (deviceObj.Type == DeviceType.FreshAir)
+                    {
+                        frame.RemoveFromParent();
+                        frameBack.BackgroundImagePath = "FreshAir/FreshAirRealDevicePic.png";
+                        frameBack.Width = Application.GetMinRealAverage(878);
+                        frameBack.Height = Application.GetMinRealAverage(354);
+                        frameBack.Gravity = Gravity.Center;
+                    }
                 }
                 else
                 {
@@ -442,15 +466,15 @@
                 //璁$畻鐪熷疄楂樺害
                 int realHeight = this.GetPictrueRealSize(58 + 58);//涓婁笅闂磋窛
                 realHeight += frameBack.ChildrenCount * this.GetPictrueRealSize(124);//鍦嗗湀楂樺害
-                realHeight += (frameBack.ChildrenCount-1) * this.GetPictrueRealSize(60);//鍦嗗湀闂磋窛
+                realHeight += (frameBack.ChildrenCount - 1) * this.GetPictrueRealSize(60);//鍦嗗湀闂磋窛
                 if (realHeight > frameBack.Height)
                 {
                     //鍙樻洿楂樺害
                     frameBack.Height = realHeight;
                 }
             }
-        }
-
+        }
+
         /// <summary>
         /// 鍒濆鍖栦竴琛岃澶囧浘鏍�
         /// </summary>
@@ -491,6 +515,8 @@
                 //鍒濆鍖栬彍鍗曡
                 this.DeviceEpointSelectEvent(btnTemp, null);
             }
+
+
         }
 
         /// <summary>
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs b/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs
index be8c916..4281bcb 100644
--- a/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/Device/DeviceMacInfoEditorForm.cs
@@ -582,8 +582,8 @@
         private void AddDryContactSettionRow()
         {
             if (this.listDeviceType.Contains(DeviceType.OnOffSwitch) == false)
-            {
-                //蹇呴』鏈変竴璺洖璺槸OnOffSwitch鎵嶈,闈㈡澘鐨勫共鎺ョ偣鐨勮瘽锛屼娇鐢ㄧ殑鏄埆鐨勮彍鍗�
+            {
+                //蹇呴』鏈変竴璺洖璺槸OnOffSwitch鎵嶈,闈㈡澘鐨勫共鎺ョ偣鐨勮瘽锛屼娇鐢ㄧ殑鏄埆鐨勮彍鍗�
                 return;
             }
             if (deviceEnumInfo.IsHdlDevice == true && deviceEnumInfo.BeloneType == DeviceBeloneType.A鎸夐敭闈㈡澘)
@@ -679,8 +679,12 @@
         {
             //鍙湁鍥炶矾鏁板ぇ浜�1鎵嶈兘鏈夎繖涓彍鍗�
             if (Common.LocalDevice.Current.GetDevicesCountByMac(listNewDevice[0].DeviceAddr) == 1)
-            {
-                return;
+            {
+                //瑕佹眰鏂伴灏忔ā鍧楃殑鏂伴鏈夊姛鑳借缃�
+                if (deviceEnumInfo.ConcreteType != DeviceConcreteType.Relay_FangyueFreshAirModul)
+                {
+                    return;
+                }
             }
             if (deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueEnvironment
                 || deviceEnumInfo.ConcreteType == DeviceConcreteType.ButtonPanel_FangyueFreshAir)
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLighWithSensorForm.cs b/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLighWithSensorForm.cs
index c02ee5a..e9b7b89 100644
--- a/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLighWithSensorForm.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelBackLighWithSensorForm.cs
@@ -576,7 +576,7 @@
 
             //鑺傝兘妯″紡淇敼(浠栦滑璇撮殢渚夸竴涓洖璺氨琛�)
             //鑲栧織璞粰鎸夐敭鎺у埗闈㈡澘锛堝洓寮�鍏帶锛夎澶囷紝璇撮粯璁�15绉掓椂闂达紝杩欐牱鎺ヨ繎鎰熷簲鍔熻兘鎵嶅悎鐞�
-            energyModeInfo.time = 15;
+            energyModeInfo.time = 4094;
             result = await HdlDevicePanelLogic.Current.SetDeviceEnergyConservationMode(panelDevice, energyModeInfo.enable, energyModeInfo.time, energyModeInfo.level);
             if (result == false)
             {
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirBackLightSettionForm.cs b/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirBackLightSettionForm.cs
index 572a224..759549a 100644
--- a/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirBackLightSettionForm.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirBackLightSettionForm.cs
@@ -584,7 +584,7 @@
 
             //鑺傝兘妯″紡淇敼(浠栦滑璇撮殢渚夸竴涓洖璺氨琛�)
             //璁惧鍚屼簨璇存柊椋庨潰鏉块粯璁�60绉掓椂闂达紝杩欐牱鎺ヨ繎鎰熷簲鍔熻兘鎵嶅悎鐞�
-            energyModeInfo.time = 60;
+            energyModeInfo.time = 65534;
             var result = await HdlDevicePanelLogic.Current.SetDeviceEnergyConservationMode(panelDevice, energyModeInfo.enable, energyModeInfo.time, energyModeInfo.level);
             if (result == false)
             {
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirButtonSettionForm.cs b/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirButtonSettionForm.cs
index fd741ba..68aa327 100644
--- a/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirButtonSettionForm.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/Device/Panel/PanelFangyueFreshAirButtonSettionForm.cs
@@ -233,16 +233,15 @@
                     curControlDev.bindList.Add(bDev);
                     var device = Common.LocalDevice.Current.GetDevice(bDev.BindMacAddr, bDev.BindEpoint);
 
-                    //鑾峰彇璁惧绫诲瀷鐨�
-                    var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { device });
-                    //鏂伴闈㈡澘鐨勬柊椋庤澶囷紝鍒欎笉鏄剧ず
-                    if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_FangyueFreshAir)
-                    {
-                        continue;
-                    }
-
                     if (device.Type == DeviceType.FreshAir)
                     {
+                        //鑾峰彇璁惧绫诲瀷鐨�
+                        var deviceEnumInfo = Common.LocalDevice.Current.GetMyDeviceEnumInfo(new List<CommonDevice>() { device });
+                        //鏂伴闈㈡澘鐨勬柊椋庤澶囷紝鍒欎笉鏄剧ず
+                        if (deviceEnumInfo.ConcreteType == Common.DeviceConcreteType.ButtonPanel_FangyueFreshAir)
+                        {
+                            continue;
+                        }
                         bindFreshAirName = device.DeviceEpointName;
                     }
                     if (device.Type == DeviceType.TemperatureSensor)
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs
index ac89816..bb30fa1 100644
--- a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonInfo.cs
@@ -74,8 +74,28 @@
         /// 澶辨晥鏁堟棩鏈熲�滅鈥�
         /// </summary>
         public static int InValidDateSecond = 0;
+
+        /// <summary>
+        /// 闂ㄩ攣鎿嶄綔绫诲瀷
+        /// </summary>
+        public enum DoorLockMessType
+        {
+            /// <summary>
+            /// app鎿嶄綔
+            /// </summary>
+            AppOperate = 0,
+            /// <summary>
+            /// 閫氳繃闂ㄩ攣鎿嶄綔璁惧涓婃姤
+            /// </summary>
+            DeviceReport = 1,
+            /// <summary>
+            /// 閫氳繃鏈嶅姟鍣ㄦ帹閫�
+            /// </summary>
+            ServicePush = 2,
+        }
         #endregion
 
+        #region 甯稿紑妯″紡 API
         /// <summary>
         /// 鑾峰彇褰撳墠闂ㄩ攣鐨勫父寮�妯″紡 
         /// </summary>
@@ -122,6 +142,343 @@
         }
 
         /// <summary>
+        /// 璁剧疆鏈湴闂ㄩ攣鐨勫父寮�妯″紡鍊�
+        /// </summary>
+        public static void NormallyOpenModeValue(ZigBee.Device.DoorLock doorLock, bool value)
+        {
+            string key = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
+            if (doorLock.IsDoorLockNormallyMode.ContainsKey(key))
+            {
+                doorLock.IsDoorLockNormallyMode[key] = value;
+            }
+            else
+            {
+                doorLock.IsDoorLockNormallyMode.Add(key, value);
+            }
+        }
+
+        /// <summary>
+        /// 甯稿紑妯″紡澶辨晥澶勭悊銆愬脊绐椼��
+        /// </summary>
+        /// <param name="doorLock">褰撳墠闂ㄩ攣</param>
+        /// <param name="doorLockMessType">瀵艰嚧闂ㄩ攣澶辨晥鐨勬搷浣滅被鍨�</param>
+        /// <param name="haveLogic">缃戝叧涓槸鍚﹀瓨鍦ㄩ�昏緫甯稿紑妯″紡</param>
+        /// <param name="action">鍥炶皟澶勭悊鏇存柊鍐呭</param>
+        public static async void NomallyOpenModeInvalidDialog(ZigBee.Device.DoorLock doorLock, DoorLockMessType doorLockMessType, bool haveLogic, Action action = null)
+        {
+            //甯稿紑妯″紡鍙兘涓讳汉鎿嶄綔
+            if (UserCenterResourse.UserInfo.AuthorityNo != 1)
+            {
+                Application.RunOnMainThread(() =>
+                {
+                    string msg0 = Language.StringByID(R.MyInternationalizationString.OnlyMasterOperate);
+                    ShowTipMsg(msg0);
+                });
+                return;
+            }
+
+            //甯稿紑妯″紡灏嗚鍙栨秷寮圭獥
+            string msg = Language.StringByID(R.MyInternationalizationString.NomallyModeIsCanceled).Replace("{0}", "\r\n");
+            var confirm = Language.StringByID(R.MyInternationalizationString.SureCancel);
+            var alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.NomallyOpenMode, msg, confirm);
+
+            if (haveLogic)
+            {
+                //鏈夐�昏緫璁剧疆鐨勫脊绐�
+                alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.CancelNomallyOpenModeWithLogic, msg, confirm);
+            }
+            alert.Show();
+
+            alert.MsgControlClickEvent += async () =>
+            {
+                if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
+                {
+                    //涓婃姤鈥滃父寮�妯″紡鈥濆凡琚彇娑堬紝app榛樿浜嗏�滃父寮�妯″紡鈥濊鍙栨秷 
+                    DoorLockCommonInfo.NormallyOpenModeValue(doorLock, false);
+                }
+                else
+                {
+                    //淇濇寔甯稿紑
+                    NormallyOpenModeValue(doorLock, true);
+                }
+                action?.Invoke();
+            };
+
+            alert.CancelClickEvent += async () =>
+            {
+                if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
+                {
+                    //涓婃姤鈥滃父寮�妯″紡鈥濆凡琚彇娑�
+                    Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); });
+                    //鍏堝垹闄ゅ凡澶辨晥鐨勨�滃父寮�妯″紡鈥濈殑閫昏緫 
+                    //if (resTemp == 1)
+                    //{
+                    //    var restulTemp = await Shared.Phone.Device.Logic.SkipView.Exist(3);
+                    //    //if (restulTemp == 3)
+                    //    //{
+                    //    //    string msg0 = Language.StringByID(R.MyInternationalizationString.CancelLogicNormallyModeFailed2);
+                    //    //    this.ShowTipMsg(msg0);
+                    //    //    return;
+                    //    //}
+                    //}
+
+                    //app閲嶆柊寮�鍚�滃父寮�妯″紡鈥�
+                    var result = await doorLock.SetNormallyOpenModeFuncAsync(true);
+                    if (result == null || result.defaultControlResponseData == null)
+                    {
+                        Application.RunOnMainThread(() =>
+                        {
+                            string msg0 = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime);
+                            ShowTipMsg(msg0);
+                            NormallyOpenModeValue(doorLock, false);
+                            CommonPage.Loading.Hide();
+                            //new Tip() { MaxWidth = 150, Text = msg0, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
+                        });
+                        action?.Invoke();
+                        return;
+                    }
+                    if (result.defaultControlResponseData.status != 0)
+                    {
+                        Application.RunOnMainThread(() =>
+                        {
+                            string msg1 = Language.StringByID(R.MyInternationalizationString.OpenNormallyOpenModeFailed);
+                            ShowTipMsg(msg1);
+                            NormallyOpenModeValue(doorLock, false);
+                            CommonPage.Loading.Hide();
+                            //new Tip() { MaxWidth = 150, Text = msg1, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
+                        });
+                        action?.Invoke();
+                        return;
+                    }
+                    else
+                    {
+                        //鍒涘缓甯稿紑妯″紡鐨勭壒娈婇�昏緫 
+                        var resu = await Shared.Phone.Device.Logic.SkipView.LockAddModifyLogic(DoorLockCommonInfo.NormallyOpenModeInvalidTime, doorLock);
+                        Application.RunOnMainThread(() =>
+                        {
+                            string msg0 = Language.StringByID(R.MyInternationalizationString.OpenNormallyOpenModeSuccess);
+                            ShowTipMsg(msg0);
+                            NormallyOpenModeValue(doorLock, true);
+                            CommonPage.Loading.Hide();
+                            //new Tip() { MaxWidth = 150, Text = msg0, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
+                        });
+                    }
+                }
+                else
+                {
+                    //app鎿嶄綔涓嶅彇娑堚�滃父寮�妯″紡鈥� 
+                    DoorLockCommonInfo.NormallyOpenModeValue(doorLock, true);
+                }
+                action?.Invoke();
+            };
+
+            alert.ConfirmClickEvent += async () =>
+            {
+                if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
+                {
+                    NormallyOpenModeValue(doorLock, false);
+                    if (haveLogic)
+                    {
+                        var resTemp2 = await Shared.Phone.Device.Logic.SkipView.Exist(3);
+                        //if (resTemp2 == 3)
+                        //{
+                        //    string msg0 = Language.StringByID(R.MyInternationalizationString.CancelLogicNormallyModeFailed);
+                        //    this.ShowTipMsg(msg0);
+                        //}
+                    }
+                }
+                else
+                {
+                    //app鎿嶄綔鍙栨秷鈥滃父寮�妯″紡鈥�
+                    Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); });
+                    var result = await doorLock.SetNormallyOpenModeFuncAsync(false);
+                    if (result == null || result.defaultControlResponseData == null)
+                    {
+                        Application.RunOnMainThread(() =>
+                        {
+                            ShowTipMsg(Language.StringByID(R.MyInternationalizationString.GwResponseOvertime));
+                            CommonPage.Loading.Hide();
+                            //new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
+                        });
+                        action?.Invoke();
+                        return;
+                    }
+                    if (result.defaultControlResponseData.status != 0)
+                    {
+                        Application.RunOnMainThread(() =>
+                        {
+                            string msg1 = Language.StringByID(R.MyInternationalizationString.CloseNormallyOpenModeFailed);
+                            ShowTipMsg(msg1);
+                            CommonPage.Loading.Hide();
+                            //new Tip() { MaxWidth = 150, Text = msg1, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
+                        });
+                        action?.Invoke();
+                        return;
+                    }
+                    else
+                    {
+                        //娣诲姞App寮�鍚父寮�妯″紡鐨勫巻鍙茶褰�
+                        HdlDeviceDoorLockLogic.Current.AddDoorHistoryLog(doorLock, 9002, string.Empty);
+                        //app纭鍙栨秷鈥滃父寮�妯″紡鈥濇垚鍔� 
+                        NormallyOpenModeValue(doorLock, false);
+                        //鍒犻櫎璁剧疆甯稿紑妯″紡鍒涘缓鐨勯�昏緫
+                        if (haveLogic)
+                        {
+                            var resTemp1 = await Shared.Phone.Device.Logic.SkipView.Exist(3);
+                            //鍥犱负鐩墠鏈哄埗闂锛岄�昏緫缁忓父澶辫触锛屾墍浠ヤ笉鎻愮ず锛屽悗鏈熸満鍒惰鏀癸紝閲嶆柊鍋氫竴涓繖涓晫闈�
+                            //if (resTemp1 == 3)
+                            //{ 
+                            //Application.RunOnMainThread(() =>
+                            //{
+                            //        string msg0 = Language.StringByID(R.MyInternationalizationString.CancelLogicNormallyModeFailed);
+                            //        ShowTipMsg(msg0);
+                            //}); 
+                            //}
+                            //else if (resTemp1 == 2)
+                            //{
+                            //Application.RunOnMainThread(() =>
+                            //{
+                            //    string msg0 = Language.StringByID(R.MyInternationalizationString.CloseNormallyOpenModeSuccess);
+                            //    ShowTipMsg(msg0);
+                            //}); 
+                        }
+                        Application.RunOnMainThread(() =>
+                        {
+                            string msg2 = Language.StringByID(R.MyInternationalizationString.CloseNormallyOpenModeSuccess);
+                            ShowTipMsg(msg2);
+                            CommonPage.Loading.Hide();
+                        });
+                    }
+                }
+                action?.Invoke();
+            };
+        }
+
+        /// <summary>
+        /// 鍒犻櫎甯稿紑妯″紡
+        /// </summary>
+        /// <param name="doorLock">褰撳墠闂ㄩ攣</param>
+        /// <param name="action">鍥炶皟澶勭悊鏇存柊鍐呭</param>
+        /// <returns></returns>
+        public static async System.Threading.Tasks.Task<bool> DelNormallyOpenMode(ZigBee.Device.DoorLock doorLock, Action action = null)
+        {
+            //app鎿嶄綔鍙栨秷鈥滃父寮�妯″紡鈥� 
+            var result = await doorLock.SetNormallyOpenModeFuncAsync(false);
+            if (result == null || result.defaultControlResponseData == null || result.defaultControlResponseData.status != 0)
+            {
+                action?.Invoke();
+                return false;
+            }
+
+            if (result.defaultControlResponseData.status == 0)
+            {
+                //app纭鍙栨秷鈥滃父寮�妯″紡鈥濇垚鍔� 
+                NormallyOpenModeValue(doorLock, false);
+                action?.Invoke();
+                return true;
+            }
+            return false;
+        }
+
+        /// <summary>
+        /// 鍚姩甯稿紑妯″紡銆愬脊绐椼��
+        /// </summary>
+        /// <param name="doorLock">褰撳墠闂ㄩ攣</param>
+        /// <param name="action">鍥炶皟澶勭悊鏇存柊鍐呭</param>
+        public static async void NomallyOpenModeStartDialog(ZigBee.Device.DoorLock doorLock, Action action)
+        {
+            //甯稿紑妯″紡鍙兘涓讳汉鎿嶄綔ZigBee.Device.DoorLock doorLock
+            if (UserCenterResourse.UserInfo.AuthorityNo != 1)
+            {
+                Application.RunOnMainThread(() =>
+                {
+                    string msg0 = Language.StringByID(R.MyInternationalizationString.OnlyMasterOperate);
+                    ShowTipMsg(msg0);
+                });
+                return;
+            }
+
+            //璁剧疆甯稿紑妯″紡鍚庯紝鎮ㄧ殑闂ㄩ攣灏嗗缁堝浜庢墦寮�鐘舵�侊紝纭寮�鍚紵 
+            string msg = Language.StringByID(R.MyInternationalizationString.SetDoorLockNomallyOpen).Replace("{0}", "\r\n");
+            var confirm = Language.StringByID(R.MyInternationalizationString.Confrim);
+            var alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.Confirm, msg, confirm);
+            alert.Show();
+
+            alert.ConfirmClickEvent += async () =>
+            {
+                Application.RunOnMainThread(() => { CommonPage.Loading.Start(""); });
+                var result = await doorLock.SetNormallyOpenModeFuncAsync(true);
+                if (result == null || result.defaultControlResponseData == null)
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        string msg0 = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime);
+                        ShowTipMsg(msg0);
+                        CommonPage.Loading.Hide();
+                    });
+                    return;
+                }
+                if (result.defaultControlResponseData.status != 0)
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        string msg1 = Language.StringByID(R.MyInternationalizationString.OpenNormallyOpenModeFailed);
+                        ShowTipMsg(msg1);
+                        CommonPage.Loading.Hide();
+                    });
+                    return;
+                }
+                else
+                {
+                    //娣诲姞App寮�鍚父寮�妯″紡鐨勫巻鍙茶褰�
+                    HdlDeviceDoorLockLogic.Current.AddDoorHistoryLog(doorLock, 9001, string.Empty);
+                    DoorLockCommonInfo.NormallyOpenModeValue(doorLock, true);
+                    action?.Invoke();
+                    Application.RunOnMainThread(() =>
+                    {
+                        NomallyOpenModeInvalidTimeDialog(doorLock);
+                        CommonPage.Loading.Hide();
+                    });
+                }
+            };
+        }
+
+        /// <summary>
+        /// 甯稿紑妯″紡澶辨晥鏃堕棿澶勭悊銆愬脊绐椼��
+        /// </summary>
+        public static async void NomallyOpenModeInvalidTimeDialog(ZigBee.Device.DoorLock doorLock)
+        {
+            //澶辨晥璁剧疆 
+            string msgTimeInValidSetting = Language.StringByID(R.MyInternationalizationString.DoorLockOpenAllTheTime);
+            var timeConfrim = Language.StringByID(R.MyInternationalizationString.Confrim);
+            var alertTimeInValidSetting = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.InValid, msgTimeInValidSetting, timeConfrim);
+            alertTimeInValidSetting.Show();
+
+            alertTimeInValidSetting.InvalidTimeAction += async (obj) =>
+            {
+                //甯稿紑妯″紡澶辨晥鏃堕棿璁剧疆鎴愬姛
+                var temp = int.Parse(obj);
+                DoorLockCommonInfo.NormallyOpenModeInvalidTime = temp;
+                //榛樿鍒涘缓甯稿紑妯″紡鐨勭壒娈婇�昏緫 
+                var res = await Shared.Phone.Device.Logic.SkipView.LockAddModifyLogic(DoorLockCommonInfo.NormallyOpenModeInvalidTime, doorLock);
+                if (!res)
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        //榛樿鍒涘缓甯稿紑妯″紡澶辫触
+                        string msg0 = Language.StringByID(R.MyInternationalizationString.AddLogicNormallyModeFailed);
+                        var alert = new UserCenter.ShowMsgControl(UserCenter.ShowMsgType.Normal, msg0, Language.StringByID(R.MyInternationalizationString.confrim));
+                        alert.Show();
+                        //浜屾鍔犺浇寮圭獥 甯稿紑妯″紡寮�鍚彁绀�
+                        NomallyOpenModeInvalidTimeDialog(doorLock);
+                    });
+                }
+            };
+        }
+        #endregion
+
+        #region 闊抽噺
+        /// <summary>
         /// 闂ㄩ攣鏄惁鏀寔闊抽噺[杩欓噷鏆傛椂鍙湁S-One闂ㄩ攣鏀寔锛孒06C涓嶆敮鎸侊紝鍚庢湡閫氳繃鑳藉姏鍊兼敮鎸乚
         /// </summary>
         /// <param name="doorLock:褰撳墠闂ㄩ攣"></param> 
@@ -137,6 +494,8 @@
             }
             return false;
         }
+
+        #endregion
 
         #region 浠庝簯绔幏鍙栫殑鏂规硶 
         /// <summary>
@@ -856,7 +1215,7 @@
         /// 鏄剧ず閿欒淇℃伅绐楀彛
         /// </summary>
         /// <param name="msg"></param>
-        private void ShowErrorMsg(string msg)
+        private static void ShowErrorMsg(string msg)
         {
             Application.RunOnMainThread(() =>
             {
@@ -869,7 +1228,7 @@
         /// 鏄剧ずTip淇℃伅绐楀彛
         /// </summary>
         /// <param name="msg"></param>
-        private void ShowTipMsg(string msg)
+        private static void ShowTipMsg(string msg)
         {
             Application.RunOnMainThread(() =>
             {
@@ -880,148 +1239,5 @@
 
         #endregion
 
-        public enum DoorLockMessType
-        {
-            /// <summary>
-            /// app鎿嶄綔
-            /// </summary>
-            AppOperate = 0,
-            /// <summary>
-            /// 璁惧涓婃姤
-            /// </summary>
-            DeviceReport = 1,
-            /// <summary>
-            /// 鏈嶅姟鍣ㄦ帹閫�
-            /// </summary>
-            ServicePush = 2,
-        }
-
-        /// <summary>
-        /// 甯稿紑妯″紡澶辨晥澶勭悊
-        /// </summary>
-        public static async void NomallyOpenModeInvalidDialog(ZigBee.Device.DoorLock doorLock, DoorLockMessType doorLockMessType, Action action)
-        {
-            if (UserCenterResourse.UserInfo.AuthorityNo != 1)
-            {
-                return;
-            }
-            string msg = Language.StringByID(R.MyInternationalizationString.NomallyModeIsCanceled).Replace("{0}", "\r\n");
-            var confirm = Language.StringByID(R.MyInternationalizationString.SureCancel);
-            var alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.NomallyOpenMode, msg, confirm);
-            var resTemp = await Shared.Phone.Device.Logic.SkipView.Exist();
-
-            if (resTemp == 1)
-            {
-                //鏈夐�昏緫璁剧疆鐨勫脊绐�
-                alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.CancelNomallyOpenModeWithLogic, msg, confirm);
-            }
-            alert.Show();
-            alert.MsgControlClickEvent += async () =>
-            {
-                if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
-                {
-                    //鍙栨秷甯稿紑
-                    NormallyOpenModeValue(doorLock, false);
-                }
-                else
-                {
-                    //淇濇寔甯稿紑
-                    NormallyOpenModeValue(doorLock, true);
-                }
-                action?.Invoke();
-                action = null;
-            };
-            alert.CancelClickEvent += async () =>
-            {
-                if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
-                {
-                    var result = await doorLock.SetNormallyOpenModeFuncAsync(true);
-                    if (result == null || result.defaultControlResponseData == null)
-                    {
-                        string msg0 = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime);
-                        Application.RunOnMainThread(() =>
-                        {
-                            new Tip() { MaxWidth = 150, Text = msg0, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
-                        });
-                        NormallyOpenModeValue(doorLock, false);
-                        return;
-                    }
-                    if (result.defaultControlResponseData.status != 0)
-                    {
-                        string msg1 = Language.StringByID(R.MyInternationalizationString.OpenNormallyOpenModeFailed);
-                        Application.RunOnMainThread(() =>
-                        {
-                            new Tip() { MaxWidth = 150, Text = msg1, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
-                        });
-                        NormallyOpenModeValue(doorLock, false);
-                        return;
-                    }
-                    else
-                    {
-                        NormallyOpenModeValue(doorLock, true);
-                    }
-                }
-                else
-                {
-                    NormallyOpenModeValue(doorLock, true);
-                }
-                action?.Invoke();
-                action = null;
-            };
-            alert.ConfirmClickEvent += async () =>
-            {
-                if (doorLockMessType == DoorLockMessType.DeviceReport || doorLockMessType == DoorLockMessType.ServicePush)
-                {
-                    NormallyOpenModeValue(doorLock, false);
-                }
-                else
-                {
-                    var result = await doorLock.SetNormallyOpenModeFuncAsync(false);
-                    if (result == null || result.defaultControlResponseData == null)
-                    {
-                        Application.RunOnMainThread(() =>
-                        {
-                            new Tip() { MaxWidth = 150, Text = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime), Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
-                        });
-                        return;
-                    }
-                    if (result.defaultControlResponseData.status != 0)
-                    {
-                        string msg1 = Language.StringByID(R.MyInternationalizationString.CloseNormallyOpenModeFailed);
-                        Application.RunOnMainThread(() => { });
-
-                        new Tip() { MaxWidth = 150, Text = msg1, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
-                        return;
-                    }
-                    else
-                    {
-                        NormallyOpenModeValue(doorLock, false);
-                        string msg2 = Language.StringByID(R.MyInternationalizationString.CloseNormallyOpenModeSuccess);
-                        Application.RunOnMainThread(() =>
-                        {
-                            new Tip() { MaxWidth = 150, Text = msg2, Direction = AMPopTipDirection.None, CloseTime = 1 }.Show(CommonPage.Instance);
-                        });
-                    }
-                }
-                action?.Invoke();
-                action = null;
-            };
-        }
-
-        /// <summary>
-        /// 闂ㄩ攣甯稿紑妯″紡鍊�
-        /// </summary>
-        public static void NormallyOpenModeValue(ZigBee.Device.DoorLock doorLock, bool value)
-        {
-            string key = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint;
-            if (doorLock.IsDoorLockNormallyMode.ContainsKey(key))
-            {
-                doorLock.IsDoorLockNormallyMode[key] = value;
-            }
-            else
-            {
-                doorLock.IsDoorLockNormallyMode.Add(key, value);
-            }
-        }
     }
 }
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs
index 1721127..1c10f51 100644
--- a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/DoorLockCommonLayout.cs
@@ -386,7 +386,7 @@
         }
 
         /// <summary>
-        /// 鍘讳釜浜轰腑蹇冿紝寮�鍚繙绋嬪紑閿侀獙璇�
+        /// 鍘讳釜浜轰腑蹇冿紝寮�鍚郴缁熷瘑鐮佹敮鎸佸紑閿佹潈闄�
         /// </summary>
         public void SystemSecondAuthentication()
         {
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs
old mode 100755
new mode 100644
index de24e88..401a08a
--- a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/FunctionSetting.cs
@@ -74,10 +74,11 @@
             {
                 RemoveFromParent();
 
-                var userDoorLockPage = new UserDoorLockPage(currentRoom, deviceUI);
-                HomePage.Instance.AddChidren(userDoorLockPage);
-                HomePage.Instance.PageIndex += 1;
-                userDoorLockPage.Show();
+                //鏆傛椂涓嶈�冭檻涓嬬骇鐣岄潰绛夋帹閫佸鑷村父寮�妯″紡澶辨晥鐨勯棶棰�
+                //var userDoorLockPage = new UserDoorLockPage(currentRoom, deviceUI);
+                //HomePage.Instance.AddChidren(userDoorLockPage);
+                //HomePage.Instance.PageIndex += 1;
+                //userDoorLockPage.Show();
             };
             this.btnBack.MouseUpEventHandler += eHandlerBack;
             this.btnBackFrameLayout.MouseUpEventHandler += eHandlerBack;
@@ -186,7 +187,7 @@
             var listCheck = new List<string>();
             rowBeloneArea.SelectRoomEvent += (roomKeys) =>
             {
-                //閫夋嫨鏈垎閰嶆椂,娓呯┖
+                //閫夋嫨鏈垎閰嶆椂,娓呯┖
                 if (roomKeys == string.Empty) { listCheck = new List<string>(); }
                 foreach (var device in this.listNewDevice)
                 {
diff --git a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs
index 285699d..cc714f0 100644
--- a/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs
+++ b/ZigbeeApp/Shared/Phone/UserCenter/DoorLock/UserDoorLockPage.cs
@@ -47,7 +47,7 @@
         /// </summary>
         bool canVolume = false;
         /// <summary>
-        /// 淇濈暀涓婁竴娆¢煶閲�
+        /// 鏄惁鏀寔甯稿紑
         /// </summary>
         bool canOpenNormallyMode = false;
         /// <summary>
@@ -788,8 +788,9 @@
             //璁剧疆
             EventHandler<MouseEventArgs> btnFuncSetHander = (sender, e) =>
             {
-                //鎵撳紑鍏朵粬鐣岄潰鏃跺墠绉婚櫎
-                RemoveFromParent();
+                //鎵撳紑鍏朵粬鐣岄潰鏃跺墠绉婚櫎銆愭殏鏃朵笉绉婚櫎銆�
+                //RemoveFromParent();
+
                 var functionSetting = new Shared.Phone.UserCenter.DoorLock.FunctionSetting(currentRoom, doorLock);
                 Shared.Phone.UserView.HomePage.Instance.AddChidren(functionSetting);
                 Shared.Phone.UserView.HomePage.Instance.PageIndex += 1;
@@ -1040,6 +1041,35 @@
         /// </summary>
         private async void NomallyOpenDialog()
         {
+            #region 鍚庣画鐗堟湰
+            //if (UserCenterResourse.UserInfo.AuthorityNo != 1)
+            //{
+            //    this.ShowMassage(ShowMsgType.Tip, Language.StringByID(R.MyInternationalizationString.OnlyMasterOperate));
+            //    return;
+            //}
+
+            //if (!UserCenterResourse.AccountOption.DoorUnLockByRemote)
+            //{
+            //    SystemSecondAuthentication();
+            //    return;
+            //}
+
+            //action = () =>
+            //{
+            //    //绯荤粺瀵嗙爜鏀寔鎿嶄綔闂ㄩ攣鍚庯紝璋冪敤娓╁眳鍩庣殑鐣岄潰銆愬父寮�鑷姩鍖栥��
+            //    var functionSetting = new Shared.Phone.UserCenter.DoorLock.FunctionSetting(currentRoom, doorLock);
+            //    Shared.Phone.UserView.HomePage.Instance.AddChidren(functionSetting);
+            //    Shared.Phone.UserView.HomePage.Instance.PageIndex += 1;
+            //    functionSetting.Show();
+            //    functionSetting.aaaAction = () =>
+            //   {
+            //       UpdateNomallyOpenStatus();
+            //   };
+            //};
+            //HdlCheckLogic.Current.CheckSecondarySecurity(action);
+            #endregion 
+
+            #region 鏆傛椂鐗堟湰 (鏈�缁堝幓鎺夛級
             if (!btnNormallyOpen.IsSelected)
             {
                 if (UserCenterResourse.UserInfo.AuthorityNo != 1)
@@ -1056,6 +1086,12 @@
 
                 action = () =>
                 {
+                    //绯荤粺瀵嗙爜鏀寔鎿嶄綔闂ㄩ攣鍚庯紝璋冪敤闂俯灞呭煄鐨勭晫闈€�愬父寮�鑷姩鍖栥��
+                    //Action nomallyOpenModeStartAction = () =>
+                    //{
+                    //    UpdateNomallyOpenStatus();
+                    //};
+
                     string msg = Language.StringByID(R.MyInternationalizationString.SetDoorLockNomallyOpen).Replace("{0}", "\r\n");
                     var confirm = Language.StringByID(R.MyInternationalizationString.Confrim);
                     var alert = new ShowDoorLockMsgControl(ShowDoorLockMsgControl.DoorLockMsgType.Confirm, msg, confirm);
@@ -1095,6 +1131,7 @@
                             AlreadyOpenNormallyMode();
                         }
                     };
+
                 };
                 HdlCheckLogic.Current.CheckSecondarySecurity(action);
             }
@@ -1102,6 +1139,8 @@
             {
                 NomallyOpenModeInvalidDialog();
             }
+
+            #endregion
         }
 
         /// <summary>
@@ -1177,11 +1216,11 @@
                     var result = await doorLock.SetNormallyOpenModeFuncAsync(true);
                     if (result == null || result.defaultControlResponseData == null)
                     {
-                        string msg0 = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime);
-                        this.ShowTipMsg(msg0);
-                        DoorLockCommonInfo.NormallyOpenModeValue(doorLock, false);
                         Application.RunOnMainThread(() =>
                         {
+                            string msg0 = Language.StringByID(R.MyInternationalizationString.GwResponseOvertime);
+                            this.ShowTipMsg(msg0);
+                            DoorLockCommonInfo.NormallyOpenModeValue(doorLock, false);
                             UpdateNomallyOpenStatus();
                         });
                         return;
diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs
old mode 100755
new mode 100644
index f73ef01..f2e05ad
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/CommonDevice.cs
@@ -238,12 +238,16 @@
                     //缁х數鍣�
                     IconPath = "Device/RelayEpoint.png";
                 }
-                else if (this.Type == DeviceType.Thermostat || this.Type == DeviceType.FreshAir)
+                else if (this.Type == DeviceType.Thermostat)
                 {
-                    //绌鸿皟
-                    //鏂伴鍜岀┖璋冨浘鏍囩浉鍚�
+                    //绌鸿皟 
                     IconPath = "Device/AirConditionerEpoint.png";
                 }
+                else if (this.Type == DeviceType.FreshAir)
+                {
+                    //鏂伴 
+                    IconPath = "Device/FreshAirEpoint.png";
+                }
                 else if (this.Type == DeviceType.FreshAirHumiditySensor)
                 {
                     //婀垮害浼犳劅鍣�
diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs
old mode 100755
new mode 100644
index 7e3f7f7..6928ccf
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/DeviceType.cs
@@ -79,7 +79,7 @@
         FreshAir = 0xD100,
         /// <summary>
         /// <para>鏂伴婀垮害浼犳劅鍣�</para>
-        /// <para>璁惧ID涓�0xD200</para>
+        /// <para>璁惧ID涓�53760</para>
         /// <para>瀹氫箟瀵硅薄锛歍emperatureSensor</para>
         /// </summary>
         FreshAirHumiditySensor = 0xD200,
diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs
old mode 100755
new mode 100644
index 0735d15..944cd49
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/DoorLock.cs
@@ -36,7 +36,8 @@
         //鏈湴鎵�鏈夎处鎴峰垪琛�
         public List<Shared.Phone.UserCenter.MemberInfoRes> localAllAccountList = new List<Shared.Phone.UserCenter.MemberInfoRes> { };
         /// <summary>
-        /// 鏄惁甯稿紑妯″紡[褰撴暟鎹幏鍙栧け璐ワ紝杩斿洖绌篯 
+        /// 鏄惁甯稿紑妯″紡銆恔ey = doorLock.DeviceAddr + "_" + doorLock.DeviceEpoint銆�
+        /// ture:甯稿紑锛� false:鍏抽棴
         /// </summary>
         public Dictionary<string, bool> IsDoorLockNormallyMode = new Dictionary<string, bool> { };//鏄惁鍐荤粨瀛愯处鎴�
         public string LocalTempPassword = string.Empty;//鏈湴鐢熸垚鐨勪复鏃跺瘑鐮�
diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/FreshAir.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/FreshAir.cs
old mode 100755
new mode 100644
index 4a9954a..b7661a2
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/FreshAir.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/FreshAir.cs
@@ -15,24 +15,85 @@
         }
 
         /// <summary>
-        /// 鎭掓俯璁惧褰撳墠妯″紡
-        /// <para>鎭掓俯璁惧鍏峰鍔熻兘锛孲ystemMode Attribute Values濡備笅</para>
-        /// <para>0:Off </para>
-        /// <para>1:Auto </para>
-        /// <para>3:Cool </para>
-        /// <para>4:Heat </para>
-        /// <para>5:Emergency heating </para>
-        /// <para>6:Precooling</para>
-        /// <para>7:Fan only </para>
-        /// <para>8:Dry </para>
-        /// <para>9:Sleep</para>
+        /// 椋庨�熸ā寮� 
+        /// <para>5:鑷姩</para>
+        /// <para>6:Smart</para>
+        /// <para>7:鎵嬪姩</para> 
         /// </summary>
-        public int currentSystemMode = 0;
+        public int currentFanMode = 0;
+        /// <summary>
+        /// 椋庨�熸。浣� 
+        /// <para>1:浣庨</para>
+        /// <para>2:涓</para>
+        /// <para>3:楂橀 </para> 
+        /// </summary>
+        public int currentFanSpeed = 0;
+        /// <summary>
+        /// 椋庢墖鐘舵��
+        /// <para>0:鍏抽棴 </para> 
+        /// <para>4:鎵撳紑 </para> 
+        /// </summary>
+        public int currentFanStatus = 0;
+
+        /// <summary>
+        /// 鍏抽棴
+        /// </summary>
+        /// <returns>The close.</returns>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> Close()
+        {
+            return await SetFanModeAsync(FanMode.Off);
+        }
+
+        /// <summary>
+        /// 寮�鍚�
+        /// </summary>
+        /// <returns>The open.</returns>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> Open()
+        {
+            return await SetFanModeAsync(FanMode.On);
+        }
+
+        /// <summary>
+        /// 楂橀
+        /// </summary>
+        /// <returns>The close.</returns>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetHighSpeed()
+        {
+            return await SetFanModeAsync(FanMode.High);
+        }
+
+        /// <summary>
+        /// 浣庨
+        /// </summary>
+        /// <returns>The open.</returns>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetLowSpeed()
+        {
+            return await SetFanModeAsync(FanMode.Low);
+        }
+
+
+        /// <summary>
+        /// 鎵嬪姩
+        /// </summary>
+        /// <returns>The close.</returns>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetManual()
+        {
+            return await SetFanModeAsync(FanMode.Manual);
+        }
+
+        /// <summary>
+        /// 鑷姩
+        /// </summary>
+        /// <returns>The open.</returns>
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetAuto()
+        {
+            return await SetFanModeAsync(FanMode.Auto);
+        }
 
         ///<summary >
-        ///璁剧疆鎭掓俯鍣ㄨ澶囧綋鍓嶅伐浣滄ā寮�.
+        ///璁剧疆鎭掓俯鍣ㄨ澶囧綋鍓嶉閫�.
         /// </summary>
-        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetSystemModeAsync(AcMode acMode)
+        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> SetFanModeAsync(FanMode fanMode)
         {
             if (Gateway == null)
             {
@@ -81,8 +142,8 @@
                 DebugPrintLog("SetWritableValue_Actions 鍚姩" + "_" + System.DateTime.Now.ToString());
                 try
                 {
-                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 513 }, { "Command", 120 } };
-                    var data = new JObject { { "Undivided", 0 }, { "AttributeId", 28 }, { "AttributeDataType", 48 }, { "AttributeData", (int)acMode } };
+                    var jObject = new JObject { { "DeviceAddr", DeviceAddr }, { "Epoint", DeviceEpoint }, { "Cluster_ID", 514 }, { "Command", 120 } };
+                    var data = new JObject { { "Undivided", 0 }, { "AttributeId", 0 }, { "AttributeDataType", 48 }, { "AttributeData", (int)fanMode } };
                     jObject.Add("Data", data);
                     Gateway.Send("SetWritableValue", jObject.ToString());
                 }
@@ -107,63 +168,63 @@
             });
         }
 
-        public enum AcMode
+
+        #region 鈼� 褰撳墠鏂伴寮�鍏崇姸鎬乢___________________
+
+        /// <summary>
+        /// 褰撳墠鏂伴寮�鍏崇姸鎬�
+        /// </summary>
+        /// <param name="freshAir"></param>
+        /// <returns></returns>
+        public bool IsOpen(FreshAir freshAir)
+        {
+            if (freshAir.currentFanStatus == 4)
+            {
+                return true;
+            }
+            return false;
+        }
+
+        #endregion
+
+
+        /// <summary>
+        /// 椋庨�熸。浣�
+        /// </summary>
+        public enum FanMode
         {
             /// <summary>
-            /// 鍏抽棴妯″紡锛堟祴璇曟亽娓╅潰鏉挎椂鍙戠幇锛�2锛�5锛�6锛�7锛�8锛�9閮芥槸鍙互鎵撳紑鐨勶級
+            /// 鍏抽棴
             /// </summary>
             Off = 0,
             /// <summary>
-            /// 鑷姩妯″紡
+            /// 浣庨
             /// </summary>
-            Auto = 1,
+            Low = 1,
             /// <summary>
-            /// 鍒跺喎妯″紡
+            /// 涓
             /// </summary>
-            Cool = 3,
+            Medium = 2,
             /// <summary>
-            /// 鍒剁儹妯″紡
+            /// 楂橀
             /// </summary>
-            Heat = 4,
+            High = 3,
             /// <summary>
-            /// 绱ф�ュ埗鐑ā寮�
+            /// 鎵撳紑
             /// </summary>
-            EmergencyHeating = 5,
+            On = 4,
             /// <summary>
-            /// 棰勫喎妯″紡
+            /// 鑷姩
             /// </summary>
-            Precooling = 6,
+            Auto = 5,
             /// <summary>
-            /// 鍙湁椋庨�熸ā寮�
+            /// Smart
             /// </summary>
-            FanOnly = 7,
+            Smart = 6,
             /// <summary>
-            /// 骞茬嚗妯″紡
+            /// 鎵嬪姩
             /// </summary>
-            Dry = 8,
-            /// <summary>
-            /// 鐫$湢妯″紡
-            /// </summary>
-            Sleep = 9
-        }
-
-        /// <summary>
-        /// 鍏抽棴
-        /// </summary>
-        /// <returns>The close.</returns>
-        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> Close()
-        {
-            return await SetSystemModeAsync(AcMode.Off);
-        }
-
-        /// <summary>
-        /// 寮�鍚�
-        /// </summary>
-        /// <returns>The open.</returns>
-        /// <param name="acMode">Ac mode.</param>
-        public async System.Threading.Tasks.Task<SetWritableValueResponAllData> Open(AcMode acMode = AcMode.Cool)
-        {
-            return await SetSystemModeAsync(acMode);
+            Manual = 7,
         }
     }
 }
diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/HumiditySensor.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/HumiditySensor.cs
old mode 100755
new mode 100644
index d982539..3646638
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/HumiditySensor.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/HumiditySensor.cs
@@ -8,6 +8,7 @@
     {
         public HumiditySensor()
         {
+            this.Type = DeviceType.FreshAirHumiditySensor;
         }
     }
 }
diff --git a/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs b/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs
index a6c6de9..4f527da 100644
--- a/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs
+++ b/ZigbeeApp/Shared/Phone/ZigBee/Device/Panel.cs
@@ -155,6 +155,7 @@
         /// <para>304:CurtainDownstop,绐楀笜涓嬮檷鍋�</para>
         /// </summary>
         public List<int> privateFuncThirdLevelList = new List<int>();
+
         #region 鑾峰彇闈㈡澘鐨勭鏈変俊鎭�.
         /// <summary>
         ///鑾峰彇闈㈡澘鐨勭鏈変俊鎭�
diff --git a/ZigbeeApp/Shared/R.cs b/ZigbeeApp/Shared/R.cs
index 9cf03ef..6c9a52b 100644
--- a/ZigbeeApp/Shared/R.cs
+++ b/ZigbeeApp/Shared/R.cs
@@ -554,6 +554,10 @@
         /// 璇疯緭鍏ュ悎娉曠殑鏁板瓧
         /// </summary>
         public const int IllegalNumber = 310;
+        /// <summary>
+        /// 鎵嬪姩
+        /// </summary>
+        public const int Manual = 311;
 
         public readonly static int cancel = 5097;
         public readonly static int confrim = 5098;
@@ -6042,7 +6046,7 @@
         /// <summary>
         /// 闀滃儚ID涓�2310鐨勮澶囩殑榛樿鍚嶅瓧锛氭柟鎮︽柊椋庡皬妯″潡
         /// </summary>
-        public const int DeviceModelId2310 = 30038;
+        public const int uDeviceModelId2310 = 30038;
 
         //鈽呪槄鈽呪槄涓嬮潰杩欎簺鏄澶囨墍灞炵绫荤殑缈昏瘧鍚嶅瓧,浠�40000寮�濮嬧槄鈽呪槄鈽�
         /// <summary>
@@ -6116,7 +6120,11 @@
         /// <summary>
         /// 鑷畾涔夎澶囨墍灞濱D涓�16鐨勭炕璇戝悕瀛楋細骞叉帴鐐�
         /// </summary>
-        public const int uDeviceBelongId16 = 40017;
+        public const int uDeviceBelongId16 = 40017;
+        /// <summary>
+        /// 鑷畾涔夎澶囨墍灞濱D涓�2310鐨勭炕璇戝悕瀛楋細鏂伴
+        /// </summary>
+        public const int uDeviceBelongId2310 = 40018;
 
         //鈽呪槄鈽呪槄妯″潡ID鐨勮澶囬粯璁ゅ娉ㄥ悕瀛�,浠�50000寮�濮�,杩欓噷涓嶉渶瑕佸畾涔�,鍙啓鍦↙anguage.ini鏂囦欢閲岄潰鈽呪槄鈽呪槄
         //鈽呪槄鈽呪槄妯″潡ID鐨勮澶囩被鍨嬪悕瀛�,浠�60000寮�濮�,杩欓噷涓嶉渶瑕佸畾涔�,鍙啓鍦↙anguage.ini鏂囦欢閲岄潰鈽呪槄鈽呪槄
diff --git a/ZigbeeApp/Shared/Shared.projitems b/ZigbeeApp/Shared/Shared.projitems
old mode 100755
new mode 100644
index 70e00cb..87dd7b3
--- a/ZigbeeApp/Shared/Shared.projitems
+++ b/ZigbeeApp/Shared/Shared.projitems
@@ -479,6 +479,8 @@
     <Compile Include="$(MSBuildThisFileDirectory)Phone\ZigBee\IO\LocalFileUtils.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Phone\UserCenter\CommonBase\Logic\HdlSafeguardLogic.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Phone\UserCenter\CommonBase\Logic\HdlAlarmsLogic.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Phone\Category\Controls\DeviceRow\DeviceFreshAirRowControl.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Phone\MainPage\ControlForm\DeviceFreshAirDetailCardForm.cs" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="$(MSBuildThisFileDirectory)Pad\" />

--
Gitblit v1.8.0