CrabtreeOn,印度客户定制APP,迁移2.0平台版本
陈嘉乐
2021-03-02 c404f2f369710fe72bbcc4cff2b7b8a2c11b5ff1
Crabtree/SmartHome/HDL/Common/HDLLinkUtlis.cs
@@ -10,6 +10,94 @@
    /// </summary>
    public class HDLLinkUtlis
    {
        /// <summary>
        /// 生成逻辑sid方法
        /// </summary>
        public static string NewSceneSid ()
        {
            string sceneId = "";
            try {
                string sOidBeginsWith = "000101";//厂商 + 通讯方式
                string sTimeSpan = "00000000";
                long sTimeSp = ConvertDateTimeLong (); //以2020年1月1日算出的时间戳0.1s为单位
                ConvertIntToByteArray (sTimeSp, ref sTimeSpan);
                if (sTimeSpan.Length > 8) {
                    sTimeSpan = sTimeSpan.Substring (0, 8);
                }
                sceneId = sOidBeginsWith + sTimeSpan;
                sceneId += "0A";
                sceneId += "0A01";
                int maxId = 1;
                Random random = new Random (Guid.NewGuid ().GetHashCode ());
                maxId = random.Next (65535);
                sceneId += (maxId).ToString ("X4");
                sceneId += "0000";
            } catch {
                return sceneId;
            }
            return sceneId;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="curtainStatus"></param>
        /// <returns></returns>
        public static string GetCurtainStatusKey (CurtainStatus curtainStatus) {
            if(curtainStatus == CurtainStatus.Open) {
                return "on";
            } else if (curtainStatus == CurtainStatus.Close) {
                return "off";
            } else if (curtainStatus == CurtainStatus.Stop) {
                return "stop";
            } else {
                return "off";
            }
        }
        #region 生成4位byte 时间戳
        private static long LastTime = 0;
        /// <summary>
        /// DateTime时间格式转换为13位带毫秒的Unix时间戳
        /// </summary>
        /// <param name="time"> DateTime时间格式</param>
        /// <returns>Unix时间戳格式</returns>
        public static long ConvertDateTimeLong ()
        {
            System.DateTime startTime = TimeZoneInfo.ConvertTimeToUtc (new System.DateTime (2020, 1, 1));
            long l = (long)(Math.Round ((DateTime.Now - startTime).TotalMilliseconds, 1) / 10);
            if (l <= LastTime) l = LastTime + 1;
            LastTime = l;
            return l;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="m"></param>
        /// <param name="strTmp"></param>
        /// <returns></returns>
        public static bool ConvertIntToByteArray (long m, ref string strTmp)
        {
            strTmp = "00000000";
            byte [] arry = new byte [4];
            arry [0] = (byte)(m & 0xFF);
            arry [1] = (byte)((m & 0xFF00) >> 8);
            arry [2] = (byte)((m & 0xFF0000) >> 16);
            arry [3] = (byte)((m & 0xFF000000) >> 24);
            strTmp = arry [0].ToString ("X2") + arry [1].ToString ("X2") + arry [2].ToString ("X2") + arry [3].ToString ("X2");
            return true;
        }
        #endregion
        #region ■ Current___________________________
        /// <summary>
        /// 通用方法
@@ -28,11 +116,469 @@
        }
        #endregion
        #region ■ 上传场景列表___________________________
        /// <summary>
        /// 上传场景列表
        /// </summary>
        public bool UploadSecneList ()
        {
            var res = false;
            try {
                //1.加载所有场景并转换
                var allSecneList = GetAllSecneList ();
                var hdlLinkSceneList = new List<HDLLinkScene> ();
                foreach (var sence in allSecneList) {
                    var mHDLLinkScene = GetHDLLinkScene (sence);
                    //1.1成功转换的场景才添加到准备上传列表
                    if(mHDLLinkScene != null && mHDLLinkScene.functions != null && mHDLLinkScene.functions.Count > 0) {
                        hdlLinkSceneList.Add (mHDLLinkScene);
                    }
                }
                //全量同步场景
                res = UploadSceneList (hdlLinkSceneList);
            } catch (Exception ex){
                Utlis.WriteLine ("catch :" + ex.ToString ());
            }
            return res;
        }
        /// <summary>
        /// 获取所有场景列表
        /// </summary>
        /// <returns></returns>
        public List<Scene> GetAllSecneList ()
        {
            List<Scene> targetSceneList = new List<Scene> ();
            //// 找出需要显示的场景
            // 1.全局场景
            var globalSceneFileList = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>> (System.Text.Encoding.UTF8.GetString (IO.FileUtils.ReadFile (Scene.GlobalSceneFilePath)));
            if (globalSceneFileList == null) {
                globalSceneFileList = new List<string> ();
            }
            // 2.房间场景
            List<string> RoomsSceneFileList = new List<string> ();
            foreach (var r in Room.Lists) {
                if (string.IsNullOrEmpty (r.Name)) {
                    continue;
                }
                if (r != null) {
                    RoomsSceneFileList.AddRange (r.SceneFilePathList);
                }
            }
            foreach (var sceneFilePath in globalSceneFileList) {
                var tempScene = Scene.GetSceneByFilePath (sceneFilePath);
                if (tempScene != null) {
                    if (string.IsNullOrEmpty (tempScene.Sid)) {
                        //如果Sid为空,重新生成并保存
                        tempScene.Sid = NewSceneSid ();
                        tempScene.Save (sceneFilePath);
                        Utlis.WriteLine ("生成新的场景id: " + tempScene.Sid);
                    }
                    targetSceneList.Add (tempScene);
                }
            }
            foreach (var roomSceneFilePath in RoomsSceneFileList) {
                var tempScene = Scene.GetSceneByFilePath (roomSceneFilePath);
                if (tempScene != null) {
                    if (string.IsNullOrEmpty (tempScene.Sid)) {
                        //如果Sid为空,重新生成并保存
                        tempScene.Sid = NewSceneSid ();
                        tempScene.Save (roomSceneFilePath);
                        Utlis.WriteLine ("生成新的场景id: " + tempScene.Sid);
                    }
                    targetSceneList.Add (tempScene);
                }
            }
            // 所有场景
            return targetSceneList;
        }
        /// <summary>
        /// 全量同步场景
        /// </summary>
        /// <param name="mScene"></param>
        bool UploadSceneList (List<HDLLinkScene> hdlLinkSceneList)
        {
            var res = false;
            try {
                var revertObj = HttpServerRequest.Current.SecneSyncList (hdlLinkSceneList);
                if (revertObj.Code == StateCode.SUCCESS) {
                    res = true;
                } else {
                    IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
                }
            } catch {
            }
            return res;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="mScene"></param>
        bool UpdateSceneList (List<HDLLinkScene> updateLinkSceneList)
        {
            var res = false;
            try {
                var revertObj = HttpServerRequest.Current.EditScene (updateLinkSceneList);
                if (revertObj.Code == StateCode.SUCCESS) {
                    res = true;
                } else {
                    IMessageCommon.Current.ShowErrorInfoAlter (revertObj.Code);
                }
            } catch {
            }
            return res;
        }
        /// <summary>
        /// 原生协议Scene 转换成 HDLLinkScene数据格式
        /// </summary>
        /// <param name="mScene"></param>
        /// <returns></returns>
        HDLLinkScene GetHDLLinkScene (Scene mScene)
        {
            var mHDLLinkScene = new HDLLinkScene ();
            mHDLLinkScene.sid = mScene.Sid;
            mHDLLinkScene.name = mScene.Name;
            if (UserConfig.Instance.CheckWhetherGatewayIdNotNull ()) {
                mHDLLinkScene.gatewayId = UserConfig.Instance.HomeGateway.gatewayId;
            }
            var functions = new List<SceneFunction> ();
            if (!mScene.busScene) {
                foreach (var deviceFilePath in mScene.DeviceFilePathList) {
                    var jsonInfo = System.Text.Encoding.UTF8.GetString (IO.FileUtils.ReadFile (deviceFilePath));
                    var common = Newtonsoft.Json.JsonConvert.DeserializeObject<Common> (jsonInfo);
                    if (common == null) continue;
                    var function = CommonUtlis.Current.CommonToFunction (common, CommonConfig.Current.FunctionList);
                    if (function == null) continue;
                    if (common.Type == DeviceType.LightDimming) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<LightDimming> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.CurrentBrightness > 0 ? "on" : "off",
                        });
                        //2.Brightness
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Brightness,
                            value = commonNew.CurrentBrightness.ToString(),
                        });
                        //3.Delay
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Delay,
                            value = (commonNew.DelayTimeHeight * 256 + commonNew.DelayTimeLow).ToString (),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                    } else if (common.Type == DeviceType.LightEnergySocket) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<LightEnergySocket> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.CurrentBrightness > 0 ? "on" : "off",
                        });
                        //2.Delay
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Delay,
                            value = (commonNew.DelayTimeHeight * 256 + commonNew.DelayTimeLow).ToString (),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                    } else if (common.Type == DeviceType.LightEnergySwitch) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<LightEnergySwitch> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.CurrentBrightness > 0 ? "on" : "off",
                        });
                        //2.Delay
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Delay,
                            value = (commonNew.DelayTimeHeight * 256 + commonNew.DelayTimeLow).ToString(),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                    } else if (common.Type == DeviceType.LightRGB) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<LightLogic> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.CurrentBrightness > 0 ? "on" : "off",
                        });
                        //2.Brightness
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Brightness,
                            value = commonNew.CurrentBrightness.ToString (),
                        });
                        //3.Delay
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Delay,
                            value = (commonNew.DelayTimeHeigh * 256 + commonNew.DelayTimeLow).ToString (),
                        });
                        //4.rgb
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.RGB,
                            value = commonNew.RStatus + "," + commonNew.GStatus + "," + commonNew.BStatus,
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                        //var device = Newtonsoft.Json.JsonConvert.DeserializeObject<LightLogic> (System.Text.Encoding.UTF8.GetString (IO.FileUtils.ReadFile (deviceFilePath)));
                        ////if (device == null) {
                        ////    mSendCount--;
                        ////    continue;
                        ////}
                        //if (device == null) {
                        //    //replyBytes = new byte [] { 0x00 };
                        //} else {
                        //    var mSceneFunction = new SceneFunction ();
                        //    functions.Add (mSceneFunction);
                        //    replyBytes = Control.ControlBytesSendHasReturn (Command.SetLogicLoopColor, device.SubnetID, device.DeviceID, new byte [] { device.LoopID, device.CurrentBrightness, 254, device.DelayTimeHeigh,device.DelayTimeLow,
                        //                            3,device.RStatus,device.GStatus,device.BStatus,0,0});
                        //}
                    } else if (common.Type == DeviceType.LightSwitch) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<LightSwitch> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.OnOff
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.CurrentBrightness > 0 ? "on" : "off",
                        });
                        //2.Delay
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Delay,
                            value = (commonNew.DelayTimeHeight * 256 + commonNew.DelayTimeLow).ToString (),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                    } else if (common.Type == DeviceType.CurtainModel) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<CurtainModel> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off stop
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = GetCurtainStatusKey(commonNew.Status),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                    } else if (common.Type == DeviceType.CurtainRoller) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<CurtainRoller> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.percent
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Percent,
                            value = commonNew.CurtainProress.ToString(),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                    } else if (common.Type == DeviceType.CurtainTrietex) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<CurtainTrietex> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.percent
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Percent,
                            value = commonNew.CurtainProress.ToString (),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                    } else if (common.Type == DeviceType.HVAC || common.Type == DeviceType.ACInfrared) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<HVAC> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.Power > 0 ? "on" : "off",
                        });
                        //2.mode
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Mode,
                            value = commonNew.SetModeAttribute,
                        });
                        //3.fan
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.FanSpeed,
                            value = commonNew.SetFanSpeedAttribute,
                        });
                        //4.SetTemp
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.SetTemp,
                            value = commonNew.SetTemperature.ToString(),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                        //replyBytes = Control.ControlBytesSendHasReturn (Command.SetACMode, device.SubnetID, device.DeviceID, new byte [] {
                        //                    device.LoopID,
                        //                    device.TemperatureMode,
                        //                    device.IndoorTemperature,
                        //                    device.CoolTemperature,
                        //                    device.HeatTemperature,
                        //                    device.AutoTemperature,
                        //                    device.ChuShiTemperature,
                        //                    device.RealModeAndFanSpeed,
                        //                    device.Power,
                        //                    device.SetMode,
                        //                    device.SetFanSpeed,
                        //                    device.SetTemperature,
                        //                    device.ShaoFanMode});
                    } else if (common.Type == DeviceType.FoolHeat) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<FoolHeat> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.Status > 0 ? "on" : "off",
                        });
                        //2.mode
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.Mode,
                            value = commonNew.SetModeAttribute,
                        });
                        //3.SetTemp
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.SetTemp,
                            value = commonNew.WorkingTemperature.ToString (),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                        //var device = Newtonsoft.Json.JsonConvert.DeserializeObject<FoolHeat> (System.Text.Encoding.UTF8.GetString (IO.FileUtils.ReadFile (deviceFilePath)));
                        ////if (device == null) {
                        ////    mSendCount--;
                        ////    continue;
                        ////}
                        //if (device == null) {
                        //    //replyBytes = new byte [] { 0x00 };
                        //} else {
                        //    var mSceneFunction = new SceneFunction ();
                        //    functions.Add (mSceneFunction);
                            //replyBytes = Control.ControlBytesSendHasReturn (Command.SetFoolHeat, device.SubnetID, device.DeviceID,
                            //                                            new byte [] { device.LoopID, (byte)(device.Status + device.WorkingMode * 16), 0,device.WorkingMode,device.NormalTemperature, device.DayTemperature,
                            //   device.NightTemperature, device.AwayTemperature , 0, 0 });
                        //}
                    } else if (common.Type == DeviceType.FanModule) {
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<FanModule> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.WindSpeed > 0 ? "on" : "off",
                        });
                        //2.FanSpeedPercent
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.FanSpeedPercent,
                            value = commonNew.WindSpeed.ToString(),
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                        //replyBytes = Control.ControlBytesSendHasReturn (Command.SetSingleLight, device.SubnetID, device.DeviceID, new byte [] { device.LoopID, (byte)device.WindSpeed });
                    } else if (common.Type == DeviceType.LogicModule) {
                        //replyBytes = Control.ControlBytesSendHasReturn (Command.SetScene, device.SubnetID, device.DeviceID, new byte [] {
                        //device.AreaID,device.AreaSceneID});
                    } else if (common.Type == DeviceType.UniversalDevice) {//2020-09-02 增加通用开关
                        var commonNew = Newtonsoft.Json.JsonConvert.DeserializeObject<UniversalDevice> (jsonInfo);
                        var mSceneFunction = new SceneFunction ();
                        mSceneFunction.sid = function.sid;
                        //1.on_off
                        var status = new List<SceneFunctionStatus> ();
                        status.Add (new SceneFunctionStatus () {
                            key = FunctionAttributeKey.OnOff,
                            value = commonNew.SendBytes [1] > 0 ? "on" : "off",
                        });
                        mSceneFunction.status = status;
                        functions.Add (mSceneFunction);
                        //replyBytes = Control.ControlBytesSendHasReturn (Command.SetCommonSwitch, device.SubnetID, device.DeviceID, new byte [] { device.SendBytes [0], device.SendBytes [1] });
                    }
                }
            } else {
            }
            mHDLLinkScene.functions = functions;
            return mHDLLinkScene;
        }
        #endregion
        #region ■ 上传设备列表___________________________
        /// <summary>
        /// 上传设备列表
        /// </summary>
        /// <returns></returns>
        public bool UploadOidAndSidList ()
