wei
2020-12-15 7467a843644aee00e5a4d91dd967cdb9e30f1985
20201215-3
15个文件已修改
1223 ■■■■ 已修改文件
.vs/HDL_APP_Project/xs/UserPrefs.xml 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL-ON_Android/Properties/AndroidManifest.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/DriverLayer/Control_Udp.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/DAL/Server/HttpServerRequest.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/DB_ResidenceData.cs 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Function/Function.cs 268 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/Function/Scene.cs 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/Entity/FunctionList.cs 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/2-Classification/ClassificationPageBLL.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/IntelligencePage.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Scene/NewSceneMenuListPage.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Scene/SceneAddPage.cs 229 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs 171 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HDL_ON/UI/UI2/3-Intelligence/Scene/SetSceneFunctionInfoPage.cs 264 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.vs/HDL_APP_Project/xs/UserPrefs.xml
@@ -1,21 +1,16 @@
<Properties StartupConfiguration="{D998E133-F0DD-4760-BE3C-461632F54DA4}|Default">
  <MonoDevelop.Ide.ItemProperties.HDL-ON__iOS PreferredExecutionTarget="MonoDevelop.IPhone.IPhoneDeviceTarget.6242be7109c740c6cb8999a8904b6e0ea8d45192" />
  <MonoDevelop.Ide.Workbench ActiveDocument="HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs">
  <MonoDevelop.Ide.Workbench ActiveDocument="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs">
    <Files>
      <File FileName="HDL_ON/Entity/Function/Scene.cs" Line="262" Column="29" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/IntelligencePage.cs" Line="383" Column="25" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs" Line="107" Column="29" />
      <File FileName="HDL_ON/Entity/FunctionList.cs" Line="504" Column="47" />
      <File FileName="HDL_ON/DAL/Server/HttpServerRequest.cs" Line="1957" Column="10" />
      <File FileName="HDL_ON/DAL/Server/HttpUtil.cs" Line="172" Column="1" />
      <File FileName="HDL_ON/DAL/Server/NewAPI.cs" Line="372" Column="84" />
      <File FileName="HDL_ON/DAL/DriverLayer/Control_Udp.cs" Line="829" Column="45" />
      <File FileName="HDL_ON/DAL/DriverLayer/Control.cs" Line="376" Column="1" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/SetSceneFunctionInfoPage.cs" Line="100" Column="1" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneAddPage.cs" Line="528" Column="27" />
      <File FileName="HDL_ON/UI/UI2/1-HomePage/HomePage.cs" Line="909" Column="66" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/NewSceneMenuListPage.cs" Line="170" Column="43" />
      <File FileName="HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs" Line="34" Column="30" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs" Line="385" Column="43" />
      <File FileName="HDL_ON/DAL/Server/HttpUtil.cs" />
      <File FileName="HDL_ON/DAL/DriverLayer/Control.cs" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/SetSceneFunctionInfoPage.cs" Line="133" Column="1" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneAddPage.cs" Line="888" Column="16" />
      <File FileName="HDL_ON/UI/UI2/1-HomePage/HomePage.cs" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/NewSceneMenuListPage.cs" />
      <File FileName="HDL_ON/Entity/Function/Function.cs" />
      <File FileName="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneFunctionListEditPage.cs" Line="475" Column="32" />
    </Files>
    <Pads>
      <Pad Id="ProjectPad">
@@ -23,31 +18,22 @@
          <Node name="HDL_APP_Project" expanded="True">
            <Node name="HDL_ON" expanded="True">
              <Node name="DAL" expanded="True">
                <Node name="DriverLayer" expanded="True" />
                <Node name="Server" 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="UI2" expanded="True">
                  <Node name="1-HomePage" expanded="True" />
                  <Node name="2-Classification" expanded="True">
                    <Node name="ClassificationPage.cs" selected="True" />
                  </Node>
                  <Node name="3-Intelligence" expanded="True">
                    <Node name="Scene" expanded="True" />
                    <Node name="Scene" expanded="True">
                      <Node name="SceneEditPage.cs" selected="True" />
                    </Node>
                  </Node>
                  <Node name="4-PersonalCenter" expanded="True">
                    <Node name="RoomListManage" expanded="True">
                      <Node name="AddRoom" expanded="True" />
                    </Node>
                  </Node>
                  <Node name="FuntionControlView" expanded="True">
                    <Node name="AC" expanded="True" />
                    <Node name="Electrical" expanded="True" />
                    <Node name="FoolHeating" expanded="True" />
                  </Node>
                </Node>
              </Node>
@@ -58,6 +44,11 @@
              </Node>
            </Node>
          </Node>
        </State>
      </Pad>
      <Pad Id="MonoDevelop.Debugger.WatchPad">
        <State>
          <Value>sceneFunctionInfo</Value>
        </State>
      </Pad>
    </Pads>
@@ -71,8 +62,10 @@
  <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|iPhone" />
  <MonoDevelop.Ide.DebuggingService.Breakpoints>
    <BreakpointStore>
      <Breakpoint file="/Users/kaede/Desktop/HDL_APP_Project/HDL_ON/Entity/Function/Scene.cs" relfile="HDL_ON/Entity/Function/Scene.cs" line="292" column="1" />
      <Breakpoint file="/Users/kaede/Desktop/HDL_APP_Project/HDL_ON/Entity/Function/Scene.cs" relfile="HDL_ON/Entity/Function/Scene.cs" line="266" column="1" />
      <Breakpoint file="/Users/kaede/Desktop/HDL_APP_Project/HDL_ON/Entity/Function/Scene.cs" relfile="HDL_ON/Entity/Function/Scene.cs" line="285" column="1" />
      <Breakpoint file="/Users/kaede/Desktop/HDL_APP_Project/HDL_ON/UI/UI2/3-Intelligence/Scene/SetSceneFunctionInfoPage.cs" relfile="HDL_ON/UI/UI2/3-Intelligence/Scene/SetSceneFunctionInfoPage.cs" line="133" column="1" />
      <Breakpoint file="/Users/kaede/Desktop/HDL_APP_Project/HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs" relfile="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs" line="540" column="1" />
      <Breakpoint file="/Users/kaede/Desktop/HDL_APP_Project/HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs" relfile="HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs" line="386" column="1" />
    </BreakpointStore>
  </MonoDevelop.Ide.DebuggingService.Breakpoints>
  <MultiItemStartupConfigurations />
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="202012141" android:versionName="1.0.202012141" package="com.hdl.onplus">
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:versionCode="202012141" android:versionName="1.0.202012141" package="com.hdl.onpro">
    <uses-sdk android:minSdkVersion="23" android:targetSdkVersion="26" />
    <!--  定位权限-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
