From 37c315988c2dc11e4f477233f7a9f87d57bb61aa Mon Sep 17 00:00:00 2001
From: wei <kaede@kaededeMacBook-Air.local>
Date: 星期一, 08 三月 2021 09:17:15 +0800
Subject: [PATCH] 数据结构优化修改

---
 HDL-ON_Android/Properties/AndroidManifest.xml                                        |    2 
 HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPage.cs                          |   94 
 HDL-ON_iOS/HDL-ON_iOS.csproj                                                         |    4 
 HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPage.cs                       |   25 
 HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPageBLL.cs                             |   38 
 HDL_ON/Entity/Function/FloorHeating.cs                                               |  372 +--
 HDL_ON/HDL_ON.projitems                                                              |    1 
 HDL_ON/Entity/Function/Sensor.cs                                                     |  506 ++---
 HDL_ON/UI/UI2/1-HomePage/HomePageBLL.cs                                              |   39 
 HDL-ON_iOS/Info.plist                                                                |    4 
 HDL_ON/Entity/Function/Fan.cs                                                        |   56 
 HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPageBLL.cs                    |  102 
 HDL_ON/Entity/Room.cs                                                                |    9 
 HDL_ON/UI/UI0-Public/UpdataSidDataDialog.cs                                          |    3 
 HDL_ON/UI/UI2/FuntionControlView/Light/RelayPage.cs                                  |   23 
 HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs                             |   27 
 HDL_ON/UI/UI1-Login/LoginPage.cs                                                     |    4 
 HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs                                        |   49 
 HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPage.cs                               |   19 
 HDL_ON/UI/UI2/FuntionControlView/Light/RGBPageBLL.cs                                 |   92 
 HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPage.cs                     |   51 
 HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSensorPage.cs     |   47 
 HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs                                 |   36 
 HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPageBLL.cs                      |   98 
 HDL_ON/DAL/DriverLayer/Control_Udp.cs                                                |  261 +-
 HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPageBLL.cs                         |   28 
 HDL_ON/Entity/Function/Function.cs                                                   |   51 
 HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs                                |    4 
 HDL_ON/UI/UI2/2-Classification/FunctionPage.cs                                       |   14 
 HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePage.cs    |   37 
 HDL_ON/UI/UI2/FuntionControlView/AC/AcControlPage.cs                                 |   98 
 HDL_ON/Entity/Function/WeepRobot.cs                                                  |    2 
 HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs                                            |   55 
 HDL_ON/UI/UI2/1-HomePage/HomePage.cs                                                 |    8 
 HDL_ON/Entity/Function/Light.cs                                                      |  287 ---
 HDL_ON/UI/UI2/FuntionControlView/Light/RGBPage.cs                                    |   41 
 HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPage.cs                                |   17 
 HDL_ON/UI/UI2/FuntionControlView/Electrical/ClothesHangerPage.cs                     |   13 
 HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPageBLL.cs                              |   77 
 HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPage.cs                                 |   49 
 HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPageBLL.cs                       |   90 
 HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPage.cs                            |   19 
 HDL_ON/Entity/Function/AC.cs                                                         |  363 +---
 HDL_ON/UI/UI2/2-Classification/ClassificationPageBLL.cs                              |   88 
 HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs                           |    3 
 HDL_ON/DAL/DriverLayer/Packet.cs                                                     |  251 +-
 HDL_ON/UI/UI2/FuntionControlView/AC/ACPageBLL.cs                                     |   81 
 .vs/HDL_APP_Project/xs/UserPrefs.xml                                                 |   57 
 HDL_ON/DAL/DriverLayer/Control.cs                                                    |  436 +---
 HDL_ON/UI/MainPage.cs                                                                |    2 
 HDL_ON/Entity/Function/AirCleaner.cs                                                 |    2 
 HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePageBLL.cs                     |   44 
 HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPage.cs                         |   23 
 HDL_ON/Entity/Function/SwitchSocket.cs                                               |    2 
 HDL_ON/Entity/Function/TV.cs                                                         |   11 
 HDL_ON/UI/UI2/FuntionControlView/Light/RelayPageBLL.cs                               |   28 
 HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePage.cs                        |   23 
 HDL_ON/Entity/FunctionList.cs                                                        |  378 +---
 HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPageBLL.cs                            |   42 
 /dev/null                                                                            |   15 
 HDL_ON/Entity/Function/Curtain.cs                                                    |   69 
 HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePageBLL.cs |   14 
 HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPageBLL.cs                  |   78 
 63 files changed, 1,966 insertions(+), 2,896 deletions(-)

diff --git a/.vs/HDL_APP_Project/xs/UserPrefs.xml b/.vs/HDL_APP_Project/xs/UserPrefs.xml
index e19ddc8..1697180 100644
--- a/.vs/HDL_APP_Project/xs/UserPrefs.xml
+++ b/.vs/HDL_APP_Project/xs/UserPrefs.xml
@@ -1,60 +1,27 @@
 锘�<Properties StartupConfiguration="{D998E133-F0DD-4760-BE3C-461632F54DA4}|Default">
-  <MonoDevelop.Ide.ItemProperties.HDL-ON__iOS PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneDeviceTarget.00008020-000404163432002E" />
-  <MonoDevelop.Ide.Workbench ActiveDocument="HDL_ON/UI/UI0-Public/UpdataSidDataDialog.cs">
+  <MonoDevelop.Ide.ItemProperties.HDL-ON__iOS PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneSimulatorTarget.94B44E9C-E1BC-4BF7-812E-FC71E9B623B2" />
+  <MonoDevelop.Ide.Workbench ActiveDocument="HDL_ON/UI/UI1-Login/LoginPage.cs">
     <Files>
-      <File FileName="HDL_ON/Entity/FunctionList.cs" Line="370" Column="38" />
-      <File FileName="HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs" Line="58" Column="22" />
-      <File FileName="HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs" Line="153" Column="41" />
-      <File FileName="HDL_ON/UI/UI2/FuntionControlView/Electrical/TuyaWaterValvePage.cs" />
+      <File FileName="HDL_ON/UI/UI1-Login/LoginPage.cs" Line="199" Column="17" />
+      <File FileName="HDL_ON/UI/UI2/FuntionControlView/Electrical/ClothesHangerPage.cs" />
       <File FileName="HDL_ON/Common/ApiUtlis.cs" />
-      <File FileName="HDL_ON/UI/UI2/FuntionControlView/ArmSensor/SensorPirPage.cs" Line="98" Column="21" />
-      <File FileName="HDL_ON/UI/UI0-Stan/Logic/HdlDeviceStatuPushLogic.cs" Line="41" Column="42" />
-      <File FileName="HDL_ON/UI/UI2/FuntionControlView/Electrical/TuyaAirCleanerPage.cs" Line="789" Column="42" />
-      <File FileName="HDL_ON/DAL/DriverLayer/Control.cs" Line="209" Column="31" />
-      <File FileName="HDL_ON/UI/UI2/FuntionControlView/AC/AcControlPage.cs" Line="83" Column="1" />
-      <File FileName="HDL_ON/UI/UI2/FuntionControlView/AC/ACPageBLL.cs" Line="9" Column="32" />
-      <File FileName="HDL_ON/UI/UI1-Login/LoginPage.cs" Line="218" Column="58" />
-      <File FileName="HDL_ON/UI/UI0-Public/UpdataSidDataDialog.cs" Line="47" Column="35" />
+      <File FileName="HDL_ON/Entity/Room.cs" />
+      <File FileName="HDL_ON/Entity/FunctionList.cs" />
+      <File FileName="HDL_ON/UI/MainPage.cs" />
+      <File FileName="HDL-ON_iOS/Info.plist" />
     </Files>
     <Pads>
       <Pad Id="ProjectPad">
         <State name="__root__">
           <Node name="HDL_APP_Project" expanded="True">
             <Node name="HDL_ON" expanded="True">
-              <Node name="Common" expanded="True">
-                <Node name="Utlis" expanded="True" />
-              </Node>
-              <Node name="DAL" expanded="True">
-                <Node name="DriverLayer" expanded="True" />
-              </Node>
-              <Node name="Entity" expanded="True">
-                <Node name="Function" expanded="True" />
-              </Node>
               <Node name="UI" expanded="True">
-                <Node name="UI0-Public" expanded="True">
-                  <Node name="UpdataSidDataDialog.cs" selected="True" />
-                </Node>
-                <Node name="UI0-Stan" expanded="True">
-                  <Node name="Logic" expanded="True" />
-                </Node>
-                <Node name="UI1-Login" expanded="True" />
-                <Node name="UI2" expanded="True">
-                  <Node name="1-HomePage" expanded="True" />
-                  <Node name="2-Classification" expanded="True" />
-                  <Node name="3-Intelligence" expanded="True">
-                    <Node name="Scene" expanded="True" />
-                  </Node>
-                  <Node name="FuntionControlView" expanded="True">
-                    <Node name="AC" expanded="True" />
-                    <Node name="ArmSensor" expanded="True" />
-                    <Node name="Curtain" expanded="True" />
-                    <Node name="Electrical" expanded="True" />
-                    <Node name="Light" expanded="True" />
-                  </Node>
+                <Node name="UI1-Login" expanded="True">
+                  <Node name="LoginPage.cs" selected="True" />
                 </Node>
               </Node>
             </Node>
-            <Node name="ys" expanded="True" />
+            <Node name="HDL-ON_iOS" expanded="True" />
           </Node>
         </State>
       </Pad>
@@ -66,7 +33,7 @@
     <String>Shared.Droid.TouchID/Shared.Droid.TouchID.csproj</String>
     <String>Shared.IOS/Shared.IOS.csproj</String>
   </DisabledProjects>
-  <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|iPhone" />
+  <MonoDevelop.Ide.Workspace ActiveConfiguration="Release" />
   <MonoDevelop.Ide.ItemProperties.HDL-ON__Android PreferredExecutionTarget="Android.SelectDevice" />
   <MonoDevelop.Ide.DebuggingService.Breakpoints>
     <BreakpointStore>
diff --git a/HDL-ON_Android/Properties/AndroidManifest.xml b/HDL-ON_Android/Properties/AndroidManifest.xml
index 7456bfe..00724b4 100644
--- a/HDL-ON_Android/Properties/AndroidManifest.xml
+++ b/HDL-ON_Android/Properties/AndroidManifest.xml
@@ -1,5 +1,5 @@
 锘�<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="202103032" android:versionName="1.1.202103032" package="com.hdl.onpro">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="202103051" android:versionName="1.1.202103051" package="com.hdl.onpro">
 	<uses-sdk android:minSdkVersion="26" android:targetSdkVersion="26" />
 	<!--  瀹氫綅鏉冮檺-->
 	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
diff --git a/HDL-ON_iOS/HDL-ON_iOS.csproj b/HDL-ON_iOS/HDL-ON_iOS.csproj
index f5a867c..cad9e3a 100644
--- a/HDL-ON_iOS/HDL-ON_iOS.csproj
+++ b/HDL-ON_iOS/HDL-ON_iOS.csproj
@@ -47,14 +47,14 @@
         <ErrorReport>prompt</ErrorReport>
         <WarningLevel>4</WarningLevel>
         <MtouchArch>ARM64</MtouchArch>
-        <CodesignKey>iPhone Developer: xuebiao huang (4P32GXQWWK)</CodesignKey>
+        <CodesignKey>Apple Development: xuebiao huang (4P32GXQWWK)</CodesignKey>
         <MtouchDebug>true</MtouchDebug>
         <MtouchI18n>cjk</MtouchI18n>
         <MtouchLink>SdkOnly</MtouchLink>
         <MtouchExtraArgs>-gcc_flags="-dead_strip -ObjC"</MtouchExtraArgs>
         <MtouchEnableSGenConc>false</MtouchEnableSGenConc>
 <CodesignEntitlements>Entitlements.plist</CodesignEntitlements>
-<CodesignProvision>ComHdlOnProDevelopment20210225-1</CodesignProvision>
+<CodesignProvision>ComHdlOnProDevelopment20210305-1</CodesignProvision>
     </PropertyGroup>
     <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|iPhone' ">
         <DebugType>none</DebugType>
diff --git a/HDL-ON_iOS/Info.plist b/HDL-ON_iOS/Info.plist
index 1e97d34..d5aace1 100644
--- a/HDL-ON_iOS/Info.plist
+++ b/HDL-ON_iOS/Info.plist
@@ -102,9 +102,9 @@
 	<key>UIStatusBarStyle</key>
 	<string>UIStatusBarStyleLightContent</string>
 	<key>CFBundleShortVersionString</key>
-	<string>1.1.202103032</string>
+	<string>1.1.202103051</string>
 	<key>CFBundleVersion</key>
-	<string>202103032</string>
+	<string>202103051</string>
 	<key>NSLocationWhenInUseUsageDescription</key>
 	<string>Use geographic location to provide services such as weather</string>
 	<key>NSAppleMusicUsageDescription</key>
diff --git a/HDL_ON/DAL/DriverLayer/Control.cs b/HDL_ON/DAL/DriverLayer/Control.cs
index 386bc5a..7982419 100644
--- a/HDL_ON/DAL/DriverLayer/Control.cs
+++ b/HDL_ON/DAL/DriverLayer/Control.cs
@@ -674,311 +674,187 @@
                     try
                     {
                         var localFunction = allLocalFuntion.Find((obj) => obj.sid == updateTemp.sid);
+                        if (localFunction == null)
+                        {
+                            continue;
+                        }
                         if (Ins.GatewayOnline_Local && isCloudData)//鏈湴閾炬帴锛岄櫎浜嗘秱楦﹁澶囨暟鎹箣澶栫殑浜戠鏁版嵁涓嶅鐞�
                         {
-                            if(!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk))
+                            if (!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(localFunction.spk))
                             {
                                 //MainPage.Log($"A鍗忚鏇存柊鐘舵��:鏈湴閾炬帴锛岄櫎浜嗘秱楦﹁澶囨暟鎹箣澶栫殑浜戠鏁版嵁涓嶅鐞�........");
                                 return;
                             }
                         }
-                        //MainPage.Log($"A鍗忚鏇存柊鐘舵��:{revString}");
+                        MainPage.Log($"A鍗忚鏇存柊鐘舵��:{revString}");
                         foreach (var attr in updateTemp.status)
                         {
-                            localFunction.SetAttrState(attr.key,attr.value);
+                            localFunction.SetAttrState(attr.key, attr.value);
                         }
 
-                        if (localFunction != null)
+                        //鏇存柊鐣岄潰鐘舵��
+                        Function localObj = null;
+                        switch (localFunction.spk)
                         {
-                            //鏇存柊鐣岄潰鐘舵��
-                            Function localObj = null;
-                            switch (localFunction.spk)
-                            {
-                                case SPK.LightSwitch:
-                                    var localSwitch = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (localSwitch != null)
+                            case SPK.LightSwitch:
+                                RelayPage.UpdataState(localFunction);
+                                break;
+                            case SPK.LightDimming:
+                                localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " +
+                                                        localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%";
+                                DimmerPage.UpdataStates(localFunction);
+                                break;
+                            case SPK.ElectricFan:
+                                localFunction.lastState = Language.StringByID(StringId.Level) + " : " +
+                                   localFunction.GetAttrState(FunctionAttributeKey.OpenLevel);
+                                FanPage.UpdataState(localFunction);
+                                break;
+                            case SPK.LightRGB:
+                                localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " + localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%";
+                                RGBPage.UpdataStates(localFunction);
+                                break;
+                            case SPK.LightRGBW:
+                                break;
+                            case SPK.LightCCT:
+                                localFunction.lastState = Language.StringByID(StringId.Brightness) + " : " + localFunction.GetAttrState(FunctionAttributeKey.Brightness) + "%";
+                                ColorTureLampPage.UpdataStatus(localFunction);
+                                break;
+                            case SPK.CurtainSwitch:
+                                localFunction.lastState = localFunction.trait_on_off.curValue.ToString() == "on" ? Language.StringByID(StringId.Open) : Language.StringByID(StringId.Close);
+                                CurtainModulePage.UpdataState(localFunction);
+                                break;
+                            case SPK.CurtainTrietex:
+                                localFunction.lastState = Language.StringByID(StringId.Open) + localFunction.GetAttrState(FunctionAttributeKey.Percent) + "%";
+                                MotorCurtainPage.UpdataState(localFunction);
+                                break;
+                            case SPK.CurtainRoller:
+                                localFunction.lastState = Language.StringByID(StringId.Open) + localFunction.GetAttrState(FunctionAttributeKey.Percent) + "%";
+                                RollingShutterPage.UpdataState(localFunction);
+                                break;
+                            case SPK.CurtainShades:
+                                break;
+                            case SPK.AcStandard:
+                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
+                                if (localFunction != null)
+                                {
+                                    localFunction.lastState = "";
+                                    switch (localFunction.GetAttrState(FunctionAttributeKey.Mode))
                                     {
-                                        localObj = localSwitch;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = localSwitch.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        RelayPage.UpdataState(localSwitch);
+                                        case "cool":
+                                            localFunction.lastState = Language.StringByID(StringId.Cool);
+                                            break;
+                                        case "heat":
+                                            localFunction.lastState = Language.StringByID(StringId.Heat);
+                                            break;
+                                        case "dry":
+                                            localFunction.lastState = Language.StringByID(StringId.Dry);
+                                            break;
+                                        case "auto":
+                                            localFunction.lastState = Language.StringByID(StringId.Auto);
+                                            break;
+                                        case "fan":
+                                            localFunction.lastState = Language.StringByID(StringId.AirSupply);
+                                            break;
                                     }
-                                    break;
-                                case SPK.LightDimming:
-                                    var dimming = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (dimming != null)
+                                    switch (localFunction.GetAttrState(FunctionAttributeKey.FanSpeed))
                                     {
-                                        localObj = dimming;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = dimming.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        dimming.lastState = Language.StringByID(StringId.Brightness) + " : " + dimming.brightness + "%";
-                                        DimmerPage.UpdataStates(dimming);
+                                        case "high":
+                                            localFunction.lastState += " " + Language.StringByID(StringId.HighWindSpeed);
+                                            break;
+                                        case "medium":
+                                            localFunction.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed);
+                                            break;
+                                        case "low":
+                                            localFunction.lastState += " " + Language.StringByID(StringId.LowWindSpeed);
+                                            break;
+                                        case "auto":
+                                            localFunction.lastState += " " + Language.StringByID(StringId.Auto);
+                                            break;
                                     }
-                                    break;
-                                case SPK.ElectricFan:
-                                    var fan = FunctionList.List.fans.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (fan != null)
+                                    localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new AC().GetTempUnitString(localFunction);
+                                    ACPage.UpdataStates(localFunction);
+                                }
+                                break;
+                            case SPK.FloorHeatStandard:
+                                switch (localFunction.GetAttrState(FunctionAttributeKey.Mode))
+                                {
+                                    case "normal":
+                                        localFunction.lastState = Language.StringByID(StringId.Normal);
+                                        break;
+                                    case "day":
+                                        localFunction.lastState = Language.StringByID(StringId.Day);
+                                        break;
+                                    case "night":
+                                        localFunction.lastState = Language.StringByID(StringId.Night);
+                                        break;
+                                    case "timer":
+                                        localFunction.lastState = Language.StringByID(StringId.Auto);
+                                        break;
+                                    case "away":
+                                        localFunction.lastState = Language.StringByID(StringId.Away);
+                                        break;
+                                }
+                                localFunction.lastState += " " + localFunction.GetAttrState(FunctionAttributeKey.SetTemp) + new FloorHeating().GetTempUnitString(localFunction);
+                                FloorHeatingPage.UpdataStates(localFunction);
+                                break;
+                            case SPK.SensorPm25:
+                            case SPK.SensorCO2:
+                            case SPK.SensorTVOC:
+                            case SPK.SensorTemperature:
+                            case SPK.SensorHumidity:
+                                var sensor = FunctionList.List.GetEnvirSensorsList().Find((obj) => obj.sid == updateTemp.sid);
+                                if (sensor != null)
+                                {
+                                    localObj = sensor;
+                                    foreach (var attr in updateTemp.status)
                                     {
-                                        localObj = fan;
-                                        foreach (var attr in updateTemp.status)
+                                        var localAttr = sensor.attributes.Find((obj) => obj.key == attr.key);
+                                        if (localAttr != null)
                                         {
-                                            var localAttr = fan.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
+                                            localAttr.curValue = attr.value;
                                         }
-                                        fan.lastState = Language.StringByID(StringId.Level) + " : " + fan.openLevel;
-                                        FanPage.UpdataState(fan);
                                     }
-                                    break;
-                                case SPK.LightRGB:
-                                    var rgb = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (rgb != null)
+                                    EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor);
+                                }
+                                break;
+                            case SPK.ElectricSocket:
+                                var es = FunctionList.List.GetElectricSocketList().Find((obj) => obj.sid == updateTemp.sid);
+                                if (es != null)
+                                {
+                                    localObj = es;
+                                    foreach (var attr in updateTemp.status)
                                     {
-                                        localObj = rgb;
-                                        foreach (var attr in updateTemp.status)
+                                        var localAttr = es.attributes.Find((obj) => obj.key == attr.key);
+                                        if (localAttr != null)
                                         {
-                                            var localAttr = rgb.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
+                                            localAttr.curValue = attr.value;
                                         }
-                                        rgb.lastState = Language.StringByID(StringId.Brightness) + " : " + rgb.brightness + "%";
-                                        RGBPage.UpdataStates(rgb);
                                     }
-                                    break;
-                                case SPK.LightRGBW:
-                                    break;
-                                case SPK.LightCCT:
-                                    var lightCCT = FunctionList.List.lights.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (lightCCT != null)
-                                    {
-                                        localObj = lightCCT;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = lightCCT.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        lightCCT.lastState = Language.StringByID(StringId.Brightness) + " : " + lightCCT.brightness + "%";
-                                        ColorTureLampPage.UpdataStates(lightCCT);
-                                    }
-                                    break;
-                                case SPK.CurtainSwitch:
-                                    var curtain = FunctionList.List.curtains.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (curtain != null)
-                                    {
-                                        localObj = curtain;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = curtain.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        curtain.lastState = curtain.trait_on_off.curValue.ToString() == "on" ? Language.StringByID(StringId.Open) : Language.StringByID(StringId.Close);
-                                        CurtainModulePage.UpdataState(curtain);
-                                    }
-                                    break;
-                                case SPK.CurtainTrietex:
-                                    var trietex = FunctionList.List.curtains.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (trietex != null)
-                                    {
-                                        localObj = trietex;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = trietex.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        trietex.lastState = Language.StringByID(StringId.Open) + trietex.percent + "%";
-                                        MotorCurtainPage.UpdataState(trietex);
-                                    }
-                                    break;
-                                case SPK.CurtainRoller:
-                                    var roller = FunctionList.List.curtains.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (roller != null)
-                                    {
-                                        localObj = roller;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = roller.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        roller.lastState = Language.StringByID(StringId.Open) + roller.percent + "%";
-                                        RollingShutterPage.UpdataState(roller);
-                                    }
-                                    break;
-                                case SPK.CurtainShades:
-                                    break;
-                                case SPK.AcStandard:
-                                    var ac = FunctionList.List.aCs.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (ac != null)
-                                    {
-                                        localObj = ac;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = ac.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        ac.lastState = "";
-                                        switch (ac.GetAttrState(FunctionAttributeKey.Mode))
-                                        {
-                                            case "cool":
-                                                ac.lastState = Language.StringByID(StringId.Cool);
-                                                break;
-                                            case "heat":
-                                                ac.lastState = Language.StringByID(StringId.Heat);
-                                                break;
-                                            case "dry":
-                                                ac.lastState = Language.StringByID(StringId.Dry);
-                                                break;
-                                            case "auto":
-                                                ac.lastState = Language.StringByID(StringId.Auto);
-                                                break;
-                                            case "fan":
-                                                ac.lastState = Language.StringByID(StringId.AirSupply);
-                                                break;
-                                        }
-                                        switch (ac.GetAttrState(FunctionAttributeKey.FanSpeed))
-                                        {
-                                            case "high":
-                                                ac.lastState += " " + Language.StringByID(StringId.HighWindSpeed);
-                                                break;
-                                            case "medium":
-                                                ac.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed);
-                                                break;
-                                            case "low":
-                                                ac.lastState += " " + Language.StringByID(StringId.LowWindSpeed);
-                                                break;
-                                            case "auto":
-                                                ac.lastState += " " + Language.StringByID(StringId.Auto);
-                                                break;
-                                        }
-                                        ac.lastState += " " + ac.GetAttrState(FunctionAttributeKey.SetTemp) + ac.tempUnitString;
-                                        ACPage.UpdataStates(ac);
-                                    }
-                                    break;
-                                case SPK.FloorHeatStandard:
-                                    var fh = FunctionList.List.floorHeatings.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (fh != null)
-                                    {
-                                        localObj = fh;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = fh.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        switch (fh.trait_mode.curValue)
-                                        {
-                                            case "normal":
-                                                fh.lastState = Language.StringByID(StringId.Normal);
-                                                break;
-                                            case "day":
-                                                fh.lastState = Language.StringByID(StringId.Day);
-                                                break;
-                                            case "night":
-                                                fh.lastState = Language.StringByID(StringId.Night);
-                                                break;
-                                            case "timer":
-                                                fh.lastState = Language.StringByID(StringId.Auto);
-                                                break;
-                                            case "away":
-                                                fh.lastState = Language.StringByID(StringId.Away);
-                                                break;
-                                        }
-                                        fh.lastState += " " + fh.trait_temp.curValue + fh.tempUnitString;
-                                        FloorHeatingPage.UpdataStates(fh);
-                                    }
-                                    break;
-                                case SPK.SensorPm25:
-                                case SPK.SensorCO2:
-                                case SPK.SensorTVOC:
-                                case SPK.SensorTemperature:
-                                case SPK.SensorHumidity:
-                                    var sensor = FunctionList.List.sensorsEnvironmentalScience.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (sensor != null)
-                                    {
-                                        localObj = sensor;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = sensor.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor);
-                                    }
-                                    break;
-                                case SPK.ElectricSocket:
-                                    var es = FunctionList.List.switchSockets.Find((obj) => obj.sid == updateTemp.sid);
-                                    if (es != null)
-                                    {
-                                        localObj = es;
-                                        foreach (var attr in updateTemp.status)
-                                        {
-                                            var localAttr = es.attributes.Find((obj) => obj.key == attr.key);
-                                            if (localAttr != null)
-                                            {
-                                                localAttr.curValue = attr.value;
-                                            }
-                                        }
-                                        SocketPage.UpdataState(es);
-                                    }
-                                    break;
-                                case SPK.ElectricTV:
-                                    break;
-                                case SPK.ElectricTuyaAirCleaner:
-                                case SPK.ElectricTuyaFan:
-                                case SPK.ElectricTuyaWeepRobot:
-                                case SPK.ElectricTuyaWaterValve:
-                                case SPK.SensorPir:
-                                case SPK.SensorDoorWindow:
-                                case SPK.SensorSmoke:
-                                case SPK.SensorWater:
-                                case SPK.ClothesHanger:
-                                case SPK.IrAC:
-                                    //璁惧鐘舵�佹帹閫�
-                                    Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid,updateTemp.status);
-                                    break;
-                            }
-                            if (localObj != null)
-                            {
-                                HomePage.UpdataFunctionStates(localObj);
-                                RoomPage.UpdataStates(localObj);
-                                FunctionPage.UpdataStates(localObj);
-                                ClassificationPage.UpdataInfo(localObj);
-                            }
+                                    SocketPage.UpdataState(es);
+                                }
+                                break;
+                            case SPK.ElectricTV:
+                                break;
+                            case SPK.ElectricTuyaAirCleaner:
+                            case SPK.ElectricTuyaFan:
+                            case SPK.ElectricTuyaWeepRobot:
+                            case SPK.ElectricTuyaWaterValve:
+                            case SPK.SensorPir:
+                            case SPK.SensorDoorWindow:
+                            case SPK.SensorSmoke:
+                            case SPK.SensorWater:
+                            case SPK.ClothesHanger:
+                            case SPK.IrAC:
+                                //璁惧鐘舵�佹帹閫�
+                                Stan.HdlDeviceStatuPushLogic.Current.UpdateDeviceStatu(updateTemp.sid, updateTemp.status);
+                                break;
                         }
+
+                        HomePage.UpdataFunctionStates(localFunction);
+                        RoomPage.UpdataStates(localFunction);
+                        FunctionPage.UpdataStates(localFunction);
+                        ClassificationPage.UpdataInfo(localFunction);
+
                     }
                     catch (Exception ex)
                     {
diff --git a/HDL_ON/DAL/DriverLayer/Control_Udp.cs b/HDL_ON/DAL/DriverLayer/Control_Udp.cs
index 456591d..d4762a2 100644
--- a/HDL_ON/DAL/DriverLayer/Control_Udp.cs
+++ b/HDL_ON/DAL/DriverLayer/Control_Udp.cs
@@ -188,47 +188,75 @@
                             }
                             break;
                         case SPK.AcStandard:
-                            AC tempAc = new AC();
+                            AC acTemp = new AC();
+                            byte onoff = 0;
+                            byte mode = 0;
+                            byte fan = 0;
                             foreach (var attr in f.status)
                             {
                                 byte modeKey = 4;
                                 switch (attr.key)
                                 {
                                     case FunctionAttributeKey.OnOff:
-                                        tempAc.trait_on_off.curValue = attr.value;
+                                        if(attr.value == "on")
+                                        {
+                                            onoff = 1;
+                                        }
+                                        else
+                                        {
+                                            onoff = 0;
+                                        }
                                         break;
                                     case FunctionAttributeKey.Mode:
-                                        tempAc.SetAttrState(FunctionAttributeKey.Mode, attr.value);
-                                        break;
-                                    case FunctionAttributeKey.FanSpeed:
-                                        tempAc.SetAttrState(FunctionAttributeKey.FanSpeed, attr.value);
-                                        break;
-                                    case FunctionAttributeKey.SetTemp:
-                                        tempAc.SetAttrState(FunctionAttributeKey.SetTemp, attr.value);
-                                        switch (tempAc.curModeIndex())
+                                        switch (attr.value)
                                         {
-                                            case 3:
+                                            case "auto":
+                                                mode = 3;
                                                 modeKey = 8;
                                                 break;
-                                            case 0:
+                                            case "cool":
+                                                mode = 0;
                                                 modeKey = 4;
                                                 break;
-                                            case 1:
+                                            case "heat":
+                                                mode = 1;
                                                 modeKey = 7;
                                                 break;
-                                            case 4:
+                                            case "dry":
+                                                mode = 4;
                                                 modeKey = 19;
                                                 break;
-                                            case 2:
+                                            case "fan":
+                                                mode = 2;
                                                 modeKey = 2;
                                                 break;
                                         }
                                         break;
+                                    case FunctionAttributeKey.FanSpeed:
+                                        switch (attr.value)
+                                        {
+                                            case "high":
+                                                fan = 1;
+                                                break;
+                                            case "medium":
+                                                fan = 2;
+                                                break;
+                                            case "low":
+                                                fan = 3;
+                                                break;
+                                            case "auto":
+                                                fan = 0;
+                                                break;
+                                            default:
+                                                fan = 0;
+                                                break;
+                                        }
+                                        break;
                                 }
-                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { 3, tempAc.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0, f.localFunction.bus.LoopId });
-                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { 6, tempAc.curModeIndex(), f.localFunction.bus.LoopId });
-                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { 5, tempAc.curFanIndex(), f.localFunction.bus.LoopId });
-                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { modeKey, Convert.ToByte(tempAc.GetAttrState(FunctionAttributeKey.SetTemp)), f.localFunction.bus.LoopId });
+                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { 3, onoff, f.localFunction.bus.LoopId });
+                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { 6, mode, f.localFunction.bus.LoopId });
+                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { 5, fan, f.localFunction.bus.LoopId });
+                                ControlBytesSend(Command.InstructionPanelKey, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] { modeKey, modeKey, f.localFunction.bus.LoopId });
                             }
                             break;
                         case SPK.LightSwitch:
@@ -260,25 +288,50 @@
                         case SPK.LightRGB:
                             break;
                         case SPK.FloorHeatStandard:
-                            var tempFh = new FloorHeating();
+                            byte onoff_1 = 0;
+                            byte setTemp_1 = 0;
+                            byte mode_1 = 0;
                             foreach (var attr in f.status)
                             {
                                 switch (attr.key)
                                 {
                                     case FunctionAttributeKey.OnOff:
-                                        tempFh.trait_on_off.curValue = attr.value;
+                                        if (attr.value == "on")
+                                        {
+                                            onoff_1 = 1;
+                                        }
+                                        else
+                                        {
+                                            onoff_1 = 0;
+                                        }
                                         break;
                                     case FunctionAttributeKey.SetTemp:
-                                        tempFh.trait_temp.curValue = attr.value;
+                                        setTemp_1 = Convert.ToByte(attr.value);
                                         break;
                                     case FunctionAttributeKey.Mode:
-                                        tempFh.trait_mode.curValue = attr.value;
+                                        switch (attr.value)
+                                        {
+                                            case "day":
+                                                mode_1 = 2;
+                                                break;
+                                            case "night":
+                                                mode_1 = 3;
+                                                break;
+                                            case "away":
+                                                mode_1 = 4;
+                                                break;
+                                            case "normal":
+                                                mode_1 = 1;
+                                                break;
+                                            case "timer":
+                                                mode_1 = 5;
+                                                break;
+                                        }
                                         break;
                                 }
                             }
-                            byte b1 = tempFh.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0;
                             ControlBytesSend(Command.SetFloorHeat, f.localFunction.bus.SubnetID, f.localFunction.bus.DeviceID, new byte[] {
-                                f. localFunction.bus.LoopId, b1, 0, tempFh.curModeIndex, Convert.ToByte( tempFh.trait_temp.curValue),  Convert.ToByte( tempFh.trait_temp.curValue), Convert.ToByte( tempFh.trait_temp.curValue), Convert.ToByte( tempFh.trait_temp.curValue), 0, 0 });
+                                f. localFunction.bus.LoopId, onoff_1, 0, setTemp_1, mode_1,  setTemp_1, setTemp_1, setTemp_1, 0, 0 });
                             break;
                         case SPK.ElectricSocket:
                             foreach (var attr in f.status)
@@ -350,78 +403,93 @@
                 switch (function.Spk_Prefix)
                 {
                     case FunctionCategory.Light:
-                        var light = function as Light;
-                        switch (light.spk)
+                        switch (function.spk)
                         {
                             case SPK.LightCCT:
                                 byte b0 = 100;//寮�鍏虫搷浣滀緷鎹畂n_off瀛楁锛屽疄闄呭紑鍏冲�间緷鎹産rightness锛屽綋on_off涓烘墦寮�锛宐rightness涓嶈兘涓�0
-                                if (light.trait_on_off.curValue.ToString() == "off")
+                                if (function.trait_on_off.curValue.ToString() == "off")
                                 {
                                     b0 = 0;
                                 }
                                 else
                                 {
-                                    b0 = (byte)light.brightness == 0 ? (byte)100 : (byte)light.brightness;
+                                    b0 = Convert.ToByte( function.GetAttrState(FunctionAttributeKey.Brightness)) == 0 ? (byte)100 : Convert.ToByte(function.GetAttrState(FunctionAttributeKey.Brightness));
                                 }
                                 var bytes0 = new byte[] { function.bus.LoopId,
                                             b0,
-                                            254, 0,Convert.ToByte(light.fadeTime) ,2,
-                                            (byte)((int)light.Attr_CCT.curValue/256),(byte)((int)light.Attr_CCT.curValue%256),
-                                            (byte)light.BlueColor,
+                                            254, 0,Convert.ToByte(function.GetAttrState(FunctionAttributeKey.FadeTime)) ,2,
+                                            (byte)(Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.CCT))/256),
+                                            (byte)(Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.CCT))%256),
+                                            0,
                                             0,0};
                                 ControlBytesSend(Command.SetLogicLoopColor, subnetId, deviceId, bytes0, 1);
                                 break;
                             case SPK.LightRGB:
                                 byte b = 100;//寮�鍏虫搷浣滀緷鎹畂n_off瀛楁锛屽疄闄呭紑鍏冲�间緷鎹産rightness锛屽綋on_off涓烘墦寮�锛宐rightness涓嶈兘涓�0
-                                if (light.trait_on_off.curValue.ToString() == "off")
+                                if (function.trait_on_off.curValue.ToString() == "off")
                                 {
                                     b = 0;
                                 }
                                 else
                                 {
-                                    b = (byte)light.brightness == 0 ? (byte)100 : (byte)light.brightness;
+                                    byte lightBri1 = Convert.ToByte(function.GetAttrState(FunctionAttributeKey.Brightness));
+                                    if (lightBri1 == 0)
+                                    {
+                                        b = 100;
+                                    }
+                                    else
+                                    {
+                                        b = lightBri1;
+                                    }
                                 }
+                                var tempLight = new Light();
                                 var bytes = new byte[] { function.bus.LoopId,
                                             b,
-                                            254, 0,Convert.ToByte(light.fadeTime) ,3,
-                                            (byte)light.RedColor,(byte)light.GreenColor,
-                                            (byte)light.BlueColor,
+                                            254, 0,Convert.ToByte(function.GetAttrState(FunctionAttributeKey.FadeTime)) ,3,
+                                            (byte)tempLight.GetColor(0,function),
+                                            (byte)tempLight.GetColor(1,function),
+                                            (byte)tempLight.GetColor(2,function),
                                             0,0};
                                 ControlBytesSend(Command.SetLogicLoopColor, subnetId, deviceId, bytes, 1);
                                 break;
                             case SPK.LightDimming:
                                 byte b1 = 100;
-                                if (light.trait_on_off.curValue.ToString() == "off")
+                                if (function.trait_on_off.curValue.ToString() == "off")
                                 {
                                     b1 = 0;
                                 }
                                 else
                                 {
-                                    b1 = (byte)light.brightness == 0 ? (byte)100 : (byte)light.brightness;
+                                    byte lightBri = Convert.ToByte(function.GetAttrState(FunctionAttributeKey.Brightness));
+                                    if (lightBri == 0)
+                                    {
+                                        b = 100;
+                                    }
+                                    else
+                                    {
+                                        b = lightBri;
+                                    }
                                 }
                                 ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] {
                                             function.bus.LoopId,
                                             b1,
-                                            0, Convert.ToByte(light.fadeTime) });
-                                //DimmerPage.UpdataStates(light);
+                                            0, Convert.ToByte(function.GetAttrState(FunctionAttributeKey.FadeTime)) });
                                 break;
                             case SPK.LightSwitch:
-                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus.LoopId, light.trait_on_off.curValue.ToString() == "on" ? (byte)100 : (byte)0, 0, 0 });
-                                //RelayPage.UpdataState(light);
+                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus.LoopId, function.trait_on_off.curValue.ToString() == "on" ? (byte)100 : (byte)0, 0, 0 });
                                 break;
                         }
                         break;
                     case FunctionCategory.Curtain:
-                        var curtain = function as Curtain;
-                        switch (curtain.spk)
+                        switch (function.spk)
                         {
                             case SPK.CurtainSwitch:
                                 byte b1 = 0;
-                                if (curtain.trait_on_off.curValue.ToString() == "stop")
+                                if (function.trait_on_off.curValue.ToString() == "stop")
                                 {
                                     b1 = 0;
                                 }
-                                else if (curtain.trait_on_off.curValue.ToString() == "on")
+                                else if (function.trait_on_off.curValue.ToString() == "on")
                                 {
                                     b1 = 1;
                                 }
@@ -429,37 +497,19 @@
                                 {
                                     b1 = 2;
                                 }
-                                ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { curtain.bus.LoopId, b1 });
+                                ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { function.bus.LoopId, b1 });
                                 break;
                             case SPK.CurtainTrietex:
                             case SPK.CurtainRoller:
-                                //if (commandDictionary.Count > 0)
-                                //{
-                                if (curtain.trait_on_off.curValue.ToString() == "stop")
+                                if (function.trait_on_off.curValue.ToString() == "stop")
                                 {
-                                    ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { curtain.bus.LoopId, 0 });
+                                    ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { function.bus.LoopId, 0 });
                                 }
                                 else
                                 {
-                                    ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, Convert.ToByte(curtain.percent) });
+                                    ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, Convert.ToByte(function.GetAttrState(FunctionAttributeKey.Percent)) });
 
                                 }
-                                //}
-                                //else
-                                //{
-                                //    if (curtain.trait_on_off.value.ToString() == "stop")
-                                //    {
-                                //        ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { curtain.bus_Data.loopId, 0 });
-                                //    }
-                                //    else if (curtain.trait_on_off.value.ToString() == "on")
-                                //    {
-                                //        ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, 100 });
-                                //    }
-                                //    else if (curtain.trait_on_off.value.ToString() == "off")
-                                //    {
-                                //        ControlBytesSend(Command.SetCurtainModelStutas, subnetId, deviceId, new byte[] { 17, 0 });
-                                //    }
-                                //}
                                 break;
                         }
                         break;
@@ -467,25 +517,26 @@
                         switch (function.spk)
                         {
                             case SPK.AcStandard:
-                                var aC = function as AC;
-                                ControlBytesSend(Command.SetACMode, subnetId, deviceId, new byte[] { aC.bus.LoopId, (byte)aC.curTempType, 32, 32, 32, 32, 32, 0, aC.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0, aC.curModeIndex(), aC.curFanIndex(), Convert.ToByte(aC.GetAttrState(FunctionAttributeKey.SetTemp)), 0 });
-                                //ControlBytesSend(Command.InstructionPanelKey, aC.bus_Data.SubnetID, aC.bus_Data.DeviceID, new byte[] { 3, aC.on_off == "on" ? (byte)1 : (byte)0, aC.bus_Data.loopId });
+                                var ac = new AC();
+                                ControlBytesSend(Command.SetACMode, subnetId, deviceId, new byte[] { function.bus.LoopId, 0, 32, 32, 32, 32, 32, 0, function.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0,
+                                    ac.GetModeIndex(function),
+                                    ac.GetFanIndex(function), Convert.ToByte(function.GetAttrState(FunctionAttributeKey.SetTemp)), 0 });
                                 foreach (var dic in commandDictionary)
                                 {
                                     switch (dic.Key)
                                     {
-                                        case "on_off":
-                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus.SubnetID, aC.bus.DeviceID, new byte[] { 3, aC.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0, aC.bus.LoopId });
+                                        case FunctionAttributeKey.OnOff:
+                                            ControlBytesSend(Command.InstructionPanelKey, function.bus.SubnetID, function.bus.DeviceID, new byte[] { 3, function.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0, function.bus.LoopId });
                                             break;
                                         case "mode":
-                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus.SubnetID, aC.bus.DeviceID, new byte[] { 6, aC.curModeIndex(), aC.bus.LoopId });
+                                            ControlBytesSend(Command.InstructionPanelKey, function.bus.SubnetID, function.bus.DeviceID, new byte[] { 6, ac.GetModeIndex(function), function.bus.LoopId });
                                             break;
                                         case "fan":
-                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus.SubnetID, aC.bus.DeviceID, new byte[] { 5, aC.curFanIndex(), aC.bus.LoopId });
+                                            ControlBytesSend(Command.InstructionPanelKey, function.bus.SubnetID, function.bus.DeviceID, new byte[] { 5, ac.GetFanIndex(function), function.bus.LoopId });
                                             break;
                                         case "temp":
                                             byte modeKey = 4;
-                                            switch (aC.curModeIndex())
+                                            switch (ac.GetModeIndex(function))
                                             {
                                                 case 3:
                                                     modeKey = 8;
@@ -503,7 +554,8 @@
                                                     modeKey = 2;
                                                     break;
                                             }
-                                            ControlBytesSend(Command.InstructionPanelKey, aC.bus.SubnetID, aC.bus.DeviceID, new byte[] { modeKey, Convert.ToByte(aC.GetAttrState(FunctionAttributeKey.SetTemp)), aC.bus.LoopId });
+                                            ControlBytesSend(Command.InstructionPanelKey, function.bus.SubnetID, function.bus.DeviceID, new byte[] {
+                                                modeKey, Convert.ToByte(function.GetAttrState(FunctionAttributeKey.SetTemp)), function.bus.LoopId });
                                             break;
                                         default:
                                             MainPage.Log($"鍔熻兘鏈敮鎸� : {dic.Key}");
@@ -515,38 +567,48 @@
                         }
                         break;
                     case FunctionCategory.FloorHeat:
-                        switch (function.spk) {
+                        var fhTemp = new FloorHeating();
+                        switch (function.spk)
+                        {
                             case SPK.FloorHeatStandard:
-                                var fh = function as FloorHeating;
-                                if (fh.modeTemp.Count == 4)
+                                if (function.Fh_Mode_Temp.Count == 4)
                                 {
-                                    byte b1 = fh.trait_on_off.curValue.ToString() == "on" ? (byte)1 : (byte)0;
-                                    if (fh.workMode > 0)
+                                    var onoffString = function.trait_on_off.curValue.ToString();
+                                    byte b1 = 1;
+                                    if(onoffString == "off")
                                     {
-                                        b1 += (byte)(16 + fh.workMode);
+                                        b1 = 0;
+                                    }
+                                    var wm = fhTemp.GetWorkModeIndex(function);
+                                    if (wm > 0)
+                                    {
+                                        b1 += (byte)(16 + wm);
                                     }
                                     if (commandDictionary.ContainsKey("temp"))
                                     {
                                         var dicTempString = "";
                                         commandDictionary.TryGetValue("temp", out dicTempString);
                                         var dicTemp = Convert.ToByte(dicTempString);
-                                        switch (fh.trait_mode.curValue)
+                                        var mode = function.GetAttrState(FunctionAttributeKey.Mode);
+                                        switch (mode)
                                         {
                                             case "day":
-                                                fh.modeTemp["day"] = dicTemp;
+                                                function.Fh_Mode_Temp["day"] = dicTemp;
                                                 break;
                                             case "night":
-                                                fh.modeTemp["night"] = dicTemp;
+                                                function.Fh_Mode_Temp["night"] = dicTemp;
                                                 break;
                                             case "away":
-                                                fh.modeTemp["away"] = dicTemp;
+                                                function.Fh_Mode_Temp["away"] = dicTemp;
                                                 break;
                                             case "normal":
-                                                fh.modeTemp["normal"] = dicTemp;
+                                                function.Fh_Mode_Temp["normal"] = dicTemp;
                                                 break;
                                         }
                                     }
-                                    ControlBytesSend(Command.SetFloorHeat, subnetId, deviceId, new byte[] { fh.bus.LoopId, b1, (byte)fh.curTempType, fh.curModeIndex, fh.modeTemp["normal"], fh.modeTemp["day"], fh.modeTemp["night"], fh.modeTemp["away"], 0, 0 });
+                                    var tt = fhTemp.GetTempUintIndex(function);
+                                    ControlBytesSend(Command.SetFloorHeat, subnetId, deviceId, new byte[] { function.bus.LoopId, b1,
+                                        (byte)tt,fhTemp.GetModeIndex(function), function.Fh_Mode_Temp["normal"], function.Fh_Mode_Temp["day"], function.Fh_Mode_Temp["night"], function.Fh_Mode_Temp["away"], 0, 0 });
                                 }
                                 break;
                         }
@@ -555,18 +617,16 @@
                         switch (function.spk)
                         {
                             case SPK.ElectricFan:
-                                var fan = function as Fan;
-                                if (fan.trait_on_off.curValue.ToString() == "on")
+                                if (function.trait_on_off.curValue.ToString() == "on")
                                 {
-                                    ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { fan.bus.LoopId, (byte)fan.openLevel });
+                                    ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus.LoopId, Convert.ToByte(function.GetAttrState(FunctionAttributeKey.OpenLevel)) });
                                 }
                                 {
-                                    ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { fan.bus.LoopId, 0 });
+                                    ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus.LoopId, 0 });
                                 }
                                 break;
                             case SPK.ElectricSocket:
-                                var s = function as SwitchSocket;
-                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { s.bus.LoopId, s.trait_on_off.curValue.ToString() == "on" ? (byte)100 : (byte)0 });
+                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus.LoopId, function.trait_on_off.curValue.ToString() == "on" ? (byte)100 : (byte)0 });
                                 break;
                         }
                         break;
@@ -642,17 +702,14 @@
                         switch (function.spk)
                         {
                             case SPK.ElectricFan:
-                                var fan = function as Fan;
-                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { fan.bus.LoopId });
+                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus.LoopId });
                                 break;
                             case SPK.ElectricSocket:
-                                var s = function as SwitchSocket;
-                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { s.bus.LoopId });
+                                ControlBytesSend(Command.SetSingleLight, subnetId, deviceId, new byte[] { function.bus.LoopId });
                                 break;
                         }
                         break;
                     case FunctionCategory.Sensor:
-                        var sensor = function as Sensor;
                         byte sensorType = 0;
                         switch (function.spk)
                         {
@@ -672,7 +729,7 @@
                                 sensorType = 7;
                                 break;
                         }
-                        ControlBytesSend(Command.ReadDeviceLoopInfo, subnetId, deviceId, new byte[] { 5, sensorType, sensor.bus.LoopId });
+                        ControlBytesSend(Command.ReadDeviceLoopInfo, subnetId, deviceId, new byte[] { 5, sensorType, function.bus.LoopId });
                         break;
                 }
             }
diff --git a/HDL_ON/DAL/DriverLayer/Packet.cs b/HDL_ON/DAL/DriverLayer/Packet.cs
index 323b918..1535a92 100644
--- a/HDL_ON/DAL/DriverLayer/Packet.cs
+++ b/HDL_ON/DAL/DriverLayer/Packet.cs
@@ -124,8 +124,8 @@
                 {
                     case Command.SetSingleLightACK:
                         var queryList = new List<Function>();
-                        queryList.AddRange(FunctionList.List.electricals);
-                        queryList.AddRange(FunctionList.List.lights);
+                        queryList.AddRange(FunctionList.List.GetElectricals());
+                        queryList.AddRange(FunctionList.List.GetLightList());
                         foreach (var updataObj in queryList)
                         {
                             if (updataObj.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0])
@@ -138,11 +138,11 @@
                                         switch (updataObj.spk)
                                         {
                                             case SPK.ElectricFan:
-                                                (updataObj as Fan).openLevel = receiveBytes[2];
+                                                updataObj.SetAttrState(FunctionAttributeKey.OpenLevel, receiveBytes[2].ToString());
                                                 updataObj.lastState = Language.StringByID(StringId.Level) + " : " + receiveBytes[2];
                                                 break;
                                             case SPK.LightDimming:
-                                                (updataObj as Light).brightness = receiveBytes[2];
+                                                updataObj.SetAttrState(FunctionAttributeKey.Brightness, receiveBytes[2].ToString());
                                                 updataObj.lastState = Language.StringByID(StringId.Brightness) + " : " + receiveBytes[2] + "%";
                                                 break;
                                         }
@@ -154,13 +154,13 @@
                                     switch (updataObj.spk)
                                     {
                                         case SPK.LightSwitch:
-                                            RelayPage.UpdataState(updataObj as Light);
+                                            RelayPage.UpdataState(updataObj);
                                             break;
                                         case SPK.LightDimming:
-                                            DimmerPage.UpdataStates(updataObj as Light);
+                                            DimmerPage.UpdataStates(updataObj);
                                             break;
                                         case SPK.ElectricFan:
-                                            FanPage.UpdataState(updataObj as Fan);
+                                            FanPage.UpdataState(updataObj);
                                             break;
                                     }
                                     break;
@@ -171,7 +171,7 @@
                     case Command.ReadLightAllLoopBrightnessACK:
                         for (int i = 0; i < receiveBytes[0]; i++)
                         {
-                            var light = FunctionList.List.lights.Find((obj) => obj.bus.SubnetID == subnetID && obj.bus.DeviceID == deviceID && obj.bus.LoopId == (i + 1));
+                            var light = FunctionList.List.GetLightList().Find((obj) => obj.bus.SubnetID == subnetID && obj.bus.DeviceID == deviceID && obj.bus.LoopId == (i + 1));
                             if (light != null)
                             {
                                 if (light.spk != SPK.LightRGB)
@@ -179,7 +179,7 @@
                                     light.trait_on_off.curValue = receiveBytes[light.bus.LoopId] == 0 ? "off" : "on";
                                     if (light.trait_on_off.curValue.ToString() == "on")
                                     {
-                                        light.brightness = receiveBytes[2];
+                                        light.SetAttrState(FunctionAttributeKey.Brightness, receiveBytes[2].ToString());
                                         light.lastState = Language.StringByID(StringId.Brightness) + " : " + receiveBytes[2] + "%";
                                     }
                                     HomePage.UpdataFunctionStates(light);
@@ -199,27 +199,26 @@
                             }
                             else
                             {
-                                var e = FunctionList.List.electricals.Find((obj) => obj.bus.SubnetID == subnetID && obj.bus.DeviceID == deviceID && obj.bus.LoopId == i);
-                                if (e != null)
+                                var function = FunctionList.List.GetElectricals().Find((obj) => obj.bus.SubnetID == subnetID && obj.bus.DeviceID == deviceID && obj.bus.LoopId == i);
+                                if (function != null)
                                 {
-                                    var fan = e as Fan;
-                                    fan.trait_on_off.curValue = receiveBytes[2] == 0 ? "off" : "on";
-                                    if (fan.trait_on_off.curValue.ToString() == "on")
+                                    function.SetAttrState(FunctionAttributeKey.OnOff, receiveBytes[2] == 0 ? "off" : "on");
+                                    if (function.trait_on_off.curValue.ToString() == "on")
                                     {
-                                        fan.openLevel = receiveBytes[2];
-                                        fan.lastState = Language.StringByID(StringId.Level) + " : " + receiveBytes[2];
+                                        function.SetAttrState(FunctionAttributeKey.OpenLevel, receiveBytes[2].ToString());
+                                        function.lastState = Language.StringByID(StringId.Level) + " : " + receiveBytes[2];
                                     }
-                                    HomePage.UpdataFunctionStates(fan);
-                                    RoomPage.UpdataStates(fan);
-                                    FunctionPage.UpdataStates(fan);
-                                    ClassificationPage.UpdataInfo(fan);
-                                    switch (fan.spk)
+                                    HomePage.UpdataFunctionStates(function);
+                                    RoomPage.UpdataStates(function);
+                                    FunctionPage.UpdataStates(function);
+                                    ClassificationPage.UpdataInfo(function);
+                                    switch (function.spk)
                                     {
                                         case SPK.ElectricFan:
-                                            FanPage.UpdataState(fan);
+                                            FanPage.UpdataState(function);
                                             break;
                                         case SPK.ElectricSocket:
-
+                                            SocketPage.UpdataState(function);
                                             break;
                                     }
                                 }
@@ -228,7 +227,7 @@
                         break;
                     case Command.SetLogicLoopColorACK:
                     case Command.ReadLogicLoopColorACK:
-                        foreach (var rgb in FunctionList.List.lights)
+                        foreach (var rgb in FunctionList.List.GetLightList())
                         {
                             if (rgb.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0])
                             {
@@ -237,10 +236,10 @@
                                     rgb.trait_on_off.curValue = receiveBytes[1] > 0 ? "on" : "off";
                                     if (receiveBytes[1] > 0)
                                     {
-                                        rgb.brightness = receiveBytes[1];
+                                        rgb.SetAttrState(FunctionAttributeKey.Brightness, receiveBytes[1].ToString());
                                         rgb.lastState = Language.StringByID(StringId.Brightness) + " : " + receiveBytes[1] + "%";
                                     }
-                                    rgb.SetRGBcolor(new byte[] { receiveBytes[6], receiveBytes[7], receiveBytes[8] });
+                                    new Light().SetRGBcolor(new byte[] { receiveBytes[6], receiveBytes[7], receiveBytes[8] }, rgb);
 
                                     HomePage.UpdataFunctionStates(rgb);
                                     RoomPage.UpdataStates(rgb);
@@ -253,7 +252,7 @@
                         break;
                     case Command.SetCurtainModelStutasACK:
                     case Command.ReadCurtainStutasACK:
-                        foreach (var curtain in FunctionList.List.curtains)
+                        foreach (var curtain in FunctionList.List.GetCurtainList())
                         {
                             if (curtain.bus.SubnetID == subnetID && curtain.bus.DeviceID == deviceID)
                             {
@@ -267,8 +266,8 @@
                                     {
                                         curtain.trait_on_off.curValue = "off";
                                     }
-                                    curtain.percent = receiveBytes[1];
-                                    curtain.lastState = Language.StringByID(StringId.Open) + curtain.percent + "%";
+                                    curtain.SetAttrState(FunctionAttributeKey.Percent, receiveBytes[1].ToString());
+                                    curtain.lastState = Language.StringByID(StringId.Open) + curtain.GetAttrState(FunctionAttributeKey.Percent) + "%";
                                 }
                                 else
                                 {
@@ -310,149 +309,157 @@
                         break;
                     case Command.SetACModeACK:
                     case Command.ReadACModeACK:
-                        foreach (var ac in FunctionList.List.aCs)
+                        foreach (var function in FunctionList.List.GetAcList())
                         {
-                            if (ac.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0])
+                            var acFunction = new AC();
+                            if (function.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0])
                             {
-                                ac.curTempType = receiveBytes[1];
-                                ac.SetAttrState(FunctionAttributeKey.IndoorTemp, receiveBytes[2].ToString());
-                                ac.trait_on_off.curValue = receiveBytes[8] == 1 ? "on" : "off";
-                                ac.SetModeIndex(receiveBytes[9]);
-                                ac.SetFanIndex(receiveBytes[10]);
-                                ac.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[11].ToString());
-                                ac.lastState = "";
-                                switch (ac.GetAttrState(FunctionAttributeKey.Mode))
+                                function.SetAttrState(FunctionAttributeKey.TempType, receiveBytes[1].ToString());
+                                function.SetAttrState(FunctionAttributeKey.IndoorTemp, receiveBytes[2].ToString());
+                                function.trait_on_off.curValue = receiveBytes[8] == 1 ? "on" : "off";
+                                acFunction.SetMode(receiveBytes[9],function);
+                                acFunction.SetFan(receiveBytes[10],function);
+                                function.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[11].ToString());
+                                function.lastState = "";
+                                switch (function.GetAttrState(FunctionAttributeKey.Mode))
                                 {
                                     case "cool":
-                                        ac.lastState = Language.StringByID(StringId.Cool);
+                                        function.lastState = Language.StringByID(StringId.Cool);
                                         break;
                                     case "heat":
-                                        ac.lastState = Language.StringByID(StringId.Heat);
+                                        function.lastState = Language.StringByID(StringId.Heat);
                                         break;
                                     case "dry":
-                                        ac.lastState = Language.StringByID(StringId.Dry);
+                                        function.lastState = Language.StringByID(StringId.Dry);
                                         break;
                                     case "auto":
-                                        ac.lastState = Language.StringByID(StringId.Auto);
+                                        function.lastState = Language.StringByID(StringId.Auto);
                                         break;
                                     case "fan":
-                                        ac.lastState = Language.StringByID(StringId.AirSupply);
+                                        function.lastState = Language.StringByID(StringId.AirSupply);
                                         break;
                                 }
-                                switch (ac.GetAttrState(FunctionAttributeKey.FanSpeed))
+                                switch (function.GetAttrState(FunctionAttributeKey.FanSpeed))
                                 {
                                     case "high":
-                                        ac.lastState += " " + Language.StringByID(StringId.HighWindSpeed);
+                                        function.lastState += " " + Language.StringByID(StringId.HighWindSpeed);
                                         break;
                                     case "medium":
-                                        ac.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed);
+                                        function.lastState += " " + Language.StringByID(StringId.MiddleWindSpeed);
                                         break;
                                     case "low":
-                                        ac.lastState += " " + Language.StringByID(StringId.LowWindSpeed);
+                                        function.lastState += " " + Language.StringByID(StringId.LowWindSpeed);
                                         break;
                                     case "auto":
-                                        ac.lastState += " " + Language.StringByID(StringId.Auto);
+                                        function.lastState += " " + Language.StringByID(StringId.Auto);
                                         break;
                                 }
-                                ac.lastState += " " + ac.GetAttrState(FunctionAttributeKey.SetTemp) + ac.tempUnitString;
-                                RoomPage.UpdataStates(ac);
-                                FunctionPage.UpdataStates(ac);
-                                HomePage.UpdataFunctionStates(ac);
-                                ClassificationPage.UpdataInfo(ac);
-                                ACPage.UpdataStates(ac);
+                                function.lastState += " " + function.GetAttrState(FunctionAttributeKey.SetTemp) + acFunction.GetTempUnitString(function);
+                                RoomPage.UpdataStates(function);
+                                FunctionPage.UpdataStates(function);
+                                HomePage.UpdataFunctionStates(function);
+                                ClassificationPage.UpdataInfo(function);
+                                ACPage.UpdataStates(function);
                             }
                         }
                         break;
                     case Command.ReadFloorHeatACK:
                     case Command.SetFloorHeatACK:
-                        foreach (var fh in FunctionList.List.floorHeatings)
+                        foreach (var function in FunctionList.List.GetFloorHeatingList())
                         {
-                            if (fh.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0])
+                            if (function.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0])
                             {
-                                fh.curTempType = receiveBytes[2];
-                                fh.trait_on_off.curValue = receiveBytes[1] % 2 == 0 ? "off" : "on";
-                                fh.curModeIndex = receiveBytes[3];
-                                if (fh.modeTemp.ContainsKey("normal"))
+                                function.SetAttrState(FunctionAttributeKey.TempType, receiveBytes[2]);
+                                function.trait_on_off.curValue = receiveBytes[1] % 2 == 0 ? "off" : "on";
+                                new FloorHeating().SetModeIndex(receiveBytes[3],function);
+
+                                if (function.Fh_Mode_Temp.ContainsKey("normal"))
                                 {
-                                    fh.modeTemp["normal"] = receiveBytes[4];
+                                    function.Fh_Mode_Temp["normal"] = receiveBytes[4];
                                 }
                                 else
                                 {
-                                    fh.modeTemp.Add("normal", receiveBytes[4]);
+                                    function.Fh_Mode_Temp.Add("normal", receiveBytes[4]);
                                 }
-                                if (fh.modeTemp.ContainsKey("day"))
+                                if (function.Fh_Mode_Temp.ContainsKey("day"))
                                 {
-                                    fh.modeTemp["day"] = receiveBytes[5];
+                                    function.Fh_Mode_Temp["day"] = receiveBytes[5];
                                 }
                                 else
                                 {
-                                    fh.modeTemp.Add("day", receiveBytes[5]);
+                                    function.Fh_Mode_Temp.Add("day", receiveBytes[5]);
                                 }
-                                if (fh.modeTemp.ContainsKey("night"))
+                                if (function.Fh_Mode_Temp.ContainsKey("night"))
                                 {
-                                    fh.modeTemp["night"] = receiveBytes[6];
+                                    function.Fh_Mode_Temp["night"] = receiveBytes[6];
                                 }
                                 else
                                 {
-                                    fh.modeTemp.Add("night", receiveBytes[6]);
+                                    function.Fh_Mode_Temp.Add("night", receiveBytes[6]);
                                 }
-                                if (fh.modeTemp.ContainsKey("away"))
+                                if (function.Fh_Mode_Temp.ContainsKey("away"))
                                 {
-                                    fh.modeTemp["away"] = receiveBytes[7];
+                                    function.Fh_Mode_Temp["away"] = receiveBytes[7];
                                 }
                                 else
                                 {
-                                    fh.modeTemp.Add("away", receiveBytes[7]);
+                                    function.Fh_Mode_Temp.Add("away", receiveBytes[7]);
                                 }
 
-                                switch (fh.trait_mode.curValue)
+                                switch (function.GetAttrState(FunctionAttributeKey.Mode))
                                 {
                                     case "normal":
-                                        fh.lastState = Language.StringByID(StringId.Normal);
-                                        fh.trait_temp.curValue = receiveBytes[4].ToString();
+                                        function.lastState = Language.StringByID(StringId.Normal);
+                                        function.SetAttrState(FunctionAttributeKey.SetTemp,receiveBytes[4].ToString());
                                         break;
                                     case "day":
-                                        fh.lastState = Language.StringByID(StringId.Day);
-                                        fh.trait_temp.curValue = receiveBytes[5].ToString();
+                                        function.lastState = Language.StringByID(StringId.Day);
+                                        function.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[5].ToString());
                                         break;
                                     case "night":
-                                        fh.lastState = Language.StringByID(StringId.Night);
-                                        fh.trait_temp.curValue = receiveBytes[6].ToString();
+                                        function.lastState = Language.StringByID(StringId.Night);
+                                        function.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[6].ToString());
                                         break;
                                     case "timer":
-                                        fh.lastState = Language.StringByID(StringId.Auto);
+                                        function.lastState = Language.StringByID(StringId.Auto);
                                         if (receiveBytes[8] == 0)
                                         {
-                                            fh.timeFlag = 0;
-                                            fh.trait_temp.curValue = receiveBytes[5].ToString();
+                                            function.SetAttrState(FunctionAttributeKey.TimeFlag, 0);
+                                            function.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[5].ToString());
                                         }
                                         else
                                         {
-                                            fh.timeFlag = 1;
-                                            fh.trait_temp.curValue = receiveBytes[6].ToString();
+                                            function.SetAttrState(FunctionAttributeKey.TimeFlag, 1);
+                                            function.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[6].ToString());
                                         }
                                         break;
                                     case "away":
-                                        fh.trait_temp.curValue = receiveBytes[7].ToString();
-                                        fh.lastState = Language.StringByID(StringId.Away);
+                                        function.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[7].ToString());
+                                        function.lastState = Language.StringByID(StringId.Away);
                                         break;
                                 }
+                                var indoorTemp = 0;
+                                if (receiveBytes[9] > 128)
+                                {
+                                    indoorTemp = 1 - (receiveBytes[9] - 128);
+                                }else
+                                {
+                                    indoorTemp = receiveBytes[9];
+                                }
+                                function.SetAttrState(FunctionAttributeKey.IndoorTemp, indoorTemp);
 
-                                fh.trait_IndoorTemp.curValue = receiveBytes[9] > 128 ? (1 - (receiveBytes[9] - 128)) : receiveBytes[9];
-
-                                fh.lastState += " " + fh.trait_temp.curValue + fh.tempUnitString;
-                                RoomPage.UpdataStates(fh);
-                                FunctionPage.UpdataStates(fh);
-                                HomePage.UpdataFunctionStates(fh);
-                                ClassificationPage.UpdataInfo(fh);
-                                FloorHeatingPage.UpdataStates(fh);
+                                function.lastState += " " + function.GetAttrState(FunctionAttributeKey.Mode) + new FloorHeating().GetTempUnitString(function);
+                                RoomPage.UpdataStates(function);
+                                FunctionPage.UpdataStates(function);
+                                HomePage.UpdataFunctionStates(function);
+                                ClassificationPage.UpdataInfo(function);
+                                FloorHeatingPage.UpdataStates(function);
                             }
                         }
                         break;
                     case Command.ReadDeviceLoopInfoACK:
-                        //FunctionType dt = (FunctionType)(11 * 256 + receiveBytes[1]);
                         string tag = receiveBytes[1] + "_" + subnetID + "_" + deviceID + "_" + receiveBytes[2];
-                        foreach (var sensor in FunctionList.List.sensorsEnvironmentalScience)
+                        foreach (var sensor in FunctionList.List.GetEnvirSensorsList())
                         {
                             byte sensorType = 0;
                             switch (sensor.spk)
@@ -482,19 +489,19 @@
                                     {
                                         case SPK.SensorTemperature:
                                             byte[] tempBytes = new byte[] { receiveBytes[24], receiveBytes[25], receiveBytes[26], receiveBytes[27] };
-                                            sensor.values = Math.Round(BitConverter.ToSingle(tempBytes, 0), 1);
+                                            sensor.SetAttrState(FunctionAttributeKey.Value,Math.Round(BitConverter.ToSingle(tempBytes, 0), 1).ToString());
                                             break;
                                         case SPK.SensorHumidity:
-                                            sensor.values = Convert.ToDouble(receiveBytes[24] * 256 + receiveBytes[25]) / 10;
+                                            sensor.SetAttrState(FunctionAttributeKey.Value, (Convert.ToDouble(receiveBytes[24] * 256 + receiveBytes[25]) / 10).ToString());
                                             break;
                                         case SPK.SensorTVOC:
-                                            sensor.values = Convert.ToDouble(receiveBytes[24] * 256 + receiveBytes[25]) / 100;
+                                            sensor.SetAttrState(FunctionAttributeKey.Value, (Convert.ToDouble(receiveBytes[24] * 256 + receiveBytes[25]) / 100).ToString());
                                             break;
                                         case SPK.SensorPm25:
-                                            sensor.values = Convert.ToInt32(receiveBytes[24] * 256 + receiveBytes[25]);
+                                            sensor.SetAttrState(FunctionAttributeKey.Value,Convert.ToInt32(receiveBytes[24] * 256 + receiveBytes[25]).ToString());
                                             break;
                                         case SPK.SensorCO2:
-                                            sensor.values = Convert.ToInt32(receiveBytes[24] * 256 + receiveBytes[25]);
+                                            sensor.SetAttrState(FunctionAttributeKey.Value, Convert.ToInt32(receiveBytes[24] * 256 + receiveBytes[25]).ToString());
                                             break;
                                     }
                                     EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor);
@@ -504,7 +511,7 @@
                         break;
                     case Command.New_Analog_Quantity_BROADCAST:
                         string tag1 = receiveBytes[1] + "_" + subnetID + "_" + deviceID + "_" + receiveBytes[2];
-                        foreach (var sensor in FunctionList.List.sensorsEnvironmentalScience)
+                        foreach (var sensor in FunctionList.List.GetEnvirSensorsList())
                         {
                             byte sensorType = 0;
                             switch (sensor.spk)
@@ -534,21 +541,24 @@
                                     switch (receiveBytes[3])
                                     {
                                         case 1:
-                                            sensor.values = (receiveBytes[5] * 256 * 256 * 256) + (receiveBytes[6] * 256 * 256) + (receiveBytes[7] * 256) + receiveBytes[8];
+                                            sensor.SetAttrState(FunctionAttributeKey.Value,( (receiveBytes[5] * 256 * 256 * 256) + (receiveBytes[6] * 256 * 256) + (receiveBytes[7] * 256) + receiveBytes[8]).ToString());
                                             break;
                                         case 2:
-                                            sensor.values = -1 * ((receiveBytes[5] * 256 * 256 * 256) + (receiveBytes[6] * 256 * 256) + (receiveBytes[7] * 256) + receiveBytes[8]);
+                                            sensor.SetAttrState(FunctionAttributeKey.Value,( -1 * ((receiveBytes[5] * 256 * 256 * 256) + (receiveBytes[6] * 256 * 256) + (receiveBytes[7] * 256) + receiveBytes[8])).ToString());
                                             break;
                                         case 3:
                                             byte[] tempBytes = new byte[] { receiveBytes[5], receiveBytes[6], receiveBytes[7], receiveBytes[8] };
-                                            sensor.values = Math.Round(BitConverter.ToSingle(tempBytes, 0), 1);
+                                            sensor.SetAttrState(FunctionAttributeKey.Value,( Math.Round(BitConverter.ToSingle(tempBytes, 0), 1)).ToString());
                                             break;
                                     }
                                     switch (receiveBytes[4])
                                     {
                                         case 2:
                                             if (receiveBytes[1] == 5)//TVOC闇�姹傞櫎浠�100000
-                                                sensor.values /= 100000;
+                                            {
+                                                var value = Convert.ToInt32(sensor.GetAttrState(FunctionAttributeKey.Value));
+                                                sensor.SetAttrState(FunctionAttributeKey.Value, (value /= 100000).ToString());
+                                            }
                                             break;
                                     }
                                     EnvironmentalSciencePage.LoadEvent_UpdataStatus(sensor);
@@ -571,42 +581,43 @@
                         {
                             break;
                         }
-                        foreach (var ac in FunctionList.List.aCs)
+                        foreach (var function in FunctionList.List.GetAcList())
                         {
-                            if (ac.GetBusId() == subnetID + "_" + deviceID + "_" + reACPanel)
+                            var acFunction = new AC();
+                            if (function.GetBusId() == subnetID + "_" + deviceID + "_" + reACPanel)
                             {
                                 switch (receiveBytes[0])
                                 {
                                     case 3://
-                                        ac.trait_on_off.curValue = receiveBytes[1] == 1 ? "on" : "off";
+                                        function.trait_on_off.curValue = receiveBytes[1] == 1 ? "on" : "off";
                                         break;
                                     case 4:
                                     case 7:
                                     case 8:
                                     case 19:
-                                        ac.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[1].ToString());
+                                        function.SetAttrState(FunctionAttributeKey.SetTemp, receiveBytes[1].ToString());
                                         break;
                                     case 5:
-                                        ac.SetFanIndex ( receiveBytes[1]);
+                                        acFunction.SetFan ( receiveBytes[1],function);
                                         break;
                                     case 6:
-                                        ac.SetModeIndex ( receiveBytes[1]);
+                                        acFunction.SetMode ( receiveBytes[1],function);
                                         break;
 
                                 }
-                                ac.lastState = "";
-                                ac.lastState += " " + ac.GetAttrState(FunctionAttributeKey.SetTemp) + ac.tempUnitString;
-                                RoomPage.UpdataStates(ac);
-                                FunctionPage.UpdataStates(ac);
-                                HomePage.UpdataFunctionStates(ac);
-                                ClassificationPage.UpdataInfo(ac);
-                                ACPage.UpdataStates(ac);
+                                function.lastState = "";
+                                function.lastState += " " + function.GetAttrState(FunctionAttributeKey.SetTemp) + acFunction.GetTempUnitString(function);
+                                RoomPage.UpdataStates(function);
+                                FunctionPage.UpdataStates(function);
+                                HomePage.UpdataFunctionStates(function);
+                                ClassificationPage.UpdataInfo(function);
+                                ACPage.UpdataStates(function);
                             }
                         }
                         break;
                     case Command.ReadPanleTempACK://1944
                     case Command.PanleBroadcastTemp:
-                        foreach (var ac in FunctionList.List.aCs)
+                        foreach (var ac in FunctionList.List.GetAcList())
                         {
                             if (ac.GetBusId() == subnetID + "_" + deviceID + "_" + receiveBytes[0])
                             {
diff --git a/HDL_ON/Entity/Function/AC.cs b/HDL_ON/Entity/Function/AC.cs
index 9b76ee4..e05d976 100644
--- a/HDL_ON/Entity/Function/AC.cs
+++ b/HDL_ON/Entity/Function/AC.cs
@@ -4,30 +4,55 @@
 
 namespace HDL_ON.Entity
 {
-    public class AC : Function
+    public class AC 
     {
-        /// <summary>
-        /// 褰撳墠娓╁害妯″紡
-        /// 0:鎽勬皬搴�
-        /// 1:鍗庢皬搴�
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int curTempType = 0;
         /// <summary>
         /// 褰撳墠娓╁害妯″紡瀛楃
         /// </summary>
-        public string tempUnitString
+        public string GetTempUnitString(Function function)
         {
-            get
+            var tt = function.GetAttrState(FunctionAttributeKey.TempType);
+            if (tt == "0")
             {
-                if (curTempType == 0)
-                {
-                    return "掳C";
-                }
-                else
-                {
-                    return "掳F";
-                }
+                return "掳C";
+            }
+            else
+            {
+                return tt;
+            }
+        }
+
+        /// <summary>
+        /// 鑾峰彇娓╁害鍗曚綅bus鏍囪瘑
+        /// </summary>
+        /// <param name="function"></param>
+        /// <returns></returns>
+        public int GetTempUintIndex(Function function)
+        {
+            var tt = function.GetAttrState(FunctionAttributeKey.TempType);
+            if(tt == "掳F")
+            {
+                return 1;
+            }
+            else
+            {
+                return 0;
+            }
+        }
+        /// <summary>
+        /// 鏍规嵁bus鏍囪瘑璁剧疆娓╁害鍗曚綅
+        /// </summary>
+        /// <param name="function"></param>
+        /// <returns></returns>
+        public void SetTempUint(Function function,int index)
+        {
+            if (index == 0)
+            {
+                function.SetAttrState(FunctionAttributeKey.TempType, "掳C");
+            }
+            else
+            {
+                function.SetAttrState(FunctionAttributeKey.TempType, "掳F");
             }
         }
 
@@ -35,46 +60,38 @@
         /// 褰撳墠妯″紡绱㈠紩
         /// bus鎺у埗鍛戒护浣跨敤
         /// </summary>
-        public byte curModeIndex()
+        public byte GetModeIndex(Function function)
         {
-            try
+            var value = function.GetAttrState(FunctionAttributeKey.Mode);
+            byte index = 0;
+            switch (value)
             {
-                string value = GetAttrState(FunctionAttributeKey.Mode);
-                byte index = 0;
-                switch (value)
-                {
-                    case "auto":
-                        index = 3;
-                        break;
-                    case "cool":
-                        index = 0;
-                        break;
-                    case "heat":
-                        index = 1;
-                        break;
-                    case "dry":
-                        index = 4;
-                        break;
-                    case "fan":
-                        index = 2;
-                        break;
-                    default:
-                        index = 0;
-                        break;
-                }
-                return index;
+                case "auto":
+                    index = 3;
+                    break;
+                case "cool":
+                    index = 0;
+                    break;
+                case "heat":
+                    index = 1;
+                    break;
+                case "dry":
+                    index = 4;
+                    break;
+                case "fan":
+                    index = 2;
+                    break;
+                default:
+                    index = 0;
+                    break;
             }
-            catch (Exception ex)
-            {
-                MainPage.Log($"get curModeIndex error : {ex.Message}");
-                return 0;
-            }
+            return index;
         }
 
         /// <summary>
-        /// 璁剧疆bus鍗忚妯″紡鏍囪
+        /// 璁剧疆bus鍗忚鏍囪璁剧疆a鍗忚鏁版嵁
         /// </summary>
-        public void SetModeIndex(int index)
+        public void SetMode(int index , Function function)
         {
             string value = "auto";
             switch (index)
@@ -95,49 +112,41 @@
                     value = "fan";
                     break;
             }
-            SetAttrState(FunctionAttributeKey.Mode, value);
+            function.SetAttrState(FunctionAttributeKey.Mode, value);
         }
 
         /// <summary>
         /// 褰撳墠椋庨�熺储寮�
         /// bus鎺у埗鍛戒护浣跨敤
         /// </summary>
-        public byte curFanIndex()
+        public byte GetFanIndex(Function function)
         {
-            try
+            var value = function.GetAttrState(FunctionAttributeKey.FanSpeed);
+            byte index = 0;
+            switch (value)
             {
-                string value = GetAttrState(FunctionAttributeKey.FanSpeed);
-                byte index = 0;
-                switch (value)
-                {
-                    case "high":
-                        index = 1;
-                        break;
-                    case "medium":
-                        index = 2;
-                        break;
-                    case "low":
-                        index = 3;
-                        break;
-                    case "auto":
-                        index = 0;
-                        break;
-                    default:
-                        index = 0;
-                        break;
-                }
-                return index;
+                case "high":
+                    index = 1;
+                    break;
+                case "medium":
+                    index = 2;
+                    break;
+                case "low":
+                    index = 3;
+                    break;
+                case "auto":
+                    index = 0;
+                    break;
+                default:
+                    index = 0;
+                    break;
             }
-            catch (Exception ex)
-            {
-                MainPage.Log($"get curFanIndex error : {ex.Message}");
-                return 0;
-            }
+            return index;
         }
         /// <summary>
-        /// 璁剧疆bus鍗忚椋庨�熸爣璁�
+        /// 鏍规嵁bus鍗忚椋庨�熸爣璁拌缃產鍗忚鏍囪
         /// </summary>
-        public void SetFanIndex(int index)
+        public void SetFan(int index,Function function)
         {
             string value = "high";
             switch (index)
@@ -155,195 +164,20 @@
                     value = "auto";
                     break;
             }
-            SetAttrState(FunctionAttributeKey.FanSpeed, value);
+            function.SetAttrState(FunctionAttributeKey.FanSpeed, value);
         }
-
-        /*  鍘绘帀琛嶇敓灞炴�э紝閫氳繃base.GetAttrState 鏌ユ壘灞炴�т笌鐘舵��
-        FunctionAttributes _trait_mode;
-        /// <summary>
-        /// 妯″紡灞炴��
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_mode
-        {
-            get
-            {
-                if (_trait_mode == null)
-                {
-                    _trait_mode = attributes.Find((obj) => obj.key == "mode");
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_mode == null)
-                    {
-                        _trait_mode = new FunctionAttributes()
-                        {
-                            key = "mode",
-                            value = new List<string> { "auto", "cool", "heat", "dry", "fan" },
-                            max = 4,
-                            min = 0,
-                        };
-                    }
-                }
-                if (_trait_mode.curValue.ToString() == "{}")
-                    _trait_mode.curValue = "cool";
-                return _trait_mode;
-            }
-        }
-
-        FunctionAttributes _trait_fan;
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_fan
-        {
-            get
-            {
-                if (_trait_fan == null)
-                {
-                    _trait_fan = attributes.Find((obj) => obj.key == "fan");
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_fan == null)
-                    {
-                        _trait_fan = new FunctionAttributes()
-                        {
-                            key = "fan",
-                            value = new List<string> { "high", "medium", "low", "auto" },
-                            max = 3,
-                            min = 0,
-                            curValue = "high"
-                        };
-                    }
-                }
-                if (_trait_fan.curValue.ToString() == "{}")
-                    _trait_fan.curValue = "high";
-                return _trait_fan;
-            }
-        }
-
-        FunctionAttributes _trait_temp;
-        /// <summary>
-        /// 褰撳墠绌鸿皟娓╁害
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_temp
-        {
-            get
-            {
-                if (_trait_temp == null)
-                {
-                    _trait_temp = attributes.Find((obj) => obj.key == "set_temp");
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_temp == null)
-                    {
-                        _trait_temp = new FunctionAttributes()
-                        {
-                            key = "set_temp",
-                            value = new List<string> { },
-                            max = 32,
-                            min = 16,
-                        };
-                    }
-                }
-                if (_trait_temp.curValue.ToString() == "{}")
-                {
-                    _trait_temp.curValue = 16;
-                }
-                double vv = 16;
-                Double.TryParse(_trait_temp.curValue.ToString(), out vv);
-                _trait_temp.curValue = Convert.ToInt32(vv);
-                return _trait_temp;
-            }
-        }
-
-        FunctionAttributes _trait_swting;
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_swting
-        {
-            get
-            {
-                if (_trait_swting == null)
-                {
-                    _trait_swting = attributes.Find((obj) => obj.key == "swting");
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_swting == null)
-                    {
-                        _trait_swting = new FunctionAttributes()
-                        {
-                            key = "swting",
-                            value = new List<string> { "up", "down", "left", "right" },
-                            max = 3,
-                            min = 0,
-                        };
-                    }
-                }
-                if (_trait_swting.curValue.ToString() == "{}")
-                    _trait_swting.curValue = "up";
-                return _trait_swting;
-            }
-        } 
-        /// <summary>
-        /// 绌鸿皟鎵妯″紡鍒楄〃
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public List<string> swting
-        {
-            get
-            {
-                try
-                {
-                    return trait_swting.value;
-                }
-                catch (Exception ex)
-                {
-                    MainPage.Log($"ac get swting error : {ex.Message}");
-                    return new List<string> { "up", "down", "left", "right" };
-                }
-            }
-        }
-        FunctionAttributes _trait_IndoorTemp;
-        /// <summary>
-        /// 瀹ゅ唴娓╁害
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_IndoorTemp
-        {
-            get
-            {
-                if (_trait_IndoorTemp == null)
-                {
-                    _trait_IndoorTemp = attributes.Find((obj) => obj.key == FunctionAttributeKey.IndoorTemp);
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_IndoorTemp == null)
-                    {
-                        _trait_IndoorTemp = new FunctionAttributes()
-                        {
-                            key = FunctionAttributeKey.IndoorTemp,
-                            value = new List<string> { },
-                            max = 30,
-                            min = 0,
-                        };
-                    }
-                }
-                if (_trait_IndoorTemp.curValue.ToString() == "{}")
-                {
-                    _trait_IndoorTemp.curValue = 0;
-                }
-                var vv = Convert.ToDouble(_trait_IndoorTemp.curValue);
-                _trait_IndoorTemp.curValue = Convert.ToInt32(vv);
-                return _trait_IndoorTemp;
-            }
-        }
-        */
 
         /// <summary>
         /// 褰撳墠妯″紡鐨刬con璺緞
         /// </summary>
         /// <param name="lightingIcon">鑾峰彇鐨勫浘鏍囩被鍨嬶紝榛樿鏄偣浜�</param>
         /// <returns></returns>
-        public string GetModeIconPath(bool lightingIcon = true)
+        public string GetModeIconPath(string modeValue , bool lightingIcon = true)
         {
-            var value = GetAttrState(FunctionAttributeKey.Mode);
             var imagePath = "FunctionIcon/AC/CoolIcon.png";
             if (lightingIcon)
             {
-                switch (value)
+                switch (modeValue)
                 {
                     case "auto":
                         imagePath = "FunctionIcon/AC/AutoIcon.png";
@@ -368,7 +202,7 @@
             else
             {
                 imagePath = "FunctionIcon/AC/AutoIconGray.png";
-                switch (value)
+                switch (modeValue)
                 {
                     case "auto":
                         imagePath = "FunctionIcon/AC/AutoIconGray.png";
@@ -395,13 +229,12 @@
         /// </summary>
         /// <param name="lightingIcon">鑾峰彇鐨勫浘鏍囩被鍨嬶紝榛樿鏄偣浜�</param>
         /// <returns></returns>
-        public string GetFanIconPath(bool lightingIcon = true)
+        public string GetFanIconPath(string modeValue, bool lightingIcon = true)
         {
-            string value = GetAttrState(FunctionAttributeKey.FanSpeed);
             var imagePath = "FunctionIcon/AC/WindHighIcon.png";
             if (lightingIcon)
             {
-                switch (value)
+                switch (modeValue)
                 {
                     case "high":
                         imagePath = "FunctionIcon/AC/WindHighIcon.png";
@@ -419,7 +252,7 @@
             }
             else
             {
-                switch (value)
+                switch (modeValue)
                 {
                     case "high":
                         imagePath = "FunctionIcon/AC/WindHighIconGray.png";
diff --git a/HDL_ON/Entity/Function/AirCleaner.cs b/HDL_ON/Entity/Function/AirCleaner.cs
index 5ed7559..4eb0fb6 100644
--- a/HDL_ON/Entity/Function/AirCleaner.cs
+++ b/HDL_ON/Entity/Function/AirCleaner.cs
@@ -1,7 +1,7 @@
 锘縰sing System;
 namespace HDL_ON.Entity
 {
-    public class AirCleaner : Function
+    public class AirCleaner 
     {
         public AirCleaner()
         {
diff --git a/HDL_ON/Entity/Function/Curtain.cs b/HDL_ON/Entity/Function/Curtain.cs
index ee1da9d..630b044 100644
--- a/HDL_ON/Entity/Function/Curtain.cs
+++ b/HDL_ON/Entity/Function/Curtain.cs
@@ -4,73 +4,12 @@
 
 namespace HDL_ON.Entity
 {
-    public class Curtain : Function
+    public class Curtain
     {
-        /*
-        绐楀笜灞炴�у垪琛細trait: [switch,percent,lock]
-        灞炴��	鎻忚堪
-        on_off	on/off/stop;
-        percent	0-100;
-        lock	boolean (Lock閿佸畾鎺у埗)
-        */
-        public Curtain()
+        public int GetPercent(Function function)
         {
-        }//percent
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_percent;
-        /// <summary>
-        /// 寮�鍏崇櫨鍒嗘瘮
-        /// 0-100
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int percent
-        {
-            get
-            {
-                try
-                {
-                    if(trait_percent==null)
-                    {
-                        trait_percent = attributes.Find((obj) => obj.key == "percent");
-                        if (trait_percent == null)
-                        {
-                            trait_percent = new FunctionAttributes()
-                            {
-                                key = "percent",
-                                value = new List<string> { "up", "down" },
-                                max = 100,
-                                min = 0,
-                                curValue = 0
-                            };
-                        }
-                        if (trait_percent.curValue.ToString() == "{}")
-                            trait_percent.curValue = 0;
-                    }
-                    string textValue = trait_percent.curValue.ToString();
-                    if (textValue == string.Empty)
-                    {
-                        trait_percent.curValue = 0;
-                    }
-                    return Convert.ToInt32( trait_percent.curValue);
-                }
-                catch
-                {
-                    MainPage.Log("percent 鏁版嵁鑾峰彇澶辫触.");
-                    return 0;
-                }
-            }
-            set
-            {
-                try
-                {
-                    trait_percent.curValue = value;
-                }
-                catch
-                {
-                    MainPage.Log("percent 鏁版嵁鍒锋柊澶辫触.");
-                }
-            }
+            return Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Percent));
         }
-
+       
     }
 }
diff --git a/HDL_ON/Entity/Function/DeviceFunction.cs b/HDL_ON/Entity/Function/DeviceFunction.cs
deleted file mode 100644
index 7638ed0..0000000
--- a/HDL_ON/Entity/Function/DeviceFunction.cs
+++ /dev/null
@@ -1,15 +0,0 @@
-锘縰sing System;
-namespace HDL_ON.Entity
-{
-    /// <summary>
-    /// 璁惧鍔熻兘
-    /// </summary>
-    public class DeviceFunction : Function
-    {
-        public DeviceFunction()
-        {
-        }
-
-
-    }
-}
diff --git a/HDL_ON/Entity/Function/Fan.cs b/HDL_ON/Entity/Function/Fan.cs
index 36108ac..ce91f65 100644
--- a/HDL_ON/Entity/Function/Fan.cs
+++ b/HDL_ON/Entity/Function/Fan.cs
@@ -3,66 +3,12 @@
 
 namespace HDL_ON.Entity
 {
-    public class Fan : Function
+    public class Fan
     {
         public Fan()
         {
         }
 
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_openLevel;
-        /// <summary>
-        /// 妗d綅
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int openLevel
-        {
-            get
-            {
-                try
-                {
-                    if (trait_openLevel == null)
-                    {
-                        trait_openLevel = attributes.Find((obj) => obj.key == "openLevel");
-                        if (trait_openLevel == null)
-                        {
-                            trait_openLevel = new FunctionAttributes()
-                            {
-                                key = "openLevel",
-                                value = new List<string> { "up", "down" },
-                                max = 7,
-                                min = 0,
-                                curValue = 0
-                            };
-                        }
-                        if (trait_openLevel.curValue.ToString() == "{}")
-                            trait_openLevel.curValue = 0;
-                    }
-                    string textValue = trait_openLevel.curValue.ToString();
-                    if (textValue == string.Empty)
-                    {
-                        trait_openLevel.curValue = 0;
-                    }
-                    return Convert.ToInt32(trait_openLevel.curValue);
-                }
-                catch
-                {
-                    MainPage.Log("openLevel 鏁版嵁鑾峰彇澶辫触.");
-                    return 0;
-                }
-            }
-            set
-            {
-                try
-                {
-                    trait_openLevel.curValue = value;
-                }
-                catch
-                {
-                    MainPage.Log("openLevel 鏁版嵁鍒锋柊澶辫触.");
-                }
-            }
-        }
 
     }
 }
diff --git a/HDL_ON/Entity/Function/FloorHeating.cs b/HDL_ON/Entity/Function/FloorHeating.cs
index aefe030..02aaffd 100644
--- a/HDL_ON/Entity/Function/FloorHeating.cs
+++ b/HDL_ON/Entity/Function/FloorHeating.cs
@@ -3,155 +3,144 @@
 
 namespace HDL_ON.Entity
 {
-    public class FloorHeating : Function
+    public class FloorHeating
     {
-        /*
-        *鍦扮儹锛歵rait: [switch, mode, set_temp, lock]
-        *灞炴�� 鎻忚堪
-        *switch	on/off
-        *mode    day, night,away, vacation, timer
-        *set_temp value
-        *lock	boolean(Lock閿佸畾鎺у埗)
-        *set_ point	up,down,value
-        */
-        public FloorHeating()
+        /// <summary>
+        /// 鑾峰彇娓╁害鍗曚綅bus鏍囪瘑
+        /// </summary>
+        /// <param name="function"></param>
+        /// <returns></returns>
+        public int GetTempUintIndex(Function function)
         {
+            var tt = function.GetAttrState(FunctionAttributeKey.TempType);
+            if (tt == "掳F")
+            {
+                return 1;
+            }
+            else
+            {
+                return 0;
+            }
         }
         /// <summary>
-        /// 褰撳墠娓╁害妯″紡
-        /// 0:鎽勬皬搴�
-        /// 1:鍗庢皬搴�
+        /// 鏍规嵁bus鏍囪瘑璁剧疆娓╁害鍗曚綅
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int curTempType = 0;
+        /// <param name="function"></param>
+        /// <returns></returns>
+        public void SetTempUint(Function function, int index)
+        {
+            if (index == 0)
+            {
+                function.SetAttrState(FunctionAttributeKey.TempType, "掳C");
+            }
+            else
+            {
+                function.SetAttrState(FunctionAttributeKey.TempType, "掳F");
+            }
+        }
 
         /// <summary>
-        /// 宸ヤ綔妯″紡
+        /// 鑾峰彇bus鍗忚宸ヤ綔妯″紡index
         /// 0:鍦扮儹妯″紡锛�1:鍦板喎妯″紡锛�
         /// 2:鍦扮儹鍔熺巼妯″紡锛�3:鍦板喎鍔熺巼妯″紡锛�
         /// </summary>
-        public int workMode = 0;
-        /// <summary>
-        /// 褰撳墠娓╁害妯″紡瀛楃
-        /// </summary>
-        public string tempUnitString
+        public int GetWorkModeIndex(Function function)
         {
-            get
-            {
-                if (curTempType == 0)
-                {
-                    return "掳C";
-                }
-                else
-                {
-                    return "掳F";
-                }
-            }
-        }
-        FunctionAttributes _trait_mode;
-        /// <summary>
-        /// 妯″紡灞炴��
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_mode
-        {
-            get
-            {
-                if (_trait_mode == null)
-                {
-                    _trait_mode = attributes.Find((obj) => obj.key == "mode");
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_mode == null)
-                    {
-                        _trait_mode = new FunctionAttributes()
-                        {
-                            key = "mode",
-                            value = new List<string> { "day", "night", "away", "normal", "timer" },
-                            max = 4,
-                            min = 0,
-                        };
-                    }
-                    if(_trait_mode.curValue.ToString() == "{}")
-                    {
-                        _trait_mode.curValue = "day";
-                    }
-                }
-                return _trait_mode;
-            }
+            var attr = function.GetAttrState(FunctionAttributeKey.WorkMode);
+            if (attr == "cool")
+                return 1;
+            return 0;
         }
 
         /// <summary>
-        /// 宸ヤ綔妯″紡瀵瑰簲鐨勫伐浣滄俯搴�
+        /// 璁剧疆bus鍗忚宸ヤ綔妯″紡index
+        /// 0:鍦扮儹妯″紡锛�1:鍦板喎妯″紡锛�
+        /// 2:鍦扮儹鍔熺巼妯″紡锛�3:鍦板喎鍔熺巼妯″紡锛�
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public Dictionary<string, byte> modeTemp = new Dictionary<string, byte>();
+        public void SetWorkModeIndex(Function function, int index)
+        {
+            if (index == 1)
+                function.SetAttrState(FunctionAttributeKey.WorkMode, "cool");
+            else
+                function.SetAttrState(FunctionAttributeKey.WorkMode, "heat");
+        }
 
         /// <summary>
-        /// 褰撳墠妯″紡绱㈠紩
-        /// bus鎺у埗鍛戒护浣跨敤
+        /// 鑾峰彇娓╁害妯″紡瀛楃
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public byte curModeIndex
+        public string GetTempUnitString(Function function)
         {
-            get
+            var tt = function.GetAttrState(FunctionAttributeKey.TempType);
+            if (tt == "0")
             {
-                try
-                {
-                    byte index = 0;
-                    switch (trait_mode.curValue.ToString())
-                    {
-                        case "day":
-                            index = 2;
-                            break;
-                        case "night":
-                            index = 3;
-                            break;
-                        case "away":
-                            index = 4;
-                            break;
-                        case "normal":
-                            index = 1;
-                            break;
-                        case "timer":
-                            index = 5;
-                            break;
-                        default:
-                            index = 0;
-                            break;
-                    }
-                    return index;
-                }
-                catch (Exception ex)
-                {
-                    MainPage.Log($"get curModeIndex error : {ex.Message}");
-                    return 0;
-                }
+                return "掳C";
             }
-            set
+            else
             {
-                switch (value)
-                {
-                    case 5:
-                        trait_mode.curValue = "timer";
-                        break;
-                    case 1:
-                        trait_mode.curValue = "normal";
-                        break;
-                    case 2:
-                        trait_mode.curValue = "day";
-                        break;
-                    case 3:
-                        trait_mode.curValue = "night";
-                        break;
-                    case 4:
-                        trait_mode.curValue = "away";
-                        break;
-                    default:
-                        trait_mode.curValue = "cool";
-                        break;
+                return tt;
+            }
+        }
 
-                }
+     
+
+        /// <summary>
+        /// 鑾峰彇bus鍗忚妯″紡绱㈠紩
+        /// </summary>
+        public byte GetModeIndex(Function function)
+        {
+            byte index = 0;
+            var mode = function.GetAttrState(FunctionAttributeKey.Mode);
+            switch (mode)
+            {
+                case "day":
+                    index = 2;
+                    break;
+                case "night":
+                    index = 3;
+                    break;
+                case "away":
+                    index = 4;
+                    break;
+                case "normal":
+                    index = 1;
+                    break;
+                case "timer":
+                    index = 5;
+                    break;
+                default:
+                    index = 0;
+                    break;
             }
+            return index;
+        }
+        /// <summary>
+        /// 璁剧疆bus鍗忚妯″紡绱㈠紩
+        /// </summary>
+        public void SetModeIndex(int value, Function function)
+        {
+            string mode = "timer";
+            switch (value)
+            {
+                case 5:
+                    mode = "timer";
+                    break;
+                case 1:
+                    mode = "normal";
+                    break;
+                case 2:
+                    mode = "day";
+                    break;
+                case 3:
+                    mode = "night";
+                    break;
+                case 4:
+                    mode = "away";
+                    break;
+                default:
+                    mode = "cool";
+                    break;
+            }
+            function.SetAttrState(FunctionAttributeKey.Mode, mode);
         }
 
         /// <summary>
@@ -160,120 +149,35 @@
         /// </summary>
         public byte timeFlag = 0;
 
-        FunctionAttributes _trait_IndoorTemp;
         /// <summary>
-        /// 瀹ゅ唴娓╁害
+        /// 鑾峰彇妯″紡鐨刬con璺緞
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_IndoorTemp
+        public string GetModeImage(Function function)
         {
-            get
+            var imagePath = "FunctionIcon/AC/HeatingIcon.png";
+            var key = function.GetAttrState(FunctionAttributeKey.Mode);
+            switch (key)
             {
-                if (_trait_IndoorTemp == null)
-                {
-                    _trait_IndoorTemp = attributes.Find((obj) => obj.key == FunctionAttributeKey.IndoorTemp);
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_IndoorTemp == null)
-                    {
-                        _trait_IndoorTemp = new FunctionAttributes()
-                        {
-                            key = FunctionAttributeKey.IndoorTemp,
-                            value = new List<string> { },
-                            max = 30,
-                            min = 0,
-                        };
-                     
-                    }
-                }
-                if (_trait_IndoorTemp.curValue.ToString() == "{}")
-                {
-                    _trait_IndoorTemp.curValue = "0";
-                }
-                    var vv = Convert.ToDouble(_trait_IndoorTemp.curValue);
-                    _trait_IndoorTemp.curValue = Convert.ToInt32(vv).ToString();
-                return _trait_IndoorTemp;
+                case "day":
+                    imagePath = "FunctionIcon/AC/HeatingIcon.png";
+                    break;
+                case "night":
+                    imagePath = "FunctionIcon/FloorHeating/NightIcon.png";
+                    break;
+                case "away":
+                    imagePath = "FunctionIcon/FloorHeating/AwayIcon.png";
+                    break;
+                case "timer":
+                    imagePath = "FunctionIcon/AC/AutoIcon.png";
+                    break;
+                case "normal":
+                    imagePath = "FunctionIcon/FloorHeating/OrdinaryIcon.png";
+                    break;
+                default:
+                    imagePath = "FunctionIcon/AC/HeatingIcon.png";
+                    break;
             }
+            return imagePath;
         }
-
-
-        FunctionAttributes _trait_temp;
-        /// <summary>
-        /// 褰撳墠娓╁害
-        /// </summary>/// <summary>
-        /// 褰撳墠绌鸿皟娓╁害
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_temp
-        {
-            get
-            {
-                if (_trait_temp == null)
-                {
-                    _trait_temp = attributes.Find((obj) => obj.key == "set_temp");
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (_trait_temp == null)
-                    {
-                        _trait_temp = new FunctionAttributes()
-                        {
-                            key = "set_temp",
-                            value = new List<string> { },
-                            max = 30,
-                            min = 5,
-                        };
-                    }
-                    if(_trait_temp.curValue.ToString() == "{}")
-                        _trait_temp.curValue = "16";
-                }
-                //if (_trait_temp.curValue.ToString().Length > 3)
-                {
-                    double vv = 0;
-                    Double.TryParse(_trait_temp.curValue.ToString(),out vv);
-                    _trait_temp.curValue = Convert.ToInt32(vv).ToString();
-                }
-                return _trait_temp;
-            }
-        }
-        /// <summary>
-        /// 褰撳墠妯″紡鐨刬con璺緞
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public string curModeImage
-        {
-            get
-            {
-                try
-                {
-                    var imagePath = "FunctionIcon/AC/HeatingIcon.png";
-                    switch (trait_mode.curValue)
-                    {
-                        case "day":
-                            imagePath = "FunctionIcon/AC/HeatingIcon.png";
-                            break;
-                        case "night":
-                            imagePath = "FunctionIcon/FloorHeating/NightIcon.png";
-                            break;
-                        case "away":
-                            imagePath = "FunctionIcon/FloorHeating/AwayIcon.png";
-                            break;
-                        case "timer":
-                            imagePath = "FunctionIcon/AC/AutoIcon.png";
-                            break;
-                        case "normal":
-                            imagePath = "FunctionIcon/FloorHeating/OrdinaryIcon.png";
-                            break;
-                        default:
-                            imagePath = "FunctionIcon/AC/HeatingIcon.png";
-                            break;
-                    }
-                    return imagePath;
-                }
-                catch (Exception ex)
-                {
-                    MainPage.Log($"ac ge curModeImage error : {ex.Message}");
-                    return "FunctionIcon/AC/CoolIcon.png";
-                }
-            }
-        }
-
     }
 }
diff --git a/HDL_ON/Entity/Function/Function.cs b/HDL_ON/Entity/Function/Function.cs
index 2eca3c6..8bd7fe7 100644
--- a/HDL_ON/Entity/Function/Function.cs
+++ b/HDL_ON/Entity/Function/Function.cs
@@ -79,7 +79,7 @@
             return attrs;
         }
         /// <summary>
-        /// 鑾峰彇鍒跺畾灞炴��
+        /// 鑾峰彇鎸囧畾灞炴��
         /// </summary>
         /// <returns></returns>
         public FunctionAttributes GetAttribute(string key)
@@ -96,7 +96,7 @@
         public string GetAttrState(string key)
         {
             var attrState = attributes.Find((s) => s.key == key.ToString());
-            if(attrState == null)
+            if (attrState == null || string.IsNullOrEmpty(attrState.state))
             {
                 return "0";
             }
@@ -108,7 +108,7 @@
         /// <param name="key"></param>
         /// <param name="value"></param>
         /// <returns>淇敼缁撴灉</returns>
-        public bool SetAttrState(string key, string value)
+        public bool SetAttrState(string key, object value)
         {
             //var attrState = status.Find((s) => s.key == key.ToString());
             var attr = attributes.Find((s) => s.key == key);
@@ -118,13 +118,28 @@
             }
             else
             {
-                attr.state = value;
+                attr.state = value.ToString();
+                attr.curValue = value.ToString();
             }
             return true;
         }
 
 
 
+
+        /// <summary>
+        /// 涓婁竴娆℃墦寮�鐨勪寒搴�
+        /// 鐏厜绉佹湁灞炴��
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public int lastBrightness = 100;
+
+        /// <summary>
+        /// 宸ヤ綔妯″紡瀵瑰簲鐨勫伐浣滄俯搴�
+        /// 鍦扮儹绉佹湁灞炴��
+        /// </summary>
+        [Newtonsoft.Json.JsonIgnore]
+        public Dictionary<string, byte> Fh_Mode_Temp = new Dictionary<string, byte>();
         #endregion
 
 
@@ -263,7 +278,6 @@
         public void CollectFunction()
         {
             var result = "";
-            //var waitPage = new Loading();
 
             new System.Threading.Thread(() =>
             {
@@ -282,6 +296,12 @@
                     {
                         collect = !collect;
                         IMessageCommon.Current.ShowErrorInfoAlter(result);
+                    });
+                }else
+                {
+                    Application.RunOnMainThread(() =>
+                    {
+                        UI.HomePage.RefreshFunctionView();
                     });
                 }
             })
@@ -672,6 +692,11 @@
         /// </summary>
         public const string Mode = "mode";
         /// <summary>
+        /// 宸ヤ綔妯″紡
+        /// 鍦扮儹/鍦板喎/鍔熺巼鍦扮儹/鍔熺巼鍦板喎
+        /// </summary>
+        public const string WorkMode = "mode_work";
+        /// <summary>
         /// 椋庨��
         /// </summary>
         public const string FanSpeed = "fan";
@@ -679,6 +704,16 @@
         /// 璁剧疆娓╁害
         /// </summary>
         public const string SetTemp = "set_temp";
+        /// <summary>
+        /// 娓╁害妯″紡
+        /// 绌鸿皟銆佸湴鐑�//app鑷姞
+        /// </summary>
+        public const string TempType = "temperature_type";
+        /// <summary>
+        /// 鏃堕棿鏍囪
+        /// 鍦扮儹//app鑷姞
+        /// </summary>
+        public const string TimeFlag = "time_flag";
         /// <summary>
         /// 寤舵椂
         /// </summary>
@@ -763,8 +798,10 @@
         /// 璐熺瀛愬墿浣欐椂闂�
         /// </summary>
         public const string AnionTimeLeft = "anion_time_surplus";
-
-
+        /// <summary>
+        /// 鎵撳紑鐧昏(椋庢墖)
+        /// </summary>
+        public const string OpenLevel = "openLevel";
 
 
         #region tuya
diff --git a/HDL_ON/Entity/Function/Light.cs b/HDL_ON/Entity/Function/Light.cs
index 0ddbb56..63d3f63 100644
--- a/HDL_ON/Entity/Function/Light.cs
+++ b/HDL_ON/Entity/Function/Light.cs
@@ -4,202 +4,24 @@
 
 namespace HDL_ON.Entity
 {
-    public class Light : Function
+    public class Light 
     {
-        [Newtonsoft.Json.JsonIgnore]
-        FunctionAttributes trait_brightness;
-        /// <summary>
-        /// 浜害鍊�
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int brightness
-        {
-            get
-            {
-                if (trait_brightness == null)
-                {
-                    trait_brightness = attributes.Find((obj) => obj.key == "brightness");
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (trait_brightness == null)
-                    {
-                        trait_brightness = new FunctionAttributes()
-                        {
-                            key = "brightness",
-                            value = new List<string> { "up", "down" },
-                            max = 100,
-                            min = 0,
-                            curValue = 0,
-                        };
-                    }
-                    if (trait_brightness.curValue.ToString() == "{}")
-                        trait_brightness.curValue = 0;
-                }
-                try
-                {
-                    string textValue = trait_brightness.curValue.ToString();
-                    if (textValue == string.Empty)
-                    {
-                        trait_brightness.curValue = 0;
-                    }
-                    return Convert.ToInt32(trait_brightness.curValue);
-                }
-                catch
-                {
-                    trait_brightness.curValue = 0;
-                    return 0;
-                }
-            }
-            set
-            {
-                try
-                {
-                    if (trait_brightness == null)
-                    {
-                        trait_brightness = attributes.Find((obj) => obj.key == "brightness");
-                        //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                        if (trait_brightness == null)
-                        {
-                            trait_brightness = new FunctionAttributes()
-                            {
-                                key = "brightness",
-                                value = new List<string> { "up", "down" },
-                                max = 100,
-                                min = 0,
-                                curValue = 0
-                            };
-                        }
-                    }
-                    trait_brightness.curValue = value;
-                }
-                catch
-                {
-                    MainPage.Log("brightness 鏁版嵁鍒锋柊澶辫触.");
-                }
-            }
-        }
-        /// <summary>
-        /// 涓婁竴娆℃墦寮�鐨勪寒搴�
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int lastBrightness = 100;
-
-        int hadFadeTime = 99;
-        /// <summary>
-        /// 鏄惁鎷ユ湁娓愬彉鏃堕棿
-        /// </summary>
-        public bool HadFadeTime
-        {
-            get
-            {
-                if (hadFadeTime == 99)
-                {
-                    var t = attributes.Find((obj) => obj.key == FunctionAttributeKey.FadeTime);
-                    if (t == null)
-                    {
-                        hadFadeTime = 0;
-                        return false;
-                    }
-                    else
-                    {
-                        hadFadeTime = 1;
-                        return true;
-                    }
-                }
-                if (hadFadeTime == 1)
-                {
-                    return true;
-                }
-                else
-                {
-                    return false;
-                }
-            }
-        }
-
-        [Newtonsoft.Json.JsonIgnore]
-        FunctionAttributes trait_fadeTime;
-        /// <summary>
-        /// 娓愬彉鏃堕棿
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int fadeTime
-        {
-            get
-            {
-                if (trait_fadeTime == null)
-                {
-                    trait_fadeTime = attributes.Find((obj) => obj.key == FunctionAttributeKey.FadeTime);
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (trait_fadeTime == null)
-                    {
-                        trait_fadeTime = new FunctionAttributes()
-                        {
-                            key = FunctionAttributeKey.FadeTime,
-                            value = new List<string> { "up", "down" },
-                            max = 10,
-                            min = 0,
-                            curValue = 0
-                        };
-                    }
-                }
-                int result = 0;
-                int.TryParse(trait_fadeTime.curValue.ToString(), out result);
-                return result;
-            }
-            set
-            {
-                try
-                {
-                    if (trait_fadeTime == null)
-                    {
-                        trait_fadeTime = attributes.Find((obj) => obj.key == FunctionAttributeKey.FadeTime);
-                        //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                        if (trait_fadeTime == null)
-                        {
-                            trait_fadeTime = new FunctionAttributes()
-                            {
-                                key = FunctionAttributeKey.FadeTime,
-                                value = new List<string> { "up", "down" },
-                                max = 100,
-                                min = 0,
-                                curValue = 0
-                            };
-                        }
-                    }
-                    trait_fadeTime.curValue = value;
-                }
-                catch
-                {
-                }
-            }
-        }
-
         #region RGB
         /// <summary>
         /// 鑾峰彇rgb棰滆壊
         /// </summary>
         /// <returns></returns>
-        public int GetRGBcolor()
+        public int GetRGBcolor(Function function )
         {
-            if (trait_color == null)
-            {
-                trait_color = attributes.Find((obj) => obj.key == FunctionAttributeKey.RGB);
-                //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                if (trait_color == null)
-                {
-                    trait_color = new FunctionAttributes()
-                    {
-                        key = "color",
-                        value = new List<string> { "255,255,255" },
-                        curValue = "255,255,255"
-                    };
-                }
-                if (trait_color.curValue.ToString() == "{}")
-                    trait_color.curValue = "255,255,255";
-            }
-            int.TryParse(trait_color.curValue.ToString().Split(",")[0], out redColor);
-            int.TryParse(trait_color.curValue.ToString().Split(",")[1], out greenColor);
-            int.TryParse(trait_color.curValue.ToString().Split(",")[2], out blueColor);
+            var color = function.GetAttrState(FunctionAttributeKey.RGB).Split(",");
+
+            int redColor = 0;
+            int greenColor = 0;
+            int blueColor = 0;
+
+            int.TryParse(color[0], out redColor);
+            int.TryParse(color[1], out greenColor);
+            int.TryParse(color[2], out blueColor);
 
             int recolor = redColor * 256 * 256 + greenColor * 256 + blueColor;
 
@@ -209,79 +31,40 @@
         /// 鑾峰彇rgb 鎺у埗瀛楃涓�
         /// </summary>
         /// <returns></returns>
-        public string GetRGBcolorString()
+        public string GetRGBcolorString(Function function )
         {
-            return redColor + "," + greenColor + "," + blueColor;
+            var color = function.GetAttrState(FunctionAttributeKey.RGB).Split(",");
+            return color[0] + "," + color[1] + "," + color[2];
+        }
+
+        /// <summary>
+        /// 鑾峰彇rgb棰滆壊
+        /// </summary>
+        /// <param name="index">0:red 1:green 2:blue</param>
+        /// <returns></returns>
+        public int GetColor( int index,Function function)
+        {
+            int color = 0;
+            if (index <= 2)
+            {
+                try
+                {
+                    int.TryParse(function.GetAttrState(FunctionAttributeKey.RGB).Split(",")[index], out color);
+                }
+                catch { }
+            }
+            return color;
         }
 
         /// <summary>
         /// 璁剧疆rgb棰滆壊
         /// </summary>
-        public void SetRGBcolor(byte[] color)
+        public void SetRGBcolor(byte[] color,Function function)
         {
-            redColor = color[0];
-            greenColor = color[1];
-            blueColor = color[2];
-            trait_color.curValue = redColor + "," + greenColor + "," + blueColor;
+            function.SetAttrState(FunctionAttributeKey.RGB, color[0] + "," + color[1] + "," + color[2]);
         }
 
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_color;
-        int redColor = 255;
-        int greenColor = 255;
-        int blueColor = 255;
-
-        public int RedColor {
-            get
-            {
-                return redColor;
-            }
-        }
-        public int GreenColor {
-            get
-            {
-                return greenColor;
-            }
-        }
-        public int BlueColor
-        {
-            get
-            {
-                return blueColor;
-            }
-        }
         #endregion
 
-        #region CCT
-        FunctionAttributes attr_CCT;
-        /// <summary>
-        /// 鑹叉俯
-        /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes Attr_CCT
-        {
-            get
-            {
-                if(attr_CCT == null)
-                {
-                    attr_CCT = attributes.Find((obj) => obj.key == FunctionAttributeKey.CCT);
-                    if(attr_CCT== null)
-                    {
-                        attr_CCT = new FunctionAttributes()
-                        {
-                            key = FunctionAttributeKey.CCT,
-                            value = new List<string> (),
-                            max = 6500,
-                            min = 2700,
-                            curValue = 2700
-                        };
-                    }
-                }
-                var result = 2700;
-                int.TryParse(attr_CCT.curValue.ToString(), out result);
-                return attr_CCT;
-            }
-        }
-        #endregion
     }
 }
diff --git a/HDL_ON/Entity/Function/Sensor.cs b/HDL_ON/Entity/Function/Sensor.cs
index 2e4d27c..585a617 100644
--- a/HDL_ON/Entity/Function/Sensor.cs
+++ b/HDL_ON/Entity/Function/Sensor.cs
@@ -3,337 +3,253 @@
 
 namespace HDL_ON.Entity
 {
-    public class Sensor :Function
+    public class Sensor
     {
-        public Sensor()
-        {
-
-        }
-        [Newtonsoft.Json.JsonIgnore]
-        public int functionTypeNameId
-        {
-            get
-            {
-                int nameId = 0;
-                switch (spk)
-                {
-                    case SPK.SensorPm25:
-                        nameId = StringId.PM25;
-                        break;
-                    case SPK.SensorCO2:
-                        nameId = StringId.CO2;
-                        break;
-                    case SPK.SensorTemperature:
-                        nameId = StringId.Temp;
-                        break;
-                    case SPK.SensorTVOC:
-                        nameId = StringId.TVOC;
-                        break;
-                    case SPK.SensorHumidity:
-                        nameId = StringId.Humidity;
-                        break;
-                }
-                return nameId;
-            }
-        }
-
-        [Newtonsoft.Json.JsonIgnore]
-        public FunctionAttributes trait_values;
         /// <summary>
-        /// 鍊�
+        /// 鑾峰彇鍚嶇О鏂囨湰ID
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public double values
+        /// <param name="spk"></param>
+        /// <returns></returns>
+        public int GetFunctionTypeNameId(string spk)
         {
-            get
+            int nameId = 0;
+            switch (spk)
             {
-                if (trait_values == null)
-                {
-                    trait_values = attributes.Find((obj) => obj.key == FunctionAttributeKey.Value);
-                    //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                    if (trait_values == null)
-                    {
-                        trait_values = new FunctionAttributes()
-                        {
-                            key = FunctionAttributeKey.Value,
-                            value = new List<string> { "29" },
-                            max = 10000,
-                            min = 0,
-                        };
-                        trait_values.curValue = trait_values.min;
-                    }
-                }
-                if (trait_values.curValue.ToString() == "{}")
-                    trait_values.curValue = 0;
-                if(spk == SPK.SensorTVOC)
-                {
-                    return Convert.ToDouble(trait_values.curValue.ToString()) / 100000;
-                }
-                return Convert.ToDouble(trait_values.curValue);
+                case SPK.SensorPm25:
+                    nameId = StringId.PM25;
+                    break;
+                case SPK.SensorCO2:
+                    nameId = StringId.CO2;
+                    break;
+                case SPK.SensorTemperature:
+                    nameId = StringId.Temp;
+                    break;
+                case SPK.SensorTVOC:
+                    nameId = StringId.TVOC;
+                    break;
+                case SPK.SensorHumidity:
+                    nameId = StringId.Humidity;
+                    break;
             }
-            set
-            {
-                try
-
-                 {
-                    if (trait_values == null)
-                    {
-                        trait_values = attributes.Find((obj) => obj.key == FunctionAttributeKey.Value);
-                        //鎵句笉鍒板睘鎬ч渶瑕佸0鏄庝竴涓紝闃叉鎶ラ敊闂��
-                        if (trait_values == null)
-                        {
-                            trait_values = new FunctionAttributes()
-                            {
-                                key = FunctionAttributeKey.Value,
-                                value = new List<string> { "up" },
-                                max = 100,
-                                min = 0,
-                            };
-                        }
-                        trait_values.curValue = trait_values.min;
-                    }
-                    trait_values.curValue = value;
-                    MainPage.Log($"values 鏁版嵁鍒锋柊{value}.");
-                }
-                catch
-                {
-                    MainPage.Log("values 鏁版嵁鍒锋柊澶辫触.");
-                }
-            }
+            return nameId;
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        public double GetValues(Function function)
+        {
+            var value = function.GetAttrState(FunctionAttributeKey.Value);
+            return Convert.ToDouble(value);
+        }
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="value"></param>
+        /// <param name="function"></param>
+        public void SetValues(int value, Function function)
+        {
+            function.SetAttrState(FunctionAttributeKey.Value, value);
         }
 
-        List<string> _intervalValue;
         /// <summary>
         /// 姣忎釜绛夌骇瀵瑰尯闂村��
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public List<string> intervalValue
+        public List<string> GetIntervalValue(string spk)
         {
-            get
+            var _intervalValue = new List<string>();
+            switch (spk)
             {
-                if (_intervalValue == null)
-                {
-                    _intervalValue = new List<string>();
-                    switch (spk)
-                    {
-                        case SPK.SensorPm25:
-                            _intervalValue.Add("0 ~ 35");
-                            _intervalValue.Add("36 ~ 75");
-                            _intervalValue.Add("76 ~ 115");
-                            _intervalValue.Add("115 ~");
-                            break;
-                        case SPK.SensorCO2:
-                            _intervalValue.Add("0 ~ 1000");
-                            _intervalValue.Add("1001 ~ 2000");
-                            _intervalValue.Add("2001 ~ 5000");
-                            _intervalValue.Add("5001 ~");
-                            break;
-                        case SPK.SensorTemperature:
-                            _intervalValue.Add("~ 18掳C");
-                            _intervalValue.Add("18 ~ 20掳C");
-                            _intervalValue.Add("20 ~ 25掳C");
-                            _intervalValue.Add("25 ~ 27掳C");
-                            _intervalValue.Add("27 ~ 30掳C");
-                            _intervalValue.Add("30 ~ 33掳C");
-                            _intervalValue.Add("33掳C ~");
-                            break;
-                        case SPK.SensorTVOC:
-                            _intervalValue.Add("0 ~ 0.6");
-                            _intervalValue.Add("0.61 ~ 2");
-                            _intervalValue.Add("2.01 ~ 5");
-                            _intervalValue.Add("5 ~");
-                            break;
-                        case SPK.SensorHumidity:
-                            _intervalValue.Add("70 ~");
-                            _intervalValue.Add("71 ~ 40");
-                            _intervalValue.Add("0 ~ 39");
-                            break;
-                    }
-                }
-                return _intervalValue;
+                case SPK.SensorPm25:
+                    _intervalValue.Add("0 ~ 35");
+                    _intervalValue.Add("36 ~ 75");
+                    _intervalValue.Add("76 ~ 115");
+                    _intervalValue.Add("115 ~");
+                    break;
+                case SPK.SensorCO2:
+                    _intervalValue.Add("0 ~ 1000");
+                    _intervalValue.Add("1001 ~ 2000");
+                    _intervalValue.Add("2001 ~ 5000");
+                    _intervalValue.Add("5001 ~");
+                    break;
+                case SPK.SensorTemperature:
+                    _intervalValue.Add("~ 18掳C");
+                    _intervalValue.Add("18 ~ 20掳C");
+                    _intervalValue.Add("20 ~ 25掳C");
+                    _intervalValue.Add("25 ~ 27掳C");
+                    _intervalValue.Add("27 ~ 30掳C");
+                    _intervalValue.Add("30 ~ 33掳C");
+                    _intervalValue.Add("33掳C ~");
+                    break;
+                case SPK.SensorTVOC:
+                    _intervalValue.Add("0 ~ 0.6");
+                    _intervalValue.Add("0.61 ~ 2");
+                    _intervalValue.Add("2.01 ~ 5");
+                    _intervalValue.Add("5 ~");
+                    break;
+                case SPK.SensorHumidity:
+                    _intervalValue.Add("70 ~");
+                    _intervalValue.Add("71 ~ 40");
+                    _intervalValue.Add("0 ~ 39");
+                    break;
             }
+            return _intervalValue;
         }
-        List<uint> _levelColorList;
+
         /// <summary>
         /// 姣忎釜绛夌骇鐨勯鑹插��
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public List<uint> levelColorList
+        public List<uint> GetLevelColorList(string spk)
         {
-            get
+            var _levelColorList = new List<uint>();
+            switch (spk)
             {
-                try
-                {
-                if (_levelColorList == null)
-                {
-                    _levelColorList = new List<uint>();
-                    switch (spk)
-                    {
-                        case SPK.SensorPm25:
-                            _levelColorList.Add(0xFFADE764);
-                            _levelColorList.Add(0xFFFFD154);
-                            _levelColorList.Add(0xFFFF9D54);
-                            _levelColorList.Add(0xFFFF3D3D);
-                            break;
-                        case SPK.SensorCO2:
-                            _levelColorList.Add(0xFFADE764);
-                            _levelColorList.Add(0xFFFFD154);
-                            _levelColorList.Add(0xFFFF9D54);
-                            _levelColorList.Add(0xFFFF3D3D);
-                            break;
-                        case SPK.SensorTemperature:
-                            _levelColorList.Add(0xFF2172FF);
-                            _levelColorList.Add(0xCC4484F4);
-                            _levelColorList.Add(0x7F4484F4);
-                            _levelColorList.Add(0xFFADE764);
-                            _levelColorList.Add(0xFFFFD154);
-                            _levelColorList.Add(0xFFFF9D54);
-                            _levelColorList.Add(0xFFFF3D3D);
-                            break;
-                        case SPK.SensorTVOC:
-                            _levelColorList.Add(0xFFADE764);
-                            _levelColorList.Add(0xFFFFD154);
-                            _levelColorList.Add(0xFFFF9D54);
-                            _levelColorList.Add(0xFFFF3D3D);
+                case SPK.SensorPm25:
+                    _levelColorList.Add(0xFFADE764);
+                    _levelColorList.Add(0xFFFFD154);
+                    _levelColorList.Add(0xFFFF9D54);
+                    _levelColorList.Add(0xFFFF3D3D);
+                    break;
+                case SPK.SensorCO2:
+                    _levelColorList.Add(0xFFADE764);
+                    _levelColorList.Add(0xFFFFD154);
+                    _levelColorList.Add(0xFFFF9D54);
+                    _levelColorList.Add(0xFFFF3D3D);
+                    break;
+                case SPK.SensorTemperature:
+                    _levelColorList.Add(0xFF2172FF);
+                    _levelColorList.Add(0xCC4484F4);
+                    _levelColorList.Add(0x7F4484F4);
+                    _levelColorList.Add(0xFFADE764);
+                    _levelColorList.Add(0xFFFFD154);
+                    _levelColorList.Add(0xFFFF9D54);
+                    _levelColorList.Add(0xFFFF3D3D);
+                    break;
+                case SPK.SensorTVOC:
+                    _levelColorList.Add(0xFFADE764);
+                    _levelColorList.Add(0xFFFFD154);
+                    _levelColorList.Add(0xFFFF9D54);
+                    _levelColorList.Add(0xFFFF3D3D);
 
-                            break;
-                        case SPK.SensorHumidity:
-                            _levelColorList.Add(0xFF2172FF);
-                            _levelColorList.Add(0xFFADE764);
-                            _levelColorList.Add(0xFFFF3D3D);
-                            break;
-                    }
-                }
-                }catch(Exception ex)
-                {
-                    MainPage.Log($"sensor error 1 : {ex.Message}");
-                }
-                return _levelColorList;
+                    break;
+                case SPK.SensorHumidity:
+                    _levelColorList.Add(0xFF2172FF);
+                    _levelColorList.Add(0xFFADE764);
+                    _levelColorList.Add(0xFFFF3D3D);
+                    break;
             }
+            return _levelColorList;
+
         }
-        List<int> _levelTextList;
+
         /// <summary>
         /// 姣忎釜绛夌骇鐨勫悕绉�
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public List<int> levelTextList
+        public List<int> GetLevelTextList(string spk)
         {
-            get
+            var _levelTextList = new List<int>();
+            switch (spk)
             {
-                if (_levelTextList == null)
-                {
-                    _levelTextList = new List<int>();
-                    switch (spk)
-                    {
-                        case SPK.SensorPm25:
-                            _levelTextList.Add(StringId.Great);
-                            _levelTextList.Add(StringId.Good);
-                            _levelTextList.Add(StringId.MildPollution);
-                            _levelTextList.Add(StringId.HeavyPollution);
-                            break;
-                        case SPK.SensorCO2:
-                            _levelTextList.Add(StringId.SensorReferenceTipCO2Level1);
-                            _levelTextList.Add(StringId.SensorReferenceTipCO2Level2);
-                            _levelTextList.Add(StringId.SensorReferenceTipCO2Level3);
-                            _levelTextList.Add(StringId.SensorReferenceTipCO2Level4);
-                            break;
-                        case SPK.SensorTemperature:
-                            _levelTextList.Add(StringId.ExtremelyCold);
-                            _levelTextList.Add(StringId.Cold);
-                            _levelTextList.Add(StringId.SlightlyCold);
-                            _levelTextList.Add(StringId.Comfortable);
-                            _levelTextList.Add(StringId.TepidFever);
-                            _levelTextList.Add(StringId.Heat_SensorTip);
-                            _levelTextList.Add(StringId.ExtremeHeat);
-
-
-                            break;
-                        case SPK.SensorTVOC:
-                            _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel1);
-                            _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel2);
-                            _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel3);
-                            _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel4);
-
-                            break;
-                        case SPK.SensorHumidity:
-                            _levelTextList.Add(StringId.SensorReferenceHumidityTipLevel1);
-                            _levelTextList.Add(StringId.SensorReferenceHumidityTipLevel2);
-                            _levelTextList.Add(StringId.SensorReferenceHumidityTipLevel3);
-                            break;
-                    }
-                }
-                return _levelTextList;
+                case SPK.SensorPm25:
+                    _levelTextList.Add(StringId.Great);
+                    _levelTextList.Add(StringId.Good);
+                    _levelTextList.Add(StringId.MildPollution);
+                    _levelTextList.Add(StringId.HeavyPollution);
+                    break;
+                case SPK.SensorCO2:
+                    _levelTextList.Add(StringId.SensorReferenceTipCO2Level1);
+                    _levelTextList.Add(StringId.SensorReferenceTipCO2Level2);
+                    _levelTextList.Add(StringId.SensorReferenceTipCO2Level3);
+                    _levelTextList.Add(StringId.SensorReferenceTipCO2Level4);
+                    break;
+                case SPK.SensorTemperature:
+                    _levelTextList.Add(StringId.ExtremelyCold);
+                    _levelTextList.Add(StringId.Cold);
+                    _levelTextList.Add(StringId.SlightlyCold);
+                    _levelTextList.Add(StringId.Comfortable);
+                    _levelTextList.Add(StringId.TepidFever);
+                    _levelTextList.Add(StringId.Heat_SensorTip);
+                    _levelTextList.Add(StringId.ExtremeHeat);
+                    break;
+                case SPK.SensorTVOC:
+                    _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel1);
+                    _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel2);
+                    _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel3);
+                    _levelTextList.Add(StringId.SensorReferenceTVOCTipLevel4);
+                    break;
+                case SPK.SensorHumidity:
+                    _levelTextList.Add(StringId.SensorReferenceHumidityTipLevel1);
+                    _levelTextList.Add(StringId.SensorReferenceHumidityTipLevel2);
+                    _levelTextList.Add(StringId.SensorReferenceHumidityTipLevel3);
+                    break;
             }
+            return _levelTextList;
         }
         /// <summary>
         /// 褰撳墠绛夌骇
         /// </summary>
-        [Newtonsoft.Json.JsonIgnore]
-        public int curLevel
+        public int GetCurLevel(Function function)
         {
-            get
+            var spk = function.spk;
+            var values = GetValues(function);
+            int level = 1;
+            switch (spk)
             {
-                int level = 1;
-                switch (spk)
-                {
-                    case SPK.SensorPm25:
-                        if (values < 35)
-                            level = 1;
-                        else if (values < 75)
-                            level = 2;
-                        else if (values < 115)
-                            level = 3;
-                        else if (values > 115)
-                            level = 4;
-                        break;
-                    case SPK.SensorCO2:
-                        if (values < 1000)
-                            level = 1;
-                        else if (values < 2000)
-                            level = 2;
-                        else if (values < 5000)
-                            level = 3;
-                        else if (values > 5000)
-                            level = 4;
-                        break;
-                    case SPK.SensorTemperature:
-                        if (values < 18)
-                            level = 1;
-                        else if (values < 20)
-                            level = 2;
-                        else if (values < 25)
-                            level = 3;
-                        else if (values < 27)
-                            level = 4;
-                        else if (values < 30)
-                            level = 5;
-                        else if (values < 33)
-                            level = 6;
-                        else if (values > 33)
-                            level = 7;
-                        break;
-                    case SPK.SensorTVOC:
-                        if (values < 0.6)
-                            level = 1;
-                        else if (values < 2)
-                            level = 2;
-                        else if (values < 5)
-                            level = 3;
-                        else if (values > 5)
-                            level = 4;
-                        break;
-                    case SPK.SensorHumidity:
-                        if (values > 70)
-                            level = 1;
-                        else if (values > 40)
-                            level = 2;
-                        else if (values < 40)
-                            level = 3;
-                        break;
-                }
-                return level;
+                case SPK.SensorPm25:
+                    if (values < 35)
+                        level = 1;
+                    else if (values < 75)
+                        level = 2;
+                    else if (values < 115)
+                        level = 3;
+                    else if (values > 115)
+                        level = 4;
+                    break;
+                case SPK.SensorCO2:
+                    if (values < 1000)
+                        level = 1;
+                    else if (values < 2000)
+                        level = 2;
+                    else if (values < 5000)
+                        level = 3;
+                    else if (values > 5000)
+                        level = 4;
+                    break;
+                case SPK.SensorTemperature:
+                    if (values < 18)
+                        level = 1;
+                    else if (values < 20)
+                        level = 2;
+                    else if (values < 25)
+                        level = 3;
+                    else if (values < 27)
+                        level = 4;
+                    else if (values < 30)
+                        level = 5;
+                    else if (values < 33)
+                        level = 6;
+                    else if (values > 33)
+                        level = 7;
+                    break;
+                case SPK.SensorTVOC:
+                    if (values < 0.6)
+                        level = 1;
+                    else if (values < 2)
+                        level = 2;
+                    else if (values < 5)
+                        level = 3;
+                    else if (values > 5)
+                        level = 4;
+                    break;
+                case SPK.SensorHumidity:
+                    if (values > 70)
+                        level = 1;
+                    else if (values > 40)
+                        level = 2;
+                    else if (values < 40)
+                        level = 3;
+                    break;
             }
+            return level;
         }
-
     }
 }
diff --git a/HDL_ON/Entity/Function/SwitchSocket.cs b/HDL_ON/Entity/Function/SwitchSocket.cs
index 34e4d09..58d9768 100644
--- a/HDL_ON/Entity/Function/SwitchSocket.cs
+++ b/HDL_ON/Entity/Function/SwitchSocket.cs
@@ -1,7 +1,7 @@
 锘縰sing System;
 namespace HDL_ON.Entity
 {
-    public class SwitchSocket : Function
+    public class SwitchSocket 
     {
         public SwitchSocket()
         {
diff --git a/HDL_ON/Entity/Function/TV.cs b/HDL_ON/Entity/Function/TV.cs
index c0b23c5..8dde74a 100644
--- a/HDL_ON/Entity/Function/TV.cs
+++ b/HDL_ON/Entity/Function/TV.cs
@@ -3,20 +3,19 @@
 
 namespace HDL_ON.Entity
 {
-    public class TV : Function
+    public class TV 
     {
         public TV()
         {
-            trait_on_off.curValue = "off";
         }
 
-        public void ControlTV(InfraredCode_TV iCode)
+        public void ControlTV(InfraredCode_TV iCode,Function function)
         {
             int RandKey = new Random().Next(0, 255);
             var textByte = (byte)iCode;
-            new Control_Udp().ControlBytesSend(Command.InfraredControl, bus.SubnetID, bus.DeviceID, new byte[] { 1, bus.LoopId, textByte, 0, 0, (byte)RandKey }, 0);
+            new Control_Udp().ControlBytesSend(Command.InfraredControl, function.bus.SubnetID, function.bus.DeviceID, new byte[] { 1, function.bus.LoopId, textByte, 0, 0, (byte)RandKey }, 0);
         }
-        public void ControlTV(int number)
+        public void ControlTV(int number,Function function)
         {
             int RandKey = new Random().Next(0, 255);
             var textByte = (byte)(number + 7);
@@ -24,7 +23,7 @@
             {
                 textByte = 18;
             }
-            new Control_Udp().ControlBytesSend(Command.InfraredControl, bus.SubnetID, bus.DeviceID, new byte[] { 1, bus.LoopId, textByte, 0, 0, (byte)RandKey }, 0);
+            new Control_Udp().ControlBytesSend(Command.InfraredControl, function.bus.SubnetID, function.bus.DeviceID, new byte[] { 1, function.bus.LoopId, textByte, 0, 0, (byte)RandKey }, 0);
         }
     }
 }
diff --git a/HDL_ON/Entity/Function/WeepRobot.cs b/HDL_ON/Entity/Function/WeepRobot.cs
index 1e39a13..cee5c46 100644
--- a/HDL_ON/Entity/Function/WeepRobot.cs
+++ b/HDL_ON/Entity/Function/WeepRobot.cs
@@ -1,7 +1,7 @@
 锘縰sing System;
 namespace HDL_ON.Entity
 {
-    public class WeepRobot : Function
+    public class WeepRobot 
     {
         public WeepRobot()
         {
diff --git a/HDL_ON/Entity/FunctionList.cs b/HDL_ON/Entity/FunctionList.cs
index 845ab49..8d83075 100644
--- a/HDL_ON/Entity/FunctionList.cs
+++ b/HDL_ON/Entity/FunctionList.cs
@@ -16,7 +16,7 @@
         {
             get
             {
-                if(_FunctionList == null)
+                if (_FunctionList == null)
                 {
                     _FunctionList = new FunctionList();
                     #region 鎭㈠鏁版嵁
@@ -35,126 +35,160 @@
         /// </summary>
         public List<Function> Functions = new List<Function>();
 
-
-
-
-
         /// <summary>
         /// 绌鸿皟鍒楄〃
         /// </summary>
-        public List<AC> aCs = new List<AC>();
+        /// <returns></returns>
+        public List<Function> GetAcList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.AcStandard);
+        }
+
+        /// <summary>
+        /// 
+        /// </summary>
+        /// <returns></returns>
+        public List<Function> GetList()
+        {
+            List<Function> list = new List<Function>();
+
+
+            return list;
+        }
+
         /// <summary>
         /// 鐏厜鍒楄〃
         /// </summary>
-        public List<Light> lights = new List<Light>();
+        public List<Function> GetLightList()
+        {
+            return Functions.FindAll((obj) =>
+                        obj.spk == SPK.LightSwitch
+                     || obj.spk == SPK.LightDimming
+                     || obj.spk == SPK.LightRGB
+                     || obj.spk == SPK.LightRGBW
+                     || obj.spk == SPK.LightCCT);
+        }
         /// <summary>
         /// 绐楀笜鍒楄〃
         /// </summary>
-        public List<Curtain> curtains = new List<Curtain>();
+        public List<Function> GetCurtainList()
+        {
+            return Functions.FindAll((obj) =>
+                       obj.spk == SPK.CurtainRoller
+                    || obj.spk == SPK.CurtainShades
+                    || obj.spk == SPK.CurtainSwitch
+                    || obj.spk == SPK.CurtainTrietex
+            );
+        }
+
         /// <summary>
         /// 鍦扮儹鍒楄〃
         /// </summary>
-        public List<FloorHeating> floorHeatings = new List<FloorHeating>();
+        public List<Function> GetFloorHeatingList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.FloorHeatStandard);
+        }
         #region 瀹剁數鍒楄〃 electricals
         /// <summary>
         /// 瀹剁數鍒楄〃
         /// </summary>
-        public List<Function> electricals
+        public List<Function> GetElectricals()
         {
-            get
-            {
-                if(fans == null)
-                {
-                    fans = new List<Fan>();
-                }
-                if(switchSockets == null)
-                {
-                    switchSockets = new List<SwitchSocket>();
-                }
-                if(tVs == null)
-                {
-                    tVs = new List<TV>();
-                }
-                if (airCleaners == null)
-                {
-                    airCleaners = new List<AirCleaner>();
-                }
-                if (weepRobots == null)
-                {
-                    weepRobots = new List<WeepRobot>();
-                }
-                if(waterValveList == null)
-                {
-                    waterValveList = new List<Function>();
-                }
-                if(clothesHangerList == null)
-                {
-                    clothesHangerList = new List<Function>();
-                }
-                var list = new List<Function>();
-                list.AddRange(fans);
-                list.AddRange(switchSockets);
-                list.AddRange(tVs);
-                list.AddRange(airCleaners);
-                list.AddRange(weepRobots);
-                list.AddRange(waterValveList);
-                list.AddRange(clothesHangerList);
-                return list;
-            }
+
+            return Functions.FindAll((obj) => obj.spk == SPK.ElectricFan || obj.spk == SPK.ElectricTuyaFan
+                || obj.spk == SPK.ElectricSocket
+                || obj.spk == SPK.ElectricTV
+                || obj.spk == SPK.ElectricTuyaAirCleaner
+                || obj.spk == SPK.ElectricTuyaWeepRobot
+                || obj.spk == SPK.ElectricTuyaWaterValve
+                || obj.spk == SPK.ClothesHanger);
         }
         /// <summary>
         /// 椋庢墖鍒楄〃
         /// </summary>
-        public List<Fan> fans = new List<Fan>();
+        public List<Function> GetFanList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.ElectricFan || obj.spk == SPK.ElectricTuyaFan);
+        }
         /// <summary>
         /// 鐢佃鍒楄〃
         /// </summary>
-        public List<TV> tVs = new List<TV>();
+        public List<Function> GetTVList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.ElectricTV);
+        }
         /// <summary>
-        /// 瀹剁數鍒楄〃
+        /// 瀹剁數鎻掑骇鍒楄〃
         /// </summary>
-        public List<SwitchSocket> switchSockets = new List<SwitchSocket>();
+        public List<Function> GetElectricSocketList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.ElectricSocket);
+        }
         /// <summary>
         /// 绌烘皵鍑�鍖栧櫒鍒楄〃
         /// </summary>
-        public List<AirCleaner> airCleaners = new List<AirCleaner>();
+        public List<Function> GetAirCleanerList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.ElectricTuyaAirCleaner);
+        }
         /// <summary>
         /// 鎵湴鏈哄櫒浜哄垪琛�
         /// </summary>
-        public List<WeepRobot> weepRobots = new List<WeepRobot>();
+        public List<Function> GetWeepRobotList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.ElectricTuyaWeepRobot);
+        }
         /// <summary>
         /// 姘撮榾鍒楄〃
         /// </summary>
-        public List<Function> waterValveList = new List<Function>();
+        public List<Function> GetWaterValveList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.ElectricTuyaWaterValve);
+        }
         /// <summary>
         /// 鍑夐湼鍒楄〃
         /// </summary>
-        public List<Function> clothesHangerList = new List<Function>();
+        public List<Function> GetClothesHangerList ()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.ClothesHanger);
+        }
         /// <summary>
         /// 绾㈠瀹濆垪琛�
         /// </summary>
-        public List<Function> irModule = new List<Function>();
+        public List<Function> GetIrModuleList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.IrModule);
+        }
 
         #endregion
         /// <summary>
         /// 鐜浼犳劅鍣ㄥ垪琛�
         /// </summary>
-        public List<Sensor> sensorsEnvironmentalScience = new List<Sensor>();
+        public List<Function> GetEnvirSensorsList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.SensorPm25
+                    || obj.spk == SPK.SensorCO2
+                    || obj.spk == SPK.SensorTVOC
+                    || obj.spk == SPK.SensorTemperature
+                    || obj.spk == SPK.SensorHumidity
+                    );
+        }
         /// <summary>
         /// 瀹夐槻璁惧鍒楄〃
         /// </summary>
-        public List<Sensor> sensorsArm = new List<Sensor>();
+        public List<Function> GetArmSensorList()
+        {
+            return Functions.FindAll((obj) => obj.spk == SPK.SensorSmoke
+                    || obj.spk == SPK.SensorWater
+                    || obj.spk == SPK.SensorDoorWindow
+                    || obj.spk == SPK.SensorPir
+            );
+        }
 
         public List<Scene> scenes = new List<Scene>();
-        /// <summary>
-        /// 鍔熻兘鍒楄〃
-        /// </summary>
-        List<Function> deviceFunctionList = new List<Function>();
-
 
         /// <summary>
         /// 鍔犺浇鍔熻兘鍒楄〃
-        /// todo 闇�瑕佷紭鍖栵紝鍚庢湡涓嶈兘淇濊瘉鑳戒娇鐢╯id瑙f瀽鍑烘槸浠�涔堢被鍨嬬殑璁惧
         /// </summary>
         /// <param name="filePath"></param>
         public void IniFunctionList(string filePath)
@@ -162,7 +196,7 @@
             // todo 澧炲姞璁惧锛屽鍔犲姛鑳借繘鍔熻兘鍒楄〃
             if (filePath.StartsWith("FunctionData_"))
             {
-                var functionDataBytes = Common.FileUtlis.Files.ReadFile(filePath);
+                var functionDataBytes = FileUtlis.Files.ReadFile(filePath);
                 var functionDataString = System.Text.Encoding.UTF8.GetString(functionDataBytes);
                 var tempFunction = Newtonsoft.Json.JsonConvert.DeserializeObject<Function>(functionDataString);
                 if (tempFunction == null)
@@ -170,100 +204,10 @@
                     FileUtlis.Files.DeleteFile(filePath);
                     return;
                 }
-                {
-                    switch (tempFunction.spk)
-                    {
-                        case SPK.LightSwitch:
-                        case SPK.LightDimming:
-                        case SPK.LightRGB:
-                        case SPK.LightRGBW:
-                        case SPK.LightCCT:
-                            var light = Newtonsoft.Json.JsonConvert.DeserializeObject<Light>(functionDataString);
-                            List.lights.Add(light);
-                            deviceFunctionList.Add(light);
-                            break;
-                        case SPK.CurtainRoller:
-                        case SPK.CurtainShades:
-                        case SPK.CurtainSwitch:
-                        case SPK.CurtainTrietex:
-                            var curtain = Newtonsoft.Json.JsonConvert.DeserializeObject<Curtain>(functionDataString);
-                            List.curtains.Add(curtain);
-                            deviceFunctionList.Add(curtain);
-                            break;
-                        case SPK.AcStandard:
-                            var ac = Newtonsoft.Json.JsonConvert.DeserializeObject<AC>(functionDataString);
-                            List.aCs.Add(ac);
-                            deviceFunctionList.Add(ac);
-                            break;
-                        case SPK.FloorHeatStandard:
-                            var fh = Newtonsoft.Json.JsonConvert.DeserializeObject<FloorHeating>(functionDataString);
-                            List.floorHeatings.Add(fh);
-                            deviceFunctionList.Add(fh);
-                            break;
-                        case SPK.SensorPm25:
-                        case SPK.SensorCO2:
-                        case SPK.SensorTVOC:
-                        case SPK.SensorTemperature:
-                        case SPK.SensorHumidity:
-                            var sensor = Newtonsoft.Json.JsonConvert.DeserializeObject<Sensor>(functionDataString);
-                            List.sensorsEnvironmentalScience.Add(sensor);
-                            deviceFunctionList.Add(sensor);
-                            break;
-                        case SPK.ElectricSocket:
-                            var ele = Newtonsoft.Json.JsonConvert.DeserializeObject<SwitchSocket>(functionDataString);
-                            List.switchSockets.Add(ele);
-                            deviceFunctionList.Add(ele);
-                            break;
-                        case SPK.ElectricTV:
-                            var tv = Newtonsoft.Json.JsonConvert.DeserializeObject<TV>(functionDataString);
-                            List.tVs.Add(tv);
-                            deviceFunctionList.Add(tv);
-                            break;
-                        case SPK.ElectricFan:
-                            var fan = Newtonsoft.Json.JsonConvert.DeserializeObject<Fan>(functionDataString);
-                            List.fans.Add(fan);
-                            deviceFunctionList.Add(fan);
-                            break;
-                        case SPK.ElectricTuyaAirCleaner:
-                            var airCleaner = Newtonsoft.Json.JsonConvert.DeserializeObject<AirCleaner>(functionDataString);
-                            List.airCleaners.Add(airCleaner);
-                            deviceFunctionList.Add(airCleaner);
-                            break;
-                        case SPK.ElectricTuyaFan:
-                            var tuyaFan = Newtonsoft.Json.JsonConvert.DeserializeObject<Fan>(functionDataString);
-                            List.fans.Add(tuyaFan);
-                            deviceFunctionList.Add(tuyaFan);
-                            break;
-                        case SPK.ElectricTuyaWeepRobot:
-                            var tuyaWeepRobot = Newtonsoft.Json.JsonConvert.DeserializeObject<WeepRobot>(functionDataString);
-                            List.weepRobots.Add(tuyaWeepRobot);
-                            deviceFunctionList.Add(tuyaWeepRobot);
-                            break;
-                        case SPK.ElectricTuyaWaterValve:
-                            var tuyaWaterValve = Newtonsoft.Json.JsonConvert.DeserializeObject<Function>(functionDataString);
-                            List.waterValveList.Add(tuyaWaterValve);
-                            deviceFunctionList.Add(tuyaWaterValve);
-                            break;
-                        case SPK.SensorSmoke:
-                        case SPK.SensorWater:
-                        case SPK.SensorDoorWindow:
-                        case SPK.SensorPir:
-                            var ser = Newtonsoft.Json.JsonConvert.DeserializeObject<Sensor>(functionDataString);
-                            List.sensorsArm.Add(ser);
-                            deviceFunctionList.Add(ser);
-                            break;
-                        case SPK.ClothesHanger:
-                            var ch = Newtonsoft.Json.JsonConvert.DeserializeObject<Function>(functionDataString);
-                            List.clothesHangerList.Add(ch);
-                            deviceFunctionList.Add(ch);
-                            break;
-                        case SPK.IrModule:
-                            var irm = Newtonsoft.Json.JsonConvert.DeserializeObject<Function>(functionDataString);
-                            List.irModule.Add(irm);
-                            deviceFunctionList.Add(irm);
-                            break;
-                    }
-                }
+
+
+                Functions.Add(tempFunction);
+
             }
             if (filePath.StartsWith("SceneData_"))
             {
@@ -279,27 +223,6 @@
         /// </summary>
         public List<Function> GetDeviceFunctionList(SPK.BrandType brandType = SPK.BrandType.All)
         {
-            if (deviceFunctionList == null || deviceFunctionList.Count == 0)
-            {
-                deviceFunctionList = new List<Function>();
-                deviceFunctionList.AddRange(aCs);
-                deviceFunctionList.AddRange(lights);
-                deviceFunctionList.AddRange(curtains);
-                deviceFunctionList.AddRange(floorHeatings);
-                deviceFunctionList.AddRange(electricals);
-                deviceFunctionList.AddRange(sensorsEnvironmentalScience);
-                deviceFunctionList.AddRange(sensorsArm);
-                deviceFunctionList.AddRange(UI.Music.A31MusicModel.A31MusicModelList);
-                try
-                {
-                    deviceFunctionList = deviceFunctionList.OrderByDescending(o => o.controlCounter).ToList();
-                }
-                catch (Exception ex)
-                {
-                    MainPage.Log($"璁惧鍔熻兘鎺掑簭寮傚父锛歿ex.Message}");
-                }
-            }
-
             List<Function> resultFunctions = new List<Function>();
             if (brandType == SPK.BrandType.All)
             {
@@ -309,7 +232,7 @@
                 switch (brandType)
                 {
                     case SPK.BrandType.Hdl:
-                        foreach (var function in deviceFunctionList)
+                        foreach (var function in Functions)
                         {
                             if (!SPK.Get3tySpk(SPK.BrandType.All3tyBrand).Contains(function.spk))
                             {
@@ -319,7 +242,7 @@
                         break;
 
                     case SPK.BrandType.Tuya:
-                        foreach (var function in deviceFunctionList)
+                        foreach (var function in Functions)
                         {
                             if (SPK.Get3tySpk(SPK.BrandType.Tuya).Contains(function.spk))
                             {
@@ -331,7 +254,7 @@
                 return resultFunctions;
             }
 
-            return deviceFunctionList;
+            return Functions;
         }
 
         /// <summary>
@@ -339,23 +262,7 @@
         /// </summary>
         public void Clear()
         {
-            List.aCs = new List<AC>();
-            List.lights = new List<Light>();
-            List.curtains = new List<Curtain>();
-            List.floorHeatings = new List<FloorHeating>();
-            List.sensorsEnvironmentalScience = new List<Sensor>();
-            #region 瀹剁數
-            List.fans = new List<Fan>();
-            List.switchSockets = new List<SwitchSocket>();
-            List.tVs = new List<TV>();
-            List.airCleaners = new List<AirCleaner>();
-            List.weepRobots = new List<WeepRobot>();
-            List.waterValveList = new List<Function>();
-            List.clothesHangerList = new List<Function>();
-            #endregion
-
-            List.scenes = new List<Scene>();
-            List.deviceFunctionList = new List<Function>();
+            Functions = new List<Function>();
             _FunctionList = null;
         }
 
@@ -408,69 +315,8 @@
         /// </summary>
         public void DeleteFunction(Function delTemp)
         {
-            switch (delTemp.spk)
-            {
-                case SPK.LightSwitch:
-                case SPK.LightDimming:
-                case SPK.LightRGB:
-                case SPK.LightRGBW:
-                case SPK.LightCCT:
-                    List.lights.Remove(List.lights.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.CurtainRoller:
-                case SPK.CurtainShades:
-                case SPK.CurtainSwitch:
-                case SPK.CurtainTrietex:
-                    List.curtains.Remove(List.curtains.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.AcStandard:
-                    List.aCs.Remove(List.aCs.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.FloorHeatStandard:
-                    List.floorHeatings.Remove(List.floorHeatings.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.SensorPm25:
-                case SPK.SensorCO2:
-                case SPK.SensorTVOC:
-                case SPK.SensorTemperature:
-                case SPK.SensorHumidity:
-                    List.sensorsEnvironmentalScience.Remove(List.sensorsEnvironmentalScience.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.ElectricSocket:
-                    List.switchSockets.Remove(List.switchSockets.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.ElectricTV:
-                    List.tVs.Remove(List.tVs.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.ElectricFan:
-                case SPK.ElectricTuyaFan:
-                    List.fans.Remove(List.fans.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.ElectricTuyaAirCleaner:
-                    List.airCleaners.Remove(List.airCleaners.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.ElectricTuyaWaterValve:
-                    List.waterValveList.Remove(List.waterValveList.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.ElectricTuyaWeepRobot:
-                    List.weepRobots.Remove(List.weepRobots.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.ClothesHanger:
-                    List.clothesHangerList.Remove(List.clothesHangerList.Find((obj) => obj.deviceId == delTemp.deviceId));
-                    break;
-                case SPK.SensorSmoke:
-                case SPK.SensorWater:
-                case SPK.SensorDoorWindow:
-                case SPK.SensorPir:
-                    List.sensorsArm.Remove(List.sensorsArm.Find((obj)=>obj.deviceId == delTemp.deviceId));
-                    break;
-            }
-            var removeTemp = deviceFunctionList.Find((obj) => obj.deviceId == delTemp.deviceId);
-            if(removeTemp!= null)
-            {
-                deviceFunctionList.Remove(removeTemp);
-            }
-            Common.FileUtlis.Files.DeleteFile(delTemp.savePath);
+            Functions.Remove(Functions.Find((obj) => obj.deviceId == delTemp.deviceId));
+            FileUtlis.Files.DeleteFile(delTemp.savePath);
         }
 
         bool lockReadFunctionStatus = false;
diff --git a/HDL_ON/Entity/Room.cs b/HDL_ON/Entity/Room.cs
index 055a4c6..e932b22 100644
--- a/HDL_ON/Entity/Room.cs
+++ b/HDL_ON/Entity/Room.cs
@@ -74,10 +74,11 @@
         {
             var roomUpdateList = spatials.FindAll((obj) => obj.roomType == "ROOM");
             var floorUpdateList = spatials.FindAll((obj) => obj.roomType == "FLOOR");
+            CurrentSpatial.DeleteAllRoom();
+            FloorList.Clear();
             //澶勭悊鎴块棿鍒楄〃
             if (roomUpdateList != null && roomUpdateList.Count > 0)
             {
-                CurrentSpatial.DeleteAllRoom();
                 foreach (var newRoom in roomUpdateList)
                 {
                     newRoom.SaveRoomFile();
@@ -88,7 +89,6 @@
             //妤煎眰鎴块棿鍒楄〃
             if (floorUpdateList != null && floorUpdateList.Count > 0)
             {
-                FloorList.Clear();
                 foreach (var updateTemp in floorUpdateList)
                 {
                     FloorList.Add(updateTemp);
@@ -325,9 +325,10 @@
         /// </summary>
         public void DeleteAllRoom()
         {
-            foreach(var localRoom in RoomList)
+            for(int i=0;i< RoomList.Count;)
             {
-                Common.FileUtlis.Files.DeleteFile(localRoom.dataSavePath);
+                Common.FileUtlis.Files.DeleteFile(RoomList[i].dataSavePath);
+                RoomList.RemoveAt(i);
             }
             rooms = null;
         }
diff --git a/HDL_ON/HDL_ON.projitems b/HDL_ON/HDL_ON.projitems
index 4e35ba4..ddfcc5a 100644
--- a/HDL_ON/HDL_ON.projitems
+++ b/HDL_ON/HDL_ON.projitems
@@ -336,7 +336,6 @@
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\ArmSensor\SensorWaterImmersionPage.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\ArmSensor\SensorDoorWinwsPage.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\FuntionControlView\ArmSensor\SensorSmokePage.cs" />
-    <Compile Include="$(MSBuildThisFileDirectory)Entity\Function\DeviceFunction.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Entity\Enumerative\ClothsHangerEnum.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\PirDevice\PirMain.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)UI\UI2\4-PersonalCenter\PirDevice\View\TopView.cs" />
diff --git a/HDL_ON/UI/MainPage.cs b/HDL_ON/UI/MainPage.cs
index 3a8d23e..7ee9323 100644
--- a/HDL_ON/UI/MainPage.cs
+++ b/HDL_ON/UI/MainPage.cs
@@ -26,7 +26,7 @@
         /// <summary>
         /// 鐗堟湰鍙�
         /// </summary>
-        public static string VersionString = "1.1.0303";
+        public static string VersionString = "1.1.0305";
         ///// <summary>
         ///// 瀹㈡埛绔被鍨�
         ///// </summary>
diff --git a/HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs b/HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs
index f6559b3..265dc13 100644
--- a/HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs
+++ b/HDL_ON/UI/UI0-Public/PublicAssmeblyBLL.cs
@@ -11,7 +11,8 @@
         /// <summary>
         /// 鍔熻兘鎺у埗鐣岄潰璺宠浆浜嬩欢
         /// </summary>
-        public EventHandler<MouseEventArgs> LoadEvent_SkipFunctionControlPage(Function function,Button btnCollectionIcon, Button btnName, Button btnFromFloor)
+        public EventHandler<MouseEventArgs> LoadEvent_SkipFunctionControlPage(Function function, Button btnCollectionIcon, Button btnName, Button btnFromFloor
+            )
         {
             EventHandler<MouseEventArgs> eventHandler = (sender, e) =>
             {
@@ -20,71 +21,61 @@
                 switch (function.spk)
                 {
                     case SPK.LightSwitch:
-                        if (function.spk == SPK.ElectricSocket)
-                        {
-                            var s1View = new SocketPage(function as SwitchSocket);
-                            MainPage.BasePageView.AddChidren(s1View);
-                            s1View.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
-                            MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
-                        }
-                        else
-                        {
-                            var relayView = new RelayPage(function as Light);
-                            MainPage.BasePageView.AddChidren(relayView);
-                            relayView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
-                            MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
-                        }
+                        var relayView = new RelayPage(function);
+                        MainPage.BasePageView.AddChidren(relayView);
+                        relayView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
+                        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.LightRGB:
-                        var rgbView = new RGBPage(function as Light);
+                        var rgbView = new RGBPage(function);
                         MainPage.BasePageView.AddChidren(rgbView);
                         rgbView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.LightDimming:
-                        var dimmerView = new DimmerPage(function as Light);
+                        var dimmerView = new DimmerPage(function);
                         MainPage.BasePageView.AddChidren(dimmerView);
                         dimmerView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.CurtainTrietex:
-                        var skinView = new MotorCurtainPage(function as Curtain);
+                        var skinView = new MotorCurtainPage(function);
                         MainPage.BasePageView.AddChidren(skinView);
                         skinView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.CurtainSwitch:
-                        var curtainView = new CurtainModulePage(function as Curtain);
+                        var curtainView = new CurtainModulePage(function);
                         MainPage.BasePageView.AddChidren(curtainView);
                         curtainView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.CurtainRoller:
-                        var rollingShutterView = new RollingShutterPage(function as Curtain);
+                        var rollingShutterView = new RollingShutterPage(function);
                         MainPage.BasePageView.AddChidren(rollingShutterView);
                         rollingShutterView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.FloorHeatStandard:
-                        var fhView = new FloorHeatingPage(function as FloorHeating);
+                        var fhView = new FloorHeatingPage(function);
                         MainPage.BasePageView.AddChidren(fhView);
                         fhView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.ElectricFan:
-                        var fanView = new FanPage(function as Fan);
+                        var fanView = new FanPage(function);
                         MainPage.BasePageView.AddChidren(fanView);
                         fanView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.ElectricSocket:
-                        var sView = new SocketPage(function as SwitchSocket);
+                        var sView = new SocketPage(function);
                         MainPage.BasePageView.AddChidren(sView);
                         sView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.ElectricTV:
-                        var tvView = new TVPage(function as TV);
+                        var tvView = new TVPage(function);
                         MainPage.BasePageView.AddChidren(tvView);
                         tvView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
@@ -108,12 +99,12 @@
                     case SPK.MusicStandard:
                         Music.A31MusicModel.Current = (function as Music.A31MusicModel);//褰撳墠鎾斁鍣�
                         var a31PlayMusicPage = new Music.A31PlayMusicPage();
-                            MainPage.BasePageView.AddChidren(a31PlayMusicPage);
-                            a31PlayMusicPage.Show();
-                            MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
+                        MainPage.BasePageView.AddChidren(a31PlayMusicPage);
+                        a31PlayMusicPage.Show();
+                        MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                         break;
                     case SPK.LightCCT:
-                        var TureView = new ColorTureLampPage(function as Light);
+                        var TureView = new ColorTureLampPage(function);
                         MainPage.BasePageView.AddChidren(TureView);
                         TureView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
                         MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
@@ -147,15 +138,9 @@
                         var acPage = new AcControlPage();
                         acPage.AddForm(function, btnCollectionIcon, btnName, btnFromFloor);
                         break;
-                    //case SPK.AcStandard:
-                    //    var acView = new ACPage(function as AC);
-                    //    MainPage.BasePageView.AddChidren(acView);
-                    //    acView.LoadPage(btnCollectionIcon, btnName, btnFromFloor);
-                    //    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
-                    //    break;
                 }
             };
             return eventHandler;
         }
     }
-}
+}
\ No newline at end of file
diff --git a/HDL_ON/UI/UI0-Public/UpdataSidDataDialog.cs b/HDL_ON/UI/UI0-Public/UpdataSidDataDialog.cs
index 984a091..b228052 100644
--- a/HDL_ON/UI/UI0-Public/UpdataSidDataDialog.cs
+++ b/HDL_ON/UI/UI0-Public/UpdataSidDataDialog.cs
@@ -44,9 +44,8 @@
                     //sidObj.bus.LoopId = Convert.ToByte(sidObj.sid.Substring(20, 4),16);
                     sidObj.bus.loopId = sidObj.sid.Substring(20, 4);
                 }
-                FunctionList.List.AddDeviceFunction(sidObj);
+                //FunctionList.List.AddDeviceFunction(sidObj);
             }
-            //MainPage.GoUserPage();
         }
 
     }
diff --git a/HDL_ON/UI/UI1-Login/LoginPage.cs b/HDL_ON/UI/UI1-Login/LoginPage.cs
index 327f2ee..06ff41a 100644
--- a/HDL_ON/UI/UI1-Login/LoginPage.cs
+++ b/HDL_ON/UI/UI1-Login/LoginPage.cs
@@ -192,12 +192,12 @@
                 //return;
                 if (b)
                 {
-                    etAccount.Text = "15622703419";//"18316120654";//lcg "18316672920";//hzx;// "13415629083"//cf;//tujie"18316120654";
+                    etAccount.Text = "18316672920";//"18316120654";//lcg "18316672920";//hzx;// "13415629083"//cf;//tujie"18316120654";
                     // "15622703419"lwn;// "18824864143";//"464027401@qq.com"; //"2791308028@qq.com";//13697499568 
                 }
                 else
                 {
-                    etAccount.Text = "18316672920";//鍑夐湼"18666455392";//13375012446//13602944661//tzy 18778381374
+                    etAccount.Text = "15971583093";//鍑夐湼"18666455392";//13375012446//13602944661//tzy 18778381374
                     //15971583093 gs
                 }
                 b = !b;
diff --git a/HDL_ON/UI/UI2/1-HomePage/HomePage.cs b/HDL_ON/UI/UI2/1-HomePage/HomePage.cs
index 687bc60..265043e 100644
--- a/HDL_ON/UI/UI2/1-HomePage/HomePage.cs
+++ b/HDL_ON/UI/UI2/1-HomePage/HomePage.cs
@@ -459,7 +459,6 @@
         /// </summary>
         void LoadDeviceFunctionControlZone()
         {
-         
             #region ContextView
             deviceFunctionView.RemoveAll();
             functionViews.Clear();
@@ -769,7 +768,7 @@
                     };
                     view.AddChidren(btnCurtainOpen);
 
-                    LoadEvent_ControlCurtain(function as Curtain, btnCurtainClose, btnCurtainOpen);
+                    LoadEvent_ControlCurtain(function, btnCurtainClose, btnCurtainOpen);
                 }
 
                 else if (function.spk == SPK.ElectricTV)
@@ -785,7 +784,7 @@
                         UnSelectedImagePath = "Public/PowerClose.png",
                     };
                     view.AddChidren(btnPower);
-                    LoadEvent_ControlTV(function as TV, btnPower);
+                    LoadEvent_ControlTV(function, btnPower);
                 }
 
                 else if (function.spk == SPK.MusicStandard)
@@ -885,7 +884,7 @@
                             #region 鐏厜 Light
                             btnIcon.UnSelectedImagePath = "FunctionIcon/Light/LightIcon.png";
                             btnIcon.SelectedImagePath = "FunctionIcon/Light/LightOnIcon.png";
-                            UpdataFunctionStates(function as Light);
+                            UpdataFunctionStates(function);
                             #endregion
                             break;
                         case FunctionCategory.AC:
@@ -948,6 +947,7 @@
                     function.CollectFunction();
                 };
 
+
                 var skipControlPageEvent = new PublicAssmebly().LoadEvent_SkipFunctionControlPage(function, btnCollection, btnName, btnZone);
                 view.MouseUpEventHandler = skipControlPageEvent;
                 btnName.MouseUpEventHandler = skipControlPageEvent;
diff --git a/HDL_ON/UI/UI2/1-HomePage/HomePageBLL.cs b/HDL_ON/UI/UI2/1-HomePage/HomePageBLL.cs
index c090e78..f2c7f27 100644
--- a/HDL_ON/UI/UI2/1-HomePage/HomePageBLL.cs
+++ b/HDL_ON/UI/UI2/1-HomePage/HomePageBLL.cs
@@ -21,6 +21,16 @@
                 bodyView.btnPm25Values.Text = MainPage.cityInfo.pm25 == null ? "--" : MainPage.cityInfo.pm25;
             }
         }
+        /// <summary>
+        /// 鏇存柊鍔熻兘鍒楄〃涓婚〉
+        /// </summary>
+        public static void RefreshFunctionView()
+        {
+            if (bodyView != null)
+            {
+                bodyView.LoadDeviceFunctionControlZone();
+            }
+        }
 
         /// <summary>
         /// 鏇存柊杩炴帴鐘舵�佸浘鏍�
@@ -163,7 +173,7 @@
         /// </summary>
         public static void UpdataFunctionStates(Function function)
         {
-            Application.RunOnMainThread((Action)(() =>
+            Application.RunOnMainThread(() =>
             {
                 try
                 {
@@ -213,7 +223,7 @@
                 {
                     MainPage.Log($"HomePage updata funciton states error {ex.Message}");
                 }
-            }));
+            });
         }
 
         /// <summary>
@@ -293,18 +303,17 @@
                     Dictionary<string, string> d = new Dictionary<string, string>();
                     if (function.spk == SPK.LightDimming || function.spk == SPK.LightRGB)
                     {
-                        var light = function as Light;
-                        d.Add(FunctionAttributeKey.OnOff, light.trait_on_off.curValue.ToString());
+                        d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
                         if (btnSwitch.IsSelected)
                         {
-                            d.Add(FunctionAttributeKey.Brightness, light.lastBrightness.ToString());
+                            d.Add(FunctionAttributeKey.Brightness, function.lastBrightness.ToString());
                         }
                         else
                         {
-                            light.lastBrightness = light.brightness;
+                            function.lastBrightness = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness));
                         }
-                        d.Add(FunctionAttributeKey.FadeTime, light.fadeTime.ToString());
-                        Control.Ins.SendWriteCommand(light, d);
+                        d.Add(FunctionAttributeKey.FadeTime, function.GetAttrState(FunctionAttributeKey.FadeTime));
+                        Control.Ins.SendWriteCommand(function, d);
                     }
                     else
                     {
@@ -321,26 +330,26 @@
         /// </summary>
         /// <param name="tV"></param>
         /// <param name="button"></param>
-        void LoadEvent_ControlTV(TV tV, Button button)
+        void LoadEvent_ControlTV(Function tV, Button button)
         {
             button.MouseUpEventHandler = (sender, e) =>
             {
-                tV.ControlTV(InfraredCode_TV.Power);
+                new TV().ControlTV(InfraredCode_TV.Power, tV);
             };
         }
 
         /// <summary>
         /// 鍔犺浇绐楀笜鎺у埗浜嬩欢
         /// </summary>
-        void LoadEvent_ControlCurtain(Curtain curtain, Button btnClose, Button btnOpen)
+        void LoadEvent_ControlCurtain(Function curtain, Button btnClose, Button btnOpen)
         {
             btnClose.MouseUpEventHandler = (sender, e) =>
             {
                 btnClose.IsSelected = true;
                 curtain.trait_on_off.curValue = "off";
-                curtain.percent = 0;
+                curtain.SetAttrState(FunctionAttributeKey.Percent, 0);
                 Dictionary<string, string> d = new Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
+                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
                 Control.Ins.SendWriteCommand(curtain, d);
             };
 
@@ -348,9 +357,9 @@
             {
                 btnOpen.IsSelected = true;
                 curtain.trait_on_off.curValue = "on";
-                curtain.percent = 100;
+                curtain.SetAttrState(FunctionAttributeKey.Percent, 100);
                 Dictionary<string, string> d = new Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
+                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
                 Control.Ins.SendWriteCommand(curtain, d);
             };
         }
diff --git a/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs b/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs
index 279c70d..b86e4c5 100644
--- a/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs
+++ b/HDL_ON/UI/UI2/2-Classification/ClassificaitionPublicBLL.cs
@@ -77,14 +77,13 @@
                                             {
                                                 try
                                                 {
+                                                    (fcView.GetChildren(j) as DiyImageSeekBar).Progress = Convert.ToInt32(updataFunction.GetAttrState(FunctionAttributeKey.Brightness));
                                                     if (updataFunction.trait_on_off.curValue.ToString() == "on")
                                                     {
-                                                        (fcView.GetChildren(j) as DiyImageSeekBar).Progress = (updataFunction as Light).brightness;
                                                         (fcView.GetChildren(j) as DiyImageSeekBar).ProgressBarColor = CSS.CSS_Color.AuxiliaryColor1;
                                                     }
                                                     else
                                                     {
-                                                        (fcView.GetChildren(j) as DiyImageSeekBar).Progress = (updataFunction as Light).brightness;
                                                         (fcView.GetChildren(j) as DiyImageSeekBar).ProgressBarColor = CSS.CSS_Color.PromptingColor2;
                                                     }
                                                 }
diff --git a/HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs b/HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs
index de798f2..4e4505a 100644
--- a/HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs
+++ b/HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs
@@ -442,41 +442,41 @@
                 {
                     case ShowFunction.Light:
                         #region Light
-                        functionCount = FunctionList.List.lights.Count;
-                        functionOnCount = FunctionList.List.lights.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
+                        functionCount = FunctionList.List.GetLightList().Count;
+                        functionOnCount = FunctionList.List.GetLightList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         #endregion
                         break;
                     case ShowFunction.AC:
                         #region AC
-                        functionCount = FunctionList.List.aCs.Count;
-                        functionOnCount = FunctionList.List.aCs.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
+                        functionCount = FunctionList.List.GetAcList().Count;
+                        functionOnCount = FunctionList.List.GetAcList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         #endregion
                         break;
                     case ShowFunction.Curtain:
                         #region Curtain
-                        functionCount = FunctionList.List.curtains.Count;
-                        functionOnCount = FunctionList.List.curtains.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
+                        functionCount = FunctionList.List.GetCurtainList().Count;
+                        functionOnCount = FunctionList.List.GetCurtainList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         #endregion
                         break;
                     case ShowFunction.FloorHeating:
                         #region 鍦扮儹
-                        functionCount = FunctionList.List.floorHeatings.Count;
-                        functionOnCount = FunctionList.List.floorHeatings.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
+                        functionCount = FunctionList.List.GetFloorHeatingList().Count;
+                        functionOnCount = FunctionList.List.GetFloorHeatingList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         #endregion
                         break;
                     case ShowFunction.DoorLock:
                         break;
                     case ShowFunction.Electric:
                         #region 鐢靛櫒
-                        functionCount = FunctionList.List.electricals.Count;
-                        functionOnCount = FunctionList.List.electricals.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
+                        functionCount = FunctionList.List.GetElectricals().Count;
+                        functionOnCount = FunctionList.List.GetElectricals().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         #endregion
                         break;
                     case ShowFunction.EnergyMonitoring:
                         break;
                     case ShowFunction.Environmental:
                         #region 鐜鏁版嵁
-                        functionCount = FunctionList.List.sensorsEnvironmentalScience.Count;
+                        functionCount = FunctionList.List.GetEnvirSensorsList().Count;
                         #endregion
                         break;
                     case ShowFunction.FreshAir:
@@ -491,7 +491,7 @@
                         functionCount = 1;
                         break;
                     case ShowFunction.Sensor:
-                        functionCount = FunctionList.List.sensorsArm.Count;
+                        functionCount = FunctionList.List.GetArmSensorList().Count;
                         break;
                     case ShowFunction.VideoIntercom:
                         break;
@@ -597,8 +597,6 @@
                     case ShowFunction.Light:
                         #region Light
                         btnName.TextID = StringId.Lights;
-                        functionCount = FunctionList.List.lights.Count;
-                        functionOnCount = FunctionList.List.lights.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         Button btnLightPower = new Button()
                         {
                             X = Application.GetRealWidth(120),
@@ -623,8 +621,6 @@
                     case ShowFunction.AC:
                         #region AC
                         btnName.TextID = StringId.AC;
-                        functionCount = FunctionList.List.aCs.Count;
-                        functionOnCount = FunctionList.List.aCs.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         Button btnAcPower = new Button()
                         {
                             X = Application.GetRealWidth(120),
@@ -647,8 +643,6 @@
                     case ShowFunction.Curtain:
                         #region Curtain
                         btnName.TextID = StringId.Curtain;
-                        functionCount = FunctionList.List.curtains.Count;
-                        functionOnCount = FunctionList.List.curtains.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         Button btnClose;
                         btnClose = new Button()
                         {
@@ -682,8 +676,6 @@
                     case ShowFunction.FloorHeating:
                         #region 鍦扮儹
                         btnName.TextID = StringId.FloorHeating;
-                        functionCount = FunctionList.List.floorHeatings.Count;
-                        functionOnCount = FunctionList.List.floorHeatings.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         Button btnFhPower = new Button()
                         {
                             X = Application.GetRealWidth(120),
@@ -709,8 +701,6 @@
                     case ShowFunction.Electric:
                         #region 鐢靛櫒
                         btnName.TextID = StringId.Electric;
-                        functionCount = FunctionList.List.electricals.Count;
-                        functionOnCount = FunctionList.List.electricals.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         Button btnElectricPower = new Button()
                         {
                             X = Application.GetRealWidth(120),
@@ -750,8 +740,6 @@
                         break;
                     case ShowFunction.Music:
                         btnName.TextID = StringId.Music;
-                        functionCount = Music.A31MusicModel.A31MusicModelList.Count;
-                        functionOnCount = Music.A31MusicModel.A31MusicModelList.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
                         btnFunctionViewBg.MouseUpEventHandler = (sender, e) =>
                         {
                             var musicMain = new Music.MusicMain();
diff --git a/HDL_ON/UI/UI2/2-Classification/ClassificationPageBLL.cs b/HDL_ON/UI/UI2/2-Classification/ClassificationPageBLL.cs
index b3624ab..dbf88dd 100644
--- a/HDL_ON/UI/UI2/2-Classification/ClassificationPageBLL.cs
+++ b/HDL_ON/UI/UI2/2-Classification/ClassificationPageBLL.cs
@@ -17,7 +17,7 @@
         /// <param name="function"></param>
         public static void UpdataInfo(Function function)
         {
-            Application.RunOnMainThread((Action)(() => {
+            Application.RunOnMainThread(() => {
                 if (bodyView == null)
                     return;
                 try
@@ -48,6 +48,7 @@
                         case SPK.ElectricTuyaFan:
                         case SPK.ElectricTuyaWaterValve:
                         case SPK.ElectricTuyaWeepRobot:
+                        case SPK.ClothesHanger:
                             vv = ShowFunction.Electric;
                             break;
                     }
@@ -57,7 +58,7 @@
                 catch
                 {
                 }
-            }));
+            });
         }
 
         /// <summary>
@@ -99,51 +100,32 @@
                                                 var btn = view3.GetChildren(o) as Button;
                                                 if (btn.Tag != null)
                                                 {
+                                                    string btnText = "0";
+                                                    switch (functionCategory)
+                                                    {
+                                                        case ShowFunction.FloorHeating:
+                                                            btnText = FunctionList.List.GetFloorHeatingList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
+                                                            break;
+                                                        case ShowFunction.AC:
+                                                            btnText = FunctionList.List.GetAcList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
+                                                            break;
+                                                        case ShowFunction.Curtain:
+                                                            btnText = FunctionList.List.GetCurtainList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
+                                                            break;
+                                                        case ShowFunction.Light:
+                                                            btnText = FunctionList.List.GetLightList().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
+                                                            break;
+                                                        case ShowFunction.Electric:
+                                                            btnText = FunctionList.List.GetElectricals().FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
+                                                            break;
+                                                    }
                                                     if (btn.Tag.ToString() == functionCategory + "_onCount")
                                                     {
-                                                        string btnText = "0";
-                                                        switch (functionCategory)
-                                                        {
-                                                            case ShowFunction.FloorHeating:
-                                                                btnText = FunctionList.List.floorHeatings.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
-                                                                break;
-                                                            case ShowFunction.AC:
-                                                                btnText = FunctionList.List.aCs.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
-                                                                break;
-                                                            case ShowFunction.Curtain:
-                                                                btnText = FunctionList.List.curtains.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
-                                                                break;
-                                                            case ShowFunction.Light:
-                                                                btnText = FunctionList.List.lights.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
-                                                                break;
-                                                            case ShowFunction.Electric:
-                                                                btnText = FunctionList.List.electricals.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count.ToString();
-                                                                break;
-                                                        }
                                                         btn.Text = btnText;
                                                     }
                                                     else if (btn.Tag.ToString() == functionCategory + "_AllControl")
                                                     {
-                                                        var openCount = 0;
-                                                        switch (functionCategory)
-                                                        {
-                                                            case ShowFunction.FloorHeating:
-                                                                openCount = FunctionList.List.floorHeatings.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
-                                                                break;
-                                                            case ShowFunction.AC:
-                                                                openCount = FunctionList.List.aCs.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
-                                                                break;
-                                                            case ShowFunction.Curtain:
-                                                                openCount = FunctionList.List.curtains.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
-                                                                break;
-                                                            case ShowFunction.Light:
-                                                                openCount = FunctionList.List.lights.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
-                                                                break;
-                                                            case ShowFunction.Electric:
-                                                                openCount = FunctionList.List.electricals.FindAll((obj) => obj.trait_on_off.curValue.ToString() == "on").Count;
-                                                                break;
-                                                        }
-                                                        btn.IsSelected = openCount != 0;
+                                                        btn.IsSelected = btnText != "0";
                                                     }
                                                 }
                                             }
@@ -349,7 +331,7 @@
                             switch (functionCategory)
                             {
                                 case ShowFunction.AC:
-                                    foreach (var f in FunctionList.List.aCs)
+                                    foreach (var f in FunctionList.List.GetAcList())
                                     {
                                         f.trait_on_off.curValue = onoff;
                                         Dictionary<string, string> d = new Dictionary<string, string>();
@@ -359,7 +341,7 @@
                                     }
                                     break;
                                 case ShowFunction.FloorHeating:
-                                    foreach (var f in FunctionList.List.floorHeatings)
+                                    foreach (var f in FunctionList.List.GetFloorHeatingList())
                                     {
                                         f.trait_on_off.curValue = onoff;
                                         Dictionary<string, string> d = new Dictionary<string, string>();
@@ -369,7 +351,7 @@
                                     }
                                     break;
                                 case ShowFunction.Light:
-                                    foreach (var f in FunctionList.List.lights)
+                                    foreach (var f in FunctionList.List.GetLightList())
                                     {
                                         f.trait_on_off.curValue = onoff;
                                         Dictionary<string, string> d = new Dictionary<string, string>();
@@ -379,7 +361,7 @@
                                     }
                                     break;
                                 case ShowFunction.Electric:
-                                    foreach (var f in FunctionList.List.electricals)
+                                    foreach (var f in FunctionList.List.GetElectricals())
                                     {
                                         f.trait_on_off.curValue = onoff;
                                         Dictionary<string, string> d = new Dictionary<string, string>();
@@ -396,7 +378,7 @@
                             {
                                 case ShowFunction.AC:
                                     List<Function> acList = new List<Function>();
-                                    foreach(var f in FunctionList.List.aCs)
+                                    foreach(var f in FunctionList.List.GetAcList())
                                     {
                                         acList.Add(f);
                                     }
@@ -404,7 +386,7 @@
                                     break;
                                 case ShowFunction.FloorHeating:
                                     List<Function> fhList = new List<Function>();
-                                    foreach (var f in FunctionList.List.floorHeatings)
+                                    foreach (var f in FunctionList.List.GetFloorHeatingList())
                                     {
                                         fhList.Add(f);
                                     }
@@ -412,7 +394,7 @@
                                     break;
                                 case ShowFunction.Light:
                                     List<Function> lightList = new List<Function>();
-                                    foreach (var f in FunctionList.List.lights)
+                                    foreach (var f in FunctionList.List.GetLightList())
                                     {
                                         lightList.Add(f);
                                     }
@@ -420,7 +402,7 @@
                                     break;
                                 case ShowFunction.Electric:
                                     List<Function> eleList = new List<Function>();
-                                    foreach (var f in FunctionList.List.electricals)
+                                    foreach (var f in FunctionList.List.GetElectricals())
                                     {
                                         eleList.Add(f);
                                     }
@@ -467,10 +449,10 @@
                 {
                     try
                     {
-                        foreach (var f in FunctionList.List.curtains)
+                        foreach (var f in FunctionList.List.GetCurtainList())
                         {
                             f.trait_on_off.curValue = "on";
-                            f.percent = 100;
+                            f.SetAttrState(FunctionAttributeKey.Percent, "100");
                             Dictionary<string, string> d = new Dictionary<string, string>();
                             d.Add("on_off", f.trait_on_off.curValue.ToString());
                             Control.Ins.SendWriteCommand(f, d);
@@ -498,10 +480,10 @@
                 DB_ResidenceData.Instance.GlobalCurtainStatus = false;
                 btnClose.IsSelected = true;
                 btnOpen.IsSelected = false;
-                foreach (var f in FunctionList.List.curtains)
+                foreach (var f in FunctionList.List.GetCurtainList())
                 {
                     f.trait_on_off.curValue = "off";
-                    f.percent = 0;
+                    f.SetAttrState(FunctionAttributeKey.Percent, "0");
                     Dictionary<string, string> d = new Dictionary<string, string>();
                     d.Add("on_off", f.trait_on_off.curValue.ToString());
                     Control.Ins.SendWriteCommand(f, d);
diff --git a/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs b/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs
index f0a079e..4727b80 100644
--- a/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs
+++ b/HDL_ON/UI/UI2/2-Classification/FunctionControlZone.cs
@@ -331,7 +331,7 @@
                         ProgressTextColor = CSS_Color.FirstLevelTitleColor,
                         ProgressTextSize = CSS_FontSize.PromptFontSize_SecondaryLevel,
                         MaxValue = 100,
-                        Progress = (function as Light).brightness,
+                        Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.BatteryState)),
                         Tag = function.sid + "_DimmerBar",
                         SeekBarPadding = Application.GetRealWidth(20),
                     };
@@ -399,7 +399,7 @@
                 IsSelected = function.GetAttrState(FunctionAttributeKey.Percent) != "0"
             };
             bodyDiv.AddChidren(btnCurtainOpen);
-            LoadEvent_ControlCurtain(btnCurtainStop, btnCurtainOpen, btnCurtainClose, function as Curtain);
+            LoadEvent_ControlCurtain(btnCurtainStop, btnCurtainOpen, btnCurtainClose, function);
             #endregion
         }
         /// <summary>
diff --git a/HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs b/HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs
index 692d673..1c22cb3 100644
--- a/HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs
+++ b/HDL_ON/UI/UI2/2-Classification/FunctionControlZoneBLL.cs
@@ -40,7 +40,7 @@
                                 {
                                     if (btn.Tag.ToString() == upfunc.sid + "_DimmerBar")
                                     {
-                                        //btn.Progress = (upfunc as Light).trait_brightness.value.value.ToString() == "on";
+                                        btn.Progress = Convert.ToInt32(upfunc.GetAttrState(FunctionAttributeKey.Brightness));
                                     }
                                 }
                             }
@@ -109,10 +109,8 @@
                 {
                     if (function.Spk_Prefix == FunctionCategory.Light)
                     {
-                        var light = function as Light;
-                        light.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                        //Control.Send(CommandType_A.write, function);
-                        System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
+                        function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                        Dictionary<string, string> d = new Dictionary<string, string>();
                         d.Add("on_off", function.trait_on_off.curValue.ToString());
                         Control.Ins.SendWriteCommand(function, d);
                     }
@@ -128,7 +126,6 @@
         {
             if(function.spk == SPK.LightDimming || function.spk == SPK.LightRGB)
             {
-                var light = function as Light;
                 dimmerControlBar.OnStartTrackingTouchEvent = (sender, e) => {
                     onDimmerBar = true;
                     (bodyDiv.Parent as VerticalScrolViewLayout).ScrollEnabled = false;
@@ -136,10 +133,10 @@
                 dimmerControlBar.OnStopTrackingTouchEvent = (sender, e) => {
                     onDimmerBar = false;
                     (bodyDiv.Parent as VerticalScrolViewLayout).ScrollEnabled = true;
-                    light.brightness = dimmerControlBar.Progress;
+                    function.SetAttrState(FunctionAttributeKey.Brightness, dimmerControlBar.Progress.ToString());
                     Dictionary<string, string> d = new Dictionary<string, string>();
-                    d.Add("brightness", light.brightness.ToString());
-                    Control.Ins.SendWriteCommand(light, d);
+                    d.Add(FunctionAttributeKey.Brightness, dimmerControlBar.Progress.ToString());
+                    Control.Ins.SendWriteCommand(function, d);
                 };
                 dimmerControlBar.OnProgressChangedEvent = (sender, e) => {
                     dimmerControlBar.ProgressBarColor = CSS.CSS_Color.AuxiliaryColor1;
@@ -183,7 +180,7 @@
         /// <param name="btnStop"></param>
         /// <param name="btnOpen"></param>
         /// <param name="btnClose"></param>
-        void LoadEvent_ControlCurtain(Button btnStop, Button btnOpen, Button btnClose, Curtain curtain)
+        void LoadEvent_ControlCurtain(Button btnStop, Button btnOpen, Button btnClose, Function curtain)
         {
             btnClose.MouseUpEventHandler = (sender, e) =>
             {
@@ -191,9 +188,9 @@
                 btnStop.IsSelected = false;
                 btnOpen.IsSelected = false;
                 curtain.trait_on_off.curValue = "off";
-                curtain.percent = 0;
+                curtain.SetAttrState(FunctionAttributeKey.Percent, 0);
                 Dictionary<string, string> d = new Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
+                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
                 Control.Ins.SendWriteCommand(curtain, d);
             };
 
@@ -204,7 +201,7 @@
                 btnOpen.IsSelected = false;
                 curtain.trait_on_off.curValue = "stop";
                 Dictionary<string, string> d = new Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
+                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
                 Control.Ins.SendWriteCommand(curtain, d);
             };
 
@@ -214,9 +211,9 @@
                 btnClose.IsSelected = false;
                 btnStop.IsSelected = false;
                 curtain.trait_on_off.curValue = "on";
-                curtain.percent = 100;
+                curtain.SetAttrState(FunctionAttributeKey.Percent, 100);
                 Dictionary<string, string> d = new Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
+                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
                 Control.Ins.SendWriteCommand(curtain, d);
             };
         }
diff --git a/HDL_ON/UI/UI2/2-Classification/FunctionPage.cs b/HDL_ON/UI/UI2/2-Classification/FunctionPage.cs
index 91c286b..1536bbb 100644
--- a/HDL_ON/UI/UI2/2-Classification/FunctionPage.cs
+++ b/HDL_ON/UI/UI2/2-Classification/FunctionPage.cs
@@ -83,31 +83,31 @@
 
             if (titleId == StringId.Lights)
             {
-                functionList.AddRange(FunctionList.List.lights);
+                functionList.AddRange(FunctionList.List.GetLightList());
             }
             else if (titleId == StringId.AC)
             {
-                functionList.AddRange(FunctionList.List.aCs);
+                functionList.AddRange(FunctionList.List.GetAcList());
             }
             else if (titleId == StringId.Curtain)
             {
-                functionList.AddRange(FunctionList.List.curtains);
+                functionList.AddRange(FunctionList.List.GetCurtainList());
             }
             else if (titleId == StringId.FloorHeating)
             {
-                functionList.AddRange(FunctionList.List.floorHeatings);
+                functionList.AddRange(FunctionList.List.GetFloorHeatingList());
             }
             else if (titleId == StringId.Electric)
             {
-                functionList.AddRange(FunctionList.List.electricals);
+                functionList.AddRange(FunctionList.List.GetElectricals());
             }
             else if (titleId == StringId.EnvironmentalScience)
             {
-                functionList.AddRange(FunctionList.List.sensorsEnvironmentalScience);
+                functionList.AddRange(FunctionList.List.GetEnvirSensorsList());
             }
             else if (titleId == StringId.Sensor)
             {
-                functionList.AddRange(FunctionList.List.sensorsArm);
+                functionList.AddRange(FunctionList.List.GetArmSensorList());
             }
             functionList.OrderByDescending(o => o.controlCounter).ToList();
 
diff --git a/HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs b/HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs
index 800f8a5..89120fe 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/AC/ACPage.cs
@@ -66,7 +66,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        AC aC;
+        AC acTemp = new AC();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -75,10 +76,10 @@
         /// </summary>
         Action actionRefresh;
         #endregion
-        public ACPage(AC func)
+        public ACPage(Function func)
         {
             bodyView = this;
-            aC = func;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -107,7 +108,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = aC.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -120,7 +121,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = aC.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -132,7 +133,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = aC.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -145,16 +146,16 @@
             {
                 Gravity = Gravity.CenterHorizontal,
                 OpenAngle = 160,
-                ThumbImagePath = aC.trait_on_off.curValue.ToString() == "on" ? "FunctionIcon/AC/DiyThumbIconOn.png" : "FunctionIcon/AC/DiyThumbIcon.png",
+                ThumbImagePath = function.trait_on_off.curValue.ToString() == "on" ? "FunctionIcon/AC/DiyThumbIconOn.png" : "FunctionIcon/AC/DiyThumbIcon.png",
                 ThumbImageHeight = Application.GetRealWidth(50),
                 ProgressBarColor = CSS_Color.MainColor,
                 OfflineProgressBarColor = CSS_Color.PromptingColor2,
-                IsOffline = aC.trait_on_off.curValue.ToString() == "off",
-                MinValue = aC.GetAttribute(FunctionAttributeKey.SetTemp).min,
-                MaxValue = aC.GetAttribute(FunctionAttributeKey.SetTemp).max,
-                //IsClickable = aC.trait_on_off.curValue.ToString() == "on",
+                IsOffline = function.trait_on_off.curValue.ToString() == "off",
+                MinValue = function.GetAttribute(FunctionAttributeKey.SetTemp).min,
+                MaxValue = function.GetAttribute(FunctionAttributeKey.SetTemp).max,
+                //IsClickable = function.trait_on_off.curValue.ToString() == "on",
                 ArcColor = CSS_Color.BackgroundColor,
-                Progress = Convert.ToInt32(aC.GetAttrState(FunctionAttributeKey.SetTemp)),
+                Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.SetTemp)),
 #if __IOS__
                 Y = Application.GetRealHeight(120 + 25),
                 Width = Application.GetRealWidth(260 - 40),
@@ -179,7 +180,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextSize = 50,
                 IsBold = true,
-                Text = aC.GetAttrState(FunctionAttributeKey.SetTemp),
+                Text = function.GetAttrState(FunctionAttributeKey.SetTemp),
                 TextAlignment = TextAlignment.Center,
             };
             controlView.AddChidren(btnTemp);
@@ -236,7 +237,7 @@
                 Y = Application.GetRealHeight(334),
                 Width = Application.GetRealWidth(30),
                 Height = Application.GetRealWidth(30),
-                UnSelectedImagePath = aC.GetModeIconPath(),
+                UnSelectedImagePath = acTemp.GetModeIconPath(function.GetAttrState(FunctionAttributeKey.Mode)),
             };
             controlView.AddChidren(btnMode);
 
@@ -246,7 +247,7 @@
                 Y = Application.GetRealHeight(337),
                 Width = Application.GetRealWidth(30),
                 Height = Application.GetRealWidth(30),
-                UnSelectedImagePath = aC.GetFanIconPath(),
+                UnSelectedImagePath = acTemp.GetFanIconPath(function.GetAttrState(FunctionAttributeKey.FanSpeed)),
             };
             controlView.AddChidren(btnWindSpeed);
 
@@ -258,15 +259,15 @@
                 Height = Application.GetRealWidth(32),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = aC.trait_on_off.curValue.ToString() == "on"
+                IsSelected = function.trait_on_off.curValue.ToString() == "on"
             };
             controlView.AddChidren(btnSwitch);
 
             LoadEventList();
-            new TopViewDiv(bodyView,Language.StringByID(StringId.AC)).LoadTopView_FunctionTop(aC, actionRefresh);
+            new TopViewDiv(bodyView,Language.StringByID(StringId.AC)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(aC);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
@@ -318,7 +319,7 @@
             };
             modeChangeView.AddChidren(btnLine);
 
-            var modeList = aC.GetAttribute(FunctionAttributeKey.Mode).value;
+            var modeList = function.GetAttribute(FunctionAttributeKey.Mode).value;
             foreach (var m in modeList)
             {
                 Button btnModeIcon = new Button()
@@ -327,7 +328,7 @@
                     Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 10 + 8),
                     Width = Application.GetRealWidth(24),
                     Height = Application.GetRealWidth(24),
-                    IsSelected = aC.GetAttrState(FunctionAttributeKey.Mode) == m,
+                    IsSelected = function.GetAttrState(FunctionAttributeKey.Mode) == m,
                 };
                 modeChangeView.AddChidren(btnModeIcon);
 
@@ -340,7 +341,7 @@
                     TextAlignment = TextAlignment.CenterLeft,
                     TextColor = CSS_Color.FirstLevelTitleColor,
                     SelectedTextColor = CSS_Color.MainColor,
-                    IsSelected = aC.GetAttrState(FunctionAttributeKey.Mode) == m,
+                    IsSelected = function.GetAttrState(FunctionAttributeKey.Mode) == m,
                     TextSize = CSS_FontSize.TextFontSize,
                 };
                 modeChangeView.AddChidren(btnModeText);
@@ -441,7 +442,7 @@
             };
             modeChangeView.AddChidren(btnLine);
 
-            var modeList = aC.GetAttribute(FunctionAttributeKey.FanSpeed).value;
+            var modeList = function.GetAttribute(FunctionAttributeKey.FanSpeed).value;
             foreach (var m in modeList)
             {
                 Button btnFanIcon = new Button()
@@ -450,7 +451,7 @@
                     Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 10 + 8),
                     Width = Application.GetRealWidth(24),
                     Height = Application.GetRealWidth(24),
-                    IsSelected = aC.GetAttrState(FunctionAttributeKey.FanSpeed) == m,
+                    IsSelected = function.GetAttrState(FunctionAttributeKey.FanSpeed) == m,
                 };
                 modeChangeView.AddChidren(btnFanIcon);
 
@@ -463,7 +464,7 @@
                     TextAlignment = TextAlignment.CenterLeft,
                     TextColor = CSS_Color.FirstLevelTitleColor,
                     SelectedTextColor = CSS_Color.MainColor,
-                    IsSelected = aC.GetAttrState(FunctionAttributeKey.FanSpeed) == m,
+                    IsSelected = function.GetAttrState(FunctionAttributeKey.FanSpeed) == m,
                     TextSize = CSS_FontSize.TextFontSize,
                 };
                 modeChangeView.AddChidren(btnFanText);
diff --git a/HDL_ON/UI/UI2/FuntionControlView/AC/ACPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/AC/ACPageBLL.cs
index d00e469..dfbc2d6 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/AC/ACPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/AC/ACPageBLL.cs
@@ -9,7 +9,7 @@
     public partial class ACPage
     {
         static DateTime updataTime = DateTime.MinValue;
-        public static void UpdataStates(AC uAc)
+        public static void UpdataStates(Function updateTemp)
         {
             try
             {
@@ -23,18 +23,19 @@
                     {
                         return;
                     }
+                    AC temp = new AC();
                     updataTime = DateTime.Now;
-                    bodyView.btnTemp.Text = uAc.GetAttrState(FunctionAttributeKey.SetTemp);
-                    bodyView.btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(uAc.GetAttrState((string)FunctionAttributeKey.IndoorTemp))) + "掳C";
-                    bodyView.btnMode.UnSelectedImagePath = uAc.GetModeIconPath();
-                    bodyView.btnWindSpeed.UnSelectedImagePath = uAc.GetFanIconPath();
-                    bodyView.arcBar.Progress = Convert.ToInt32(Convert.ToDouble(uAc.GetAttrState(FunctionAttributeKey.SetTemp)));
-                    if (uAc.trait_on_off.curValue.ToString() == "on")
+                    bodyView.btnTemp.Text = updateTemp.GetAttrState(FunctionAttributeKey.SetTemp);
+                    bodyView.btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(updateTemp.GetAttrState((string)FunctionAttributeKey.IndoorTemp))) + "掳C";
+                    bodyView.btnMode.UnSelectedImagePath = temp.GetModeIconPath(updateTemp.GetAttrState(FunctionAttributeKey.Mode));
+                    bodyView.btnWindSpeed.UnSelectedImagePath = temp.GetFanIconPath(updateTemp.GetAttrState(FunctionAttributeKey.FanSpeed));
+                    bodyView.arcBar.Progress = Convert.ToInt32(Convert.ToDouble(updateTemp.GetAttrState(FunctionAttributeKey.SetTemp)));
+                    if (updateTemp.trait_on_off.curValue.ToString() == "on")
                     {
                         bodyView.arcBar.IsOffline = false;
                         bodyView.btnSwitch.IsSelected = true;
                         bodyView.arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIconOn.png";
-                        if (uAc.GetAttrState((string)FunctionAttributeKey.Mode) == "fan")
+                        if (updateTemp.GetAttrState((string)FunctionAttributeKey.Mode) == "fan")
                         {
                             bodyView.arcBar.IsClickable = false;
                         }
@@ -67,8 +68,8 @@
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () =>
             {
-                btnFunctionName.Text = btnFunctionName_Out.Text = aC.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = aC.GetRoomListName();
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
             };
         }
 
@@ -79,8 +80,8 @@
         {
             btnCollection.MouseUpEventHandler += (sender, e) =>
             {
-                btnCollection.IsSelected = aC.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                aC.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -91,56 +92,56 @@
         {
             btnMinus.MouseUpEventHandler = (sender, e) =>
             {
-                if (aC.trait_on_off.curValue.ToString() == "off" || aC.GetAttrState(FunctionAttributeKey.Mode) == "fan")
+                if (function.trait_on_off.curValue.ToString() == "off" || function.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                 {
                     return;
                 }
-                var temp = Convert.ToInt32(aC.GetAttrState(FunctionAttributeKey.SetTemp));
-                if (temp <= aC.GetAttribute(FunctionAttributeKey.Mode).min)
+                var temp = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.SetTemp));
+                if (temp <= function.GetAttribute(FunctionAttributeKey.Mode).min)
                 {
                     return;
                 }
                 temp--;
                 arcBar.Progress = temp;
                 btnTemp.Text = temp.ToString();
-                aC.SetAttrState(FunctionAttributeKey.SetTemp,temp.ToString());
-                //Control.Send(CommandType_A.write, aC);
+                function.SetAttrState(FunctionAttributeKey.SetTemp,temp.ToString());
+                //Control.Send(CommandType_A.write, function);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
-                Control.Ins.SendWriteCommand(aC, d);
+                Control.Ins.SendWriteCommand(function, d);
             };
             btnPlus.MouseUpEventHandler = (sender, e) =>
             {
-                if (aC.trait_on_off.curValue.ToString() == "off" || aC.GetAttrState(FunctionAttributeKey.Mode) == "fan")
+                if (function.trait_on_off.curValue.ToString() == "off" || function.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                 {
                     return;
                 }
-                var temp = Convert.ToInt32(aC.GetAttrState(FunctionAttributeKey.SetTemp));
-                if (temp >= aC.GetAttribute(FunctionAttributeKey.SetTemp).max)
+                var temp = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.SetTemp));
+                if (temp >= function.GetAttribute(FunctionAttributeKey.SetTemp).max)
                 {
                     return;
                 }
                 temp++;
                 arcBar.Progress = temp;
                 btnTemp.Text = temp.ToString();
-                aC.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
+                function.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
-                Control.Ins.SendWriteCommand(aC, d);
-                //aC.GetSendJObject
+                Control.Ins.SendWriteCommand(function, d);
+                //function.GetSendJObject
 
             };
             arcBar.OnStopTrackingTouchEvent = (sender, e) =>
            {
-               aC.SetAttrState(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
+               function.SetAttrState(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
                btnTemp.Text = arcBar.Progress.ToString();
                System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                d.Add(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
-               Control.Ins.SendWriteCommand(aC, d);
+               Control.Ins.SendWriteCommand(function, d);
            };
             arcBar.OnProgressChangedEvent = (sender, e) =>
             {
-                aC.SetAttrState(FunctionAttributeKey.SetTemp, e.ToString());
+                function.SetAttrState(FunctionAttributeKey.SetTemp, e.ToString());
                 btnTemp.Text = e.ToString();
             };
         }
@@ -151,7 +152,7 @@
         {
             btnMode.MouseUpEventHandler = (sender, e) =>
             {
-                if (aC.trait_on_off.curValue.ToString() == "off")
+                if (function.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
@@ -159,7 +160,7 @@
             };
             btnWindSpeed.MouseUpEventHandler = (sender, e) =>
             {
-                if (aC.trait_on_off.curValue.ToString() == "off")
+                if (function.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
@@ -169,8 +170,8 @@
             btnSwitch.MouseUpEventHandler = (sender, e) =>
             {
                 btnSwitch.IsSelected = !btnSwitch.IsSelected;
-                aC.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                if (aC.trait_on_off.curValue.ToString() == "on")
+                function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                if (function.trait_on_off.curValue.ToString() == "on")
                 {
                     arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIconOn.png";
                     btnSwitch.IsSelected = true;
@@ -183,8 +184,8 @@
                     arcBar.IsOffline = true;
                 }
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, aC.trait_on_off.curValue.ToString());
-                Control.Ins.SendWriteCommand(aC, d);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                Control.Ins.SendWriteCommand(function, d);
             };
         }
 
@@ -200,14 +201,14 @@
             EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
             {
                 btnModeIcon.IsSelected = btnModeText.IsSelected = true;
-                aC.SetAttrState(FunctionAttributeKey.Mode, curMode);
-                btnMode.UnSelectedImagePath = aC.GetModeIconPath();
+                function.SetAttrState(FunctionAttributeKey.Mode, curMode);
+                btnMode.UnSelectedImagePath = acTemp.GetModeIconPath(function.GetAttrState(FunctionAttributeKey.Mode));
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 btnMode.UnSelectedImagePath = btnModeIcon.UnSelectedImagePath;
                 d.Add(FunctionAttributeKey.Mode, curMode);
-                Control.Ins.SendWriteCommand(aC, d);
+                Control.Ins.SendWriteCommand(function, d);
                 dialog.Close();
-                if (aC.GetAttrState(FunctionAttributeKey.Mode) == "fan")
+                if (function.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                 {
                     bodyView.arcBar.IsClickable = false;
                 }
@@ -232,11 +233,11 @@
             EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
             {
                 btnFanIcon.IsSelected = btnFanText.IsSelected = true;
-                aC.SetAttrState(FunctionAttributeKey.FanSpeed, curFan);
-                btnWindSpeed.UnSelectedImagePath = aC.GetFanIconPath();
+                function.SetAttrState(FunctionAttributeKey.FanSpeed, curFan);
+                btnWindSpeed.UnSelectedImagePath = acTemp.GetFanIconPath(function.GetAttrState(FunctionAttributeKey.FanSpeed));
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.FanSpeed, curFan);
-                Control.Ins.SendWriteCommand(aC, d);
+                Control.Ins.SendWriteCommand(function, d);
                 btnWindSpeed.UnSelectedImagePath = btnFanIcon.UnSelectedImagePath;
                 dialog.Close();
             };
diff --git a/HDL_ON/UI/UI2/FuntionControlView/AC/AcControlPage.cs b/HDL_ON/UI/UI2/FuntionControlView/AC/AcControlPage.cs
index 1686f8f..629a706 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/AC/AcControlPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/AC/AcControlPage.cs
@@ -44,7 +44,9 @@
         /// </summary>
         Button btnSwitch;
 
-        AC acDevice;
+        AC acFunction = new AC();
+
+
 
         #endregion
 
@@ -55,7 +57,6 @@
         /// </summary>
         public override void InitFrameWhiteContent()
         {
-            acDevice = device as AC;
 
             base.ShowColltionButton = false;
             base.SetTitleText(Language.StringByID(StringId.Electric));
@@ -85,16 +86,10 @@
             {
                 Gravity = Gravity.CenterHorizontal,
                 OpenAngle = 160,
-                ThumbImagePath = device.GetAttrState(FunctionAttributeKey.OnOff)  == "on" ? "FunctionIcon/AC/DiyThumbIconOn.png" : "FunctionIcon/AC/DiyThumbIcon.png",
                 ThumbImageHeight = Application.GetRealWidth(50),
                 ProgressBarColor = CSS_Color.MainColor,
                 OfflineProgressBarColor = CSS_Color.PromptingColor2,
-                IsOffline = device.GetAttrState(FunctionAttributeKey.OnOff) == "off",
-                MinValue = device.GetAttribute(FunctionAttributeKey.OnOff).min,
-                MaxValue = device.GetAttribute(FunctionAttributeKey.OnOff).max,
-                //IsClickable = acDevice.trait_on_off.curValue.ToString() == "on",
                 ArcColor = CSS_Color.BackgroundColor,
-                Progress = Convert.ToInt32(device.GetAttrState(FunctionAttributeKey.SetTemp)),
 #if __IOS__
                 Y = Application.GetRealHeight(120 + 25),
                 Width = Application.GetRealWidth(260 - 40),
@@ -109,6 +104,13 @@
 
             };
             FrameWhiteCentet1.AddChidren(arcBar);
+
+
+            arcBar.ThumbImagePath = device.GetAttrState(FunctionAttributeKey.OnOff) == "on" ? "FunctionIcon/AC/DiyThumbIconOn.png" : "FunctionIcon/AC/DiyThumbIcon.png";
+            arcBar.IsOffline = device.GetAttrState(FunctionAttributeKey.OnOff) == "off";
+            arcBar.MinValue = device.GetAttribute(FunctionAttributeKey.SetTemp).min;
+            arcBar.MaxValue = device.GetAttribute(FunctionAttributeKey.SetTemp).max;
+            arcBar.Progress = Convert.ToInt32(device.GetAttrState(FunctionAttributeKey.SetTemp));
 
             btnTemp = new Button()
             {
@@ -176,7 +178,7 @@
                 Y = Application.GetRealHeight(334),
                 Width = Application.GetRealWidth(30),
                 Height = Application.GetRealWidth(30),
-                UnSelectedImagePath = acDevice.GetModeIconPath(),
+                UnSelectedImagePath = acFunction.GetModeIconPath(device.GetAttrState(FunctionAttributeKey.Mode)),
             };
             FrameWhiteCentet1.AddChidren(btnMode);
 
@@ -186,7 +188,7 @@
                 Y = Application.GetRealHeight(337),
                 Width = Application.GetRealWidth(30),
                 Height = Application.GetRealWidth(30),
-                UnSelectedImagePath = acDevice.GetFanIconPath(),
+                UnSelectedImagePath = acFunction.GetFanIconPath(device.GetAttrState(FunctionAttributeKey.FanSpeed)),
             };
             FrameWhiteCentet1.AddChidren(btnWindSpeed);
 
@@ -281,9 +283,9 @@
                 };
                 modeChangeView.AddChidren(btnModeText);
 
-                btnModeIcon.UnSelectedImagePath = acDevice.GetModeIconPath(false);
-                btnModeIcon.SelectedImagePath = acDevice.GetModeIconPath();
-                btnModeText.Text = acDevice.GetModeAttrText( m);
+                btnModeIcon.UnSelectedImagePath = acFunction.GetModeIconPath(m, false);
+                btnModeIcon.SelectedImagePath = acFunction.GetModeIconPath(m);
+                btnModeText.Text = acFunction.GetModeAttrText( m);
 
                 if (modeList.IndexOf(m) < modeList.Count - 1)
                 {
@@ -303,14 +305,14 @@
                 EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
                 {
                     btnModeIcon.IsSelected = btnModeText.IsSelected = true;
-                    acDevice.SetAttrState(FunctionAttributeKey.Mode, m);
-                    btnMode.UnSelectedImagePath = acDevice.GetModeIconPath();
+                    device.SetAttrState(FunctionAttributeKey.Mode, m);
+                    btnMode.UnSelectedImagePath = acFunction.GetModeIconPath(m);
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                     btnMode.UnSelectedImagePath = btnModeIcon.UnSelectedImagePath;
                     d.Add(FunctionAttributeKey.Mode, m);
-                    Control.Ins.SendWriteCommand(acDevice, d);
+                    Control.Ins.SendWriteCommand(device, d);
                     dialog.Close();
-                    if (acDevice.GetAttrState(FunctionAttributeKey.Mode) == "fan")
+                    if (device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                     {
                         arcBar.IsClickable = false;
                     }
@@ -404,9 +406,9 @@
                     TextSize = CSS_FontSize.TextFontSize,
                 };
                 modeChangeView.AddChidren(btnFanText);
-                btnFanIcon.UnSelectedImagePath = acDevice.GetModeIconPath(false);
-                btnFanIcon.SelectedImagePath = acDevice.GetModeIconPath();
-                btnFanText.Text = acDevice.GetModeAttrText(m);
+                btnFanIcon.UnSelectedImagePath = acFunction.GetModeIconPath(m,false);
+                btnFanIcon.SelectedImagePath = acFunction.GetModeIconPath(m);
+                btnFanText.Text = acFunction.GetModeAttrText(m);
 
                 if (modeList.IndexOf(m) < modeList.Count - 1)
                 {
@@ -427,11 +429,11 @@
                 EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
                 {
                     btnFanIcon.IsSelected = btnFanText.IsSelected = true;
-                    acDevice.SetAttrState(FunctionAttributeKey.FanSpeed, m);
-                    btnWindSpeed.UnSelectedImagePath = acDevice.GetFanIconPath();
+                    device.SetAttrState(FunctionAttributeKey.FanSpeed, m);
+                    btnWindSpeed.UnSelectedImagePath = acFunction.GetFanIconPath(m);
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                     d.Add(FunctionAttributeKey.FanSpeed, m);
-                    Control.Ins.SendWriteCommand(acDevice, d);
+                    Control.Ins.SendWriteCommand(device, d);
                     btnWindSpeed.UnSelectedImagePath = btnFanIcon.UnSelectedImagePath;
                     dialog.Close();
                 };
@@ -473,53 +475,53 @@
         {
             btnMinus.MouseUpEventHandler = (sender, e) =>
             {
-                if (acDevice.trait_on_off.curValue.ToString() == "off" || acDevice.GetAttrState(FunctionAttributeKey.Mode) == "fan")
+                if (device.trait_on_off.curValue.ToString() == "off" || device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                 {
                     return;
                 }
-                var temp = Convert.ToInt32(acDevice.GetAttrState(FunctionAttributeKey.SetTemp));
-                if (temp <= acDevice.GetAttribute(FunctionAttributeKey.Mode).min)
+                var temp = Convert.ToInt32(device.GetAttrState(FunctionAttributeKey.SetTemp));
+                if (temp <= device.GetAttribute(FunctionAttributeKey.Mode).min)
                 {
                     return;
                 }
                 temp--;
                 arcBar.Progress = temp;
                 btnTemp.Text = temp.ToString();
-                acDevice.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
+                device.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
-                Control.Ins.SendWriteCommand(acDevice, d);
+                Control.Ins.SendWriteCommand(device, d);
             };
             btnPlus.MouseUpEventHandler = (sender, e) =>
             {
-                if (acDevice.trait_on_off.curValue.ToString() == "off" || acDevice.GetAttrState(FunctionAttributeKey.Mode) == "fan")
+                if (device.trait_on_off.curValue.ToString() == "off" || device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                 {
                     return;
                 }
-                var temp = Convert.ToInt32(acDevice.GetAttrState(FunctionAttributeKey.SetTemp));
-                if (temp >= acDevice.GetAttribute(FunctionAttributeKey.SetTemp).max)
+                var temp = Convert.ToInt32(device.GetAttrState(FunctionAttributeKey.SetTemp));
+                if (temp >= device.GetAttribute(FunctionAttributeKey.SetTemp).max)
                 {
                     return;
                 }
                 temp++;
                 arcBar.Progress = temp;
                 btnTemp.Text = temp.ToString();
-                acDevice.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
+                device.SetAttrState(FunctionAttributeKey.SetTemp, temp.ToString());
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
-                Control.Ins.SendWriteCommand(acDevice, d);
+                Control.Ins.SendWriteCommand(device, d);
             };
             arcBar.OnStopTrackingTouchEvent = (sender, e) =>
             {
-                acDevice.SetAttrState(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
+                device.SetAttrState(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
                 btnTemp.Text = arcBar.Progress.ToString();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
-                Control.Ins.SendWriteCommand(acDevice, d);
+                Control.Ins.SendWriteCommand(device, d);
             };
             arcBar.OnProgressChangedEvent = (sender, e) =>
             {
-                acDevice.SetAttrState(FunctionAttributeKey.SetTemp, e.ToString());
+                device.SetAttrState(FunctionAttributeKey.SetTemp, e.ToString());
                 btnTemp.Text = e.ToString();
             };
         }
@@ -530,7 +532,7 @@
         {
             btnMode.MouseUpEventHandler = (sender, e) =>
             {
-                if (acDevice.trait_on_off.curValue.ToString() == "off")
+                if (device.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
@@ -538,7 +540,7 @@
             };
             btnWindSpeed.MouseUpEventHandler = (sender, e) =>
             {
-                if (acDevice.trait_on_off.curValue.ToString() == "off")
+                if (device.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
@@ -548,8 +550,8 @@
             btnSwitch.MouseUpEventHandler = (sender, e) =>
             {
                 btnSwitch.IsSelected = !btnSwitch.IsSelected;
-                acDevice.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                if (acDevice.trait_on_off.curValue.ToString() == "on")
+                device.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                if (device.trait_on_off.curValue.ToString() == "on")
                 {
                     arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIconOn.png";
                     btnSwitch.IsSelected = true;
@@ -562,8 +564,8 @@
                     arcBar.IsOffline = true;
                 }
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, acDevice.trait_on_off.curValue.ToString());
-                Control.Ins.SendWriteCommand(acDevice, d);
+                d.Add(FunctionAttributeKey.OnOff, device.trait_on_off.curValue.ToString());
+                Control.Ins.SendWriteCommand(device, d);
             };
         }
 
@@ -579,16 +581,16 @@
             Application.RunOnMainThread(() =>
             {
                 btnTemp.Text = device.GetAttrState(FunctionAttributeKey.SetTemp);
-                btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(acDevice.GetAttrState(FunctionAttributeKey.IndoorTemp))) + "掳C";
-                btnMode.UnSelectedImagePath = acDevice.GetModeIconPath();
-                btnWindSpeed.UnSelectedImagePath = acDevice.GetFanIconPath();
-                arcBar.Progress = Convert.ToInt32(Convert.ToDouble(acDevice.GetAttrState(FunctionAttributeKey.SetTemp)));
-                if (acDevice.trait_on_off.curValue.ToString() == "on")
+                btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.IndoorTemp))) + "掳C";
+                btnMode.UnSelectedImagePath = acFunction.GetModeIconPath(device.GetAttrState(FunctionAttributeKey.Mode));
+                btnWindSpeed.UnSelectedImagePath = acFunction.GetFanIconPath(device.GetAttrState(FunctionAttributeKey.FanSpeed));
+                arcBar.Progress = Convert.ToInt32(Convert.ToDouble(device.GetAttrState(FunctionAttributeKey.SetTemp)));
+                if (device.trait_on_off.curValue.ToString() == "on")
                 {
                     arcBar.IsOffline = false;
                     btnSwitch.IsSelected = true;
                     arcBar.ThumbImagePath = "FunctionIcon/AC/DiyThumbIconOn.png";
-                    if (acDevice.GetAttrState(FunctionAttributeKey.Mode) == "fan")
+                    if (device.GetAttrState(FunctionAttributeKey.Mode) == "fan")
                     {
                         arcBar.IsClickable = false;
                     }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePage.cs b/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePage.cs
index b8646de..6e8c66f 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePage.cs
@@ -40,7 +40,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Curtain curtain;
+        Curtain curtainTemp = new Curtain();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -49,10 +50,10 @@
         /// </summary>
         Action actionRefresh;
         #endregion
-        public CurtainModulePage(Curtain func)
+        public CurtainModulePage(Function func)
         {
             bodyView = this;
-            curtain = func;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -81,7 +82,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = curtain.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -94,7 +95,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = curtain.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -106,7 +107,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = curtain.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -134,7 +135,7 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "FunctionIcon/Curtain/CurtainCloseIcon.png",
                 SelectedImagePath = "FunctionIcon/Curtain/CurtainCloseOnIcon.png",
-                IsSelected = curtain.trait_on_off.curValue.ToString() == "off",
+                IsSelected = function.trait_on_off.curValue.ToString() == "off",
             };
             controlView.AddChidren(btnCurtainClose);
 
@@ -146,7 +147,7 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "FunctionIcon/Curtain/CurtainStopIcon.png",
                 SelectedImagePath = "FunctionIcon/Curtain/CurtainStopOnIcon.png",
-                IsSelected = curtain.trait_on_off.curValue.ToString() == "stop",
+                IsSelected = function.trait_on_off.curValue.ToString() == "stop",
             };
             controlView.AddChidren(btnCurtainStop);
 
@@ -158,15 +159,15 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "FunctionIcon/Curtain/CurtainOpenIcon.png",
                 SelectedImagePath = "FunctionIcon/Curtain/CurtainOpenOnIcon.png",
-                IsSelected = curtain.trait_on_off.curValue.ToString() == "on",
+                IsSelected = function.trait_on_off.curValue.ToString() == "on",
             };
             controlView.AddChidren(btnCurtainOpen);
 
             LoadEventList();
-            new TopViewDiv(bodyView,Language.StringByID(StringId.Curtain)).LoadTopView_FunctionTop(curtain, actionRefresh);
+            new TopViewDiv(bodyView,Language.StringByID(StringId.Curtain)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(curtain);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePageBLL.cs
index 1579e5b..0087ce3 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Curtain/CurtainModulePageBLL.cs
@@ -10,29 +10,29 @@
         /// <summary>
         /// 鏇存柊绐楀笜鐘舵��
         /// </summary>
-        public static void UpdataState(Curtain uCurtain)
+        public static void UpdataState(Function updataTemp)
         {
-            Application.RunOnMainThread((Action)(() => {
+            Application.RunOnMainThread(() => {
                 if(bodyView == null)
                 {
                     return;
                 }
-                if (uCurtain.spk == bodyView.curtain.spk && uCurtain.sid == bodyView.curtain.sid)
+                if (updataTemp.spk == bodyView.function.spk && updataTemp.sid == bodyView.function.sid)
                 {
-                    if (uCurtain.trait_on_off.curValue.ToString() == "stop")
+                    if (updataTemp.trait_on_off.curValue.ToString() == "stop")
                     {
                         //bodyView.btnCurtainOpen.IsSelected = false;
                         //bodyView.btnCurtainClose.IsSelected = false;
                         //bodyView.btnCurtainStop.IsSelected = true;
                     }
-                    else if (uCurtain.trait_on_off.curValue.ToString() == "on")
+                    else if (updataTemp.trait_on_off.curValue.ToString() == "on")
                     {
                         //bodyView.btnCurtainOpen.IsSelected = true;
                         //bodyView.btnCurtainClose.IsSelected = false;
                         //bodyView.btnCurtainStop.IsSelected = false;
                         bodyView.btnCurtainBgIcon.IsSelected = true;
                     }
-                    else if (uCurtain.trait_on_off.curValue.ToString() == "off")
+                    else if (updataTemp.trait_on_off.curValue.ToString() == "off")
                     {
                         //bodyView.btnCurtainOpen.IsSelected = false;
                         //bodyView.btnCurtainClose.IsSelected = true;
@@ -40,7 +40,7 @@
                         bodyView.btnCurtainBgIcon.IsSelected = false;
                     }
                 }
-            }));
+            });
         }
 
         void LoadEventList()
@@ -49,11 +49,11 @@
             LoadEvent_ControlEvent();
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = curtain.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = curtain.GetRoomListName();
-                //curtain.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
-            UpdataState(curtain);
+            UpdataState(function);
         }
         /// <summary>
         /// 鏀惰棌鍔熻兘鎸夐挳浜嬩欢
@@ -61,8 +61,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = curtain.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                curtain.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -79,10 +79,10 @@
                     });
                 }) { IsBackground = true }.Start();
                 btnCurtainBgIcon.IsSelected = false;
-                curtain.trait_on_off.curValue = "off";
+                function.trait_on_off.curValue = "off";
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
-                Control.Ins.SendWriteCommand(curtain, d);
+                d.Add("on_off", function.trait_on_off.curValue.ToString());
+                Control.Ins.SendWriteCommand(function, d);
             };
 
             btnCurtainStop.MouseDownEventHandler = (sender, e) =>
@@ -106,10 +106,10 @@
                     });
                 })
                 { IsBackground = true }.Start();
-                curtain.trait_on_off.curValue = "stop";
+                function.trait_on_off.curValue = "stop";
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
-                Control.Ins.SendWriteCommand(curtain, d);
+                d.Add("on_off", function.trait_on_off.curValue.ToString());
+                Control.Ins.SendWriteCommand(function, d);
             };
             btnCurtainOpen.MouseUpEventHandler = (sender, e) =>
             {
@@ -121,10 +121,10 @@
                 })
                 { IsBackground = true }.Start();
                 btnCurtainBgIcon.IsSelected = true;
-                curtain.trait_on_off.curValue = "on";
+                function.trait_on_off.curValue = "on";
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add("on_off", curtain.trait_on_off.curValue.ToString());
-                Control.Ins.SendWriteCommand(curtain, d);
+                d.Add("on_off", function.trait_on_off.curValue.ToString());
+                Control.Ins.SendWriteCommand(function, d);
             };
 
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPage.cs
index 85125ca..8a1097b 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPage.cs
@@ -52,7 +52,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Curtain curtain;
+        Curtain curtainTemp = new Curtain();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -66,10 +67,10 @@
         /// </summary>
         bool onControl = false;
 
-        public MotorCurtainPage(Curtain func)
+        public MotorCurtainPage(Function func)
         {
             bodyView = this;
-            curtain = func;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -99,7 +100,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = curtain.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -112,7 +113,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = curtain.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -124,7 +125,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = curtain.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -139,7 +140,7 @@
                 Y = Application.GetRealHeight(130),
                 Width = Application.GetRealWidth(250),
                 Height = Application.GetRealWidth(177),
-                Progress = curtain.percent,
+                Progress = curtainTemp.GetPercent(function),
                 ProgressTextColor =0x00000000,
                 //IsInvertedProgress = true,
             };
@@ -202,7 +203,7 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "FunctionIcon/Curtain/CurtainCloseIcon.png",
                 SelectedImagePath = "FunctionIcon/Curtain/CurtainCloseOnIcon.png",
-                IsSelected = curtain.GetAttrState(FunctionAttributeKey.Percent) == "0"
+                IsSelected = function.GetAttrState(FunctionAttributeKey.Percent) == "0"
             };
             controlView.AddChidren(btnCurtainClose);
 
@@ -225,15 +226,15 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "FunctionIcon/Curtain/CurtainOpenIcon.png",
                 SelectedImagePath = "FunctionIcon/Curtain/CurtainOpenOnIcon.png",
-                IsSelected = curtain.GetAttrState(FunctionAttributeKey.Percent) != "0"
+                IsSelected = function.GetAttrState(FunctionAttributeKey.Percent) != "0"
             };
             controlView.AddChidren(btnCurtainOpen);
 
             LoadEventList();
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Curtain)).LoadTopView_FunctionTop(curtain,actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Curtain)).LoadTopView_FunctionTop(function,actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(curtain);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPageBLL.cs
index 702c4d7..c94975f 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Curtain/MotorCurtainPageBLL.cs
@@ -9,17 +9,17 @@
         /// <summary>
         /// 鏇存柊绐楀笜
         /// </summary>
-        /// <param name="uCurtain"></param>
-        public static void UpdataState(Curtain uCurtain)
+        /// <param name="updateTemp"></param>
+        public static void UpdataState(Function updateTemp)
         {
             Application.RunOnMainThread((Action)(() => {
                 if (bodyView == null)
                     return;
                 if (bodyView.onControl)
                     return;
-                if (uCurtain.spk == bodyView.curtain.spk && uCurtain.sid == bodyView.curtain.sid)
+                if (updateTemp.spk == bodyView.function.spk && updateTemp.sid == bodyView.function.sid)
                 {
-                    var percentString = uCurtain.GetAttrState(FunctionAttributeKey.Percent);
+                    var percentString = updateTemp.GetAttrState(FunctionAttributeKey.Percent);
                     if (percentString != null)
                     {
                         int percent = 0;
@@ -31,7 +31,7 @@
                     {
                         if (!bodyView.onCurtainAnimation)
                         {
-                            bodyView.CurtainAnimation(Convert.ToInt32(uCurtain.trait_percent.curValue.ToString()));
+                            bodyView.CurtainAnimation(Convert.ToInt32(updateTemp.GetAttrState(FunctionAttributeKey.Percent)));
                         }
                     }
                     catch { }
@@ -112,9 +112,9 @@
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () =>
             {
-                btnFunctionName.Text = btnFunctionName_Out.Text = curtain.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = curtain.GetRoomListName();
-                //curtain.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
         }
         /// <summary>
@@ -124,8 +124,8 @@
         {
             btnCollection.MouseUpEventHandler += (sender, e) =>
             {
-                btnCollection.IsSelected = curtain.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                curtain.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -143,12 +143,12 @@
                 //    });
                 //})
                 //{ IsBackground = true }.Start();
-                curtain.trait_on_off.curValue = "off";
-                curtain.percent = 0;
+                function.trait_on_off.curValue = "off";
+                function.SetAttrState(FunctionAttributeKey.Percent, 0);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
-                CurtainAnimation(curtain.percent);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
+                CurtainAnimation(0);
             };
 
             btnCurtainStop.MouseUpEventHandler = (sender, e) =>
@@ -163,10 +163,10 @@
                     });
                 })
                 { IsBackground = true }.Start();
-                curtain.trait_on_off.curValue = "stop";
+                function.trait_on_off.curValue = "stop";
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
             };
 
             btnCurtainOpen.MouseUpEventHandler = (sender, e) =>
@@ -178,12 +178,12 @@
                 //    });
                 //})
                 //{ IsBackground = true }.Start();
-                curtain.trait_on_off.curValue = "on";
-                curtain.percent = 100;
+                function.trait_on_off.curValue = "on";
+                function.SetAttrState(FunctionAttributeKey.Percent, 100);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
-                CurtainAnimation(curtain.percent);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
+                CurtainAnimation(100);
             };
 
 
@@ -204,20 +204,20 @@
 
             //btnMinusSignIcon.MouseUpEventHandler = (sender, e) =>
             //{
-            //    curtain.percent--;
-            //    controlBar.Progress = curtain.percent;
+            //    function.percent--;
+            //    controlBar.Progress = function.percent;
             //    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-            //    d.Add(FunctionAttributeKey.Percent, curtain.percent.ToString());
-            //    DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+            //    d.Add(FunctionAttributeKey.Percent, function.percent.ToString());
+            //    DriverLayer.Control.Ins.SendWriteCommand(function, d);
             //};
 
             //btnPlusSgnIcon.MouseUpEventHandler = (sender, e) =>
             //{
-            //    curtain.percent++;
-            //    controlBar.Progress = curtain.percent;
+            //    function.percent++;
+            //    controlBar.Progress = function.percent;
             //    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-            //    d.Add(FunctionAttributeKey.Percent, curtain.percent.ToString());
-            //    DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+            //    d.Add(FunctionAttributeKey.Percent, function.percent.ToString());
+            //    DriverLayer.Control.Ins.SendWriteCommand(function, d);
             //};
 
             //curtainSeekBar.OnProgressChangedEvent = (sender, e) =>
@@ -225,13 +225,13 @@
             //    controlBar.Progress = curtainSeekBar.Progress;
             //    new System.Threading.Thread(() =>
             //    {
-            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - curtain.refreshTime).TotalMilliseconds > 300)
+            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - function.refreshTime).TotalMilliseconds > 300)
             //        {
-            //            curtain.percent = e;
-            //            curtain.refreshTime = DateTime.Now;
+            //            function.percent = e;
+            //            function.refreshTime = DateTime.Now;
             //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-            //            d.Add("percent", curtain.percent.ToString());
-            //            Control.SendWriteCommand(curtain, d);
+            //            d.Add("percent", function.percent.ToString());
+            //            Control.SendWriteCommand(function, d);
             //        }
             //    })
             //    { IsBackground = true }.Start();
@@ -241,11 +241,11 @@
                 //controlBar.Progress = curtainSeekBar.Progress;
                 new System.Threading.Thread(() =>
                 {
-                    curtain.percent = e;
-                    curtain.refreshTime = DateTime.Now;
+                    function.SetAttrState(FunctionAttributeKey.Percent, e);
+                    function.refreshTime = DateTime.Now;
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add(FunctionAttributeKey.Percent, curtain.percent.ToString());
-                    DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+                    d.Add(FunctionAttributeKey.Percent, e.ToString());
+                    DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
@@ -255,13 +255,13 @@
             //    curtainSeekBar.Progress = controlBar.Progress;
             //    new System.Threading.Thread(() =>
             //    {
-            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - curtain.refreshTime).TotalMilliseconds > 300)
+            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - function.refreshTime).TotalMilliseconds > 300)
             //        {
-            //            curtain.percent = e;
-            //            curtain.refreshTime = DateTime.Now;
+            //            function.percent = e;
+            //            function.refreshTime = DateTime.Now;
             //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-            //            d.Add("percent", curtain.percent.ToString());
-            //            Control.SendWriteCommand(curtain, d);
+            //            d.Add("percent", function.percent.ToString());
+            //            Control.SendWriteCommand(function, d);
             //        }
             //    })
             //    { IsBackground = true }.Start();
@@ -272,11 +272,11 @@
             //    curtainSeekBar.Progress = controlBar.Progress;
             //    new System.Threading.Thread(() =>
             //    {
-            //        curtain.percent = e;
-            //        curtain.refreshTime = DateTime.Now;
+            //        function.percent = e;
+            //        function.refreshTime = DateTime.Now;
             //        System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-            //        d.Add("percent", curtain.percent.ToString());
-            //        DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+            //        d.Add("percent", function.percent.ToString());
+            //        DriverLayer.Control.Ins.SendWriteCommand(function, d);
             //    })
             //    { IsBackground = true }.Start();
             //};
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPage.cs
index 434c27e..55ef055 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPage.cs
@@ -53,7 +53,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Curtain curtain;
+        Curtain curtainTemp = new Curtain();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -66,10 +67,10 @@
         /// 姝e湪鎺у埗
         /// </summary>
         bool onControl = false;
-        public RollingShutterPage(Curtain func)
+        public RollingShutterPage(Function func)
         {
             bodyView = this;
-            curtain = func;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -99,7 +100,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = curtain.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -112,7 +113,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = curtain.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -124,7 +125,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = curtain.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -139,7 +140,7 @@
                 Y = Application.GetRealHeight(130),
                 Width = Application.GetRealWidth(170),
                 Height = Application.GetRealWidth(210),
-                Progress = curtain.percent,
+                Progress = curtainTemp.GetPercent(function),
                 //IsInvertedProgress = true,
                 ProgressTextColor = 0x00000000,
             };
@@ -173,7 +174,7 @@
                 ProgressTextSize = 0x00000000,
                 MaxValue = 100,
                 SeekBarPadding = Application.GetRealWidth(20),
-                Progress = curtain.percent,
+                Progress = curtainTemp.GetPercent(function),
                 Visible = false,
                 Enable = false,
             };
@@ -202,7 +203,7 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "FunctionIcon/Curtain/CurtainCloseIcon.png",
                 SelectedImagePath = "FunctionIcon/Curtain/CurtainCloseOnIcon.png",
-                IsSelected = curtain.GetAttrState(FunctionAttributeKey.Percent) == "0",
+                IsSelected = function.GetAttrState(FunctionAttributeKey.Percent) == "0",
             };
             controlView.AddChidren(btnCurtainClose);
 
@@ -225,15 +226,15 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "FunctionIcon/Curtain/CurtainOpenIcon.png",
                 SelectedImagePath = "FunctionIcon/Curtain/CurtainOpenOnIcon.png",
-                IsSelected = curtain.GetAttrState(FunctionAttributeKey.Percent) != "0",
+                IsSelected = function.GetAttrState(FunctionAttributeKey.Percent) != "0",
             };
             controlView.AddChidren(btnCurtainOpen);
 
             LoadEventList();
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Curtain)).LoadTopView_FunctionTop(curtain, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Curtain)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(curtain);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPageBLL.cs
index 2fce988..511c748 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Curtain/RollingShutterPageBLL.cs
@@ -9,17 +9,17 @@
         /// <summary>
         /// 鏇存柊绐楀笜
         /// </summary>
-        /// <param name="uCurtain"></param>
-        public static void UpdataState(Curtain uCurtain)
+        /// <param name="updateTemp"></param>
+        public static void UpdataState(Function updateTemp)
         {
-            Application.RunOnMainThread((Action)(() => {
+            Application.RunOnMainThread(() => {
                 if (bodyView == null)
                     return;
                 if (bodyView.onControl)
                     return;
-                if (uCurtain.spk == bodyView.curtain.spk && uCurtain.sid == bodyView.curtain.sid)
+                if (updateTemp.spk == bodyView.function.spk && updateTemp.sid == bodyView.function.sid)
                 {
-                    var percentString = uCurtain.GetAttrState(FunctionAttributeKey.Percent);
+                    var percentString = updateTemp.GetAttrState(FunctionAttributeKey.Percent);
                     int percent = 0;
                     int.TryParse(percentString, out percent);
                     bodyView.btnCurtainOpen.IsSelected = percent > 0;
@@ -28,12 +28,12 @@
                     {
                         if (!bodyView.onCurtainAnimation)
                         {
-                            bodyView.CurtainAnimation(Convert.ToInt32(uCurtain.trait_percent.curValue.ToString()));
+                            bodyView.CurtainAnimation(Convert.ToInt32(updateTemp.GetAttrState(FunctionAttributeKey.Percent)));
                         }
                     }
                     catch { }
                 }
-            }));
+            });
         }
 
         /// <summary>
@@ -109,9 +109,9 @@
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () =>
             {
-                btnFunctionName.Text = btnFunctionName_Out.Text = curtain.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = curtain.GetRoomListName();
-                //curtain.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
         }
         /// <summary>
@@ -121,8 +121,8 @@
         {
             btnCollection.MouseUpEventHandler += (sender, e) =>
             {
-                btnCollection.IsSelected = curtain.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                curtain.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -140,12 +140,12 @@
                 //    });
                 //})
                 //{ IsBackground = true }.Start();
-                curtain.trait_on_off.curValue = "off";
-                curtain.percent = 0;
+                function.trait_on_off.curValue = "off";
+                function.SetAttrState(FunctionAttributeKey.Percent, 0);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
-                CurtainAnimation(curtain.percent);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
+                CurtainAnimation(0);
             };
 
             btnCurtainStop.MouseUpEventHandler = (sender, e) =>
@@ -157,10 +157,10 @@
                     });
                 })
                 { IsBackground = true }.Start();
-                curtain.trait_on_off.curValue = "stop";
+                function.trait_on_off.curValue = "stop";
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 onCurtainAnimation = false;
             };
 
@@ -173,30 +173,30 @@
                 //    });
                 //})
                 //{ IsBackground = true }.Start();
-                curtain.trait_on_off.curValue = "on";
-                curtain.percent = 100;
+                function.trait_on_off.curValue = "on";
+                function.SetAttrState(FunctionAttributeKey.Percent, 100);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, curtain.trait_on_off.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
-                CurtainAnimation(curtain.percent);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
+                CurtainAnimation(100);
             };
 
             btnMinusSignIcon.MouseUpEventHandler = (sender, e) =>
             {
-                curtain.percent--;
-                controlBar.Progress = curtain.percent;
+                controlBar.Progress -= 1;
+                function.SetAttrState(FunctionAttributeKey.Percent, controlBar.Progress);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.Percent, curtain.percent.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+                d.Add(FunctionAttributeKey.Percent, controlBar.Progress.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
             };
 
             btnPlusSgnIcon.MouseUpEventHandler = (sender, e) =>
             {
-                curtain.percent++;
-                controlBar.Progress = curtain.percent;
+                controlBar.Progress += 1;
+                function.SetAttrState(FunctionAttributeKey.Percent, controlBar.Progress);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.Percent, curtain.percent.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+                d.Add(FunctionAttributeKey.Percent, controlBar.Progress.ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
             };
 
 
@@ -221,13 +221,13 @@
             //    controlBar.Progress = curtainSeekBar.Progress;
             //    new System.Threading.Thread(() =>
             //    {
-            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - curtain.refreshTime).TotalMilliseconds > 300)
+            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - function.refreshTime).TotalMilliseconds > 300)
             //        {
-            //            curtain.percent = e;
-            //            curtain.refreshTime = DateTime.Now;
+            //            function.percent = e;
+            //            function.refreshTime = DateTime.Now;
             //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-            //            d.Add("percent", curtain.percent.ToString());
-            //            Control.SendWriteCommand(curtain, d);
+            //            d.Add("percent", function.percent.ToString());
+            //            Control.SendWriteCommand(function, d);
             //        }
             //    })
             //    { IsBackground = true }.Start();
@@ -237,11 +237,11 @@
                 controlBar.Progress = curtainSeekBar.Progress;
                 new System.Threading.Thread(() =>
                 {
-                    curtain.percent = e;
-                    curtain.refreshTime = DateTime.Now;
+                    function.SetAttrState(FunctionAttributeKey.Percent, e);
+                    function.refreshTime = DateTime.Now;
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add(FunctionAttributeKey.Percent, curtain.percent.ToString());
-                    DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+                    d.Add(FunctionAttributeKey.Percent, e.ToString());
+                    DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
@@ -251,13 +251,13 @@
             //    curtainSeekBar.Progress = controlBar.Progress;
             //    new System.Threading.Thread(() =>
             //    {
-            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - curtain.refreshTime).TotalMilliseconds > 300)
+            //        if (controlBar.Progress == 0 || controlBar.Progress == 100 || (DateTime.Now - function.refreshTime).TotalMilliseconds > 300)
             //        {
-            //            curtain.percent = e;
-            //            curtain.refreshTime = DateTime.Now;
+            //            function.percent = e;
+            //            function.refreshTime = DateTime.Now;
             //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-            //            d.Add("percent", curtain.percent.ToString());
-            //            Control.SendWriteCommand(curtain, d);
+            //            d.Add("percent", function.percent.ToString());
+            //            Control.SendWriteCommand(function, d);
             //        }
             //    })
             //    { IsBackground = true }.Start();
@@ -268,11 +268,11 @@
                 curtainSeekBar.Progress = controlBar.Progress;
                 new System.Threading.Thread(() =>
                 {
-                    curtain.percent = e;
-                    curtain.refreshTime = DateTime.Now;
+                    function.SetAttrState(FunctionAttributeKey.Percent, e);
+                    function.refreshTime = DateTime.Now;
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("percent", curtain.percent.ToString());
-                    DriverLayer.Control.Ins.SendWriteCommand(curtain, d);
+                    d.Add("percent", e.ToString());
+                    DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Electrical/ClothesHangerPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Electrical/ClothesHangerPage.cs
index 3255433..57119a2 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Electrical/ClothesHangerPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Electrical/ClothesHangerPage.cs
@@ -450,8 +450,6 @@
         /// </summary>
         public bool Lighting = false;
 
-
-
         public ClothesHangerControl(string iconPath1, string iconPath2, string title, string time)
         {
             btnIcon = new Button()
@@ -478,7 +476,7 @@
             btnTime = new Button()
             {
                 Gravity = Gravity.CenterHorizontal,
-                Y = btnTitle.Bottom,
+                Y = Application.GetRealHeight(74-32),
                 Height = Application.GetRealHeight(32),
                 Text = time,
                 TextColor = 0x00000000,
@@ -494,29 +492,28 @@
         public void ChangeTime(string newTime)
         {
             int.TryParse(newTime, out leftTime);
-            leftTime *= 60;
             if (countdownThread == null)
             {
                 countdownThread = new System.Threading.Thread(() =>
                 {
                     while (true)
                     {
-                        if (leftTime > 1)
+                        if (leftTime > 0)
                         {
                             Application.RunOnMainThread(() =>
                             {
-                                btnTime.Text = new TimeSpan(0, 0, leftTime).ToString();
+                                btnTime.Text = new TimeSpan(0, leftTime, 0).ToString().Remove(5,3) ;
                             });
-                            System.Threading.Thread.Sleep(1000);
                             leftTime--;
                         }
-                        else
+                        else if(leftTime == 0)
                         {
                             Application.RunOnMainThread(() =>
                             {
                                 btnTime.Text = "";
                             });
                         }
+                        System.Threading.Thread.Sleep(60000);
                     }
                 })
                 { IsBackground = true };
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPage.cs
index 7d8c20e..05e47f6 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPage.cs
@@ -31,7 +31,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Fan fan;
+        Fan fanTemp = new Fan();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -44,7 +45,7 @@
         public FanPage(Function func)
         {
             bodyView = this;
-            fan = func as Fan; 
+            function = func;
         }
 
 
@@ -74,7 +75,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = fan.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -87,7 +88,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = fan.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -99,7 +100,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = fan.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -114,7 +115,7 @@
                 Y = Application.GetRealHeight(100),
                 Width = Application.GetRealWidth(198),
                 Height = Application.GetRealWidth(198),
-                IsSelected = fan.trait_on_off.curValue.ToString() == "on",
+                IsSelected = function.trait_on_off.curValue.ToString() == "on",
                 SelectedImagePath = "FunctionIcon/Electrical/FanIconBg.png",
                 UnSelectedImagePath = "FunctionIcon/Electrical/FanIconBgGray.png",
             };
@@ -166,17 +167,17 @@
                 Height = Application.GetMinRealAverage(40),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = fan.trait_on_off.curValue.ToString() == "on"
+                IsSelected = function.trait_on_off.curValue.ToString() == "on"
             };
             controlView.AddChidren(btnSwitch);
 
 
             LoadEventList();
 
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Fan)).LoadTopView_FunctionTop(fan, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Fan)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(fan);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPageBLL.cs
index 11f6b3b..86a0e73 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Electrical/FanPageBLL.cs
@@ -10,7 +10,7 @@
         /// <summary>
         /// 鏇存柊鐏厜鐘舵��
         /// </summary>
-        public static void UpdataState(Fan uFan)
+        public static void UpdataState(Function updateTemp)
         {
             Application.RunOnMainThread(() =>
             {
@@ -18,9 +18,9 @@
                 {
                     if (bodyView == null)
                         return;
-                    bodyView.btnSwitch.IsSelected = bodyView.btnSwitchIcon.IsSelected = uFan.trait_on_off.curValue.ToString() == "on";
-                    bodyView.barGradualChange.ProgressBarColor = uFan.trait_on_off.curValue.ToString() == "on" ? CSS.CSS_Color.MainColor : CSS.CSS_Color.PromptingColor2;
-                    bodyView.barGradualChange.Progress = uFan.openLevel;
+                    bodyView.btnSwitch.IsSelected = bodyView.btnSwitchIcon.IsSelected = updateTemp.trait_on_off.curValue.ToString() == "on";
+                    bodyView.barGradualChange.ProgressBarColor = updateTemp.trait_on_off.curValue.ToString() == "on" ? CSS.CSS_Color.MainColor : CSS.CSS_Color.PromptingColor2;
+                    bodyView.barGradualChange.Progress = Convert.ToInt32(updateTemp.GetAttrState(FunctionAttributeKey.OpenLevel));
                 }
                 catch (Exception ex)
                 {
@@ -38,9 +38,9 @@
 
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = fan.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = fan.GetRoomListName();
-                //fan.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
         }
 
@@ -50,8 +50,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = fan.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                fan.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -66,11 +66,11 @@
 
                 new System.Threading.Thread(() =>
                 {
-                    fan.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                    //Control.Send(CommandType_A.write, this.fan);
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                    //Control.Send(CommandType_A.write, this.function);
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("on_off", fan.trait_on_off.curValue.ToString());
-                    Control.Ins.SendWriteCommand(fan, d);
+                    d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
@@ -80,24 +80,22 @@
 
                 new System.Threading.Thread(() =>
                 {
-                    fan.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                    //Control.Send(CommandType_A.write, this.fan);
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("on_off", fan.trait_on_off.curValue.ToString());
-                    Control.Ins.SendWriteCommand(fan, d);
+                    d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
 
             barGradualChange.OnProgressChangedEvent = (sender, e) => {
-                fan.openLevel = e;
+                function.SetAttrState(FunctionAttributeKey.OpenLevel, e.ToString());
                 new System.Threading.Thread(() =>
                 {
-                    fan.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                    //Control.Send(CommandType_A.write, this.fan);
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("on_off", fan.trait_on_off.curValue.ToString());
-                    Control.Ins.SendWriteCommand(fan, d);
+                    d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPage.cs
index 8c2b3dc..f34d757 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPage.cs
@@ -30,7 +30,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        SwitchSocket socketFunction;
+        SwitchSocket socketTemp;
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -43,7 +44,7 @@
         public SocketPage(Function func)
         {
             bodyView = this;
-            socketFunction = func as SwitchSocket;
+            function = func ;
         }
 
 
@@ -73,7 +74,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = socketFunction.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -86,7 +87,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = socketFunction.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -98,7 +99,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = socketFunction.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -113,7 +114,7 @@
                 Y = Application.GetRealHeight(100),
                 Width = Application.GetRealWidth(198),
                 Height = Application.GetRealWidth(198),
-                IsSelected = socketFunction.trait_on_off.curValue.ToString() == "on",
+                IsSelected = function.trait_on_off.curValue.ToString() == "on",
                 UnSelectedImagePath = "FunctionIcon/Socket/SocketIconBg.png",
                 SelectedImagePath = "FunctionIcon/Socket/SocketIconOnBg.png",  
             };
@@ -127,16 +128,16 @@
                 Height = Application.GetMinRealAverage(40),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = socketFunction.trait_on_off.curValue.ToString() == "on"
+                IsSelected = function.trait_on_off.curValue.ToString() == "on"
             };
             controlView.AddChidren(btnSwitch);
 
             LoadEventList();
 
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Socket)).LoadTopView_FunctionTop(socketFunction, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Socket)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(socketFunction);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPageBLL.cs
index 5dde93c..300b194 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Electrical/SocketPageBLL.cs
@@ -10,7 +10,7 @@
         /// <summary>
         /// 鏇存柊鐏厜鐘舵��
         /// </summary>
-        public static void UpdataState(SwitchSocket uFan)
+        public static void UpdataState(Function uFan)
         {
             Application.RunOnMainThread(() =>
             {
@@ -36,9 +36,9 @@
 
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = socketFunction.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = socketFunction.GetRoomListName();
-                socketFunction.UpdataFuncitonInfo();
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                function.UpdataFuncitonInfo();
             };
         }
 
@@ -48,8 +48,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = socketFunction.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                socketFunction.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -64,11 +64,11 @@
 
                 new System.Threading.Thread(() =>
                 {
-                    socketFunction.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                    //Control.Send(CommandType_A.write, this.socketFunction);
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                    //Control.Send(CommandType_A.write, this.function);
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("on_off", socketFunction.trait_on_off.curValue.ToString());
-                    Control.Ins.SendWriteCommand(socketFunction, d);
+                    d.Add("on_off", function.trait_on_off.curValue.ToString());
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
@@ -78,11 +78,11 @@
 
                 new System.Threading.Thread(() =>
                 {
-                    socketFunction.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                    //Control.Send(CommandType_A.write, this.socketFunction);
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                    //Control.Send(CommandType_A.write, this.function);
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("on_off", socketFunction.trait_on_off.curValue.ToString());
-                    Control.Ins.SendWriteCommand(socketFunction, d);
+                    d.Add("on_off", function.trait_on_off.curValue.ToString());
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPage.cs
index 737c59b..b9bc1a6 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPage.cs
@@ -43,7 +43,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        TV tv;
+        TV tvTemp = new TV();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -56,7 +57,7 @@
         public TVPage(Function func)
         {
             bodyView = this;
-            tv = func as TV;
+            function = func;
         }
 
 
@@ -86,7 +87,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = tv.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -99,7 +100,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = tv.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -111,7 +112,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = tv.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -335,8 +336,8 @@
 
             LoadEventList();
 
-            new TopViewDiv(bodyView, Language.StringByID(StringId.TV)).LoadTopView_FunctionTop(tv, actionRefresh);
-            DriverLayer.Control.Ins.SendReadCommand(tv);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.TV)).LoadTopView_FunctionTop(function, actionRefresh);
+            DriverLayer.Control.Ins.SendReadCommand(function);
 
         }
 
@@ -420,7 +421,7 @@
                 numberView.AddChidren(btn);
                 btn.MouseUpEventHandler = (sender, e) => {
                     btn.IsSelected = false;
-                    tv.ControlTV(i);
+                    tvTemp.ControlTV(i,function);
                 };
                 btn.MouseDownEventHandler = (sender, e) => {
                     btn.IsSelected = true;
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPageBLL.cs
index ea72033..2467e67 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Electrical/TVPageBLL.cs
@@ -16,9 +16,9 @@
 
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = tv.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = tv.GetRoomListName();
-                tv.UpdataFuncitonInfo();
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                function.UpdataFuncitonInfo();
             };
         }
 
@@ -28,8 +28,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = tv.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                tv.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -40,32 +40,32 @@
         {
             btnChangeTVAV.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.AV_TV);
+                tvTemp.ControlTV(InfraredCode_TV.AV_TV,function);
             };
             btnChlPlus.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.ChannelUp);
+                tvTemp.ControlTV(InfraredCode_TV.ChannelUp, function);
             };
             btnChlReduce.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.ChannelDown);
+                tvTemp.ControlTV(InfraredCode_TV.ChannelDown, function);
             };
             btnVolPlus.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.VolUp);
+                tvTemp.ControlTV(InfraredCode_TV.VolUp, function);
             };
             btnVolReduce.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.VolDown);
+                tvTemp.ControlTV(InfraredCode_TV.VolDown, function);
             };
             btnBack.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.Back);
+                tvTemp.ControlTV(InfraredCode_TV.Back, function);
             };
 
             btnMenu.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.Menu);
+                tvTemp.ControlTV(InfraredCode_TV.Menu, function);
             };
             btn123.MouseUpEventHandler = (sender, e) =>
             {
@@ -73,27 +73,27 @@
             };
             btnMute.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.Mute);
+                tvTemp.ControlTV(InfraredCode_TV.Mute, function);
             };
             btnPower.MouseUpEventHandler = (sender, e) =>
             {
-                tv.ControlTV(InfraredCode_TV.Power);
+                tvTemp.ControlTV(InfraredCode_TV.Power, function);
             };
 
             btnTopMenuUp.MouseUpEventHandler = (sender, e) => {
-                tv.ControlTV(InfraredCode_TV.Up);
+                tvTemp.ControlTV(InfraredCode_TV.Up, function);
             };
             btnTopMenuLeft.MouseUpEventHandler = (sender, e) => {
-                tv.ControlTV(InfraredCode_TV.Left);
+                tvTemp.ControlTV(InfraredCode_TV.Left, function);
             };
             btnTopMenuRight.MouseUpEventHandler = (sender, e) => {
-                tv.ControlTV(InfraredCode_TV.Right);
+                tvTemp.ControlTV(InfraredCode_TV.Right, function);
             };
             btnTopMenuDown.MouseUpEventHandler = (sender, e) => {
-                tv.ControlTV(InfraredCode_TV.Down);
+                tvTemp.ControlTV(InfraredCode_TV.Down, function);
             };
             btnOk.MouseUpEventHandler = (sender, e) => {
-                tv.ControlTV(InfraredCode_TV.Confrim);
+                tvTemp.ControlTV(InfraredCode_TV.Confrim, function);
             };
         }
 
diff --git a/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePage.cs b/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePage.cs
index cbd8d7e..b830595 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePage.cs
@@ -50,6 +50,7 @@
         #region 鍖哄煙鍙橀噺
         Room room;
 
+        Sensor sensorTemp = new Sensor();
         #endregion
 
 
@@ -349,7 +350,7 @@
         {
             sensorListView.RemoveAll();
             int index = 0;
-            foreach (var sensor in FunctionList.List.sensorsEnvironmentalScience)
+            foreach (var sensor in FunctionList.List.GetEnvirSensorsList())
             {
                 LoadSensorDiv(sensor, index);
                 index++;
@@ -359,8 +360,11 @@
         /// <summary>
         /// 鍔犺浇浼犳劅鍣ㄥ垪琛�
         /// </summary>
-        void LoadSensorDiv(Sensor sensor,int index)
+        void LoadSensorDiv(Function sensor,int index)
         {
+            var levelColorList = sensorTemp.GetLevelColorList(sensor.spk);
+            var levelTextList = sensorTemp.GetLevelTextList(sensor.spk);
+
             if (room.roomId == "" ||  sensor.roomIds.Contains(room.roomId))
             {
                 var sensorTag = sensor.sid;
@@ -388,10 +392,10 @@
                     Width = Application.GetRealWidth(48),
                     Height = Application.GetRealWidth(48),
                     OpenAngle = 10,
-                    ProgressBarColor = sensor.levelColorList[sensor.curLevel - 1],
+                    ProgressBarColor = sensorTemp.GetLevelColorList(sensor.spk)[sensorTemp.GetCurLevel(sensor) - 1],
                     MinValue = 0,
                     MaxValue = 96,
-                    Progress = (96 / sensor.levelColorList.Count) * sensor.curLevel,
+                    Progress = (96 / sensorTemp.GetLevelColorList(sensor.spk).Count * sensorTemp.GetCurLevel(sensor)),
                     IsClickable = false,
                     ArcColor = CSS_Color.BackgroundColor,
                     ArcWidth = Application.GetRealWidth(4),
@@ -409,7 +413,7 @@
                     TextAlignment = TextAlignment.Center,
                     TextSize = CSS_FontSize.PromptFontSize_SecondaryLevel,
                     TextColor = CSS_Color.FirstLevelTitleColor,
-                    TextID = sensor.functionTypeNameId,
+                    TextID = sensorTemp.GetFunctionTypeNameId(sensor.spk),
                     Tag = "SensorTitle"
                 };
                 sensorView.AddChidren(btnSensorTitle);
@@ -445,7 +449,7 @@
                     TextColor = CSS_Color.FirstLevelTitleColor,
                     TextSize = CSS_FontSize.EmphasisFontSize_Secondary,
                     IsBold = true,
-                    Text = sensor.values.ToString(),
+                    Text = sensor.GetAttrState(FunctionAttributeKey.Value),
                     Tag = "SensorValues"
                 };
                 sensorView.AddChidren(btnSensorValues);
@@ -457,9 +461,9 @@
                     Width = Application.GetRealWidth(50),
                     Height = Application.GetRealWidth(18),
                     TextAlignment = TextAlignment.CenterLeft,
-                    TextColor = sensor.levelColorList[sensor.curLevel - 1],
+                    TextColor = levelColorList[sensorTemp.GetCurLevel( sensor) - 1],
                     TextSize = CSS_FontSize.PromptFontSize_SecondaryLevel,
-                    TextID = sensor.levelTextList[sensor.curLevel - 1],
+                    TextID = levelTextList[sensorTemp.GetCurLevel(sensor) - 1],
                     Tag = "SensorLevel"
                 };
                 sensorView.AddChidren(btnLevel);
@@ -471,8 +475,10 @@
         /// <summary>
         /// 鍔犺浇浼犳劅鍣ㄧ瓑绾х浉鍏充俊鎭�
         /// </summary>
-        void LoadInfo(Sensor sensor)
+        void LoadInfo(Function sensor)
         {
+            var levelColorList = sensorTemp.GetLevelColorList(sensor.spk);
+            var levelTextList = sensorTemp.GetLevelTextList(sensor.spk);
             Dialog dialog = new Dialog();
 
             FrameLayout dialogBodyView = new FrameLayout();
@@ -481,13 +487,12 @@
             {
                 dialog.Close();
             };
-
             VerticalScrolViewLayout infoView = new VerticalScrolViewLayout()
             {
                 Gravity = Gravity.CenterHorizontal,
-                Y = Application.GetRealHeight(667 - 94 - (sensor.levelColorList.Count * 44) - 20),
+                Y = Application.GetRealHeight(667 - 94 - (levelColorList.Count * 44) - 20),
                 Width = Application.GetRealWidth(343),
-                Height = Application.GetRealHeight(94 + (sensor.levelColorList.Count * 44) + sensor.levelColorList.Count),
+                Height = Application.GetRealHeight(94 + (levelColorList.Count * 44) + levelColorList.Count),
                 Radius = (uint)Application.GetRealWidth(12),
                 BackgroundColor = CSS_Color.MainBackgroundColor,
                 Animate = Animate.DownToUp,
@@ -563,7 +568,7 @@
                 IsBold = true,
                 TextID = StringId.ColorValue,
             });
-            for (int index = 0; index < sensor.levelTextList.Count; index++)
+            for (int index = 0; index < levelTextList.Count; index++)
             {
                 infoView.AddChidren(new Button()
                 {
@@ -587,7 +592,7 @@
                     TextColor = CSS_Color.FirstLevelTitleColor,
                     TextSize = CSS_FontSize.TextFontSize,
                     IsBold = true,
-                    Text = sensor.intervalValue[index]
+                    Text = sensorTemp.GetIntervalValue(sensor.spk)[index]
                 });
 
                 subInfoView.AddChidren(new Button()
@@ -598,7 +603,7 @@
                     TextColor = CSS_Color.FirstLevelTitleColor,
                     TextSize = CSS_FontSize.TextFontSize,
                     IsBold = true,
-                    TextID = sensor.levelTextList[index]
+                    TextID = levelTextList[index]
                 });
 
                 subInfoView.AddChidren(new Button()
@@ -608,7 +613,7 @@
                     Width = Application.GetRealWidth(38),
                     Height = Application.GetRealHeight(18),
                     Radius = (uint)Application.GetRealWidth(4),
-                    BackgroundColor = sensor.levelColorList[index]
+                    BackgroundColor = levelColorList[index]
                 });
             }
 
diff --git a/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePageBLL.cs
index c9b08eb..0a37a2e 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSciencePageBLL.cs
@@ -11,14 +11,14 @@
 
         }
 
-       public static void LoadEvent_UpdataStatus(Sensor sensor)
+       public static void LoadEvent_UpdataStatus(Function updateTemp)
         {
             Application.RunOnMainThread(() =>{
                 if (bodyView != null)
                 {
                     for (int i = 0; i < bodyView.sensorListView.ChildrenCount; i++)
                     {
-                        var sensorTag = sensor.sid;
+                        var sensorTag = updateTemp.sid;
                         var view = bodyView.sensorListView.GetChildren(i);
                         if (view.GetType() == typeof(FrameLayout))
                         {
@@ -36,20 +36,20 @@
                                         var tag = btn.Tag.ToString();
                                         if (tag == "SensorValues")
                                         {
-                                            (btn as Button).Text = sensor.values.ToString();
+                                            (btn as Button).Text = updateTemp.GetAttrState(FunctionAttributeKey.Value);
                                         }
                                         else if (tag == "SensorLevel")
                                         {
-                                            (btn as Button).TextID = sensor.levelTextList[sensor.curLevel - 1];
-                                            (btn as Button).TextColor = sensor.levelColorList[sensor.curLevel - 1];
+                                            (btn as Button).TextID = bodyView.sensorTemp.GetLevelTextList(updateTemp.spk)[bodyView.sensorTemp.GetCurLevel(updateTemp) - 1];
+                                            (btn as Button).TextColor = bodyView.sensorTemp.GetLevelColorList(updateTemp.spk)[bodyView.sensorTemp.GetCurLevel(updateTemp) - 1];
                                         }
                                     }
                                 }
                                 else if (btn.GetType() == typeof(ArcSeekBar))
                                 {
-                                    (btn as ArcSeekBar).ProgressBarColor = sensor.levelColorList[sensor.curLevel - 1];
+                                    (btn as ArcSeekBar).ProgressBarColor = bodyView.sensorTemp.GetLevelColorList(updateTemp.spk)[bodyView.sensorTemp.GetCurLevel(updateTemp) - 1];
 
-                                    (btn as ArcSeekBar).Progress = (96 / sensor.levelColorList.Count) * sensor.curLevel;
+                                    (btn as ArcSeekBar).Progress = (96 / bodyView.sensorTemp.GetLevelColorList(updateTemp.spk).Count) * bodyView.sensorTemp.GetCurLevel(updateTemp);
                                 }
                             }
                         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSensorPage.cs b/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSensorPage.cs
index 594196b..cd98b4c 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSensorPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/EnvironmentalScience/EnvironmentalSensorPage.cs
@@ -21,9 +21,10 @@
 
         MyEchartsViewOn myEchartsView;
 
-        Sensor sensor;
+        Sensor sensorTemp = new Sensor();
 
-        List<Sensor> showSensors;
+        Function function;
+        List<Function> showFunctions;
         /// <summary>
         /// 褰撳墠鏌ヨ绫诲瀷
         /// </summary>
@@ -39,12 +40,12 @@
             "#80AEFF","#FFD154","#FF9D54","#FE6A6A","#B183C3","#ADE764",
         };
 
-        public EnvironmentalSensorPage(Sensor ss)
+        public EnvironmentalSensorPage(Function ss)
         {
             bodyView = this;
-            sensor = ss;
-            showSensors = new List<Sensor>();
-            showSensors.Add(ss);
+            function = ss;
+            showFunctions = new List<Function>();
+            showFunctions.Add(ss);
         }
 
         public void LoadPage()
@@ -163,7 +164,7 @@
             };
             diagramView.AddChidren(tipTextView);
 
-            switch (sensor.spk)
+            switch (function.spk)
             {
                 case SPK.SensorPm25:
                     tipValuesView.AddChidren(new Button()
@@ -552,7 +553,7 @@
                 TextAlignment = TextAlignment.CenterLeft,
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextSize = CSS_FontSize.TextFontSize,
-                Text = sensor.name,
+                Text = function.name,
                 IsBold = true,
             };
             selfInfoView.AddChidren(btnSeltSensorName);
@@ -566,7 +567,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = sensor.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             selfInfoView.AddChidren(btnFromFoorAndRoom);
 
@@ -628,9 +629,9 @@
             {
                 Action backAction = () =>
                 {
-                    btnSeltSensorName.Text = sensor.name;
+                    btnSeltSensorName.Text = function.name;
                 };
-                var infoView = new FunctionBaseInfoSetPage(sensor, backAction);
+                var infoView = new FunctionBaseInfoSetPage(function, backAction);
                 MainPage.BasePageView.AddChidren(infoView);
                 infoView.LoadPage();
                 MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
@@ -642,13 +643,13 @@
 
             bool initTitleButton = true;
 
-            foreach (var tempSensor in FunctionList.List.sensorsEnvironmentalScience)
+            foreach (var tempSensor in FunctionList.List.GetEnvirSensorsList())
             {
-                if (tempSensor.sid == sensor.sid)
+                if (tempSensor.sid == function.sid)
                 {
                     continue;
                 }
-                if (tempSensor.spk != sensor.spk)
+                if (tempSensor.spk != function.spk)
                 {
                     continue;
                 }
@@ -705,7 +706,7 @@
                     TextAlignment = TextAlignment.CenterLeft,
                     TextColor = CSS_Color.FirstLevelTitleColor,
                     TextSize = CSS_FontSize.TextFontSize,
-                    Text = sensor.name,
+                    Text = function.name,
                     IsBold = true,
                 };
                 otherInfoView.AddChidren(btnSensorName);
@@ -772,16 +773,16 @@
                     btnShowData1.IsSelected = !btnShowData1.IsSelected;
                     if (btnShowData1.IsSelected)
                     {
-                        if (!showSensors.Contains(sensor))
+                        if (!showFunctions.Contains(function))
                         {
-                            showSensors.Add(sensor);
+                            showFunctions.Add(function);
                         }
                     }
                     else
                     {
-                        if (showSensors.Contains(sensor))
+                        if (showFunctions.Contains(function))
                         {
-                            showSensors.Remove(sensor);
+                            showFunctions.Remove(function);
                         }
                     }
                     LoadMothed_GetSensorHistoryData();
@@ -790,7 +791,7 @@
 
             }
             #endregion
-            new TopViewDiv(bodyView, Language.StringByID(sensor.functionTypeNameId)).LoadTopView();
+            new TopViewDiv(bodyView, Language.StringByID(sensorTemp.GetFunctionTypeNameId(function.spk))).LoadTopView();
 
             LoadMothed_GetSensorHistoryData();
             LoadEvent_ChangeSensorHistoryShowType();
@@ -824,13 +825,13 @@
                     });
                     int i = 0;
       
-                    foreach (var sr in FunctionList.List.sensorsEnvironmentalScience)
+                    foreach (var sr in FunctionList.List.GetEnvirSensorsList())
                     {
-                        if (sr.spk != sensor.spk)
+                        if (sr.spk != function.spk)
                         {
                             continue;
                         }
-                        if (showSensors.Find((obj) => obj.sid == sr.sid) == null)
+                        if (showFunctions.Find((obj) => obj.sid == sr.sid) == null)
                         {
                             i++;
                             continue;
diff --git a/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPage.cs b/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPage.cs
index e798a2e..7e1565f 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPage.cs
@@ -23,7 +23,7 @@
         /// </summary>
         Button btnCollection;
         /// <summary>
-        /// 绌鸿皟娓╁害鎺у埗鎺т欢
+        /// 娓╁害鎺у埗鎺т欢
         /// </summary>
         DiyArcSeekBar arcBar;
         /// <summary>
@@ -62,7 +62,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        FloorHeating fh;
+        FloorHeating fhTemp = new FloorHeating();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -71,10 +72,10 @@
         /// </summary>
         Action actionRefresh;
         #endregion
-        public FloorHeatingPage(FloorHeating func)
+        public FloorHeatingPage(Function func)
         {
             bodyView = this;
-            fh = func;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -103,7 +104,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = fh.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -116,7 +117,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = fh.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -128,7 +129,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = fh.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -141,16 +142,15 @@
             {
                 Gravity = Gravity.CenterHorizontal,
                 OpenAngle = 160,
-                ThumbImagePath = fh.trait_on_off.curValue.ToString() == "on" ? "FunctionIcon/FloorHeating/DiyThumbIconOn.png" : "FunctionIcon/AC/DiyThumbIcon.png",
+                ThumbImagePath = function.trait_on_off.curValue.ToString() == "on" ? "FunctionIcon/FloorHeating/DiyThumbIconOn.png" : "FunctionIcon/AC/DiyThumbIcon.png",
                 ThumbImageHeight = Application.GetRealWidth(50),
                 ProgressBarColor = CSS_Color.AuxiliaryColor1, // 0xFFFC9C04,
                 OfflineProgressBarColor = CSS_Color.PromptingColor2,
-                IsOffline = fh.trait_on_off.curValue.ToString() == "off",
-                MinValue = fh.trait_temp.min,
-                MaxValue = fh.trait_temp.max,
-                //IsClickable = fh.trait_on_off.curValue.ToString() == "on",
+                IsOffline = function.trait_on_off.curValue.ToString() == "off",
+                MinValue = function.GetAttribute(FunctionAttributeKey.SetTemp).min,
+                MaxValue = function.GetAttribute(FunctionAttributeKey.SetTemp).max,
                 ArcColor = CSS_Color.BackgroundColor,
-                Progress = Convert.ToInt32(fh.trait_temp.curValue),
+                Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.SetTemp)),
 #if __IOS__
                 Y = Application.GetRealHeight(120+25),
                 Width = Application.GetRealWidth(260-40),
@@ -175,7 +175,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextSize = 56,
                 IsBold = true,
-                Text = fh.trait_temp.curValue.ToString(),
+                Text = function.GetAttrState(FunctionAttributeKey.SetTemp),
                 TextAlignment = TextAlignment.Center,
             };
             controlView.AddChidren(btnTemp);
@@ -190,7 +190,7 @@
                 TextSize = CSS_FontSize.EmphasisFontSize_Secondary,
                 IsBold = true,
                 TextAlignment = TextAlignment.CenterLeft,
-                Text = fh.tempUnitString
+                Text = fhTemp.GetTempUnitString(function)
             };
             controlView.AddChidren(btnTempUint);
 
@@ -232,7 +232,7 @@
                 Y = Application.GetRealHeight(337),
                 Width = Application.GetRealWidth(30),
                 Height = Application.GetRealWidth(30),
-                UnSelectedImagePath = fh.curModeImage,
+                UnSelectedImagePath = fhTemp.GetModeImage(function)
             };
             controlView.AddChidren(btnMode);
 
@@ -244,15 +244,15 @@
                 Height = Application.GetRealWidth(32),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = fh.trait_on_off.curValue.ToString() == "on"
+                IsSelected = function.trait_on_off.curValue.ToString() == "on"
             };
             controlView.AddChidren(btnSwitch);
 
             LoadEventList();
-            new TopViewDiv(bodyView, Language.StringByID(StringId.FloorHeating)).LoadTopView_FunctionTop(fh, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.FloorHeating)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(fh);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
@@ -304,28 +304,29 @@
             };
             modeChangeView.AddChidren(btnLine);
 
-            foreach (var m in fh.trait_mode.value)
+            var modeList = function.GetAttribute(FunctionAttributeKey.Mode).value;
+            foreach (var m in modeList) 
             {
                 Button btnModeIcon = new Button()
                 {
                     X = btnTitle.X,
-                    Y = Application.GetRealHeight(44 * (fh.trait_mode.value.IndexOf(m) + 1) + 10 + 8),
+                    Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 10 + 8),
                     Width = Application.GetRealWidth(24),
                     Height = Application.GetRealWidth(24),
-                    IsSelected = fh.trait_mode.curValue.ToString() == m,
+                    IsSelected = function.GetAttrState(FunctionAttributeKey.Mode) == m,
                 };
                 modeChangeView.AddChidren(btnModeIcon);
 
                 Button btnModeText = new Button()
                 {
                     X = Application.GetRealWidth(12) + btnModeIcon.Right,
-                    Y = Application.GetRealHeight(44 * (fh.trait_mode.value.IndexOf(m) + 1) + 8),
+                    Y = Application.GetRealHeight(44 * (modeList.IndexOf(m) + 1) + 8),
                     Height = Application.GetRealHeight(44),
                     Width = Application.GetRealWidth(70),
                     TextAlignment = TextAlignment.CenterLeft,
                     TextColor = CSS_Color.FirstLevelTitleColor,
                     SelectedTextColor = CSS_Color.MainColor,
-                    IsSelected = fh.trait_mode.curValue.ToString() == m,
+                    IsSelected = function.GetAttrState(FunctionAttributeKey.Mode) == m,
                 };
                 modeChangeView.AddChidren(btnModeText);
 
@@ -358,7 +359,7 @@
                         break;
                 }
 
-                if (fh.trait_mode.value.IndexOf(m) < fh.trait_mode.value.Count - 1)
+                if (modeList.IndexOf(m) < modeList.Count - 1)
                 {
                     modeChangeView.AddChidren(new Button()
                     {
diff --git a/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPageBLL.cs
index 8a716e8..c60d77b 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/FoolHeating/FloorHeatingPageBLL.cs
@@ -9,7 +9,7 @@
     public partial class FloorHeatingPage
     {
 
-        public static void UpdataStates(FloorHeating uFh)
+        public static void UpdataStates(Function updateTemp)
         {
             try
             {
@@ -19,11 +19,11 @@
                     {
                         return;
                     }
-                    bodyView.btnTemp.Text = uFh.trait_temp.curValue.ToString();
-                    bodyView.btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(uFh.trait_IndoorTemp.curValue)) + "掳C";
-                    bodyView.btnMode.UnSelectedImagePath = uFh.curModeImage;
-                    bodyView.arcBar.Progress = Convert.ToInt32(Convert.ToDouble(uFh.trait_temp.curValue));
-                    if (uFh.trait_on_off.curValue.ToString() == "on")
+                    bodyView.btnTemp.Text = updateTemp.GetAttrState(FunctionAttributeKey.SetTemp);
+                    bodyView.btnIndoorTemp.Text = Language.StringByID(StringId.IndoorTemp) + Convert.ToInt32(Convert.ToDouble(updateTemp.GetAttrState(FunctionAttributeKey.IndoorTemp))) + "掳C";
+                    bodyView.btnMode.UnSelectedImagePath = bodyView.fhTemp.GetModeImage(updateTemp);
+                    bodyView.arcBar.Progress = Convert.ToInt32(Convert.ToDouble(updateTemp.GetAttrState(FunctionAttributeKey.SetTemp)));
+                    if (updateTemp.trait_on_off.curValue.ToString() == "on")
                     {
                         bodyView.arcBar.ThumbImagePath = "FunctionIcon/FloorHeating/DiyThumbIconOn.png";
                         bodyView.btnSwitch.IsSelected = true;
@@ -51,9 +51,9 @@
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () =>
             {
-                btnFunctionName.Text = btnFunctionName_Out.Text = fh.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = fh.GetRoomListName();
-                //fh.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
         }
 
@@ -64,8 +64,8 @@
         {
             btnCollection.MouseUpEventHandler += (sender, e) =>
             {
-                btnCollection.IsSelected = fh.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                fh.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -76,57 +76,55 @@
         {
             btnMinus.MouseUpEventHandler = (sender, e) =>
             {
-                if(fh.trait_on_off.curValue.ToString() == "off")
+                if(function.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
 
-                var temp = Convert.ToInt32(fh.trait_temp.curValue);
-                if (temp < Convert.ToInt32(fh.trait_temp.min))
+                var temp = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.SetTemp));
+                if (temp < Convert.ToInt32(function.GetAttribute(FunctionAttributeKey.SetTemp).min))
                 {
                     return;
                 }
                 temp--;
                 arcBar.Progress = temp;
-                fh.trait_temp.curValue = temp.ToString();
+                function.SetAttrState(FunctionAttributeKey.SetTemp, temp);
                 btnTemp.Text = temp.ToString();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
-                Control.Ins.SendWriteCommand(fh, d);
+                Control.Ins.SendWriteCommand(function, d);
             };
             btnPlus.MouseUpEventHandler = (sender, e) =>
             {
-                if (fh.trait_on_off.curValue.ToString() == "off")
+                if (function.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
-                var temp = Convert.ToInt32(fh.trait_temp.curValue);
-                if (temp > Convert.ToInt32(fh.trait_temp.max))
+                var temp = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.SetTemp));
+                if (temp > Convert.ToInt32(function.GetAttribute(FunctionAttributeKey.SetTemp).max))
                 {
                     return;
                 }
                 temp++;
                 arcBar.Progress = temp;
                 btnTemp.Text = temp.ToString();
-                fh.trait_temp.curValue = temp.ToString();
-                //Control.Send(CommandType_A.write, fh);
+                function.SetAttrState(FunctionAttributeKey.SetTemp, temp);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
                 d.Add(FunctionAttributeKey.SetTemp, temp.ToString());
-                Control.Ins.SendWriteCommand(fh, d);
+                Control.Ins.SendWriteCommand(function, d);
             };
             arcBar.OnStopTrackingTouchEvent = (sender, e) =>
             {
-                fh.trait_temp.curValue = arcBar.Progress.ToString();
-                btnTemp.Text = fh.trait_temp.curValue.ToString();
-                //Control.Send(CommandType_A.write, fh);
+                function.SetAttrState(FunctionAttributeKey.SetTemp,arcBar.Progress);
+                btnTemp.Text = arcBar.Progress.ToString();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.SetTemp, fh.trait_temp.curValue.ToString());
-                Control.Ins.SendWriteCommand(fh, d);
+                d.Add(FunctionAttributeKey.SetTemp, arcBar.Progress.ToString());
+                Control.Ins.SendWriteCommand(function, d);
             };
             arcBar.OnProgressChangedEvent = (sender, e) =>
             {
-                fh.trait_temp.curValue = e.ToString();
-                btnTemp.Text = fh.trait_temp.curValue.ToString();
+                function.SetAttrState(FunctionAttributeKey.SetTemp, e);
+                btnTemp.Text = function.GetAttrState(FunctionAttributeKey.SetTemp);
             };
         }
         /// <summary>
@@ -136,7 +134,7 @@
         {
             btnMode.MouseUpEventHandler = (sender, e) =>
             {
-                if (fh.trait_on_off.curValue.ToString() == "off")
+                if (function.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
@@ -146,8 +144,8 @@
             btnSwitch.MouseUpEventHandler = (sender, e) =>
             {
                 btnSwitch.IsSelected = !btnSwitch.IsSelected;
-                fh.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
-                if (fh.trait_on_off.curValue.ToString() == "on")
+                function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                if (function.trait_on_off.curValue.ToString() == "on")
                 {
                     //arcBar.ProgressBarColor = CSS_Color.MainColor;
                     arcBar.ThumbImagePath = "FunctionIcon/FloorHeating/DiyThumbIconOn.png";
@@ -162,8 +160,8 @@
                     arcBar.IsOffline = true;
                 }
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.OnOff, fh.trait_on_off.curValue.ToString());
-                Control.Ins.SendWriteCommand(fh, d);
+                d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                Control.Ins.SendWriteCommand(function, d);
                
             };
         }
@@ -181,14 +179,14 @@
             EventHandler<MouseEventArgs> eventHandler1 = (sender, e) =>
             {
                 btn1.IsSelected = btn2.IsSelected = true;
-                fh.trait_mode.curValue = curMode;
+                function.SetAttrState(FunctionAttributeKey.Mode,curMode);
                 btnMode.UnSelectedImagePath = btn1.SelectedImagePath;
-                byte pro = 6;
-                fh.modeTemp.TryGetValue(curMode, out pro);
-                arcBar.Progress = pro;
+                //byte pro = 6;//涓嶅鐞嗘俯搴︽樉绀猴紝绛夊緟鍥炲鏁版嵁鍐嶅鐞�
+                //function.Fh_Mode_Temp.TryGetValue(curMode, out pro);
+                //arcBar.Progress = pro;
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.Mode, fh.trait_mode.curValue.ToString());
-                Control.Ins.SendWriteCommand(fh, d);
+                d.Add(FunctionAttributeKey.Mode, function.GetAttrState(FunctionAttributeKey.Mode));
+                Control.Ins.SendWriteCommand(function, d);
                 dialog.Close();
             };
             btn1.MouseUpEventHandler = eventHandler1;
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPage.cs
index a2014d0..c7305f0 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPage.cs
@@ -53,7 +53,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Light light;
+        Light lightTemp = new Light();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -70,10 +71,10 @@
             bodyView = null;
         }
 
-        public ColorTureLampPage(Light func)
+        public ColorTureLampPage(Function func)
         {
             bodyView = this;
-            light = func;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -82,8 +83,6 @@
             btnFunctionName_Out = btnFunctionNameOut;
             btnFromFloor_Out = btnFromFloorOut;
             bodyView.BackgroundColor = CSS_Color.BackgroundColor;
-            //new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView(light,null);
-            //new PublicAssmebly().LoadTopView(bodyView, Language.StringByID(StringId.Lights), light);
 
             controlView = new FrameLayout()
             {
@@ -104,7 +103,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = light.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -117,7 +116,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = light.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -129,7 +128,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = light.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -142,16 +141,16 @@
             {
                 Gravity = Gravity.CenterHorizontal,
                 Y = Application.GetRealHeight(108),
-                Width = Application.GetRealWidth(142 - 16 -16),
+                Width = Application.GetRealWidth(142 - 16 - 16),
                 Height = Application.GetRealHeight(222),
                 BorderColor = 0x00000000,
                 CornerRadius = Application.GetRealWidth(20),
                 BorderWidth = 0,
-                Progress = light.brightness,
+                Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness)),
                 IsProgressTextShow = false,
             };
             controlView.AddChidren(dimmerBar);
-            if (light.trait_on_off.curValue.ToString() == "on")
+            if (function.trait_on_off.curValue.ToString() == "on")
             {
                 dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
             }
@@ -159,17 +158,17 @@
             {
                 dimmerBar.SetProgressBarColors(CSS_Color.DividingLineColor, CSS_Color.DividingLineColor);
             }
-            dimmerBar.Progress = light.brightness;
+            dimmerBar.Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness));
             btnBrightnessText = new Button()
             {
                 Gravity = Gravity.CenterHorizontal,
-                Y = ((100 - light.brightness) * Application.GetRealHeight(222  - 16) / 100) + Application.GetRealWidth(80),
+                Y = ((100 - Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness))) * Application.GetRealHeight(222  - 16) / 100) + Application.GetRealWidth(80),
                 Width = Application.GetRealWidth(56),
                 Height = Application.GetRealWidth(46),
                 UnSelectedImagePath = "FunctionIcon/Light/BrightnessBg.png",
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextSize = CSS_FontSize.PromptFontSize_SecondaryLevel,
-                Text = light.brightness + "%",
+                Text = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness)) + "%",
             };
             controlView.AddChidren(btnBrightnessText);
 
@@ -219,7 +218,7 @@
             //鏄剧ず涓婃柟鐨凾xt
             barColorTemplatrue.ShowCustomTextView(Application.GetRealWidth(50), CSS_FontSize.PromptFontSize_FirstLevel, CSS_Color.FirstLevelTitleColor);
             var cct = 27;
-            int.TryParse(light.Attr_CCT.curValue.ToString(), out cct);
+            int.TryParse(function.GetAttrState(FunctionAttributeKey.CCT), out cct);
             barColorTemplatrue.Progress = cct;
             //璁剧疆鍒濆鍊�
             barColorTemplatrue.SetCustomText(barColorTemplatrue.Progress * 100 + "K");
@@ -282,7 +281,7 @@
             //    ProgressTextSize = CSS_FontSize.PromptFontSize_FirstLevel,
             //    ProgressBarUnitSring = "s",
             //    MaxValue = 10,
-            //    Progress = light.fadeTime,
+            //    Progress = function.fadeTime,
             //    SeekBarPadding = Application.GetRealWidth(20),
             //};
             //controlView.AddChidren(barFadeTime);
@@ -309,7 +308,7 @@
                 Height = Application.GetRealWidth(32),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = light.trait_on_off.curValue.ToString() == "on",
+                IsSelected = function.trait_on_off.curValue.ToString() == "on",
             };
             controlView.AddChidren(btnSwitch);
 
@@ -329,10 +328,10 @@
 
             LoadEventList();
 
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(light, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(light);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
@@ -347,7 +346,8 @@
 
             var dialogBody = new FrameLayout();
             frameBack.AddChidren(dialogBody);
-            dialogBody.MouseUpEventHandler = (sender, e) => {
+            dialogBody.MouseUpEventHandler = (sender, e) =>
+            {
                 frameBack.Close();
             };
 
@@ -393,12 +393,12 @@
             btnCozyIcon.MouseUpEventHandler += (sender, e) =>
             {
                 barColorTemplatrue.Progress = 27;
-                light.Attr_CCT.curValue = barColorTemplatrue.Progress * 100;
-                barColorTemplatrue.SetCustomText(light.Attr_CCT.curValue + "K");
+                function.SetAttrState(FunctionAttributeKey.CCT, barColorTemplatrue.Progress * 100);
+                barColorTemplatrue.SetCustomText((barColorTemplatrue.Progress * 100) + "K");
                 frameBack.Close();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(light, d);
+                d.Add(FunctionAttributeKey.CCT, (barColorTemplatrue.Progress * 100).ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 btnShortcut.UnSelectedImagePath = "FunctionIcon/Light/CozyIconOn.png";
             };
             //娓╅Θ 2700k
@@ -416,12 +416,12 @@
             btnCozy.MouseUpEventHandler += (sender, e) =>
             {
                 barColorTemplatrue.Progress = 27;
-                light.Attr_CCT.curValue = barColorTemplatrue.Progress * 100;
-                barColorTemplatrue.SetCustomText(light.Attr_CCT.curValue + "K");
+                function.SetAttrState(FunctionAttributeKey.CCT, barColorTemplatrue.Progress * 100);
+                barColorTemplatrue.SetCustomText((barColorTemplatrue.Progress * 100) + "K");
                 frameBack.Close();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(light, d); barColorTemplatrue.Progress = 27;
+                d.Add(FunctionAttributeKey.CCT, (barColorTemplatrue.Progress * 100).ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d); barColorTemplatrue.Progress = 27;
                 barColorTemplatrue.SetCustomText(barColorTemplatrue.Progress * 100 + "K");
                 frameBack.Close();
                 btnShortcut.UnSelectedImagePath = "FunctionIcon/Light/CozyIconOn.png";
@@ -439,12 +439,12 @@
             btnMeetIcon.MouseUpEventHandler += (sender, e) =>
             {
                 barColorTemplatrue.Progress = 30;
-                light.Attr_CCT.curValue = barColorTemplatrue.Progress * 100;
-                barColorTemplatrue.SetCustomText(light.Attr_CCT.curValue + "K");
+                function.SetAttrState(FunctionAttributeKey.CCT, barColorTemplatrue.Progress * 100);
+                barColorTemplatrue.SetCustomText((barColorTemplatrue.Progress * 100) + "K");
                 frameBack.Close();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(light, d);
+                d.Add(FunctionAttributeKey.CCT, (barColorTemplatrue.Progress * 100).ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 btnShortcut.UnSelectedImagePath = "FunctionIcon/Light/MeetingGuestsIconOn.png";
             };
 
@@ -463,12 +463,12 @@
             btnMeet.MouseUpEventHandler += (sender, e) =>
             {
                 barColorTemplatrue.Progress = 30;
-                light.Attr_CCT.curValue = barColorTemplatrue.Progress * 100;
-                barColorTemplatrue.SetCustomText(light.Attr_CCT.curValue + "K");
+                function.SetAttrState(FunctionAttributeKey.CCT, barColorTemplatrue.Progress * 100);
+                barColorTemplatrue.SetCustomText((barColorTemplatrue.Progress * 100) + "K");
                 frameBack.Close();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(light, d);
+                d.Add(FunctionAttributeKey.CCT, (barColorTemplatrue.Progress * 100).ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 btnShortcut.UnSelectedImagePath = "FunctionIcon/Light/MeetingGuestsIconOn.png";
             };
 
@@ -484,12 +484,12 @@
             btnReadIcon.MouseUpEventHandler += (sender, e) =>
             {
                 barColorTemplatrue.Progress = 65;
-                light.Attr_CCT.curValue = barColorTemplatrue.Progress * 100;
-                barColorTemplatrue.SetCustomText(light.Attr_CCT.curValue + "K");
+                function.SetAttrState(FunctionAttributeKey.CCT, barColorTemplatrue.Progress * 100);
+                barColorTemplatrue.SetCustomText((barColorTemplatrue.Progress * 100) + "K");
                 frameBack.Close();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(light, d);
+                d.Add(FunctionAttributeKey.CCT, (barColorTemplatrue.Progress * 100).ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 btnShortcut.UnSelectedImagePath = "FunctionIcon/Light/ReadIconOn.png";
             };
             //闃呰 6500k
@@ -507,12 +507,12 @@
             btnRead.MouseUpEventHandler += (sender, e) =>
             {
                 barColorTemplatrue.Progress = 65;
-                light.Attr_CCT.curValue = barColorTemplatrue.Progress * 100;
-                barColorTemplatrue.SetCustomText(light.Attr_CCT.curValue + "K");
+                function.SetAttrState(FunctionAttributeKey.CCT, barColorTemplatrue.Progress * 100);
+                barColorTemplatrue.SetCustomText((barColorTemplatrue.Progress * 100) + "K");
                 frameBack.Close();
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                DriverLayer.Control.Ins.SendWriteCommand(light, d);
+                d.Add(FunctionAttributeKey.CCT, (barColorTemplatrue.Progress * 100).ToString());
+                DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 btnShortcut.UnSelectedImagePath = "FunctionIcon/Light/ReadIconOn.png";
             };
             btnCozy.IsSelected = false;
@@ -521,17 +521,17 @@
             btnMeetIcon.IsSelected = false;
             btnRead.IsSelected = false;
             btnReadIcon.IsSelected = false;
-            if (light.Attr_CCT.curValue.ToString() == "2700")
+            if (function.GetAttrState(FunctionAttributeKey.CCT) == "2700")
             {
                 btnCozy.IsSelected = true;
                 btnCozyIcon.IsSelected = true;
             }
-            if (light.Attr_CCT.curValue.ToString() == "3000")
+            if (function.GetAttrState(FunctionAttributeKey.CCT) == "3000")
             {
                 btnMeet.IsSelected = true;
                 btnMeetIcon.IsSelected = true;
             }
-            if (light.Attr_CCT.curValue.ToString() == "6500")
+            if (function.GetAttrState(FunctionAttributeKey.CCT) == "6500")
             {
                 btnRead.IsSelected = true;
                 btnReadIcon.IsSelected = true;
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPageBLL.cs
index 03b6752..2bb7c7b 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/ColorTureLampPageBLL.cs
@@ -10,34 +10,34 @@
         /// <summary>
         /// 鏇存柊鍔熻兘鐘舵��
         /// </summary>
-        public static void UpdataStates(Light uFunction)
+        public static void UpdataStatus(Function updataTemp)
         {
-            Application.RunOnMainThread((Action)(() =>
+            Application.RunOnMainThread(() =>
             {
                 try
                 {
                     if (bodyView == null)
                         return;
-                    if (uFunction.spk == bodyView.light.spk && uFunction.sid == bodyView.light.sid)
+                    if (updataTemp.spk == bodyView.function.spk && updataTemp.sid == bodyView.function.sid)
                     {
-                        if (uFunction.trait_on_off.curValue.ToString() == "on")
+                        if (updataTemp.trait_on_off.curValue.ToString() == "on")
                         {
                             bodyView.dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
                             if (!bodyView.onDimmerBar)
                             {
-                                bodyView.dimmerBar.Progress = uFunction.brightness;
+                                bodyView.dimmerBar.Progress = Convert.ToInt32( updataTemp.GetAttrState(FunctionAttributeKey.Brightness));
                             }
-                            bodyView.btnBrightnessText.Text = uFunction.brightness + "%";
-                            bodyView.btnBrightnessText.Y = ((100 - uFunction.brightness) * Application.GetRealHeight(222 - 16) / 100) + Application.GetRealWidth(80);
+                            bodyView.btnBrightnessText.Text = updataTemp.GetAttrState(FunctionAttributeKey.Brightness) + "%";
+                            bodyView.btnBrightnessText.Y = ((100 - Convert.ToInt32(updataTemp.GetAttrState(FunctionAttributeKey.Brightness))) * Application.GetRealHeight(222 - 16) / 100) + Application.GetRealWidth(80);
                         }
                         else
                         {
                             bodyView.dimmerBar.SetProgressBarColors(CSS_Color.DividingLineColor, CSS_Color.DividingLineColor);
                         }
-                        bodyView.btnSwitch.IsSelected = uFunction.trait_on_off.curValue.ToString() == "on";
-                        bodyView.barColorTemplatrue.Enable = uFunction.trait_on_off.curValue.ToString() == "on";
+                        bodyView.btnSwitch.IsSelected = updataTemp.trait_on_off.curValue.ToString() == "on";
+                        bodyView.barColorTemplatrue.Enable = updataTemp.trait_on_off.curValue.ToString() == "on";
                         var cct = 27;
-                        int.TryParse(uFunction.Attr_CCT.curValue.ToString(), out cct);
+                        int.TryParse(updataTemp.GetAttrState(FunctionAttributeKey.CCT), out cct);
                         bodyView.barColorTemplatrue.Progress = cct / 100;
                         //璁剧疆鍒濆鍊�
                         bodyView.barColorTemplatrue.SetCustomText(bodyView.barColorTemplatrue.Progress * 100 + "K");
@@ -48,7 +48,7 @@
                 {
                     MainPage.Log($"{bodyView.GetType().Name } UpdataStates error : {ex.Message}");
                 }
-            }));
+            });
         }
 
         void LoadEventList()
@@ -60,9 +60,9 @@
             LoadEvet_ChangeColorTemplatrue();
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = light.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = light.GetRoomListName();
-                //light.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
         }
         /// <summary>
@@ -72,8 +72,8 @@
         {
             //barFadeTime.OnStopTrackingTouchEvent = (sender, e) =>
             //{
-            //    light.fadeTime = e;
-            //    light.SaveFunctionData(true);
+            //    function.fadeTime = e;
+            //    function.SaveFunctionData(true);
             //};
         }
 
@@ -90,10 +90,10 @@
                     {
                         //璁剧疆鑷畾涔夌殑鏂囨湰
                         barColorTemplatrue.SetCustomText(value * 100 + "K");
-                        light.Attr_CCT.curValue = value * 100;
+                        function.SetAttrState(FunctionAttributeKey.CCT, value * 100);
                         //System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                        //d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                        //Control.Ins.SendWriteCommand(light, d);
+                        //d.Add(FunctionAttributeKey.CCT, function.Attr_CCT.curValue.ToString());
+                        //Control.Ins.SendWriteCommand(function, d);
                     });
                     //System.Threading.Thread.Sleep(200);
                 }).Start();
@@ -101,10 +101,10 @@
 
             barColorTemplatrue.OnStopTrackingTouchEvent = (sender, value) =>
             {
-                light.Attr_CCT.curValue = value * 100;
+                function.SetAttrState(FunctionAttributeKey.CCT, value * 100);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.CCT, light.Attr_CCT.curValue.ToString());
-                Control.Ins.SendWriteCommand(light, d);
+                d.Add(FunctionAttributeKey.CCT, (value * 100 ).ToString());
+                Control.Ins.SendWriteCommand(function, d);
             };
 
         }
@@ -115,8 +115,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = light.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                light.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -131,11 +131,11 @@
             dimmerBar.OnStopTrackingTouchEvent = (sender, e) =>
             {
                 onDimmerBar = false;
-                light.brightness = dimmerBar.Progress;
+                function.SetAttrState(FunctionAttributeKey.Brightness, dimmerBar.Progress);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                Control.Ins.SendWriteCommand(light, d);
-                //light.fadeTime = barFadeTime.Progress;
+                d.Add(FunctionAttributeKey.Brightness, dimmerBar.Progress.ToString());
+                Control.Ins.SendWriteCommand(function, d);
+                //function.fadeTime = barFadeTime.Progress;
                 btnBrightnessText.Text = dimmerBar.Progress + "%";
 
                 dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
@@ -143,38 +143,38 @@
             dimmerBar.OnProgressChangedEvent = (sender, e) =>
             {
                 dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
-                //light.fadeTime = 0;
+                //function.fadeTime = 0;
                 //if (!btnSwitch.IsSelected)
                 //{
                 //    dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
                 //}
                 //btnSwitch.IsSelected = e > 0 ? true : false;
-                //light.brightness = e;
-                //light.trait_on_off.curValue = e > 0 ? "on" : "off";
+                //function.brightness = e;
+                //function.trait_on_off.curValue = e > 0 ? "on" : "off";
 
                 //if (e == 0 || e == 100)
                 //{
                 //    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                //    d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                //    Control.Ins.SendWriteCommand(light, d);
+                //    d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
+                //    Control.Ins.SendWriteCommand(function, d);
                 //}
                 //else
                 //{
-                //    if (200 < (DateTime.Now - light.refreshTime).TotalMilliseconds)
+                //    if (200 < (DateTime.Now - function.refreshTime).TotalMilliseconds)
                 //    {
-                //        light.refreshTime = DateTime.Now;
+                //        function.refreshTime = DateTime.Now;
                 //        new System.Threading.Thread(() =>
                 //        {
                 //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                //            d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                //            Control.Ins.SendWriteCommand(light, d);
+                //            d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
+                //            Control.Ins.SendWriteCommand(function, d);
                 //        })
                 //        { IsBackground = true }.Start();
                 //    }
                 //}
 
                 //btnBrightnessText.Y = ((100 - dimmerBar.Progress) * Application.GetRealHeight(222 - 16 - 16) / 100) + Application.GetRealWidth(40);
-                //btnBrightnessText.Text = light.brightness + "%";
+                //btnBrightnessText.Text = function.brightness + "%";
 
                 btnBrightnessText.Y = ((100 - dimmerBar.Progress) * Application.GetRealHeight(222 - 16) / 100) + Application.GetRealWidth(80);
                 btnBrightnessText.Text = dimmerBar.Progress + "%";
@@ -190,7 +190,7 @@
         {
             btnSwitch.MouseUpEventHandler += (sender, e) =>
             {
-                //light.fadeTime = barFadeTime.Progress;
+                //function.fadeTime = barFadeTime.Progress;
                 btnSwitch.IsSelected = !btnSwitch.IsSelected;
                 if (btnSwitch.IsSelected)
                 {
@@ -202,19 +202,19 @@
                 }
                 new System.Threading.Thread(() =>
                 {
-                    light.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add(FunctionAttributeKey.OnOff, light.trait_on_off.curValue.ToString());
-                    d.Add(FunctionAttributeKey.FadeTime, light.fadeTime.ToString());
+                    d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                    d.Add(FunctionAttributeKey.FadeTime, function.GetAttrState(FunctionAttributeKey.FadeTime));
                     if (btnSwitch.IsSelected)
                     {
-                        d.Add(FunctionAttributeKey.Brightness, light.lastBrightness.ToString());
+                        d.Add(FunctionAttributeKey.Brightness, function.lastBrightness.ToString());
                     }
                     else
                     {
-                        light.lastBrightness = light.brightness;
+                        function.lastBrightness = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness));
                     }
-                    Control.Ins.SendWriteCommand(light, d);
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPage.cs
index 1a9040b..3bbb89d 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPage.cs
@@ -45,7 +45,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Light light;
+        Light lightTemp = new Light();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -62,10 +63,10 @@
             bodyView = null;
         }
 
-        public DimmerPage(Light func)
+        public DimmerPage(Function func)
         {
             bodyView = this;
-            light = func;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -74,8 +75,8 @@
             btnFunctionName_Out = btnFunctionNameOut;
             btnFromFloor_Out = btnFromFloorOut;
             bodyView.BackgroundColor = CSS_Color.BackgroundColor;
-            //new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView(light,null);
-            //new PublicAssmebly().LoadTopView(bodyView, Language.StringByID(StringId.Lights), light);
+            //new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView(function,null);
+            //new PublicAssmebly().LoadTopView(bodyView, Language.StringByID(StringId.Lights), function);
 
             controlView = new FrameLayout()
             {
@@ -96,7 +97,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = light.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -109,7 +110,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = light.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -121,7 +122,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = light.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -139,11 +140,11 @@
                 BorderColor = 0x00000000,
                 CornerRadius = Application.GetRealWidth(30),
                 BorderWidth = 0,
-                Progress = light.brightness,
+                Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness)),
                 IsProgressTextShow = false,
             };
             controlView.AddChidren(dimmerBar);
-            if(light.trait_on_off.curValue.ToString() == "on")
+            if(function.trait_on_off.curValue.ToString() == "on")
             {
                 dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
             }
@@ -151,7 +152,7 @@
             {
                 dimmerBar.SetProgressBarColors(CSS_Color.DividingLineColor, CSS_Color.DividingLineColor);
             }
-            dimmerBar.Progress = light.brightness;
+            dimmerBar.Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness));
             btnBrightnessText = new Button()
             {
                 Gravity = Gravity.CenterHorizontal,
@@ -161,7 +162,7 @@
                 UnSelectedImagePath = "FunctionIcon/Light/BrightnessBg.png",
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextSize = CSS_FontSize.PromptFontSize_SecondaryLevel,
-                Text = light.brightness + "%",
+                Text = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness)) + "%",
             };
             controlView.AddChidren(btnBrightnessText);
 
@@ -176,8 +177,8 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                 TextID = StringId.SpeedOfChange,
-                Visible = light.HadFadeTime,
-                Enable = light.HadFadeTime,
+                Visible = function.GetAttribute(FunctionAttributeKey.FadeTime)!= null,
+                Enable = function.GetAttribute(FunctionAttributeKey.FadeTime)!= null,
             };
             controlView.AddChidren(btnGradualChangeText);
 
@@ -191,8 +192,8 @@
                 TextAlignment = TextAlignment.CenterLeft,
                 TextColor = CSS_Color.PromptingColor1,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Visible = light.HadFadeTime,
-                Enable = light.HadFadeTime,
+                Visible = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
+                Enable = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
             };
             controlView.AddChidren(btnGradualChangeMinValuesText);
 
@@ -210,10 +211,10 @@
                 ProgressTextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                 ProgressBarUnitSring = "s",
                 MaxValue = 10,
-                Progress = light.fadeTime,
+                Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.FadeTime)),
                 SeekBarPadding = Application.GetRealWidth(20),
-                Visible = light.HadFadeTime,
-                Enable = light.HadFadeTime,
+                Visible = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
+                Enable = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
             };
             controlView.AddChidren(barFadeTime);
 
@@ -227,8 +228,8 @@
                 TextAlignment = TextAlignment.CenterLeft,
                 TextColor = CSS_Color.PromptingColor1,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Visible = light.HadFadeTime,
-                Enable = light.HadFadeTime,
+                Visible = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
+                Enable = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
             };
             controlView.AddChidren(btnGradualChangeMaxValuesText);
             #endregion
@@ -241,16 +242,16 @@
                 Height = Application.GetMinRealAverage(40),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = light.trait_on_off.curValue.ToString() == "on",
+                IsSelected = function.trait_on_off.curValue.ToString() == "on",
             };
             controlView.AddChidren(btnSwitch);
 
             LoadEventList();
 
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(light, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(light);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPageBLL.cs
index 709243b..8b08cbb 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/DimmerPageBLL.cs
@@ -10,31 +10,31 @@
         /// <summary>
         /// 鏇存柊鍔熻兘鐘舵��
         /// </summary>
-        public static void UpdataStates(Light uFunction)
+        public static void UpdataStates(Function updataTemp)
         {
-            Application.RunOnMainThread((Action)(() =>
+            Application.RunOnMainThread((() =>
             {
                 try
                 {
                     if (bodyView == null)
                         return;
-                    if (uFunction.spk == bodyView.light.spk && uFunction.sid == bodyView.light.sid)
+                    if (updataTemp.spk == bodyView.function.spk && updataTemp.sid == bodyView.function.sid)
                     {
-                        bodyView.btnBrightnessText.Text = uFunction.brightness + "%";
-                        bodyView.btnBrightnessText.Y = ((100 - uFunction.brightness) * Application.GetRealHeight(288 - 16 - 16) / 100) + Application.GetRealWidth(40);
-                        if (uFunction.trait_on_off.curValue.ToString() == "on")
+                        bodyView.btnBrightnessText.Text = updataTemp.GetAttrState(FunctionAttributeKey.Brightness) + "%";
+                        bodyView.btnBrightnessText.Y = ((100 - Convert.ToInt32( updataTemp.GetAttrState(FunctionAttributeKey.Brightness))) * Application.GetRealHeight(288 - 16 - 16) / 100) + Application.GetRealWidth(40);
+                        if (updataTemp.trait_on_off.curValue.ToString() == "on")
                         {
                             bodyView.dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
                             if (!bodyView.onDimmerBar)
                             {
-                                bodyView.dimmerBar.Progress = uFunction.brightness;
+                                bodyView.dimmerBar.Progress = Convert.ToInt32(updataTemp.GetAttrState(FunctionAttributeKey.Brightness));
                             }
                         }
                         else
                         {
                             bodyView.dimmerBar.SetProgressBarColors(CSS_Color.DividingLineColor, CSS_Color.DividingLineColor);
                         }
-                        bodyView.btnSwitch.IsSelected = uFunction.trait_on_off.curValue.ToString() == "on";
+                        bodyView.btnSwitch.IsSelected = updataTemp.trait_on_off.curValue.ToString() == "on";
                     }
                 }
                 catch (Exception ex)
@@ -52,9 +52,9 @@
             LoadEvet_ChangeFadeTime();
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = light.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = light.GetRoomListName();
-                //light.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
         }
         /// <summary>
@@ -64,8 +64,8 @@
         {
             barFadeTime.OnStopTrackingTouchEvent = (sender, e) =>
             {
-                light.fadeTime = e;
-                light.UpdataFuncitonInfo();
+                function.SetAttrState(FunctionAttributeKey.FadeTime, e.ToString());
+                function.UpdataFuncitonInfo();
             };
         }
 
@@ -75,8 +75,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = light.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                light.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -90,43 +90,42 @@
             };
             dimmerBar.OnStopTrackingTouchEvent = (sender, e) => {
                 onDimmerBar = false;
-                light.brightness = dimmerBar.Progress;
-                //Control.Send(CommandType_A.write, light);
+                function.SetAttrState(FunctionAttributeKey.Brightness, dimmerBar.Progress);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                Control.Ins.SendWriteCommand(light, d);
-                light.fadeTime = barFadeTime.Progress;
+                d.Add(FunctionAttributeKey.Brightness, dimmerBar.Progress.ToString());
+                Control.Ins.SendWriteCommand(function, d);
+                function.SetAttrState(FunctionAttributeKey.FadeTime, barFadeTime.Progress);
                 btnBrightnessText.Text = dimmerBar.Progress + "%";
             };
             //20201223 鍒犻櫎婊戝姩鍙戦�佸懡浠わ紝闃叉鎺т欢璺冲姩
             dimmerBar.OnProgressChangedEvent = (sender, e) =>
             {
                 dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
-                //light.fadeTime = 0;
+                //function.fadeTime = 0;
                 //if (!btnSwitch.IsSelected)
                 //{
                 //    dimmerBar.SetProgressBarColors(CSS_Color.AuxiliaryColor1, CSS_Color.AuxiliaryColor1);
                 //}
                 //btnSwitch.IsSelected = e > 0 ? true : false;
-                //light.brightness = e;
-                //light.trait_on_off.curValue = e > 0 ? "on" : "off";
+                //function.brightness = e;
+                //function.trait_on_off.curValue = e > 0 ? "on" : "off";
                 //if (e == 0 || e == 100)
                 //{
-                //    //Control.Send(CommandType_A.write, this.light);
+                //    //Control.Send(CommandType_A.write, this.function);
                 //    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                //    d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                //    Control.Ins.SendWriteCommand(light, d);
+                //    d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
+                //    Control.Ins.SendWriteCommand(function, d);
                 //}
                 //else
                 //{
-                //    if (200 < (DateTime.Now - light.refreshTime).TotalMilliseconds)
+                //    if (200 < (DateTime.Now - function.refreshTime).TotalMilliseconds)
                 //    {
-                //        light.refreshTime = DateTime.Now;
+                //        function.refreshTime = DateTime.Now;
                 //        new System.Threading.Thread(() =>
                 //        {
                 //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                //            d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                //            Control.Ins.SendWriteCommand(light, d);
+                //            d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
+                //            Control.Ins.SendWriteCommand(function, d);
                 //        })
                 //        { IsBackground = true }.Start();
                 //    }
@@ -143,7 +142,7 @@
         {
             btnSwitch.MouseUpEventHandler += (sender, e) =>
             {
-                light.fadeTime = barFadeTime.Progress;
+                function.SetAttrState(FunctionAttributeKey.FadeTime, barFadeTime.Progress);
                 btnSwitch.IsSelected = !btnSwitch.IsSelected;
                 if (btnSwitch.IsSelected)
                 {
@@ -155,23 +154,23 @@
                 }
                 new System.Threading.Thread(() =>
                 {
-                    light.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add(FunctionAttributeKey.OnOff, light.trait_on_off.curValue.ToString());
-                    d.Add(FunctionAttributeKey.FadeTime, light.fadeTime.ToString());
+                    d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                    d.Add(FunctionAttributeKey.FadeTime, function.GetAttrState(FunctionAttributeKey.FadeTime));
                     if (btnSwitch.IsSelected)
                     {
-                        if(light.lastBrightness == 0)
+                        if(function.lastBrightness == 0)
                         {
-                            light.lastBrightness = 100;
+                            function.lastBrightness = 100;
                         }
-                        d.Add(FunctionAttributeKey.Brightness, light.lastBrightness.ToString());
+                        d.Add(FunctionAttributeKey.Brightness, function.lastBrightness.ToString());
                     }
                     else
                     {
-                        light.lastBrightness = light.brightness;
+                        function.lastBrightness = Convert.ToInt32( function.GetAttrState(FunctionAttributeKey.Brightness));
                     }
-                    Control.Ins.SendWriteCommand(light, d);
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPage.cs
index 6a6d92b..c9291ea 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPage.cs
@@ -52,11 +52,12 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Light light;
+        Light lightTemp;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
         bool onDimmerBar = false;
+        Function function;
         /// <summary>
         /// 鍒锋柊鏄剧ず淇℃伅
         /// </summary>
@@ -66,7 +67,7 @@
         public RGBPage(Function func)
         {
             bodyView = this;
-            light = func as Light;
+            function = func;
         }
 
         public void LoadPage(Button btnCollectionIcon, Button btnFunctionNameOut, Button btnFromFloorOut)
@@ -97,7 +98,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = light.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -110,7 +111,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = light.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -123,7 +124,7 @@
                 Radius = (uint)Application.GetMinRealAverage(8),
                 BorderColor = CSS_Color.PromptingColor2,
                 BorderWidth = 1,
-                BackgroundColor = (uint)(0xFF000000 + light.GetRGBcolor())
+                BackgroundColor = (uint)(0xFF000000 + lightTemp.GetRGBcolor(function))
             };
             controlView.AddChidren(btnCurColor);
 
@@ -135,7 +136,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = light.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -157,7 +158,7 @@
                 ColorImagePath = "FunctionIcon/Light/ColorWheel.png",
             };
             framePickerBack.AddChidren(colorPicker);
-            if(light.trait_on_off.curValue.ToString() == "off")
+            if(function.trait_on_off.curValue.ToString() == "off")
             {
                 colorPicker.ColorImagePath = "FunctionIcon/Light/ColorWheelGray.png";
             }
@@ -199,7 +200,7 @@
 
             dimmerBar = new DiyImageSeekBar()
             {
-                X = Application.GetRealWidth(35 +22),
+                X = Application.GetRealWidth(35 + 22),
                 Y = Application.GetRealHeight(312),
                 Width = Application.GetRealWidth(210),
                 Height = Application.GetRealHeight(54),
@@ -208,9 +209,9 @@
                 ThumbImageHeight = Application.GetRealHeight(54),
                 ProgressTextColor = CSS_Color.FirstLevelTitleColor,
                 ProgressTextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                ProgressBarColor = light.trait_on_off.curValue.ToString() == "on" ? CSS_Color.AuxiliaryColor1 : CSS_Color.DividingLineColor,
+                ProgressBarColor = function.trait_on_off.curValue.ToString() == "on" ? CSS_Color.AuxiliaryColor1 : CSS_Color.DividingLineColor,
                 MaxValue = 100,
-                Progress = light.brightness,
+                Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness)),
                 SeekBarPadding = Application.GetRealWidth(20),
             };
             controlView.AddChidren(dimmerBar);
@@ -253,8 +254,8 @@
                 TextAlignment = TextAlignment.CenterLeft,
                 TextColor = CSS_Color.PromptingColor1,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Visible = light.HadFadeTime,
-                Enable = light.HadFadeTime,
+                Visible = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
+                Enable = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
             };
             controlView.AddChidren(btnGradualChangeMinValuesText);
 
@@ -273,10 +274,10 @@
                 ProgressTextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                 ProgressBarUnitSring = "s",
                 MaxValue = 10,
-                Progress = light.fadeTime,
+                Progress = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.FadeTime)),
                 SeekBarPadding = Application.GetRealWidth(20),
-                Visible = light.HadFadeTime,
-                Enable = light.HadFadeTime,
+                Visible = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
+                Enable = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
             };
             controlView.AddChidren(barFadeTime);
 
@@ -290,8 +291,8 @@
                 TextAlignment = TextAlignment.CenterLeft,
                 TextColor = CSS_Color.PromptingColor1,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Visible = light.HadFadeTime,
-                Enable = light.HadFadeTime,
+                Visible = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
+                Enable = function.GetAttribute(FunctionAttributeKey.FadeTime) != null,
             };
             controlView.AddChidren(btnGradualChangeMaxValuesText);
             #endregion
@@ -315,15 +316,15 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = light.trait_on_off.curValue.ToString() == "on"
+                IsSelected = function.trait_on_off.curValue.ToString() == "on"
             };
             controlView.AddChidren(btnSwitch);
 
             LoadEventList();
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(light, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(light);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPageBLL.cs
index 89900c2..b20523e 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/RGBPageBLL.cs
@@ -9,18 +9,18 @@
         /// <summary>
         /// 鏇存柊鍔熻兘鐘舵��
         /// </summary>
-        public static void UpdataStates(Light uFunction)
+        public static void UpdataStates(Function updateTemp)
         {
-            Application.RunOnMainThread((Action)(() =>
+            Application.RunOnMainThread((() =>
             {
                 try
                 {
                     if (bodyView == null)
                         return;
-                    if (uFunction.spk == bodyView.light.spk && uFunction.sid == bodyView.light.sid)
+                    if (updateTemp.spk == bodyView.function.spk && updateTemp.sid == bodyView.function.sid)
                     {
 
-                        if (uFunction.trait_on_off.curValue.ToString() == "on")
+                        if (updateTemp.trait_on_off.curValue.ToString() == "on")
                         {
                             //瑙e喅閮ㄥ垎瀹夊崜鎵嬫満锛屽埛鏂板浘鐗囨椂浼氬彉灏忛棶棰�
                             if (bodyView.colorPicker.ColorImagePath != "FunctionIcon/Light/ColorWheel.png")
@@ -31,11 +31,11 @@
                             bodyView.btnSwitch.IsSelected = true;
                             if (!bodyView.onDimmerBar)
                             {
-                                bodyView.dimmerBar.Progress = uFunction.brightness;
+                                bodyView.dimmerBar.Progress = Convert.ToInt32(updateTemp.GetAttrState(FunctionAttributeKey.Brightness));
                             }
                         }
                         //鐘舵�佷竴鏍锋椂,涓嶅啀鍒锋柊瑙嗗浘
-                        else if (uFunction.trait_on_off.curValue.ToString() == "off" && bodyView.btnSwitch.IsSelected == true)
+                        else if (updateTemp.trait_on_off.curValue.ToString() == "off" && bodyView.btnSwitch.IsSelected == true)
                         {
                             //瑙e喅閮ㄥ垎瀹夊崜鎵嬫満锛屽埛鏂板浘鐗囨椂浼氬彉灏忛棶棰�
                             if (bodyView.colorPicker.ColorImagePath != "FunctionIcon/Light/ColorWheelGray.png")
@@ -48,8 +48,8 @@
                             //鑹茬洏鐨勫渾鐐归殣钘�
                             bodyView.btnWhiteRound.Visible = false;
                         }
-                        bodyView.btnCurColor.BackgroundColor = (uint)(0xFF000000 + bodyView.light.GetRGBcolor());
-                        if (bodyView.light.GetRGBcolor() == 16777215 && bodyView.btnCurColor.BorderColor != 0x00000000)
+                        bodyView.btnCurColor.BackgroundColor = (uint)(0xFF000000 + bodyView.lightTemp.GetRGBcolor(updateTemp));
+                        if (bodyView.lightTemp.GetRGBcolor(updateTemp) == 16777215 && bodyView.btnCurColor.BorderColor != 0x00000000)
                         {
                             bodyView.btnCurColor.BorderColor = CSS.CSS_Color.PromptingColor2;
                         }
@@ -77,8 +77,8 @@
             LoadEvet_ChangeFadeTime();
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = light.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = light.GetRoomListName();
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
             };
         }
 
@@ -95,7 +95,7 @@
             int circleR = colorPicker.Width / 2 - Application.GetRealWidth(12);
 
             colorPicker.ColorChaged += (sender2, e2) => {
-                if (light.trait_on_off.curValue.ToString() == "off"
+                if (function.trait_on_off.curValue.ToString() == "off"
                   || pointIsRight == false)
                 {
                     //pointIsRight:鐐圭殑鍖哄煙涓嶆槸鍦嗙洏鍐�
@@ -103,17 +103,17 @@
                 }
                 if ((DateTime.Now - colorChangeTime).TotalMilliseconds > 200)
                 {
-                    light.SetRGBcolor(e2);
+                    lightTemp.SetRGBcolor(e2,function);
                     colorChangeTime = DateTime.Now;
-                    btnCurColor.BackgroundColor = (uint)(0xFF000000 + light.GetRGBcolor());
+                    btnCurColor.BackgroundColor = (uint)(0xFF000000 + lightTemp.GetRGBcolor(function));
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add(FunctionAttributeKey.RGB, light.GetRGBcolorString());
-                    Control.Ins.SendWriteCommand(light, d);
+                    d.Add(FunctionAttributeKey.RGB, lightTemp.GetRGBcolorString(function));
+                    Control.Ins.SendWriteCommand(function, d);
                 }
             };
             colorPicker.MouseDownEventHandler += (sender, e) =>
             {
-                if (light.trait_on_off.curValue.ToString() == "off")
+                if (function.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
@@ -144,8 +144,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = light.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                light.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -163,39 +163,39 @@
                     onDimmerBar = false;
                 })
                 { IsBackground = true }.Start();
-                light.brightness = dimmerBar.Progress;
+                function.SetAttrState(FunctionAttributeKey.Brightness, dimmerBar.Progress);
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                Control.Ins.SendWriteCommand(light, d);
-                light.fadeTime = barFadeTime.Progress;
+                d.Add(FunctionAttributeKey.Brightness, dimmerBar.Progress.ToString());
+                Control.Ins.SendWriteCommand(function, d);
+                function.SetAttrState(FunctionAttributeKey.FadeTime, barFadeTime.Progress);
             };
             dimmerBar.OnProgressChangedEvent = (sender, e) => {
-                //light.fadeTime = 0;
+                //function.fadeTime = 0;
                 //if (!btnSwitch.IsSelected)
                 //{
                 //    dimmerBar.ProgressBarColor = CSS.CSS_Color.AuxiliaryColor1;
                 //}
                 //btnSwitch.IsSelected = e > 0 ? true : false;
-                //light.brightness = e;
-                //light.trait_on_off.curValue = e > 0 ? "on" : "off";
+                //function.brightness = e;
+                //function.trait_on_off.curValue = e > 0 ? "on" : "off";
 
                 //if (e == 0 || e == 100)
                 //{
                 //    System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                //    d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                //    Control.Ins.SendWriteCommand(light, d);
+                //    d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
+                //    Control.Ins.SendWriteCommand(function, d);
                 //}
                 //else
                 //{
-                //    if (200 < (DateTime.Now - light.refreshTime).TotalMilliseconds)
+                //    if (200 < (DateTime.Now - function.refreshTime).TotalMilliseconds)
                 //    {
-                //        light.refreshTime = DateTime.Now;
+                //        function.refreshTime = DateTime.Now;
                 //        new System.Threading.Thread(() =>
                 //        {
-                //            //Control.Send(CommandType_A.write, light);
+                //            //Control.Send(CommandType_A.write, function);
                 //            System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                //            d.Add(FunctionAttributeKey.Brightness, light.brightness.ToString());
-                //            Control.Ins.SendWriteCommand(light, d);
+                //            d.Add(FunctionAttributeKey.Brightness, function.brightness.ToString());
+                //            Control.Ins.SendWriteCommand(function, d);
                 //        })
                 //        { IsBackground = true }.Start();
                 //    }
@@ -214,8 +214,8 @@
         {
             barFadeTime.OnStopTrackingTouchEvent = (sender, e) =>
             {
-                light.fadeTime = barFadeTime.Progress;
-                light.UpdataFuncitonInfo();
+                function.SetAttrState(FunctionAttributeKey.FadeTime, barFadeTime.Progress);
+                function.UpdataFuncitonInfo();
             };
         }
         /// <summary>
@@ -230,24 +230,24 @@
                 bodyView.colorPicker.ColorImagePath = btnSwitch.IsSelected ? "FunctionIcon/Light/ColorWheel.png" : "FunctionIcon/Light/ColorWheelGray.png";
                 new System.Threading.Thread(() =>
                 {
-                    light.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add(FunctionAttributeKey.OnOff, light.trait_on_off.curValue.ToString());
-                    d.Add(FunctionAttributeKey.FadeTime, light.fadeTime.ToString());
+                    d.Add(FunctionAttributeKey.OnOff, function.trait_on_off.curValue.ToString());
+                    d.Add(FunctionAttributeKey.FadeTime, function.GetAttrState(FunctionAttributeKey.FadeTime));
                     if (btnSwitch.IsSelected)
                     {
-                        if(light.lastBrightness == 0)
+                        if(function.lastBrightness == 0)
                         {
-                            light.lastBrightness = 100;
+                            function.lastBrightness = 100;
                             dimmerBar.Progress = 100;
                         }
-                        d.Add(FunctionAttributeKey.Brightness, light.lastBrightness.ToString());
+                        d.Add(FunctionAttributeKey.Brightness, function.lastBrightness.ToString());
                     }
                     else
                     {
-                        light.lastBrightness = light.brightness;
+                        function.lastBrightness = Convert.ToInt32(function.GetAttrState(FunctionAttributeKey.Brightness));
                     }
-                    Control.Ins.SendWriteCommand(light, d);
+                    Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
@@ -259,19 +259,19 @@
         {
             btnRestoredPoint.MouseUpEventHandler = (sender, e) =>
             {
-                if(light.trait_on_off.curValue.ToString() == "off")
+                if(function.trait_on_off.curValue.ToString() == "off")
                 {
                     return;
                 }
                 btnWhiteRound.Visible = true;
                 btnWhiteRound.Gravity = Gravity.Center;
 
-                light.SetRGBcolor(new byte[] { 255, 255, 255 });
+                lightTemp.SetRGBcolor(new byte[] { 255, 255, 255 },function);
                 btnCurColor.BackgroundColor = 0xFFFFFFFF;
                 btnCurColor.BorderColor = CSS.CSS_Color.PromptingColor2;
                 System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                d.Add(FunctionAttributeKey.RGB, light.GetRGBcolorString());
-                Control.Ins.SendWriteCommand(light, d);
+                d.Add(FunctionAttributeKey.RGB, lightTemp.GetRGBcolorString(function));
+                Control.Ins.SendWriteCommand(function, d);
             };
         }
 
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPage.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPage.cs
index 78ede19..42728f6 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPage.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPage.cs
@@ -37,7 +37,8 @@
         #endregion
 
         #region 鍖哄煙鍙橀噺
-        Light light;
+        Light lightTemp = new Light();
+        Function function;
         Button btnCollection_Out;
         Button btnFunctionName_Out;
         Button btnFromFloor_Out;
@@ -47,10 +48,10 @@
         Action actionRefresh;
         #endregion
 
-        public RelayPage(Light func)
+        public RelayPage(Function func)
         {
             bodyView = this;
-            light = func;
+            function = func;
 
         }
         /// <summary>
@@ -74,7 +75,7 @@
                 btnFromFloor_Out = btnFromFloorOut;
             }
             bodyView.BackgroundColor = CSS_Color.BackgroundColor;
-            //new PublicAssmebly().LoadTopView(bodyView, Language.StringByID(StringId.Lights), light);
+            //new PublicAssmebly().LoadTopView(bodyView, Language.StringByID(StringId.Lights), function);
 
             controlView = new FrameLayout()
             {
@@ -95,7 +96,7 @@
                 TextColor = CSS_Color.FirstLevelTitleColor,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.EmphasisFontSize_FirstLevel,
-                Text = light.name,
+                Text = function.name,
             };
             controlView.AddChidren(btnFunctionName);
 
@@ -108,7 +109,7 @@
                 TextColor = CSS_Color.PromptingColor1,
                 TextAlignment = TextAlignment.CenterLeft,
                 TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
-                Text = light.GetRoomListName()
+                Text = function.GetRoomListName()
             };
             controlView.AddChidren(btnFromFoorAndRoom);
 
@@ -120,7 +121,7 @@
                 Height = Application.GetMinRealAverage(40),
                 SelectedImagePath = "Collection/CollectionIcon.png",
                 UnSelectedImagePath = "Collection/CollectionGrayIcon.png",
-                IsSelected = light.collect
+                IsSelected = function.collect
             };
             //controlView.AddChidren(btnCollection);
             //2020-12-16 濡傛灉鏄垚鍛橀殣钘忔敹钘忓姛鑳�
@@ -137,7 +138,7 @@
                 Height = Application.GetRealWidth(288),
                 UnSelectedImagePath = "FunctionIcon/Light/RelayBg.png",
                 SelectedImagePath = "FunctionIcon/Light/RelayOnBg.png",
-                IsSelected = light.trait_on_off.curValue.ToString() == "on"
+                IsSelected = function.trait_on_off.curValue.ToString() == "on"
             };
             controlView.AddChidren(btnSwitchIcon);
 
@@ -149,16 +150,16 @@
                 Height = Application.GetMinRealAverage(32),
                 UnSelectedImagePath = "Public/PowerClose.png",
                 SelectedImagePath = "Public/PowerOpen.png",
-                IsSelected = light.trait_on_off.curValue.ToString() == "on"
+                IsSelected = function.trait_on_off.curValue.ToString() == "on"
             };
             controlView.AddChidren(btnSwitch);
 
             LoadEventList();
 
-            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(light, actionRefresh);
+            new TopViewDiv(bodyView, Language.StringByID(StringId.Lights)).LoadTopView_FunctionTop(function, actionRefresh);
             new System.Threading.Thread(() =>
             {
-                DriverLayer.Control.Ins.SendReadCommand(light);
+                DriverLayer.Control.Ins.SendReadCommand(function);
             })
             { IsBackground = true }.Start();
         }
diff --git a/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPageBLL.cs b/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPageBLL.cs
index 82b44f0..089c4e8 100644
--- a/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPageBLL.cs
+++ b/HDL_ON/UI/UI2/FuntionControlView/Light/RelayPageBLL.cs
@@ -9,7 +9,7 @@
         /// <summary>
         /// 鏇存柊鐏厜鐘舵��
         /// </summary>
-        public static void UpdataState(Light uLight)
+        public static void UpdataState(Function updataTemp)
         {
             Application.RunOnMainThread(() =>
             {
@@ -17,7 +17,7 @@
                 {
                     if (bodyView == null)
                         return;
-                    bodyView.btnSwitch.IsSelected = bodyView.btnSwitchIcon.IsSelected = uLight.trait_on_off.curValue.ToString() == "on";
+                    bodyView.btnSwitch.IsSelected = bodyView.btnSwitchIcon.IsSelected = updataTemp.trait_on_off.curValue.ToString() == "on";
                 }
                 catch (Exception ex)
                 {
@@ -35,9 +35,9 @@
 
             //鍥為��鍒锋柊淇℃伅浜嬩欢
             actionRefresh = () => {
-                btnFunctionName.Text = btnFunctionName_Out.Text = light.name;
-                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = light.GetRoomListName();
-                //light.SaveFunctionData(true);
+                btnFunctionName.Text = btnFunctionName_Out.Text = function.name;
+                btnFromFloor_Out.Text = btnFromFoorAndRoom.Text = function.GetRoomListName();
+                //function.SaveFunctionData(true);
             };
         }
 
@@ -47,8 +47,8 @@
         void LoadCollectionEvent()
         {
             btnCollection.MouseUpEventHandler += (sender, e) => {
-                btnCollection.IsSelected = light.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
-                light.CollectFunction();
+                btnCollection.IsSelected = function.collect = btnCollection_Out.IsSelected = !btnCollection.IsSelected;
+                function.CollectFunction();
             };
         }
 
@@ -62,10 +62,10 @@
                 btnSwitch.IsSelected = btnSwitchIcon.IsSelected = !btnSwitchIcon.IsSelected;
                 new System.Threading.Thread(() =>
                 {
-                    light.trait_on_off.curValue = btnSwitchIcon.IsSelected ? "on" : "off";
+                    function.trait_on_off.curValue = btnSwitchIcon.IsSelected ? "on" : "off";
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("on_off", light.trait_on_off.curValue.ToString());
-                    DriverLayer.Control.Ins.SendWriteCommand(light, d);
+                    d.Add("on_off", function.trait_on_off.curValue.ToString());
+                    DriverLayer.Control.Ins.SendWriteCommand(function, d);
                 })
                 { IsBackground = true }.Start();
             };
@@ -74,11 +74,11 @@
                 btnSwitchIcon.IsSelected = btnSwitch.IsSelected = !btnSwitch.IsSelected;
                 new System.Threading.Thread(() =>
                 {
-                    light.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
+                    function.trait_on_off.curValue = btnSwitch.IsSelected ? "on" : "off";
                     System.Collections.Generic.Dictionary<string, string> d = new System.Collections.Generic.Dictionary<string, string>();
-                    d.Add("on_off", light.trait_on_off.curValue.ToString());
-                    DriverLayer.Control.Ins.SendWriteCommand(light, d);
-                    //Control.Send(CommandType_A.write, light);
+                    d.Add("on_off", function.trait_on_off.curValue.ToString());
+                    DriverLayer.Control.Ins.SendWriteCommand(function, d);
+                    //Control.Send(CommandType_A.write, function);
                 })
                 { IsBackground = true }.Start();
             };

--
Gitblit v1.8.0