@@ -70,87 +616,7 @@
            List<Common> TargetList = new List<Common> ();
            //找出需要显示的设备
            var filesList = FileUtils.ReadFiles ().FindAll ((obj) => {
                string [] str = obj.Split ('_');
                return obj.StartsWith ("Equipment_") && str.Length == 5;
            });
            var localEquipments = filesList.FindAll ((obj) => {
                string typeString = obj.Split ('_') [1];
                return (
                #region light
                    typeString.ToString () == DeviceType.LightCCT.ToString () ||
                typeString.ToString () == DeviceType.LightRGB.ToString () ||
                typeString.ToString () == DeviceType.LightDALI.ToString () ||
                typeString.ToString () == DeviceType.LightRGBW.ToString () ||
                typeString.ToString () == DeviceType.LightLogic.ToString () ||
                typeString.ToString () == DeviceType.LightSwitch.ToString () ||
                typeString.ToString () == DeviceType.LightDimming.ToString () ||
                typeString.ToString () == DeviceType.LightMixSwitch.ToString () ||
                typeString.ToString () == DeviceType.LightRGBandCCT.ToString () ||
                typeString.ToString () == DeviceType.LightMixDimming.ToString () ||
                typeString.ToString () == DeviceType.LightEnergySwitch.ToString () ||
                typeString.ToString () == DeviceType.LightEnergySocket.ToString () ||
                typeString.ToString () == DeviceType.LightSwitchSocket.ToString ()
                || typeString.ToString () == DeviceType.DMX48.ToString ()
                #endregion
                #region light
                    || typeString.ToString () == DeviceType.SensorCH4.ToString () ||
                typeString.ToString () == DeviceType.SensorCO2.ToString () ||
                typeString.ToString () == DeviceType.SensorLPG.ToString () ||
                typeString.ToString () == DeviceType.SensorCOH2.ToString () ||
                typeString.ToString () == DeviceType.SensorPM25.ToString () ||
                typeString.ToString () == DeviceType.SensorTVOC.ToString () ||
                typeString.ToString () == DeviceType.SensorPower.ToString () ||
                typeString.ToString () == DeviceType.SensorSmoke.ToString () ||
                typeString.ToString () == DeviceType.SensorWater.ToString () ||
                typeString.ToString () == DeviceType.SensorWeight.ToString () ||
                typeString.ToString () == DeviceType.SensorCurrent.ToString () ||
                typeString.ToString () == DeviceType.SensorVoltage.ToString ()
                || typeString.ToString () == DeviceType.SensorRainfall.ToString ()
                || typeString.ToString () == DeviceType.SensorVelocity.ToString ()
                || typeString.ToString () == DeviceType.SensorMenciAndwindowMagnetic.ToString ()
                || typeString.ToString () == DeviceType.SensorMobileDetection.ToString ()
                || typeString.ToString () == DeviceType.SensorLiquidPressure.ToString ()
                || typeString.ToString () == DeviceType.SensorVibration.ToString ()
                || typeString.ToString () == DeviceType.SensorLiquidFlow.ToString ()
                || typeString.ToString () == DeviceType.SensorLiquidDepth.ToString ()
                || typeString.ToString () == DeviceType.SensorTemperature.ToString ()
                || typeString.ToString () == DeviceType.SensorHeightLength.ToString ()
                || typeString.ToString () == DeviceType.SensorIllumination.ToString ()
                || typeString.ToString () == DeviceType.SensorWindPressure.ToString ()
                || typeString.ToString () == DeviceType.SensorHumidity.ToString ()
                #endregion
                #region curtain
                    || typeString.ToString () == DeviceType.CurtainModel.ToString ()
                || typeString.ToString () == DeviceType.CurtainRoller.ToString ()
                || typeString.ToString () == DeviceType.CurtainTrietex.ToString ()
                #endregion
                #region ac
                    || typeString.ToString () == DeviceType.ACPanel.ToString ()
                || typeString.ToString () == DeviceType.ACDevice.ToString ()
                || typeString.ToString () == DeviceType.ACInfrared.ToString ()
                || typeString.ToString () == DeviceType.ACCoolmaster.ToString ()
                || typeString.ToString () == DeviceType.CustomAC.ToString ()
                || typeString.ToString () == DeviceType.HVAC.ToString ()
                #endregion
                #region foolheat
                    || typeString.ToString () == DeviceType.FoolHeat.ToString ()
                || typeString.ToString () == DeviceType.FoolHeatPanel.ToString ()
                #endregion
                #region
                    || typeString.ToString () == DeviceType.InfraredMode.ToString ()
                || typeString.ToString () == DeviceType.DoorLock.ToString ()
                || typeString.ToString () == DeviceType.FanModule.ToString ()
                || typeString.ToString () == DeviceType.FreshAir.ToString ()
                || typeString.ToString () == DeviceType.InfraredTV.ToString ()
                || typeString.ToString () == DeviceType.UniversalDevice.ToString ()
                || typeString.ToString () == DeviceType.MusicModel.ToString ()
                || typeString.ToString () == DeviceType.SecurityModule.ToString ()
                || typeString.ToString () == DeviceType.LogicModule.ToString ()
                || typeString.ToString () == DeviceType.SecurityPanel.ToString ()
                #endregion
                    );
            });
            var localEquipments = CommonUtlis.Current.GetAllLocalEquipments ();
            foreach (string deviceFilePath in localEquipments) {
                try {
@@ -265,7 +731,7 @@
                        Oid tmpOid = new Oid ();
                        tmpOid.protocolType = "bus";
                        tmpOid.device_name = tmp.Type.ToString ();
                        tmpOid.oid = FormingNewOid (tmp.Type);
                        tmpOid.oid = FormingNewOid (tmp);
                        tmpOid.addresses = addresses;
                        tmpOid.device_model = tmp.Type.ToString ();
                        tmpOid.fw_version = "";
@@ -276,11 +742,11 @@
                        functionLists.AddRange (ConvertToSidListToIotCloud (tmpOid.oid, tmp));
                        Utlis.WriteLine ("新的模块,新的的OID:" + tmpOid.addresses + " deviceType:" + tmpOid.deviceType);
                        //Utlis.WriteLine ("新的模块,新的的OID:" + tmpOid.addresses + " deviceType:" + tmpOid.deviceType);
                    } else {
                        //3.2存在则取之前的oid 
                        functionLists.AddRange (ConvertToSidListToIotCloud (deviceOid.oid, tmp));
                        Utlis.WriteLine ("相同的模块,取之前的OID:" + deviceOid.addresses + " deviceType:" + deviceOid.deviceType);
                        //Utlis.WriteLine ("相同的模块,取之前的OID:" + deviceOid.addresses + " deviceType:" + deviceOid.deviceType);
                    }
                }