HDL_ON/DAL/DriverLayer/Control_Udp.cs
@@ -196,7 +196,7 @@
                                case FunctionAttributeKey.FanSpeed:
                                    tempAc.trait_fan.curValue = attr.value;
                                    break;
                                case FunctionAttributeKey.Temp:
                                case FunctionAttributeKey.SetTemp:
                                    tempAc.trait_temp.curValue = attr.value;
                                    switch (tempAc.curModeIndex)
                                    {
@@ -261,7 +261,7 @@
                                case FunctionAttributeKey.OnOff:
                                    tempFh.trait_on_off.curValue = attr.value;
                                    break;
                                case FunctionAttributeKey.Temp:
                                case FunctionAttributeKey.SetTemp:
                                    tempFh.trait_temp.curValue = attr.value;
                                    break;
                                case FunctionAttributeKey.Mode:
HDL_ON/DAL/Server/HttpServerRequest.cs
@@ -585,8 +585,12 @@
                                DB_ResidenceData.Instance.HomeGateway = mHomeGatewayRes[0];
                                if(mHomeGatewayRes[0].gatewayStatus == "ON_LINE")
                                {
                                    DriverLayer.Control.Ins.IsRemote = true;
                                    //DriverLayer.Control.Ins.IsRemote = true;
                                    DriverLayer.Control.Ins.GatewayOnline = true;
                                }
                                else
                                {
                                    DriverLayer.Control.Ins.GatewayOnline = false;
                                }
                                DB_ResidenceData.Instance.SaveResidenceData();
                                return;
@@ -1913,7 +1917,7 @@
            d.Add("userSceneIds",new List<string>() { seceneId });
            var requestJson = HttpUtil.GetSignRequestJson(d);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_GetSecneList, requestJson);
            return HttpUtil.RequestHttpsPostFroHome(NewAPI.Api_Post_GetSecneInfo, requestJson);
        }
        /// <summary>
        /// 添加场景
HDL_ON/Entity/DB_ResidenceData.cs
@@ -157,7 +157,10 @@
                }
            }
        }
        /// <summary>
        /// 记录窗帘全开全关状态
        /// </summary>
        public bool GlobalCurtainStatus = false;
        /// <summary>
        /// 检测住宅是否绑定了网关
        /// gatewayId 判空
HDL_ON/Entity/Function/Function.cs
@@ -469,270 +469,6 @@
        /// </summary>
        public object curValue = new object();
        //----app自定义
        /// <summary>
        /// 属性值单位
        /// </summary>
        string _uintString;
        [Newtonsoft.Json.JsonIgnore]
        public string uintString
        {
            get
            {
                if (!string.IsNullOrEmpty(_uintString))
                {
                    return _uintString;
                }
                var us = "";
                switch (key)
                {
                    case "temperature":
                    case "set_temp":
                        us = "°C";
                        break;
                    case "percent":
                    case "brightness":
                        us = "%";
                        break;
                }
                return us;
            }
        }
        /// <summary>
        /// 属性名称显示文本
        /// 中英文显示
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string name_text
        {
            get
            {
                string text = "";
                switch (key)
                {
                    case "on_off":
                        text = Language.StringByID(StringId.OnOff);
                        break;
                    case "brightness":
                        text = Language.StringByID(StringId.Brightness);
                        break;
                    case "color":
                        text = Language.StringByID(StringId.ColorValue);
                        break;
                    case "mode":
                        text = Language.StringByID(StringId.Mode);
                        break;
                    case "fan":
                        text = Language.StringByID(StringId.FanSpeed);
                        break;
                    case "temperature":
                case "set_temp":
                        text = Language.StringByID(StringId.Temp);
                        break;
                    case "delay":
                        text = Language.StringByID(StringId.Delay);
                        break;
                    case "cct":
                        text = "CCT";
                        break;
                    //case "fade_time":
                    case "percent":
                        text = Language.StringByID(StringId.PercentAdjustment);
                        break;
                        //case "lock":
                        //case "ico":
                        //case "swing":
                        //case "set_point":
                        //case "pm25":
                        //case "volume":
                        //case "vol_step":
                        //case "source":
                        //case "treble":
                        //case "bass":
                        //case "playlist":
                        //case "song_name":
                        //case "current_status":
                        //case "enable":
                        //case "lux":
                        //case "adjust_value":
                        //case "range":
                        //case "humidity":
                        //case "type":
                        //case "state":
                        //case "sensitivity":
                        //case "pm25value":
                }
                return text;
            }
        }
        /// <summary>
        /// 获取当前属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetCurValueText()
        {
            return GetValueText(curValue.ToString());
        }
        /// <summary>
        /// 获取指定属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetValueText(string value)
        {
            string text = "";
            value = value.Replace("{}", "");
            switch (key)
            {
                case "on_off":
                    text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
                    break;
                case "temperature":
                case "set_temp":
                case "brightness":
                case "percent":
                    if (value == "")
                    {
                        this.curValue = this.min;
                        text = this.min.ToString();
                    }
                    else
                    {
                        text = value;
                    }
                    break;
                //case "color":
                case "mode":
                    switch (value)
                    {
                        //----空调
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        case "cool":
                            text = Language.StringByID(StringId.Cool);
                            break;
                        case "heat":
                            text = Language.StringByID(StringId.Heat);
                            break;
                        case "dry":
                            text = Language.StringByID(StringId.Dry);
                            break;
                        case "fan":
                            text = Language.StringByID(StringId.AirSupply);
                            break;
                        //-----地热
                        case "day":
                            text = Language.StringByID(StringId.Day);
                            break;
                        case "night":
                            text = Language.StringByID(StringId.Night);
                            break;
                        case "away":
                            text = Language.StringByID(StringId.Away);
                            break;
                        case "normal":
                            text = Language.StringByID(StringId.Normal);
                            break;
                        case "timer":
                            text = Language.StringByID(StringId.Timer);
                            break;
                        default:
                            if (this.value.Contains("cool"))
                            {
                                this.curValue = "cool";
                                text = Language.StringByID(StringId.Cool);
                            }
                            else if (this.value.Contains("day"))
                            {
                                this.curValue = "day";
                                text = Language.StringByID(StringId.Day);
                            }
                            else
                            {
                                foreach (var v in this.value)
                                {
                                    this.curValue = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                case "fan":
                    switch (value)
                    {
                        case "high":
                            text = Language.StringByID(StringId.HighWindSpeed);
                            break;
                        case "medium":
                            text = Language.StringByID(StringId.MiddleWindSpeed);
                            break;
                        case "low":
                            text = Language.StringByID(StringId.LowWindSpeed);
                            break;
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        default:
                            if (this.value.Contains("low"))
                            {
                                this.curValue = "low";
                                text = Language.StringByID(StringId.LowWindSpeed);
                            }
                            else
                            {
                                foreach (var v in this.value)
                                {
                                    this.curValue = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                //case "delay":
                //case "cct":
                //case "fade_time":
                //case "lock":
                //case "ico":
                //case "swing":
                //case "set_point":
                //case "pm25":
                //case "volume":
                //case "vol_step":
                //case "source":
                //case "treble":
                //case "bass":
                //case "playlist":
                //case "song_name":
                //case "current_status":
                //case "enable":
                //case "lux":
                //case "adjust_value":
                //case "range":
                //case "humidity":
                //case "type":
                //case "state":
                //case "sensitivity":
                //case "pm25value":
                case "high":
                    text = Language.StringByID(StringId.HighWindSpeed);
                    break;
                case "medium":
                    text = Language.StringByID(StringId.MiddleWindSpeed);
                    break;
                case "low":
                    text = Language.StringByID(StringId.LowWindSpeed);
                    break;
                case "auto":
                    text = Language.StringByID(StringId.Auto);
                    break;
            }
            return text;
        }
    }
    /// <summary>
    /// 功能属性键名列表
@@ -760,9 +496,9 @@
        /// </summary>
        public const string FanSpeed = "fan";
        /// <summary>
        /// 温度
        /// 设置温度
        /// </summary>
        public const string Temp = "temperature";
        public const string SetTemp = "set_temp";
        /// <summary>
        /// 延时
        /// </summary>
HDL_ON/Entity/Function/Scene.cs
@@ -256,10 +256,31 @@
                MainPage.Log($"Save Scene Data : {savePath}");
            }
        }
        /// <summary>
        /// 修改场景
        /// </summary>
        public string UpdateScene()
        {
            var pm = new HttpServerRequest();
            var revPack = pm.EditScene(this);
            if (revPack.Code == StateCode.SUCCESS)
            {
                var scenes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Scene>>(revPack.Data.ToString());
                var tempScene = scenes.Find((obj) => obj.sid == sid);
                if (tempScene != null)
                {
                    var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(tempScene));
                    Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd);
                }
            }
            return revPack.Code;
        }
        /// <summary>
        /// 添加场景
        /// </summary>
        public void AddScene()
        public string AddScene()
        {
            var pm = new HttpServerRequest();
            var revPack = pm.AddScene(this);
@@ -268,6 +289,7 @@
                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
                Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd);
            }
            return revPack.Code;
        }
        /// <summary>