@@ -339,23 +805,30 @@
        /// <summary>
        /// 生成设备Oid
        /// </summary>
        /// <param name="iDeviceType"></param>
        /// <param name="common"></param>
        /// <returns></returns>
        public string FormingNewOid (DeviceType deviceType)
        public string FormingNewOid (Common common)
        {
            string sOid = "";
            try {
                //1.生成 厂商 + 通讯方式 
                string sOidBeginsWith = "000101";//厂商 + 通讯方式
                //2.生成产品时间戳
                long sTimeSp = ConvertDateTimeLong (); //以2020年1月1日算出的时间戳0.1s为单位
                //****************************
                ////2.生成产品时间戳
                //long sTimeSp = ConvertDateTimeLong (); //以2020年1月1日算出的时间戳0.1s为单位
                //string sTimeSpan = "";
                //ConvertIntToByteArray (sTimeSp, ref sTimeSpan);
                //if (sTimeSpan.Length != 8) return sOid;
                ////延迟10ms
                //2.方案二:生成产品时间戳(云端不解析)印度APP把当前位置改为(子网号、设备号、大类小类)表示,保证设备在子网号设备号不变的情况下 oid生成也不变
                string sTimeSpan = "";
                ConvertIntToByteArray (sTimeSp, ref sTimeSpan);
                if (sTimeSpan.Length != 8) return sOid;
                //延迟10ms
                sTimeSpan = common.SubnetID.ToString ("X2") + common.DeviceID.ToString ("X2") + common.DeviceTypeString;
                //****************************
                //3.生成产品类别
                var productType = GetProductType (deviceType);
                var productType = GetProductType (common.Type);
                sOid = sOidBeginsWith + sTimeSpan + productType;
                return sOid;
@@ -550,7 +1023,7 @@
                //2.通道号
                string loopIDStr = loopCommon.LoopID.ToString ("X4");
                //3.大小类别
                string bigMinStr = loopCommon.BigClass.ToString ("X2") + loopCommon.MinClass.ToString ("X2");
                string bigMinStr = loopCommon.DeviceTypeString;
                //4.拼接
                sSid = sOid + mPhysicalModelType + loopIDStr + bigMinStr;
                return sSid;
@@ -579,82 +1052,137 @@
                tmp.oid = sOid;
                tmp.sid = sSid;
                tmp.name = loopCommon.Name;
                tmp.attributes = new List<FunctionSid> ();
                tmp.attributes = new List<Attribute> ();
                tmp.omodel = loopCommon.Type.ToString ();
                //继电器开关类
                if (loopCommon.Type == DeviceType.LightSwitch
                    || loopCommon.Type == DeviceType.LightEnergySwitch
                    || loopCommon.Type == DeviceType.LightEnergySocket
                    || loopCommon.Type == DeviceType.LightSwitchSocket
                    || loopCommon.Type == DeviceType.LightMixSwitch) {
                    tmp.spk = "light.switch";
                if (loopCommon.Type == DeviceType.UniversalDevice) {
                    //通用开关
                    tmp.spk = SPK.UniversalDevice;
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                }else if (loopCommon.Type == DeviceType.FanModule ) {
                    //风扇
                    tmp.spk = SPK.ElectricFan;
                    #region on_off
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                    #region volume_level
                    Attribute tempSpeedAttribute = new Attribute ();
                    tempSpeedAttribute.key = FunctionAttributeKey.FanSpeedPercent;
                    tempSpeedAttribute.data_type = "integer";
                    tempSpeedAttribute.value = new List<string> ();
                    tempSpeedAttribute.max = 8;
                    tempSpeedAttribute.min = 0;
                    tmp.attributes.Add (tempSpeedAttribute);
                    #endregion
                } else if (loopCommon.Type == DeviceType.LightSwitch
                    || loopCommon.Type == DeviceType.LightEnergySwitch
                    || loopCommon.Type == DeviceType.LightMixSwitch) {
                    //继电器开关类
                    tmp.spk = SPK.LightSwitch;
                    #region on_off
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                }else if (loopCommon.Type == DeviceType.LightEnergySocket
                    || loopCommon.Type == DeviceType.LightSwitchSocket) {
                    //电器 插座
                    tmp.spk = SPK.ElectricSocket;
                    #region on_off
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                } else if (loopCommon.Type == DeviceType.LightDimming
                    || loopCommon.Type == DeviceType.LightCCT
                    || loopCommon.Type == DeviceType.LightDALI) {
                    //调光类
                    tmp.spk = "light.dimming";
                    //tmp.spk = "light.dimming";
                    tmp.spk = SPK.LightDimming;
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                    #region brightness
                    FunctionSid tempFunction1 = new FunctionSid ();
                    tempFunction1.key = "brightness";
                    tempFunction1.data_type = "integer";
                    tempFunction1.value = new List<string> ();
                    Attribute tempAttribute1 = new Attribute ();
                    tempAttribute1.key = "brightness";
                    tempAttribute1.data_type = "integer";
                    tempAttribute1.value = new List<string> ();
                    tempFunction1.max = 100;
                    tempFunction1.min = 0;
                    tmp.attributes.Add (tempFunction1);
                    tempAttribute1.max = 100;
                    tempAttribute1.min = 0;
                    tmp.attributes.Add (tempAttribute1);
                    #endregion
                    #region fade_time
                    FunctionSid tempFunction3 = new FunctionSid ();
                    tempFunction3.key = "fade_time";
                    tempFunction3.data_type = "integer";
                    tempFunction3.value = new List<string> ();
                    //tempFunction1.value.Add("percent");
                    Attribute tempAttribute3 = new Attribute ();
                    tempAttribute3.key = "fade_time";
                    tempAttribute3.data_type = "integer";
                    tempAttribute3.value = new List<string> ();
                    //tempAttribute1.value.Add("percent");
                    //for (int iPercent = 0; iPercent <= 100; iPercent++)
                    //{
                    //    tempFunction1.value.Add(iPercent.ToString());
                    //    tempAttribute1.value.Add(iPercent.ToString());
                    //}
                    tempFunction3.max = 100;
                    tempFunction3.min = 0;
                    tmp.attributes.Add (tempFunction3);
                    tempAttribute3.max = 100;
                    tempAttribute3.min = 0;
                    tmp.attributes.Add (tempAttribute3);
                    #endregion
                    if (loopCommon.Type == DeviceType.LightCCT || loopCommon.Type == DeviceType.LightDALI)//色温类别
                    {
                        tmp.spk = "light.cct";
                        //tmp.spk = "light.cct";
                        tmp.spk = SPK.LightCCT;
                        #region cct
                        FunctionSid tempFunction2 = new FunctionSid ();
                        tempFunction2.key = "cct";
                        tempFunction2.data_type = "integer";
                        tempFunction2.value = new List<string> ();
                        //tempFunction2.value.Add("warm light ");
                        //tempFunction2.value.Add("cold light ");
                        tempFunction2.max = 65535;
                        tempFunction2.min = 0;
                        tmp.attributes.Add (tempFunction2);
                        Attribute tempAttribute2 = new Attribute ();
                        tempAttribute2.key = "cct";
                        tempAttribute2.data_type = "integer";
                        tempAttribute2.value = new List<string> ();
                        //tempAttribute2.value.Add("warm light ");
                        //tempAttribute2.value.Add("cold light ");
                        tempAttribute2.max = 65535;
                        tempAttribute2.min = 0;
                        tmp.attributes.Add (tempAttribute2);
                        #endregion
                    }
                } else if (loopCommon.Type == DeviceType.LightRGB
@@ -663,98 +1191,102 @@
                    || loopCommon.Type == DeviceType.LightRGBandCCT
                    || loopCommon.Type == DeviceType.DMX48) {
                    tmp.spk = "light.rgb";
                    tmp.spk = SPK.LightRGB;
                    //tmp.spk = "light.rgb";
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                    #region brightness
                    FunctionSid tempFunction2 = new FunctionSid ();
                    tempFunction2.key = "brightness";
                    tempFunction2.data_type = "integer";
                    tempFunction2.value = new List<string> ();
                    tempFunction2.max = 100;
                    tempFunction2.min = 0;
                    tmp.attributes.Add (tempFunction2);
                    Attribute tempAttribute2 = new Attribute ();
                    tempAttribute2.key = "brightness";
                    tempAttribute2.data_type = "integer";
                    tempAttribute2.value = new List<string> ();
                    tempAttribute2.max = 100;
                    tempAttribute2.min = 0;
                    tmp.attributes.Add (tempAttribute2);
                    #endregion
                    if (loopCommon.Type == DeviceType.LightRGBW) {
                        tmp.spk = "light.rgbw";
                        //tmp.spk = "light.rgbw";
                        tmp.spk = SPK.LightRGBW;
                        #region color
                        FunctionSid tempFunction3 = new FunctionSid ();
                        tempFunction3.key = "rgb";
                        tempFunction3.data_type = "integer";
                        tempFunction3.value = new List<string> ();
                        //tempFunction2.value.Add("red");
                        //tempFunction2.value.Add("green");
                        //tempFunction2.value.Add("blue");
                        tempFunction3.max = 255;
                        tempFunction3.min = 0;
                        tmp.attributes.Add (tempFunction3);
                        Attribute tempAttribute3 = new Attribute ();
                        tempAttribute3.key = "rgb";
                        tempAttribute3.data_type = "integer";
                        tempAttribute3.value = new List<string> ();
                        //tempAttribute2.value.Add("red");
                        //tempAttribute2.value.Add("green");
                        //tempAttribute2.value.Add("blue");
                        tempAttribute3.max = 255;
                        tempAttribute3.min = 0;
                        tmp.attributes.Add (tempAttribute3);
                        #endregion
                    } else {
                        #region color
                        FunctionSid tempFunction3 = new FunctionSid ();
                        tempFunction3.key = "rgb";
                        tempFunction3.data_type = "integer";
                        tempFunction3.value = new List<string> ();
                        tempFunction3.min = 0;
                        tmp.attributes.Add (tempFunction3);
                        Attribute tempAttribute3 = new Attribute ();
                        tempAttribute3.key = "rgb";
                        tempAttribute3.data_type = "integer";
                        tempAttribute3.value = new List<string> ();
                        tempAttribute3.min = 0;
                        tmp.attributes.Add (tempAttribute3);
                        #endregion
                    }
                    if (loopCommon.Type == DeviceType.LightRGBandCCT) {
                        #region CCT
                        FunctionSid tempFunctionCCT = new FunctionSid ();
                        tempFunctionCCT.key = "cct";
                        tempFunctionCCT.data_type = "integer";
                        tempFunctionCCT.value = new List<string> ();
                        //tempFunction2.value.Add("red");
                        //tempFunction2.value.Add("green");
                        //tempFunction2.value.Add("blue");
                        tempFunctionCCT.max = 65535;
                        tempFunctionCCT.min = 0;
                        tmp.attributes.Add (tempFunctionCCT);
                        Attribute tempAttributeCCT = new Attribute ();
                        tempAttributeCCT.key = "cct";
                        tempAttributeCCT.data_type = "integer";
                        tempAttributeCCT.value = new List<string> ();
                        //tempAttribute2.value.Add("red");
                        //tempAttribute2.value.Add("green");
                        //tempAttribute2.value.Add("blue");
                        tempAttributeCCT.max = 65535;
                        tempAttributeCCT.min = 0;
                        tmp.attributes.Add (tempAttributeCCT);
                        #endregion
                    }
                } else if (loopCommon.Type == DeviceType.CurtainModel || loopCommon.Type == DeviceType.CurtainRoller || loopCommon.Type == DeviceType.CurtainTrietex) {
                    tmp.spk = "curtain.switch";
                    //tmp.spk = "curtain.switch";
                    tmp.spk = SPK.CurtainSwitch;
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.value.Add ("stop");
                    tempFunction.max = 2;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.value.Add ("stop");
                    tempAttribute.max = 2;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                    if (loopCommon.Type == DeviceType.CurtainRoller || loopCommon.Type == DeviceType.CurtainTrietex)//所有卷帘控制器 
                    {
                        tmp.spk = "curtain.trietex";
                        tmp.spk = SPK.CurtainTrietex;
                        //tmp.spk = "curtain.trietex";
                        #region openlevel
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "percent";
                        tempFunction1.data_type = "integer";
                        tempFunction1.value = new List<string> ();
                        //tempFunction1.value.Add("percent");
                        tempFunction1.max = 100;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "percent";
                        tempAttribute1.data_type = "integer";
                        tempAttribute1.value = new List<string> ();
                        //tempAttribute1.value.Add("percent");
                        tempAttribute1.max = 100;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                    }
                } else if (loopCommon.Type == DeviceType.ACPanel
@@ -765,103 +1297,104 @@
                   || loopCommon.Type == DeviceType.HVAC) {
                    //空调类
                    tmp.spk = "ac.standard";
                    tmp.spk = SPK.AcStandard;
                    //tmp.spk = "ac.standard";
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                    #region mode
                    FunctionSid tempFunction1 = new FunctionSid ();
                    tempFunction1.key = "mode";
                    tempFunction1.data_type = "integer";
                    tempFunction1.value = new List<string> ();
                    tempFunction1.value.Add ("cool");
                    tempFunction1.value.Add ("heat");
                    tempFunction1.value.Add ("fan");
                    tempFunction1.value.Add ("auto");
                    tempFunction1.value.Add ("dry");
                    Attribute tempAttribute1 = new Attribute ();
                    tempAttribute1.key = "mode";
                    tempAttribute1.data_type = "integer";
                    tempAttribute1.value = new List<string> ();
                    tempAttribute1.value.Add ("cool");
                    tempAttribute1.value.Add ("heat");
                    tempAttribute1.value.Add ("fan");
                    tempAttribute1.value.Add ("auto");
                    tempAttribute1.value.Add ("dry");
                    tempFunction1.max = 4;
                    tempFunction1.min = 0;
                    tmp.attributes.Add (tempFunction1);
                    tempAttribute1.max = 4;
                    tempAttribute1.min = 0;
                    tmp.attributes.Add (tempAttribute1);
                    #endregion
                    #region fan
                    FunctionSid tempFunction2 = new FunctionSid ();
                    tempFunction2.key = "fan";
                    tempFunction2.data_type = "integer";
                    tempFunction2.value = new List<string> ();
                    tempFunction2.value.Add ("high");
                    tempFunction2.value.Add ("medium");
                    tempFunction2.value.Add ("low");
                    tempFunction2.value.Add ("auto");
                    tempFunction2.max = 3;
                    tempFunction2.min = 0;
                    tmp.attributes.Add (tempFunction2);
                    Attribute tempAttribute2 = new Attribute ();
                    tempAttribute2.key = "fan";
                    tempAttribute2.data_type = "integer";
                    tempAttribute2.value = new List<string> ();
                    tempAttribute2.value.Add ("high");
                    tempAttribute2.value.Add ("medium");
                    tempAttribute2.value.Add ("low");
                    tempAttribute2.value.Add ("auto");
                    tempAttribute2.max = 3;
                    tempAttribute2.min = 0;
                    tmp.attributes.Add (tempAttribute2);
                    #endregion
                    #region temp
                    FunctionSid tempFunction3 = new FunctionSid ();
                    tempFunction3.key = "set_temp";
                    Attribute tempAttribute3 = new Attribute ();
                    tempAttribute3.key = "set_temp";
                    //2020 08 11  hvac 温度控制 1°-> int 0.5°->float
                    //if (HVACModuleDeviceTypeList.HDLHVACwithAcControlHighPrecision.Contains(DevOnLineTmp.DeviceType))
                    //{
                    //20201224 设置温度数据类型统一float 伟南后续ai+数据类型网关处理
                    tempFunction3.data_type = "float";
                    tempAttribute3.data_type = "float";
                    //}
                    //else
                    //{
                    //    tempFunction3.data_type = "integer";
                    //    tempAttribute3.data_type = "integer";
                    //}
                    tempFunction3.value = new List<string> ();
                    tempFunction3.max = 30;
                    tempFunction3.min = 16;
                    tmp.attributes.Add (tempFunction3);
                    tempAttribute3.value = new List<string> ();
                    tempAttribute3.max = 30;
                    tempAttribute3.min = 16;
                    tmp.attributes.Add (tempAttribute3);
                    #endregion
                    #region temp_step
                    FunctionSid tempFunction5 = new FunctionSid ();
                    tempFunction5.key = "set_temp_step";
                    tempFunction5.data_type = "string";
                    tempFunction5.value = new List<string> ();
                    tempFunction5.value.Add ("up");
                    tempFunction5.value.Add ("down");
                    tempFunction5.max = 1;
                    tempFunction5.min = 0;
                    tmp.attributes.Add (tempFunction5);
                    Attribute tempAttribute5 = new Attribute ();
                    tempAttribute5.key = "set_temp_step";
                    tempAttribute5.data_type = "string";
                    tempAttribute5.value = new List<string> ();
                    tempAttribute5.value.Add ("up");
                    tempAttribute5.value.Add ("down");
                    tempAttribute5.max = 1;
                    tempAttribute5.min = 0;
                    tmp.attributes.Add (tempAttribute5);
                    #endregion
                    #region room_temp
                    FunctionSid tempFunction6 = new FunctionSid ();
                    tempFunction6.key = "room_temp";
                    tempFunction6.data_type = "float";
                    tempFunction6.value = new List<string> ();
                    tempFunction6.max = 50;
                    tempFunction6.min = -50;
                    tmp.attributes.Add (tempFunction6);
                    Attribute tempAttribute6 = new Attribute ();
                    tempAttribute6.key = "room_temp";
                    tempAttribute6.data_type = "float";
                    tempAttribute6.value = new List<string> ();
                    tempAttribute6.max = 50;
                    tempAttribute6.min = -50;
                    tmp.attributes.Add (tempAttribute6);
                    #endregion
                    #region swing
                    FunctionSid tempFunction4 = new FunctionSid ();
                    tempFunction4.key = "swing";
                    tempFunction4.data_type = "string";
                    tempFunction4.value = new List<string> ();
                    tempFunction4.value.Add ("up_down");
                    //tempFunction4.value.Add("down");
                    tempFunction4.value.Add ("left_right");
                    //tempFunction4.value.Add("right");
                    tempFunction4.value.Add ("stop");
                    tempFunction4.max = 3;
                    tempFunction4.min = 0;
                    tmp.attributes.Add (tempFunction4);
                    Attribute tempAttribute4 = new Attribute ();
                    tempAttribute4.key = "swing";
                    tempAttribute4.data_type = "string";
                    tempAttribute4.value = new List<string> ();
                    tempAttribute4.value.Add ("up_down");
                    //tempAttribute4.value.Add("down");
                    tempAttribute4.value.Add ("left_right");
                    //tempAttribute4.value.Add("right");
                    tempAttribute4.value.Add ("stop");
                    tempAttribute4.max = 3;
                    tempAttribute4.min = 0;
                    tmp.attributes.Add (tempAttribute4);
                    #endregion
                    #region lock
@@ -870,67 +1403,68 @@
                    #endregion
                } else if (loopCommon.Type == DeviceType.FoolHeat
                    || loopCommon.Type == DeviceType.FoolHeatPanel) {
                    tmp.spk = "floorHeat.standard";
                    tmp.spk = SPK.FloorHeatStandard;
                    //tmp.spk = "floorHeat.standard";
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                    #region mode
                    FunctionSid tempFunction1 = new FunctionSid ();
                    tempFunction1.key = "mode";
                    tempFunction1.data_type = "string";
                    tempFunction1.value = new List<string> ();
                    tempFunction1.value.Add ("day");
                    tempFunction1.value.Add ("night");
                    tempFunction1.value.Add ("away");
                    tempFunction1.value.Add ("normal");
                    tempFunction1.value.Add ("timer");
                    tempFunction1.max = 4;
                    tempFunction1.min = 0;
                    tmp.attributes.Add (tempFunction1);
                    Attribute tempAttribute1 = new Attribute ();
                    tempAttribute1.key = "mode";
                    tempAttribute1.data_type = "string";
                    tempAttribute1.value = new List<string> ();
                    tempAttribute1.value.Add ("day");
                    tempAttribute1.value.Add ("night");
                    tempAttribute1.value.Add ("away");
                    tempAttribute1.value.Add ("normal");
                    tempAttribute1.value.Add ("timer");
                    tempAttribute1.max = 4;
                    tempAttribute1.min = 0;
                    tmp.attributes.Add (tempAttribute1);
                    #endregion
                    #region temp
                    FunctionSid tempFunction3 = new FunctionSid ();
                    tempFunction3.key = "set_temp";
                    tempFunction3.data_type = "float";
                    tempFunction3.value = new List<string> ();
                    //tempFunction3.value.Add("up");
                    //tempFunction3.value.Add("down");
                    //tempFunction3.value.Add("value");
                    tempFunction3.max = 35;
                    tempFunction3.min = 0;
                    tmp.attributes.Add (tempFunction3);
                    Attribute tempAttribute3 = new Attribute ();
                    tempAttribute3.key = "set_temp";
                    tempAttribute3.data_type = "float";
                    tempAttribute3.value = new List<string> ();
                    //tempAttribute3.value.Add("up");
                    //tempAttribute3.value.Add("down");
                    //tempAttribute3.value.Add("value");
                    tempAttribute3.max = 35;
                    tempAttribute3.min = 0;
                    tmp.attributes.Add (tempAttribute3);
                    #endregion
                    #region temp
                    FunctionSid tempFunction4 = new FunctionSid ();
                    tempFunction4.key = "set_temp_step";
                    tempFunction4.data_type = "string";
                    tempFunction4.value = new List<string> ();
                    tempFunction4.value.Add ("up");
                    tempFunction4.value.Add ("down");
                    tempFunction4.max = 1;
                    tempFunction4.min = 0;
                    tmp.attributes.Add (tempFunction4);
                    Attribute tempAttribute4 = new Attribute ();
                    tempAttribute4.key = "set_temp_step";
                    tempAttribute4.data_type = "string";
                    tempAttribute4.value = new List<string> ();
                    tempAttribute4.value.Add ("up");
                    tempAttribute4.value.Add ("down");
                    tempAttribute4.max = 1;
                    tempAttribute4.min = 0;
                    tmp.attributes.Add (tempAttribute4);
                    #endregion
                    #region room_temp
                    FunctionSid tempFunction5 = new FunctionSid ();
                    tempFunction5.key = "room_temp";
                    tempFunction5.data_type = "float";
                    tempFunction5.value = new List<string> ();
                    tempFunction5.max = 50;
                    tempFunction5.min = -50;
                    tmp.attributes.Add (tempFunction5);
                    Attribute tempAttribute5 = new Attribute ();
                    tempAttribute5.key = "room_temp";
                    tempAttribute5.data_type = "float";
                    tempAttribute5.value = new List<string> ();
                    tempAttribute5.max = 50;
                    tempAttribute5.min = -50;
                    tmp.attributes.Add (tempAttribute5);
                    #endregion
                    #region lock
@@ -940,458 +1474,467 @@
                } else if (loopCommon.Type == DeviceType.MusicA31
                    || loopCommon.Type == DeviceType.MusicModel
                    || loopCommon.Type == DeviceType.MusicPanel) {
                    tmp.spk = "music.standard";
                    tmp.spk = SPK.MusicStandard;
                    //tmp.spk = "music.standard";
                    // on_off  volume song_step  audio  list_channel  mode  song_num  special_song  volume_level
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("play");
                    tempFunction.value.Add ("pause");
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("play");
                    tempAttribute.value.Add ("pause");
                    //tempFunction.value.Add("play");
                    //tempFunction.value.Add("stop");
                    //tempFunction.value.Add("pause");
                    //tempAttribute.value.Add("play");
                    //tempAttribute.value.Add("stop");
                    //tempAttribute.value.Add("pause");
                    //play stop pause
                    tempFunction.max = 2;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    tempAttribute.max = 2;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                    #region volume
                    FunctionSid tempFunction1 = new FunctionSid ();
                    tempFunction1.key = "volume";
                    tempFunction1.data_type = "integer";
                    tempFunction1.value = new List<string> ();
                    //tempFunction1.value.Add("percent");
                    tempFunction1.max = 100;
                    tempFunction1.min = 0;
                    tmp.attributes.Add (tempFunction1);
                    Attribute tempAttribute1 = new Attribute ();
                    tempAttribute1.key = "volume";
                    tempAttribute1.data_type = "integer";
                    tempAttribute1.value = new List<string> ();
                    //tempAttribute1.value.Add("percent");
                    tempAttribute1.max = 100;
                    tempAttribute1.min = 0;
                    tmp.attributes.Add (tempAttribute1);
                    #endregion
                    #region volume_step
                    FunctionSid tempFunction9 = new FunctionSid ();
                    tempFunction9.key = "volume_step";
                    tempFunction9.data_type = "string";
                    tempFunction9.value = new List<string> ();
                    tempFunction9.value.Add ("up");
                    tempFunction9.value.Add ("down");
                    tempFunction9.max = 1;
                    tempFunction9.min = 0;
                    tmp.attributes.Add (tempFunction9);
                    Attribute tempAttribute9 = new Attribute ();
                    tempAttribute9.key = "volume_step";
                    tempAttribute9.data_type = "string";
                    tempAttribute9.value = new List<string> ();
                    tempAttribute9.value.Add ("up");
                    tempAttribute9.value.Add ("down");
                    tempAttribute9.max = 1;
                    tempAttribute9.min = 0;
                    tmp.attributes.Add (tempAttribute9);
                    #endregion
                    #region volume_level
                    FunctionSid tempFunction10 = new FunctionSid ();
                    tempFunction10.key = "volume_level";
                    tempFunction10.data_type = "integer";
                    tempFunction10.value = new List<string> ();
                    //tempFunction1.value.Add("percent");
                    tempFunction10.max = 10;
                    tempFunction10.min = 0;
                    tmp.attributes.Add (tempFunction10);
                    Attribute tempAttribute10 = new Attribute ();
                    tempAttribute10.key = "volume_level";
                    tempAttribute10.data_type = "integer";
                    tempAttribute10.value = new List<string> ();
                    //tempAttribute1.value.Add("percent");
                    tempAttribute10.max = 10;
                    tempAttribute10.min = 0;
                    tmp.attributes.Add (tempAttribute10);
                    #endregion
                    #region volume_level_step
                    FunctionSid tempFunction11 = new FunctionSid ();
                    tempFunction11.key = "volume_level_step";
                    tempFunction11.data_type = "string";
                    tempFunction11.value = new List<string> ();
                    tempFunction11.value.Add ("up");
                    tempFunction11.value.Add ("down");
                    tempFunction11.max = 1;
                    tempFunction11.min = 0;
                    tmp.attributes.Add (tempFunction11);
                    Attribute tempAttribute11 = new Attribute ();
                    tempAttribute11.key = "volume_level_step";
                    tempAttribute11.data_type = "string";
                    tempAttribute11.value = new List<string> ();
                    tempAttribute11.value.Add ("up");
                    tempAttribute11.value.Add ("down");
                    tempAttribute11.max = 1;
                    tempAttribute11.min = 0;
                    tmp.attributes.Add (tempAttribute11);
                    #endregion
                    #region treble
                    FunctionSid tempFunction14 = new FunctionSid ();
                    tempFunction14.key = "treble";
                    tempFunction14.data_type = "integer";
                    tempFunction14.max = 10;
                    tempFunction14.min = -10;
                    tmp.attributes.Add (tempFunction14);
                    Attribute tempAttribute14 = new Attribute ();
                    tempAttribute14.key = "treble";
                    tempAttribute14.data_type = "integer";
                    tempAttribute14.max = 10;
                    tempAttribute14.min = -10;
                    tmp.attributes.Add (tempAttribute14);
                    #endregion
                    #region treble_step
                    FunctionSid tempFunction12 = new FunctionSid ();
                    tempFunction12.key = "treble_step";
                    tempFunction12.data_type = "string";
                    tempFunction12.value = new List<string> ();
                    tempFunction12.value.Add ("up");
                    tempFunction12.value.Add ("down");
                    tempFunction12.max = 1;
                    tempFunction12.min = 0;
                    tmp.attributes.Add (tempFunction12);
                    Attribute tempAttribute12 = new Attribute ();
                    tempAttribute12.key = "treble_step";
                    tempAttribute12.data_type = "string";
                    tempAttribute12.value = new List<string> ();
                    tempAttribute12.value.Add ("up");
                    tempAttribute12.value.Add ("down");
                    tempAttribute12.max = 1;
                    tempAttribute12.min = 0;
                    tmp.attributes.Add (tempAttribute12);
                    #endregion
                    #region bass
                    FunctionSid tempFunction15 = new FunctionSid ();
                    tempFunction15.key = "bass";
                    tempFunction15.data_type = "integer";
                    tempFunction15.max = 10;
                    tempFunction15.min = -10;
                    tmp.attributes.Add (tempFunction15);
                    Attribute tempAttribute15 = new Attribute ();
                    tempAttribute15.key = "bass";
                    tempAttribute15.data_type = "integer";
                    tempAttribute15.max = 10;
                    tempAttribute15.min = -10;
                    tmp.attributes.Add (tempAttribute15);
                    #endregion
                    #region bass_step
                    FunctionSid tempFunction13 = new FunctionSid ();
                    tempFunction13.key = "bass_step";
                    tempFunction13.data_type = "string";
                    tempFunction13.value = new List<string> ();
                    tempFunction13.value.Add ("up");
                    tempFunction13.value.Add ("down");
                    tempFunction13.max = 1;
                    tempFunction13.min = 0;
                    tmp.attributes.Add (tempFunction13);
                    Attribute tempAttribute13 = new Attribute ();
                    tempAttribute13.key = "bass_step";
                    tempAttribute13.data_type = "string";
                    tempAttribute13.value = new List<string> ();
                    tempAttribute13.value.Add ("up");
                    tempAttribute13.value.Add ("down");
                    tempAttribute13.max = 1;
                    tempAttribute13.min = 0;
                    tmp.attributes.Add (tempAttribute13);
                    #endregion
                    #region mode
                    FunctionSid tempFunction5 = new FunctionSid ();
                    tempFunction5.key = "mode";
                    tempFunction5.data_type = "string";
                    tempFunction5.value = new List<string> ();
                    Attribute tempAttribute5 = new Attribute ();
                    tempAttribute5.key = "mode";
                    tempAttribute5.data_type = "string";
                    tempAttribute5.value = new List<string> ();
                    //singel/single_circle/order/all
                    //single/single_cycle/order/list_cycle/random
                    tempFunction5.value.Add ("single");
                    tempFunction5.value.Add ("single_cycle");
                    tempFunction5.value.Add ("order");
                    tempFunction5.value.Add ("list_cycle");
                    tempFunction5.value.Add ("random");
                    tempFunction5.max = 3;
                    tempFunction5.min = 0;
                    tmp.attributes.Add (tempFunction5);
                    tempAttribute5.value.Add ("single");
                    tempAttribute5.value.Add ("single_cycle");
                    tempAttribute5.value.Add ("order");
                    tempAttribute5.value.Add ("list_cycle");
                    tempAttribute5.value.Add ("random");
                    tempAttribute5.max = 3;
                    tempAttribute5.min = 0;
                    tmp.attributes.Add (tempAttribute5);
                    #endregion
                    #region source
                    //1   = SD, 2 = External Input, 3 = FTP, 4 = Radio
                    //sdcard/external_input/ftp/radio
                    FunctionSid tempFunction3 = new FunctionSid ();
                    tempFunction3.key = "source";
                    tempFunction3.data_type = "string";
                    tempFunction3.value = new List<string> ();
                    tempFunction3.value.Add ("sdcard");
                    tempFunction3.value.Add ("audio_in");
                    tempFunction3.value.Add ("ftp");
                    tempFunction3.value.Add ("radio");
                    tempFunction3.value.Add ("bluetooth");
                    tempFunction3.max = 3;
                    tempFunction3.min = 0;
                    tmp.attributes.Add (tempFunction3);
                    Attribute tempAttribute3 = new Attribute ();
                    tempAttribute3.key = "source";
                    tempAttribute3.data_type = "string";
                    tempAttribute3.value = new List<string> ();
                    tempAttribute3.value.Add ("sdcard");
                    tempAttribute3.value.Add ("audio_in");
                    tempAttribute3.value.Add ("ftp");
                    tempAttribute3.value.Add ("radio");
                    tempAttribute3.value.Add ("bluetooth");
                    tempAttribute3.max = 3;
                    tempAttribute3.min = 0;
                    tmp.attributes.Add (tempAttribute3);
                    #endregion
                    #region song_step
                    FunctionSid tempFunction2 = new FunctionSid ();
                    tempFunction2.key = "song_step";
                    tempFunction2.data_type = "string";
                    tempFunction2.value = new List<string> ();
                    tempFunction2.value.Add ("up");
                    tempFunction2.value.Add ("down");
                    tempFunction2.max = 1;
                    tempFunction2.min = 0;
                    tmp.attributes.Add (tempFunction2);
                    Attribute tempAttribute2 = new Attribute ();
                    tempAttribute2.key = "song_step";
                    tempAttribute2.data_type = "string";
                    tempAttribute2.value = new List<string> ();
                    tempAttribute2.value.Add ("up");
                    tempAttribute2.value.Add ("down");
                    tempAttribute2.max = 1;
                    tempAttribute2.min = 0;
                    tmp.attributes.Add (tempAttribute2);
                    #endregion
                    #region bass
                    FunctionSid tempFunction16 = new FunctionSid ();
                    tempFunction16.key = "playlist_name";
                    tempFunction16.data_type = "string";
                    tmp.attributes.Add (tempFunction16);
                    Attribute tempAttribute16 = new Attribute ();
                    tempAttribute16.key = "playlist_name";
                    tempAttribute16.data_type = "string";
                    tmp.attributes.Add (tempAttribute16);
                    #endregion
                    #region bass
                    FunctionSid tempFunction17 = new FunctionSid ();
                    tempFunction17.key = "song_name";
                    tempFunction17.data_type = "string";
                    tmp.attributes.Add (tempFunction17);
                    Attribute tempAttribute17 = new Attribute ();
                    tempAttribute17.key = "song_name";
                    tempAttribute17.data_type = "string";
                    tmp.attributes.Add (tempAttribute17);
                    #endregion
                    #region bass
                    FunctionSid tempFunction19 = new FunctionSid ();
                    tempFunction19.key = "song_time";
                    tempFunction19.data_type = "string";
                    tmp.attributes.Add (tempFunction19);
                    Attribute tempAttribute19 = new Attribute ();
                    tempAttribute19.key = "song_time";
                    tempAttribute19.data_type = "string";
                    tmp.attributes.Add (tempAttribute19);
                    #endregion
                    #region bass
                    FunctionSid tempFunction20 = new FunctionSid ();
                    tempFunction20.key = "playing_time";
                    tempFunction20.data_type = "string";
                    tmp.attributes.Add (tempFunction20);
                    Attribute tempAttribute20 = new Attribute ();
                    tempAttribute20.key = "playing_time";
                    tempAttribute20.data_type = "string";
                    tmp.attributes.Add (tempAttribute20);
                    #endregion
                } else if (loopCommon.BigClass == 5) {
                    //传感器
                    if (loopCommon.Type == DeviceType.SensorMobileDetection) {
                        tmp.spk = "sensor.pir";
                        tmp.spk = SPK.SensorPir;
                        //tmp.spk = "sensor.pir";
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region status
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "status";
                        tempFunction1.data_type = "string";
                        tempFunction1.value = new List<string> ();
                        tempFunction1.value.Add ("true");
                        tempFunction1.value.Add ("false");
                        tempFunction1.max = 1;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "status";
                        tempAttribute1.data_type = "string";
                        tempAttribute1.value = new List<string> ();
                        tempAttribute1.value.Add ("true");
                        tempAttribute1.value.Add ("false");
                        tempAttribute1.max = 1;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                        #region sensitivity
                        FunctionSid tempFunction2 = new FunctionSid ();
                        tempFunction2.key = "sensitivity";
                        tempFunction2.data_type = "integer";
                        tempFunction2.max = 100;
                        tempFunction2.min = 0;
                        tmp.attributes.Add (tempFunction2);
                        Attribute tempAttribute2 = new Attribute ();
                        tempAttribute2.key = "sensitivity";
                        tempAttribute2.data_type = "integer";
                        tempAttribute2.max = 100;
                        tempAttribute2.min = 0;
                        tmp.attributes.Add (tempAttribute2);
                        #endregion
                    }else if (loopCommon.Type == DeviceType.SensorTemperature) {
                        tmp.spk = "sensor.temperature";
                        tmp.spk = SPK.SensorTemperature;
                        //tmp.spk = "sensor.temperature";
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region temp
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "value";  //2020 12 22
                        tempFunction1.data_type = "float";
                        tempFunction1.max = 50;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "value";  //2020 12 22
                        tempAttribute1.data_type = "float";
                        tempAttribute1.max = 50;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                        #region type
                        FunctionSid tempFunction2 = new FunctionSid ();
                        tempFunction2.key = "type";
                        tempFunction2.data_type = "string";
                        tempFunction2.value = new List<string> ();
                        tempFunction2.value.Add ("C");
                        tempFunction2.value.Add ("F");
                        tempFunction2.max = 1;
                        tempFunction2.min = 0;
                        tmp.attributes.Add (tempFunction2);
                        Attribute tempAttribute2 = new Attribute ();
                        tempAttribute2.key = "type";
                        tempAttribute2.data_type = "string";
                        tempAttribute2.value = new List<string> ();
                        tempAttribute2.value.Add ("C");
                        tempAttribute2.value.Add ("F");
                        tempAttribute2.max = 1;
                        tempAttribute2.min = 0;
                        tmp.attributes.Add (tempAttribute2);
                        #endregion
                        //#region precision
                        //Function tempFunction3 = new GateWay.Function();
                        //tempFunction3.key = "precision";
                        //tempFunction3.data_type = "string";
                        //tempFunction3.value = new List<string>();
                        //tempFunction3.value.Add("0.01");
                        //tempFunction3.value.Add("0.1");
                        //tempFunction3.value.Add("100");
                        //tempFunction3.max = 2;
                        //tempFunction3.min = 0;
                        //tmp.attributes.Add(tempFunction3);
                        //Function tempAttribute3 = new GateWay.Function();
                        //tempAttribute3.key = "precision";
                        //tempAttribute3.data_type = "string";
                        //tempAttribute3.value = new List<string>();
                        //tempAttribute3.value.Add("0.01");
                        //tempAttribute3.value.Add("0.1");
                        //tempAttribute3.value.Add("100");
                        //tempAttribute3.max = 2;
                        //tempAttribute3.min = 0;
                        //tmp.attributes.Add(tempAttribute3);
                        //#endregion
                    }else if (loopCommon.Type == DeviceType.SensorIllumination) {
                        tmp.spk = "sensor.light";
                        //tmp.spk = "sensor.light";
                        tmp.spk = SPK.SensorLight;
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region lux
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "value";  //2020 12 22
                        tempFunction1.data_type = "integer";
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "value";  //2020 12 22
                        tempAttribute1.data_type = "integer";
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                        #region error_value
                        FunctionSid tempFunction2 = new FunctionSid ();
                        tempFunction2.key = "error_value";
                        tempFunction2.data_type = "integer";
                        tmp.attributes.Add (tempFunction2);
                        Attribute tempAttribute2 = new Attribute ();
                        tempAttribute2.key = "error_value";
                        tempAttribute2.data_type = "integer";
                        tmp.attributes.Add (tempAttribute2);
                        #endregion
                        #region precision
                        FunctionSid tempFunction3 = new FunctionSid ();
                        tempFunction3.key = "precision";
                        tempFunction3.data_type = "string";
                        tempFunction3.value = new List<string> ();
                        tempFunction3.value.Add ("0.01");
                        tempFunction3.value.Add ("0.1");
                        tempFunction3.value.Add ("100");
                        tempFunction3.max = 2;
                        tempFunction3.min = 0;
                        tmp.attributes.Add (tempFunction3);
                        Attribute tempAttribute3 = new Attribute ();
                        tempAttribute3.key = "precision";
                        tempAttribute3.data_type = "string";
                        tempAttribute3.value = new List<string> ();
                        tempAttribute3.value.Add ("0.01");
                        tempAttribute3.value.Add ("0.1");
                        tempAttribute3.value.Add ("100");
                        tempAttribute3.max = 2;
                        tempAttribute3.min = 0;
                        tmp.attributes.Add (tempAttribute3);
                        #endregion
                    } else if (loopCommon.Type == DeviceType.SensorPM25) {
                        tmp.spk = "sensor.pm25";
                        //tmp.spk = "sensor.pm25";
                        tmp.spk = SPK.SensorPm25;
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region value
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "value";
                        tempFunction1.data_type = "integer";
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "value";
                        tempAttribute1.data_type = "integer";
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                        #region error_value
                        FunctionSid tempFunction2 = new FunctionSid ();
                        tempFunction2.key = "error_value";
                        tempFunction2.data_type = "integer";
                        tmp.attributes.Add (tempFunction2);
                        Attribute tempAttribute2 = new Attribute ();
                        tempAttribute2.key = "error_value";
                        tempAttribute2.data_type = "integer";
                        tmp.attributes.Add (tempAttribute2);
                        #endregion
                        #region precision
                        FunctionSid tempFunction3 = new FunctionSid ();
                        tempFunction3.key = "precision";
                        tempFunction3.data_type = "string";
                        tempFunction3.value = new List<string> ();
                        tempFunction3.value.Add ("0.01");
                        tempFunction3.value.Add ("0.1");
                        tempFunction3.value.Add ("100");
                        tempFunction3.max = 2;
                        tempFunction3.min = 0;
                        tmp.attributes.Add (tempFunction3);
                        Attribute tempAttribute3 = new Attribute ();
                        tempAttribute3.key = "precision";
                        tempAttribute3.data_type = "string";
                        tempAttribute3.value = new List<string> ();
                        tempAttribute3.value.Add ("0.01");
                        tempAttribute3.value.Add ("0.1");
                        tempAttribute3.value.Add ("100");
                        tempAttribute3.max = 2;
                        tempAttribute3.min = 0;
                        tmp.attributes.Add (tempAttribute3);
                        #endregion
                    }else if (loopCommon.Type == DeviceType.SensorHumidity) {
                        tmp.spk = "sensor.humidity";
                        //tmp.spk = "sensor.humidity";
                        tmp.spk = SPK.SensorHumidity;
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region value
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "value";
                        tempFunction1.data_type = "float";
                        tempFunction1.max = 10000;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "value";
                        tempAttribute1.data_type = "float";
                        tempAttribute1.max = 10000;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                    }else if (loopCommon.Type == DeviceType.SensorTVOC) {
                        tmp.spk = "sensor.tvoc";
                        //tmp.spk = "sensor.tvoc";
                        tmp.spk = SPK.SensorTVOC;
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region value
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "value";
                        tempFunction1.data_type = "integer";
                        tempFunction1.max = 10000;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "value";
                        tempAttribute1.data_type = "integer";
                        tempAttribute1.max = 10000;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                    }else if (loopCommon.Type == DeviceType.SensorCO2) {
                        tmp.spk = "sensor.co2";
                        //tmp.spk = "sensor.co2";
                        tmp.spk = SPK.SensorCO2;
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region value
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "value";
                        tempFunction1.data_type = "integer";
                        tempFunction1.max = 10000;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "value";
                        tempAttribute1.data_type = "integer";
                        tempAttribute1.max = 10000;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                    }else if (loopCommon.Type == DeviceType.Sensor) {
                        tmp.spk = "dryContact.standard";
                        //tmp.spk = "dryContact.standard";
                        tmp.spk = SPK.DryContact;
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region status
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "status";
                        tempFunction1.data_type = "string";
                        tempFunction1.value = new List<string> ();
                        tempFunction1.value.Add ("on");
                        tempFunction1.value.Add ("off");
                        tempFunction1.max = 1;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "status";
                        tempAttribute1.data_type = "string";
                        tempAttribute1.value = new List<string> ();
                        tempAttribute1.value.Add ("on");
                        tempAttribute1.value.Add ("off");
                        tempAttribute1.max = 1;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                    } else {
                        #region on_off
                        FunctionSid tempFunction = new FunctionSid ();
                        tempFunction.key = "enable";
                        tempFunction.data_type = "string";
                        tempFunction.value = new List<string> ();
                        tempFunction.value.Add ("true");
                        tempFunction.value.Add ("false");
                        tempFunction.max = 1;
                        tempFunction.min = 0;
                        tmp.attributes.Add (tempFunction);
                        Attribute tempAttribute = new Attribute ();
                        tempAttribute.key = "enable";
                        tempAttribute.data_type = "string";
                        tempAttribute.value = new List<string> ();
                        tempAttribute.value.Add ("true");
                        tempAttribute.value.Add ("false");
                        tempAttribute.max = 1;
                        tempAttribute.min = 0;
                        tmp.attributes.Add (tempAttribute);
                        #endregion
                        #region value
                        FunctionSid tempFunction1 = new FunctionSid ();
                        tempFunction1.key = "value";
                        tempFunction1.data_type = "integer";
                        tempFunction1.max = 10000;
                        tempFunction1.min = 0;
                        tmp.attributes.Add (tempFunction1);
                        Attribute tempAttribute1 = new Attribute ();
                        tempAttribute1.key = "value";
                        tempAttribute1.data_type = "integer";
                        tempAttribute1.max = 10000;
                        tempAttribute1.min = 0;
                        tmp.attributes.Add (tempAttribute1);
                        #endregion
                    }
@@ -1399,21 +1942,30 @@
                } else {
                    #region on_off
                    FunctionSid tempFunction = new FunctionSid ();
                    tempFunction.key = "on_off";
                    tempFunction.data_type = "string";
                    tempFunction.value = new List<string> ();
                    tempFunction.value.Add ("on");
                    tempFunction.value.Add ("off");
                    tempFunction.max = 1;
                    tempFunction.min = 0;
                    tmp.attributes.Add (tempFunction);
                    Attribute tempAttribute = new Attribute ();
                    tempAttribute.key = "on_off";
                    tempAttribute.data_type = "string";
                    tempAttribute.value = new List<string> ();
                    tempAttribute.value.Add ("on");
                    tempAttribute.value.Add ("off");
                    tempAttribute.max = 1;
                    tempAttribute.min = 0;
                    tmp.attributes.Add (tempAttribute);
                    #endregion
                }
            } catch { }
            return tmp;
        }
        #endregion
        #region 获取属性
        #endregion
        //#region 判断类型
        ///// <summary>
@@ -1481,42 +2033,11 @@
        //#endregion
        #region 生成4位byte 时间戳
        private long LastTime = 0;
        /// <summary>
        /// DateTime时间格式转换为13位带毫秒的Unix时间戳
        /// </summary>
        /// <param name="time"> DateTime时间格式</param>
        /// <returns>Unix时间戳格式</returns>
        public long ConvertDateTimeLong ()
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime (new System.DateTime (2020, 1, 1));
            long l = (long)(Math.Round ((DateTime.Now - startTime).TotalSeconds, 1) * 10);
            if (l <= LastTime) l = LastTime + 1;
            LastTime = l;
            return l;
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="m"></param>
        /// <param name="strTmp"></param>
        /// <returns></returns>
        public bool ConvertIntToByteArray (long m, ref string strTmp)
        {
            strTmp = "00000000";
            byte [] arry = new byte [4];
            arry [0] = (byte)(m & 0xFF);
            arry [1] = (byte)((m & 0xFF00) >> 8);
            arry [2] = (byte)((m & 0xFF0000) >> 16);
            arry [3] = (byte)((m & 0xFF000000) >> 24);
            strTmp = arry [0].ToString ("X2") + arry [1].ToString ("X2") + arry [2].ToString ("X2") + arry [3].ToString ("X2");
            return true;
        }
        #endregion
    }
    #region ■ 设备列表相关___________________________
    [Serializable]
    public class BaseCloudFeedback
    {
@@ -1567,12 +2088,14 @@
        public string oid { get; set; }  //设备模块地址
        public string omodel { get; set; }    //型号
        public List<FunctionSid> attributes { get; set; } //属性列表
        public List<Attribute> attributes { get; set; } //属性列表
    }
    /// <summary>
    /// 属性
    /// </summary>
    [Serializable]
    public class FunctionSid
    public class Attribute
    {
        //public string name { get; set; }
        public string key { get; set; }
@@ -1778,6 +2301,20 @@
        /// 固定的序号
        /// </summary>
        public int fixedSerialNumber = int.MaxValue;
        /// <summary>
        /// 大类小类
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string DeviceTypeString {
            get {
                if (!string.IsNullOrEmpty (sid) && sid.Length >= 28) {
                    return sid.Substring (sid.Length - 4, 4);
                } else {
                    return "0000";
                }
            }
        }
    }