@@ -329,10 +351,11 @@
        /// 本地对应的功能
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public Function localFunction {
        public Function localFunction
        {
            get
            {
                if(_localFunction == null)
                if (_localFunction == null)
                {
                    _localFunction = ConvertFunctionObject();
                }
@@ -347,13 +370,9 @@
        Function ConvertFunctionObject()
        {
            var localFunction = FunctionList.List.GetDeviceFunctionList().Find((obj) => obj.sid == sid);
            foreach (var s in status)
            {
                localFunction.attributes.Add(new FunctionAttributes() { key = s.key, curValue = s.value, value = new List<string>() { s.value } });
            }
            return localFunction;
        }
    }
    /// <summary>
HDL_ON/Entity/FunctionList.cs
@@ -4,6 +4,7 @@
using System.Threading;
using HDL_ON.DAL;
using HDL_ON.DAL.Server;
using Shared;
namespace HDL_ON.Entity
{
@@ -437,15 +438,7 @@
                    var sceneList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Scene>>(pack.Data.ToString());
                    if (sceneList != null)
                    {
                        ////将下载到到数据全部保存
                        //new Thread(() => {
                        //    foreach (var temp in sceneList)
                        //    {
                        //        temp.SaveSceneData();
                        //    }
                        //})
                        //{ IsBackground = true }.Start();
                        for(int i=0;i<List.scenes.Count;)
                        for (int i=0;i<List.scenes.Count;)
                        {
                            var localScene = List.scenes[i];
                            if (localScene == null)
@@ -626,6 +619,166 @@
            { IsBackground = true }.Start();
        }
        #region 功能文本相关
        /// <summary>
        /// 属性名称显示文本
        /// 中英文显示
        /// </summary>
        public string GetNameText(string key)
        {
            string text = "";
            switch (key)
            {
                case FunctionAttributeKey.OnOff:
                    text = Language.StringByID(StringId.OnOff);
                    break;
                case FunctionAttributeKey.Brightness:
                    text = Language.StringByID(StringId.Brightness);
                    break;
                case FunctionAttributeKey.Color:
                    text = Language.StringByID(StringId.ColorValue);
                    break;
                case FunctionAttributeKey.Mode:
                    text = Language.StringByID(StringId.Mode);
                    break;
                case FunctionAttributeKey.FanSpeed:
                    text = Language.StringByID(StringId.FanSpeed);
                    break;
                case FunctionAttributeKey.SetTemp:
                    text = Language.StringByID(StringId.Temp);
                    break;
                case FunctionAttributeKey.IndoorTemp:
                    text = Language.StringByID(StringId.IndoorTemp);
                    break;
                case FunctionAttributeKey.Delay:
                    text = Language.StringByID(StringId.Delay);
                    break;
                case FunctionAttributeKey.CCT:
                    text = "CCT";
                    break;
                case FunctionAttributeKey.Percent:
                    text = Language.StringByID(StringId.PercentAdjustment);
                    break;
            }
            return text;
        }
        /// <summary>
        /// 属性值单位
        /// </summary>
        public string GetUintString(string key)
        {
            var us = "";
            switch (key)
            {
                case FunctionAttributeKey.SetTemp:
                case FunctionAttributeKey.IndoorTemp:
                    us = "°C";
                    break;
                case FunctionAttributeKey.Percent:
                case FunctionAttributeKey.Brightness:
                    us = "%";
                    break;
            }
            return us;
        }
        /// <summary>
        /// 获取指定属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetValueText(string key, string value)
        {
            string text = "";
            switch (key)
            {
                case FunctionAttributeKey.OnOff:
                    text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
                    break;
                case FunctionAttributeKey.SetTemp:
                case FunctionAttributeKey.IndoorTemp:
                case FunctionAttributeKey.Brightness:
                case FunctionAttributeKey.Percent:
                    if (value == "")
                    {
                        value = "0";
                    }
                    text = value;
                    break;
                case FunctionAttributeKey.Mode:
                    switch (value)
                    {
                        //----空调
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        case "cool":
                            text = Language.StringByID(StringId.Cool);
                            break;
                        case "heat":
                            text = Language.StringByID(StringId.Heat);
                            break;
                        case "dry":
                            text = Language.StringByID(StringId.Dry);
                            break;
                        case "fan":
                            text = Language.StringByID(StringId.AirSupply);
                            break;
                        //-----地热
                        case "day":
                            text = Language.StringByID(StringId.Day);
                            break;
                        case "night":
                            text = Language.StringByID(StringId.Night);
                            break;
                        case "away":
                            text = Language.StringByID(StringId.Away);
                            break;
                        case "normal":
                            text = Language.StringByID(StringId.Normal);
                            break;
                        case "timer":
                            text = Language.StringByID(StringId.Timer);
                            break;
                    }
                    break;
                case FunctionAttributeKey.FanSpeed:
                    switch (value)
                    {
                        case "high":
                            text = Language.StringByID(StringId.HighWindSpeed);
                            break;
                        case "medium":
                            text = Language.StringByID(StringId.MiddleWindSpeed);
                            break;
                        case "low":
                            text = Language.StringByID(StringId.LowWindSpeed);
                            break;
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        default:
                            text = "low";
                            break;
                    }
                    break;
                case "high":
                    text = Language.StringByID(StringId.HighWindSpeed);
                    break;
                case "medium":
                    text = Language.StringByID(StringId.MiddleWindSpeed);
                    break;
                case "low":
                    text = Language.StringByID(StringId.LowWindSpeed);
                    break;
                case "auto":
                    text = Language.StringByID(StringId.Auto);
                    break;
            }
            return text;
        }
        #endregion
    }
}
HDL_ON/UI/UI2/2-Classification/ClassificationPage.cs
@@ -615,7 +615,7 @@
                            UnSelectedImagePath = "FunctionIcon/Curtain/CurtainCloseIcon.png",
                            SelectedImagePath = "FunctionIcon/Curtain/CurtainCloseOnIcon.png",
                            //Tag = item + "_AllControl",
                            IsSelected = false
                            IsSelected = !DB_ResidenceData.Instance.GlobalCurtainStatus,
                        };
                        functionView.AddChidren(btnClose);
@@ -628,7 +628,7 @@
                            Height = Application.GetRealWidth(32),
                            UnSelectedImagePath = "FunctionIcon/Curtain/CurtainOpenIcon.png",
                            SelectedImagePath = "FunctionIcon/Curtain/CurtainOpenOnIcon.png",
                            IsSelected = true,
                            IsSelected = DB_ResidenceData.Instance.GlobalCurtainStatus,
                        };
                        functionView.AddChidren(btnOpen);
                        LoadEvent_CurtainSwitch(btnClose, btnOpen);
HDL_ON/UI/UI2/2-Classification/ClassificationPageBLL.cs
@@ -356,6 +356,9 @@
        {
            btnOpen.MouseUpEventHandler = (sender, e) =>
            {
                DB_ResidenceData.Instance.GlobalCurtainStatus = true;
                btnOpen.IsSelected = true;
                btnClose.IsSelected = false;
                foreach (var f in FunctionList.List.curtains)
                {
                    f.trait_on_off.curValue = "on";
@@ -368,6 +371,9 @@
            btnClose.MouseUpEventHandler = (sender, e) =>
            {
                DB_ResidenceData.Instance.GlobalCurtainStatus = false;
                btnClose.IsSelected = true;
                btnOpen.IsSelected = false;
                foreach (var f in FunctionList.List.curtains)
                {
                    f.trait_on_off.curValue =  "off";
HDL_ON/UI/UI2/3-Intelligence/IntelligencePage.cs
@@ -374,7 +374,6 @@
                    Action refreshAction = () => {
                        btnName.Text = scene.name;
                        btnZone.Text = scene.GetRoomListName();
                        //view.BackgroundImagePath = scene.ImagePath;
                        //2020-12-03 修改图片加载方法
                        ImageUtlis.Current.LoadLocalOrNetworkImages((scene as Scene).ImagePath, view);
                    };
HDL_ON/UI/UI2/3-Intelligence/Scene/NewSceneMenuListPage.cs
@@ -164,9 +164,9 @@
                    this.RemoveFromParent();
                    action();
                };
                var scene = new Entity.Scene() { roomIds = new System.Collections.Generic.List<string>() { "" } };
                var scene = new Scene() { roomIds = new System.Collections.Generic.List<string>() { "" } };
                scene.NewSid();
                scene.name = Language.StringByID(StringId.Scene) + " " + (1 + Entity.FunctionList.List.scenes.Count).ToString();
                scene.name = Language.StringByID(StringId.Scene) + " " + (1 + FunctionList.List.scenes.Count).ToString();
                var aep = new SceneAddPage(scene,backAction);
                MainPage.BasePageView.AddChidren(aep);
                aep.LoadPage();
HDL_ON/UI/UI2/3-Intelligence/Scene/SceneAddPage.cs
@@ -90,23 +90,18 @@
            scene = s;
            backAction = act;
            refreshFunctionRowAction = () => {
                LoadFunctionRow(functionListView);
            };
        }
        public void LoadPage( Action backRefresh)
        public void LoadPage()
        {
            new TopViewDiv(bodyView, Language.StringByID(StringId.NewScene)).LoadTopView(backRefresh);
            initPage();
        }
        void initPage()
        {
            new TopViewDiv(bodyView, Language.StringByID(StringId.NewScene)).LoadTopView();
            bodyView.BackgroundColor = CSS_Color.MainBackgroundColor;
            VerticalScrolViewLayout contentView = new VerticalScrolViewLayout()
            var contentView = new VerticalScrolViewLayout()
            {
                Y = Application.GetRealHeight(64),
                Height = Application.GetRealHeight(603 - 50),
@@ -114,7 +109,7 @@
            bodyView.AddChidren(contentView);
            contentView.AddChidren(new Button() { Height = Application.GetRealWidth(12) });
            FrameLayout sceneBgView = new FrameLayout()
            var sceneBgView = new FrameLayout()
            {
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(252),
@@ -135,7 +130,6 @@
            //2020-12-03 修改图片加载方法
            ImageUtlis.Current.LoadLocalOrNetworkImages(scene.ImagePath, addSceneImageView);
            #region 场景名称row
            sceneNameView = new FrameLayout()
@@ -401,8 +395,6 @@
                };
                row.AddChidren(btnRight);
                var btnFunctionInfo = new Button()
                {
                    Width = Application.GetRealWidth(327),
@@ -472,7 +464,6 @@
                    MainPage.BasePageView.PageIndex = MainPage.BasePageView.ChildrenCount - 1;
                };
                Button btnDelSceneFunction = new Button()
                {
                    BackgroundColor = CSS_Color.WarningColor,
@@ -485,10 +476,7 @@
                    scene.SaveSceneData(true);
                    row.RemoveFromParent();
                    functionListView.Height = Application.GetRealWidth(65 * scene.functions.Count);
                    //LoadFunctionRow(functionListView);
                };
            }
        }
@@ -506,66 +494,115 @@
                    if (sfs.value == "off")
                        return Language.StringByID(StringId.Close);
                }
                if (sfs.key == FunctionAttributeKey.Mode)
                {
                }
            }
            FunctionAttributes perTrait;
            switch (sceneFunction.localFunction.functionType)
            if (sceneFunction.status.Count == 0)
            {
                case FunctionType.AC:
                    sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode").GetCurValueText();
                    sceneFunctionInfo += " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").curValue.ToString() +
                         sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").uintString;
                    sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "fan").GetCurValueText();
                    break;
                case FunctionType.FloorHeating:
                    sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode").GetCurValueText();
                    sceneFunctionInfo += " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").curValue.ToString() +
                         sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").uintString;
                    break;
                case FunctionType.Dimmer:
                    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness");
                    if (perTrait != null)
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
                    }
                    else
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open);
                    }
                    break;
                case FunctionType.Relay:
                    sceneFunctionInfo += Language.StringByID(StringId.Open);
                    break;
                case FunctionType.RGB:
                    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
                    if (perTrait != null)
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
                    }
                    else
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open);
                    }
                    break;
                case FunctionType.Curtain:
                    sceneFunctionInfo += Language.StringByID(StringId.Open);
                    break;
                case FunctionType.MotorCurtain:
                    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
                    if (perTrait != null)
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent").curValue.ToString() + "%";
                    }
                    else
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open);
                    }
                    break;
                return sceneFunctionInfo += Language.StringByID(StringId.Open);
            }
            var modeState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Mode);
            var tempState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.SetTemp);
            var fanState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.FanSpeed);
            if (modeState != null)
            {
                sceneFunctionInfo += FunctionList.List.GetValueText(modeState.key, modeState.value);
            }
            if (tempState != null)
            {
                sceneFunctionInfo += FunctionList.List.GetValueText(tempState.key, tempState.value);
                sceneFunctionInfo += FunctionList.List.GetUintString(tempState.key);
            }
            if (fanState != null)
            {
                sceneFunctionInfo += FunctionList.List.GetValueText(fanState.key, fanState.value);
            }
            var briState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Brightness);
            if (briState != null)
            {
                sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
            }
            else
            {
                sceneFunctionInfo += Language.StringByID(StringId.Open);
            }
            var perState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Percent);
            if (perState != null)
            {
                sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
            }
            else
            {
                sceneFunctionInfo += Language.StringByID(StringId.Open);
            }
            //FunctionAttributes perTrait;
            //switch (sceneFunction.localFunction.functionType)
            //{
                //case FunctionType.AC:
                    //var acMode = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Mode);
                    //var acTemp = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.SetTemp);
                    //var acFan = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.FanSpeed);
                    //if (acMode != null)
                    //{
                    //    sceneFunctionInfo += FunctionList.List.GetValueText(acMode.key, acMode.value);
                    //}
                    //if (acTemp != null)
                    //{
                    //    sceneFunctionInfo += FunctionList.List.GetValueText(acTemp.key, acTemp.value);
                    //    sceneFunctionInfo += FunctionList.List.GetUintString(acTemp.key);
                    //}
                    //if (acFan!=null)
                    //{
                    //    sceneFunctionInfo += FunctionList.List.GetValueText(acFan.key, acFan.value);
                    //}
                //    break;
                //case FunctionType.FloorHeating:
                    //sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode").GetCurValueText();
                    //sceneFunctionInfo += " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").curValue.ToString() +
                    //     sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").uintString;
                    //break;
                //case FunctionType.Dimmer:
                    //perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness");
                    //if (perTrait != null)
                    //{
                    //    sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
                    //}
                    //else
                    //{
                    //    sceneFunctionInfo += Language.StringByID(StringId.Open);
                    //}
                    //break;
                //case FunctionType.Relay:
                //    sceneFunctionInfo += Language.StringByID(StringId.Open);
                //    break;
                //case FunctionType.RGB:
                //    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
                //    if (perTrait != null)
                //    {
                //        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
                //    }
                //    else
                //    {
                //        sceneFunctionInfo += Language.StringByID(StringId.Open);
                //    }
                //    break;
                //case FunctionType.Curtain:
                //    sceneFunctionInfo += Language.StringByID(StringId.Open);
                //    break;
                //case FunctionType.MotorCurtain:
                //    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
                //    if (perTrait != null)
                //    {
                //        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent").curValue.ToString() + "%";
                //    }
                //    else
                //    {
                //        sceneFunctionInfo += Language.StringByID(StringId.Open);
                //    }
                //    break;
            //}
            return sceneFunctionInfo;
        }