@@ -1869,6 +2406,11 @@
        /// value
        /// </summary>
        public const string Value = "value";
        /// <summary>
        /// 风扇档位
        /// </summary>
        public const string FanSpeedPercent = "fan_speed_percent";
    }
    /// <summary>
@@ -2000,6 +2542,11 @@
        /// 家电、风扇
        /// </summary>
        public const string ElectricFan = "electrical.fan";
        /// <summary>
        /// 其它、通用开关
        /// </summary>
        public const string UniversalDevice = "other.common";
    }
@@ -2071,98 +2618,104 @@
    //    public Sids devices { get; set; } //设备列表
    //}
}
//sid组成部分:
//sid
//来源   厂商代码   通讯方式   产品时间戳   产品类别   物模型类   通道号   大小类别
//1byte   1byte   1byte   4byte   1byte   2byte   2byte   2byte
//oid组成部分:
//来源   厂商代码   通讯方式   产品时间戳   产品类别
//1byte   1 byte   1 byte   4 byte   1byte
//其中各部分代码列表:
//来源   1byte   编号   描述
//      00   默认原生态系统数据
//      01   网关或者其他A设备
//      02   调试软件
//      03   APP应用程序
//      04   第三方网关或者平台
//厂商代码   1byte   编号   描述
//      01   HDL
//      02
    //sid组成部分:
    //sid
    //来源   厂商代码   通讯方式   产品时间戳   产品类别   物模型类   通道号   大小类别
    //1byte   1byte   1byte   4byte   1byte   2byte   2byte   2byte
    //oid组成部分:
    //来源   厂商代码   通讯方式   产品时间戳   产品类别
    //1byte   1 byte   1 byte   4 byte   1byte
    //其中各部分代码列表:
    //来源   1byte   编号   描述
    //      00   默认原生态系统数据
    //      01   网关或者其他A设备
    //      02   调试软件
    //      03   APP应用程序
    //      04   第三方网关或者平台