@@ -843,41 +880,35 @@
        {
            btnComplete.MouseUpEventHandler += (sender, e) =>
            {
                if (btnComplete.TextID == StringId.Complete)
                if (string.IsNullOrEmpty(scene.name))
                {
                    if (string.IsNullOrEmpty(scene.name))
                    new Tip()
                    {
                        new Tip()
                        {
                            CloseTime = 1,
                            Text = Language.StringByID(StringId.SceneNameCannotBeEmpty),
                            Direction = AMPopTipDirection.None,
                        }.Show(bodyView);
                        CloseTime = 1,
                        Text = Language.StringByID(StringId.SceneNameCannotBeEmpty),
                        Direction = AMPopTipDirection.None,
                    }.Show(bodyView);
                    return;
                }
                foreach (var tempRoom in FunctionList.List.scenes)
                {
                    if (scene.name == tempRoom.name)
                    {
                        new PublicAssmebly().TipMsg(StringId.Tip, StringId.SceneNameAlreadyExists);
                        return;
                    }
                    foreach (var tempRoom in FunctionList.List.scenes)
                    {
                        if (scene.name == tempRoom.name)
                        {
                            new PublicAssmebly().TipMsg(StringId.Tip, StringId.SceneNameAlreadyExists);
                            return;
                        }
                    }
                    scene.SaveSceneData(true);
                }
                var result = scene.AddScene();
                if (result == StateCode.SUCCESS)
                {
                    FunctionList.List.scenes.Add(scene);
                    backAction();
                    this.RemoveFromParent();
                }
                if (btnComplete.TextID == StringId.Del)
                else
                {
                    Action action = () =>
                    {
                        FunctionList.List.DeleteScene(scene, true);
                        backAction();
                        this.RemoveFromParent();
                    };
                    new PublicAssmebly().TipOptionMsg(StringId.Tip, StringId.DeleteSceneTip, action);
                };
                    IMessageCommon.Current.ShowErrorInfoAlter(result);
                }
            };
        }
HDL_ON/UI/UI2/3-Intelligence/Scene/SceneEditPage.cs
@@ -374,6 +374,37 @@
            bodyView.AddChidren(btnComplete);
            LoadEventList();
            var waitPage = new Loading();
            new Thread(() => {
                Application.RunOnMainThread(() => {
                    bodyView.AddChidren(waitPage);
                    waitPage.Start(Language.StringByID(StringId.PleaseWait));
                });
                var pm = new HttpServerRequest();
                var pack = pm.GetSceneInfo(scene.userSceneId);
                if (pack.Code == StateCode.SUCCESS)
                {
                    var sceneList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Scene>>(pack.Data.ToString());
                    var tempScene = sceneList.Find((obj) => obj.userSceneId == scene.userSceneId);
                    if(tempScene!= null)
                    {
                        scene.functions = tempScene.functions;
                    }
                    Application.RunOnMainThread(() =>
                    {
                        waitPage.Hide();
                    });
                }
                else
                {
                    Application.RunOnMainThread(() =>
                    {
                        waitPage.Hide();
                        IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
                    });
                }
            }).Start();
        }
        /// <summary>
        /// 加载功能列表
@@ -513,66 +544,94 @@
                    if (sfs.value == "off")
                        return Language.StringByID(StringId.Close);
                }
                if (sfs.key == FunctionAttributeKey.Mode)
                {
                }
            }
            FunctionAttributes perTrait;
            switch (sceneFunction.localFunction.functionType)
            if (sceneFunction.status.Count == 0)
            {
                case FunctionType.AC:
                    sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode").GetCurValueText();
                    sceneFunctionInfo += " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").curValue.ToString() +
                         sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").uintString;
                    sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "fan").GetCurValueText();
                    break;
                case FunctionType.FloorHeating:
                    sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode").GetCurValueText();
                    sceneFunctionInfo += " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").curValue.ToString() +
                         sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").uintString;
                    break;
                case FunctionType.Dimmer:
                    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness");
                    if (perTrait != null)
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
                    }
                    else
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open);
                    }
                    break;
                case FunctionType.Relay:
                    sceneFunctionInfo += Language.StringByID(StringId.Open);
                    break;
                case FunctionType.RGB:
                    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
                    if (perTrait != null)
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
                    }
                    else
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open);
                    }
                    break;
                case FunctionType.Curtain:
                    sceneFunctionInfo += Language.StringByID(StringId.Open);
                    break;
                case FunctionType.MotorCurtain:
                    perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
                    if (perTrait != null)
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent").curValue.ToString() + "%";
                    }
                    else
                    {
                        sceneFunctionInfo += Language.StringByID(StringId.Open);
                    }
                    break;
                return sceneFunctionInfo += Language.StringByID(StringId.Open);
            }
            var modeState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Mode);
            var tempState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.SetTemp);
            var fanState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.FanSpeed);
            if (modeState != null)
            {
                sceneFunctionInfo += FunctionList.List.GetValueText(modeState.key, modeState.value);
            }
            if (tempState != null)
            {
                sceneFunctionInfo += FunctionList.List.GetValueText(tempState.key, tempState.value);
                sceneFunctionInfo += FunctionList.List.GetUintString(tempState.key);
            }
            if (fanState != null)
            {
                sceneFunctionInfo += FunctionList.List.GetValueText(fanState.key, fanState.value);
            }
            var briState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Brightness);
            if (briState != null)
            {
                sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + briState.value + "%";
            }
            var perState = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Percent);
            if (perState != null)
            {
                sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + perState.value + "%";
            }
            //FunctionAttributes perTrait;
            //switch (sceneFunction.localFunction.functionType)
            //{
            //    case FunctionType.AC:
            //        sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode").GetCurValueText();
            //        sceneFunctionInfo += " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").curValue.ToString() +
            //             sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").uintString;
            //        sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "fan").GetCurValueText();
            //        break;
            //    case FunctionType.FloorHeating:
            //        sceneFunctionInfo += sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode").GetCurValueText();
            //        sceneFunctionInfo += " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").curValue.ToString() +
            //             sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp").uintString;
            //        break;
            //    case FunctionType.Dimmer:
            //        perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness");
            //        if (perTrait != null)
            //        {
            //            sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
            //        }
            //        else
            //        {
            //            sceneFunctionInfo += Language.StringByID(StringId.Open);
            //        }
            //        break;
            //    case FunctionType.Relay:
            //        sceneFunctionInfo += Language.StringByID(StringId.Open);
            //        break;
            //    case FunctionType.RGB:
            //        perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
            //        if (perTrait != null)
            //        {
            //            sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness").curValue.ToString() + "%";
            //        }
            //        else
            //        {
            //            sceneFunctionInfo += Language.StringByID(StringId.Open);
            //        }
            //        break;
            //    case FunctionType.Curtain:
            //        sceneFunctionInfo += Language.StringByID(StringId.Open);
            //        break;
            //    case FunctionType.MotorCurtain:
            //        perTrait = sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent");
            //        if (perTrait != null)
            //        {
            //            sceneFunctionInfo += Language.StringByID(StringId.Open) + " " + sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent").curValue.ToString() + "%";
            //        }
            //        else
            //        {
            //            sceneFunctionInfo += Language.StringByID(StringId.Open);
            //        }
            //        break;
            //}
            return sceneFunctionInfo;
        }
HDL_ON/UI/UI2/3-Intelligence/Scene/SetSceneFunctionInfoPage.cs
@@ -10,21 +10,19 @@
    {
        FrameLayout bodyView;
        VerticalScrolViewLayout contentView;
        Button btnOnText;
        Scene scene;
        Action refreshAction;
        SceneFunction sceneFunction;
        //Function localFunction;
        public SceneFunctionInfoEditPage(Scene s, SceneFunction fc,Action action)
        {
            bodyView = this;
            scene = s;
            //localFunction = fc;
            sceneFunction = fc;
            refreshAction = action;
        }
        public void LoadPage()
        {
@@ -40,35 +38,58 @@
            };
            bodyView.AddChidren(contentView);
            //加载开关Row
            LoadFunctionRow(sceneFunction.localFunction.trait_on_off);
            LoadFunctionRow(sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff));
            switch (sceneFunction.localFunction.functionType)
            foreach (var attr in sceneFunction.status)
            {
                case FunctionType.AC:
                    LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp"));
                    LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode"));
                    LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "fan"));
                    break;
                case FunctionType.FloorHeating:
                    LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp"));
                    LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode"));
                    break;
                case FunctionType.Curtain:
                    //无操作
                    break;
                case FunctionType.MotorCurtain:
                case FunctionType.RollingShutter:
                    LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent"));
                    break;
                case FunctionType.Relay:
                    //无操作
                    break;
                case FunctionType.Dimmer:
                case FunctionType.RGB:
                    LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness"));
                    break;
                switch (attr.key)
                {
                    case FunctionAttributeKey.SetTemp:
                        LoadFunctionRow(sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.SetTemp));
                        break;
                    case FunctionAttributeKey.Mode:
                        LoadFunctionRow(sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Mode));
                        break;
                    case FunctionAttributeKey.FanSpeed:
                        LoadFunctionRow(sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.FanSpeed));
                        break;
                    case FunctionAttributeKey.Percent:
                        LoadFunctionRow(sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Percent));
                        break;
                    case FunctionAttributeKey.Brightness:
                        LoadFunctionRow(sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.Brightness));
                        break;
                }
            }
            //加载开关Row
            //LoadFunctionRow(sceneFunction.localFunction.trait_on_off);
            //switch (sceneFunction.localFunction.functionType)
            //{
            //    case FunctionType.AC:
            //        LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp"));
            //        LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode"));
            //        LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "fan"));
            //        break;
            //    case FunctionType.FloorHeating:
            //        LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "set_temp"));
            //        LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "mode"));
            //        break;
            //    case FunctionType.Curtain:
            //        //无操作
            //        break;
            //    case FunctionType.MotorCurtain:
            //    case FunctionType.RollingShutter:
            //        LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "percent"));
            //        break;
            //    case FunctionType.Relay:
            //        //无操作
            //        break;
            //    case FunctionType.Dimmer:
            //    case FunctionType.RGB:
            //        LoadFunctionRow(sceneFunction.localFunction.attributes.Find((obj) => obj.key == "brightness"));
            //        break;
            //}
            //加载延时Row
            LoadDelayRow();