//通讯方式   1byte   编号   描述
//      01   HDL Bus
//      02   Zigbee
//      03   KNX
//      04   Z-Wave
    //厂商代码   1byte   编号   描述
    //      01   HDL
    //      02
//产品时间戳   4bytes   以2020年1月1日算出的时间戳0.1s为单位
    //通讯方式   1byte   编号   描述
    //      01   HDL Bus
    //      02   Zigbee
    //      03   KNX
    //      04   Z-Wave
//产品类别   1byte   编号   描述
//      01   调光器
//      02   继电器
//      03   干接点模块
//      04   传感器
//      05   面板
//      06   RCU
//      07   网关
//      08   红外发射
//      09   Android屏
//      10   场景
//      11   音乐播放器
//      12   232/485转换器
//      21   自动化
//      22   安防防区
//      14   窗帘模块
//      15   HVAC
//      16   地热模块
    //产品时间戳   4bytes   以2020年1月1日算出的时间戳0.1s为单位
//物模型类型   2bytes   编号   描述
//      01   开关类   01   开关
//            02   插座
//            03
//      02   照明   01   开关
//            02   调光
//            03   色温(CCT)
//            04   RGB
//      03   遮阳   01   窗帘控制器
//            02   百叶窗
//            03   开合帘
//            04   卷帘
//            05    推窗器
//            06    投影幕
//      04   面板   01   按键面板
//      05   传感器   01   移动探测
//            02   温度传感器
//            03   湿度传感器
//            04   照度传感器
//            05   TVOC
//            06   PM2.5
//            07   CO2
//            08   毫米波传感器
//            09
//            10
//            11   烟雾传感器
//            25   干接点
//      07   恒温器   01   空调
//            02   风扇
//            03   毛细空调
//      08   地热   01   地热模块
//      09   背景音乐   01   音乐播放器
//            02   Sonos
//      10   场景   01   场景
//            02   电影场景
//      19   新风   01   新风
    //产品类别   1byte   编号   描述
    //      01   调光器
    //      02   继电器
    //      03   干接点模块
    //      04   传感器
    //      05   面板
    //      06   RCU
    //      07   网关
    //      08   红外发射
    //      09   Android屏
    //      10   场景
    //      11   音乐播放器
    //      12   232/485转换器
    //      21   自动化
    //      22   安防防区
    //      14   窗帘模块
    //      15   HVAC
    //      16   地热模块