@@ -100,7 +121,6 @@
            btnConfrim.MouseUpEventHandler = (sender, e) =>
            {
                //var temp = localFunction.ConvertSceneFunction();
                var temp = scene.functions.Find((obj) => obj.sid == sceneFunction.sid);
                if (temp != null)
                {
@@ -110,9 +130,19 @@
                {
                    scene.functions.Add(sceneFunction);
                }
                scene.SaveSceneData(true);
                refreshAction();
                this.RemoveFromParent();
                if (!string.IsNullOrEmpty(scene.userSceneId))
                {
                    var result = scene.UpdateScene();
                    if (result == DAL.Server.StateCode.SUCCESS)
                    {
                        refreshAction();
                        this.RemoveFromParent();
                    }
                    else
                    {
                        DAL.Server.IMessageCommon.Current.ShowErrorInfoAlter(result);
                    }
                }
            };
        }
@@ -120,9 +150,9 @@
        /// <summary>
        /// 加载功能Row
        /// </summary>
        void LoadFunctionRow(FunctionAttributes trait)
        void LoadFunctionRow(SceneFunctionStatus sceneStatus)
        {
            if (trait == null)
            if (sceneStatus == null)
                return;
            #region Row code
            var row = new FrameLayout()
@@ -131,7 +161,7 @@
                BackgroundColor = CSS_Color.MainBackgroundColor,
            };
            contentView.AddChidren(row);
            if (trait.key != "on_off")
            if (sceneStatus.key != FunctionAttributeKey.OnOff)
            {
                row.AddChidren(new Button() { X = Application.GetRealWidth(16), Height = Application.GetRealHeight(1), Width = Application.GetRealWidth(343), BackgroundColor = CSS_Color.DividingLineColor });
            }
@@ -151,9 +181,11 @@
                TextAlignment = TextAlignment.CenterRight,
                TextColor = CSS_Color.PromptingColor1,
                TextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                Text = trait.GetCurValueText() + trait.uintString
                Text = FunctionList.List.GetValueText(sceneStatus.key,sceneStatus.value) + FunctionList.List.GetUintString(sceneStatus.key)
            };
            row.AddChidren(btnFunctionText);
            if (sceneStatus.key == FunctionAttributeKey.OnOff)
                btnOnText = btnFunctionText;
            var btnFunctionName = new Button()
            {
@@ -161,62 +193,48 @@
                TextAlignment = TextAlignment.CenterLeft,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                Text = trait.name_text
                Text = FunctionList.List.GetNameText(sceneStatus.key)
            };
            row.AddChidren(btnFunctionName);
            btnFunctionName.MouseUpEventHandler = (sender, e) =>
            {
                switch (trait.key)
                switch (sceneStatus.key)
                {
                    case "on_off":
                        LoadEditDialog_OnOff(trait, btnFunctionText);
                    case FunctionAttributeKey.OnOff:
                        LoadEditDialog_OnOff(sceneStatus, btnFunctionText);
                        break;
                    case "brightness":
                        LoadEditDialog_Percent(trait, btnFunctionText);
                    case FunctionAttributeKey.Brightness:
                        LoadEditDialog_Percent(sceneStatus, btnFunctionText);
                        break;
                    //case "color":
                    //    break;
                    case "mode":
                        LoadEditDialog_FunctionPar(trait, btnFunctionText);
                    case FunctionAttributeKey.Mode:
                        var statusList = new List<string>();
                        var tr = sceneFunction.localFunction.attributes.Find((obj) => obj.key == FunctionAttributeKey.Mode);
                        foreach(var t in tr.value)
                        {
                            statusList.Add(t);
                        }
                        LoadEditDialog_FunctionPar(sceneStatus, btnFunctionText,statusList);
                        break;
                    case "fan":
                        LoadEditDialog_FunctionPar(trait, btnFunctionText);
                    case FunctionAttributeKey.FanSpeed:
                        var fanStatusList = new List<string>();
                        var tr1 = sceneFunction.localFunction.attributes.Find((obj) => obj.key == FunctionAttributeKey.FanSpeed);
                        foreach (var t in tr1.value)
                        {
                            fanStatusList.Add(t);
                        }
                        LoadEditDialog_FunctionPar(sceneStatus, btnFunctionText, fanStatusList);
                        break;
                    case "set_temp":
                        LoadEditDialog_Temp(trait, btnFunctionText);
                    case FunctionAttributeKey.SetTemp:
                        LoadEditDialog_Temp(sceneStatus, btnFunctionText);
                        break;
                    case "delay":
                        break;
                    case "cct":
                        break;
                    //case "fade_time":
                    case "percent":
                        LoadEditDialog_Percent(trait, btnFunctionText);
                    case FunctionAttributeKey.Percent:
                        LoadEditDialog_Percent(sceneStatus, btnFunctionText);
                        break;
                        //case "lock":
                        //case "ico":
                        //case "swing":
                        //case "set_ point":
                        //case "pm25":
                        //case "volume":
                        //case "vol_step":
                        //case "source":
                        //case "treble":
                        //case "bass":
                        //case "playlist":
                        //case "song_name":
                        //case "current_status":
                        //case "enable":
                        //case "lux":
                        //case "adjust_value":
                        //case "range":
                        //case "humidity":
                        //case "type":
                        //case "state":
                        //case "sensitivity":
                        //case "pm25value":
                }
                //LoadEditDialog_Temp(trait, btnFunctionText);
            };
            #endregion
@@ -286,7 +304,7 @@
        /// </summary>
        /// <param name="function"></param>
        /// <param name="btn"></param>
        void LoadEditDialog_OnOff(FunctionAttributes trait, Button btn)
        void LoadEditDialog_OnOff(SceneFunctionStatus trait, Button btn)
        {
            Dialog dialog = new Dialog();
@@ -324,7 +342,7 @@
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.On,
                IsSelected = trait.curValue.ToString() == "on"
                IsSelected = trait.value.ToString() == "on"
            };
            optionView.AddChidren(btnOn);
@@ -338,7 +356,7 @@
                SelectedTextColor = CSS_Color.MainColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
                TextID = StringId.OFF,
                IsSelected = trait.curValue.ToString() == "off"
                IsSelected = trait.value.ToString() == "off"
            };
            optionView.AddChidren(btnOff);
@@ -367,15 +385,15 @@
            };
            btnOn.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
                trait.curValue = "on";
                trait.value = "on";
                sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = "on";
                btn.Text = trait.GetCurValueText() + trait.uintString;
                btn.Text = FunctionList.List.GetValueText(trait.key, trait.value) + FunctionList.List.GetUintString(trait.key);
            };
            btnOff.MouseUpEventHandler = (sender,e) =>{
                dialog.Close();
                trait.curValue = "off";
                trait.value = "off";
                sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = "off";
                btn.Text= trait.GetCurValueText() + trait.uintString;
                btn.Text= FunctionList.List.GetValueText(trait.key,trait.value) + FunctionList.List.GetUintString(trait.key);
            };
        }
@@ -385,7 +403,7 @@
        /// </summary>
        /// <param name="function"></param>
        /// <param name="btn"></param>
        void LoadEditDialog_Temp(FunctionAttributes trait, Button btn)
        void LoadEditDialog_Temp(SceneFunctionStatus trait, Button btn)
        {
            List<string> pickerItems = new List<string>();
            if(trait == null)
@@ -452,33 +470,14 @@
                Height = Application.GetRealHeight(210),
                Radius = (uint)Application.GetRealWidth(12),
            };
            if(trait!=null)
            for (int i = 16; i <= 32; i += 1)
            {
                if (trait.data_type == "float")
                {
                    for (double i = trait.min; i <= trait.max; i += 0.5)
                    {
                        pickerItems.Add(i.ToString() + trait.uintString);
                    }
                }
                else
                {
                    for (int i = trait.min; i <= trait.max; i += 1)
                    {
                        pickerItems.Add(i.ToString() + trait.uintString);
                    }
                }
            }else
            {
                for (int i = 16; i <= 32; i += 1)
                {
                    pickerItems.Add(i.ToString() + trait.uintString);
                }
                pickerItems.Add(i.ToString() + FunctionList.List.GetUintString(trait.key));
            }
            uIPickerView.setNPicker(pickerItems, null, null);
            optionBaseView.AddChidren(uIPickerView);
            uIPickerView.setCurrentItems(pickerItems.IndexOf(trait.curValue.ToString()), 4, 5);
            string selectItem = trait.curValue.ToString() + trait.uintString;
            uIPickerView.setCurrentItems(pickerItems.IndexOf(trait.value.ToString()), 4, 5);
            string selectItem = trait.value.ToString() + FunctionList.List.GetUintString(trait.key);
            dialog.Show();
@@ -495,19 +494,18 @@
            btnConfrim.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
                btn.Text = selectItem;
                sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = trait.curValue.ToString() ;
                trait.curValue = selectItem.Replace(trait.uintString,"");
                //sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = trait.value.ToString() ;
                trait.value = selectItem.Replace(FunctionList.List.GetUintString(trait.key),"");
            };
        }
        /// <summary>
        /// 加载亮度选择弹窗
        /// </summary>
        /// <param name="function"></param>
        /// <param name="btn"></param>
        void LoadEditDialog_Percent(FunctionAttributes trait, Button btn)
        void LoadEditDialog_Percent(SceneFunctionStatus trait, Button btn)
        {
            if (trait == null)
            {
@@ -546,13 +544,12 @@
            optionBaseView.AddChidren(topView);
            topView.AddChidren(new Button() { Y = Application.GetRealHeight(39), Height = Application.GetRealHeight(1), BackgroundColor = CSS_Color.DividingLineColor });
            var btnTitle = new Button()
            {
                Gravity = Gravity.CenterHorizontal,
                TextAlignment = TextAlignment.Center,
                Width = Application.GetRealWidth(100),
                Text = trait.name_text,
                Text = FunctionList.List.GetNameText(trait.key),
                IsBold = true,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
@@ -580,8 +577,6 @@
            };
            topView.AddChidren(btnConfrim);
            Button btnMinusSignIcon = new Button()
            {
                X = Application.GetRealWidth(26),
@@ -605,7 +600,7 @@
                ProgressTextColor = CSS_Color.FirstLevelTitleColor,
                ProgressTextSize = CSS_FontSize.PromptFontSize_FirstLevel,
                MaxValue = 100,
                Progress = trait.curValue.ToString().Replace("{}", "") == "" ? 0 : Convert.ToInt32( trait.curValue),
                Progress = trait.value.ToString().Replace("{}", "") == "" ? 0 : Convert.ToInt32( trait.value.Replace("{}","")),
                SeekBarPadding = Application.GetRealWidth(20),
            };
            optionBaseView.AddChidren(controlBar);
@@ -627,7 +622,6 @@
                controlBar.Progress++;
            };
            dialog.Show();
            pView.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
@@ -638,9 +632,17 @@
            };
            btnConfrim.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
                trait.curValue = controlBar.Progress;
                sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = trait.curValue.ToString() ;
                btn.Text = trait.curValue + trait.uintString;
                trait.value = controlBar.Progress.ToString();
                btn.Text = trait.value + FunctionList.List.GetUintString(trait.key);
                if (controlBar.Progress > 0)
                {
                    var temp = sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff);
                    if (temp != null)
                    {
                        temp.value = "on";
                        btnOnText.Text = FunctionList.List.GetValueText(temp.key, temp.value);
                    }
                }
            };
        }
@@ -649,7 +651,7 @@
        /// <summary>
        /// 加载功能属性数据选择弹窗
        /// </summary>
        void LoadEditDialog_FunctionPar(FunctionAttributes trait, Button btn)
        void LoadEditDialog_FunctionPar(SceneFunctionStatus trait, Button btn,List<string> statusList)
        {
            Button lastButton = new Button();
            var lastData = "";
@@ -664,10 +666,10 @@
            var optionBaseView = new FrameLayout()
            {
                Y = Application.GetRealHeight(579 - 50 * trait.value.Count),
                Y = Application.GetRealHeight(579 - 50 * statusList.Count),
                Gravity = Gravity.CenterHorizontal,
                Width = Application.GetRealWidth(343),
                Height = Application.GetRealHeight(50 * trait.value.Count + 50),
                Height = Application.GetRealHeight(50 * statusList.Count + 50),
                AnimateSpeed = 0.3f,
                Animate = Animate.DownToUp,
                BackgroundColor = CSS_Color.MainBackgroundColor,
@@ -690,7 +692,7 @@
                Gravity = Gravity.CenterHorizontal,
                TextAlignment = TextAlignment.Center,
                Width = Application.GetRealWidth(100),
                Text = trait.name_text,
                Text = FunctionList.List.GetNameText(trait.key),
                IsBold = true,
                TextColor = CSS_Color.FirstLevelTitleColor,
                TextSize = CSS_FontSize.SubheadingFontSize,
@@ -718,7 +720,7 @@
            };
            topView.AddChidren(btnConfrim);
            int hei = 1;
            foreach (var m in trait.value)
            foreach (var m in statusList)
            {
                var row = new FrameLayout()
                {
@@ -726,7 +728,7 @@
                    Height = Application.GetRealHeight(50),
                };
                optionBaseView.AddChidren(row);
                if (trait.value.Count > hei)
                if (statusList.Count > hei)
                {
                    optionBaseView.AddChidren(new Button()
                    {
@@ -750,7 +752,7 @@
                };
                row.AddChidren(btnChoose);
                if (trait.curValue.ToString() == m)
                if (trait.value == m)
                {
                    lastButton = btnChoose;
                    btnChoose.IsSelected = true;
@@ -762,7 +764,7 @@
                    TextColor = CSS_Color.FirstLevelTitleColor,
                    TextSize = CSS_FontSize.TextFontSize,
                    Tag = m,
                    Text = trait.GetValueText(m)
                    Text = FunctionList.List.GetValueText(trait.key, m)
                };
                row.AddChidren(btnPropertyTitle);
@@ -792,8 +794,8 @@
            };
            btnConfrim.MouseUpEventHandler = (sender, e) => {
                dialog.Close();
                trait.curValue = lastData;
                sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = trait.curValue.ToString() ;
                trait.value = lastData;
                //sceneFunction.status.Find((obj) => obj.key == FunctionAttributeKey.OnOff).value = trait.curValue.ToString() ;
                btn.Text = lastText;
            };