//13   能源   01   电表
//            02   水表
//            03   燃气
//      16   电器   01   风扇
//            02   TV
//      20   安防   01   安防
//      21   自动化   01   自动化
//大类别   1bytes   (预留)
//小类别   1byte   (预留)
    //物模型类型   2bytes   编号   描述
    //      01   开关类   01   开关
    //            02   插座
    //            03
    //      02   照明   01   开关
    //            02   调光
    //            03   色温(CCT)
    //            04   RGB
    //      03   遮阳   01   窗帘控制器
    //            02   百叶窗
    //            03   开合帘
    //            04   卷帘
    //            05    推窗器
    //            06    投影幕
    //      04   面板   01   按键面板
    //      05   传感器   01   移动探测
    //            02   温度传感器
    //            03   湿度传感器
    //            04   照度传感器
    //            05   TVOC
    //            06   PM2.5
    //            07   CO2
    //            08   毫米波传感器
    //            09
    //            10
    //            11   烟雾传感器
    //            25   干接点
    //      07   恒温器   01   空调
    //            02   风扇
    //            03   毛细空调
    //      08   地热   01   地热模块
    //      09   背景音乐   01   音乐播放器
    //            02   Sonos
    //      10   场景   01   场景
    //            02   电影场景
    //      19   新风   01   新风
    //13   能源   01   电表
    //            02   水表
    //            03   燃气
    //      16   电器   01   风扇
    //            02   TV
    //      20   安防   01   安防
    //      21   自动化   01   自动化
    //大类别   1bytes   (预留)
    //小类别   1byte   (预留)
    #endregion
}