wxr
2020-12-17 1a13c963a5fb8cad92bf03667e411f46d6a6a843
HDL_ON/Entity/Function/Function.cs
@@ -1,365 +1,51 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
using HDL_ON;
using HDL_ON.DriverLayer;
using Shared;
namespace HDL_ON.Entity
{
    /// <summary>
    /// 功能属性
    /// 属性字段解析:attri :属性内容,value 属性的值,max 最大值 min 最小值
    /// 读取服务器空间信息返回到数据包
    /// </summary>
    public class Trait
    public class DevcieApiPack
    {
        /// <summary>
        /// 属性名称
        /// </summary>
        public string name;
        List<string> _value_key;
        /// <summary>
        /// 属性的值列表
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public List<string> value_key {
            get
            {
                return _value_key;
            }
            set
            {
                _value_key = value;
            }
        }
        /// <summary>
        /// 最大值
        /// </summary>
        public int max;
        /// <summary>
        /// 最小值
        /// </summary>
        public int min;
        public List<Function> list = new List<Function>();
        /// <summary>
        /// 数据类型
        /// </summary>
        public string data_type = "";
        public string totalCount = "0";
        /// <summary>
        /// 当前值
        /// </summary>
        public object value = new object();
        public string totalPage = "0";
        public string pageNo = "0";
        //----app自定义
        /// <summary>
        /// 属性值单位
        /// </summary>
        string _uintString;
        [Newtonsoft.Json.JsonIgnore]
        public string uintString
        {
            get
            {
                if(!string.IsNullOrEmpty( _uintString))
                {
                    return _uintString;
                }
                var us = "";
                switch(name)
                {
                    case "temperature":
                        us = "°C";
                        break;
                    case "percent":
                    case "brightness":
                        us = "%";
                        break;
                }
                return us;
            }
        }
        public string pageSize = "0";
        /// <summary>
        /// 属性名称显示文本
        /// 中英文显示
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string name_text
        {
            get
            {
                string text = "";
                switch (name)
                {
                    case "on_off":
                        text = Language.StringByID(StringId.OnOff);
                        break;
                    case "brightness":
                        text = Language.StringByID(StringId.Brightness);
                        break;
                    case "color":
                        text = Language.StringByID(StringId.ColorValue);
                        break;
                    case "mode":
                        text = Language.StringByID(StringId.Mode);
                        break;
                    case "fan":
                        text = Language.StringByID(StringId.FanSpeed);
                        break;
                    case "temperature":
                        text = Language.StringByID(StringId.Temp);
                        break;
                    case "delay":
                        text = Language.StringByID(StringId.Delay);
                        break;
                    case "cct":
                        text = "CCT";
                        break;
                    //case "fade_time":
                    case "percent":
                        text = Language.StringByID(StringId.PercentAdjustment);
                        break;
                        //case "lock":
                        //case "ico":
                        //case "swing":
                        //case "set_ point":
                        //case "pm25":
                        //case "volume":
                        //case "vol_step":
                        //case "source":
                        //case "treble":
                        //case "bass":
                        //case "playlist":
                        //case "song_name":
                        //case "current_status":
                        //case "enable":
                        //case "lux":
                        //case "adjust_value":
                        //case "range":
                        //case "humidity":
                        //case "type":
                        //case "state":
                        //case "sensitivity":
                        //case "pm25value":
                }
                return text;
            }
        }
        /// <summary>
        /// 获取当前属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetCurValueText()
        {
            return GetValueText(value.ToString());
        }
        /// <summary>
        /// 获取指定属性的显示文本
        /// 中英文显示
        /// </summary>
        public string GetValueText(string value)
        {
            string text = "";
            value = value.Replace("{}", "");
            switch (name)
            {
                case "on_off":
                    text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
                    break;
                case "temperature":
                case "brightness":
                case "percent":
                    if (text == "")
                    {
                        this.value = this.min;
                        text = this.min.ToString();
                    }
                    else
                    {
                        text = value;
                    }
                    break;
                //case "color":
                case "mode":
                    switch (value)
                    {
                        //----空调
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        case "cool":
                            text = Language.StringByID(StringId.Cool);
                            break;
                        case "heat":
                            text = Language.StringByID(StringId.Heat);
                            break;
                        case "dry":
                            text = Language.StringByID(StringId.Dry);
                            break;
                        case "fan":
                            text = Language.StringByID(StringId.AirSupply);
                            break;
                        //-----地热
                        case "day":
                            text = Language.StringByID(StringId.Day);
                            break;
                        case "night":
                            text = Language.StringByID(StringId.Night);
                            break;
                        case "away":
                            text = Language.StringByID(StringId.Away);
                            break;
                        case "normal":
                            text = Language.StringByID(StringId.Normal);
                            break;
                        case "timer":
                            text = Language.StringByID(StringId.Timer);
                            break;
                        default:
                            if (this.value_key.Contains("cool"))
                            {
                                this.value = "cool";
                                text = Language.StringByID(StringId.Cool);
                            }
                            else if (this.value_key.Contains("day"))
                            {
                                this.value = "day";
                                text = Language.StringByID(StringId.Day);
                            }
                            else
                            {
                                foreach (var v in this.value_key)
                                {
                                    this.value = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                case "fan":
                    switch (value)
                    {
                        case "high":
                            text = Language.StringByID(StringId.HighWindSpeed);
                            break;
                        case "medium":
                            text = Language.StringByID(StringId.MiddleWindSpeed);
                            break;
                        case "low":
                            text = Language.StringByID(StringId.LowWindSpeed);
                            break;
                        case "auto":
                            text = Language.StringByID(StringId.Auto);
                            break;
                        default:
                            if (this.value_key.Contains("low"))
                            {
                                this.value = "low";
                                text = Language.StringByID(StringId.LowWindSpeed);
                            }
                            else
                            {
                                foreach (var v in this.value_key)
                                {
                                    this.value = v;
                                    text = GetCurValueText();
                                }
                            }
                            break;
                    }
                    break;
                //case "delay":
                //case "cct":
                //case "fade_time":
                //case "lock":
                //case "ico":
                //case "swing":
                //case "set_ point":
                //case "pm25":
                //case "volume":
                //case "vol_step":
                //case "source":
                //case "treble":
                //case "bass":
                //case "playlist":
                //case "song_name":
                //case "current_status":
                //case "enable":
                //case "lux":
                //case "adjust_value":
                //case "range":
                //case "humidity":
                //case "type":
                //case "state":
                //case "sensitivity":
                //case "pm25value":
                case "high":
                    text = Language.StringByID(StringId.HighWindSpeed);
                    break;
                case "medium":
                    text = Language.StringByID(StringId.MiddleWindSpeed);
                    break;
                case "low":
                    text = Language.StringByID(StringId.LowWindSpeed);
                    break;
                case "auto":
                    text = Language.StringByID(StringId.Auto);
                    break;
            }
            return text;
        }
    }
    /// <summary>
    /// 设备功能oid
    /// 功能类能满足数据使用要求,子类只是为了方便使用属性
    /// </summary>
    public class FunctionOid
    {
        public string oid;
        public string name;
        public string machine_id;
        public string net_id;
        public string dev_id;
        public string channels;
    }
    public class Function
    {
        public Function()
        {
        }
        /// <summary>
        /// 数据存储文件名
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string savePath
        {
            get
            {
                return "FunctionData_" + sid;
            }
        }
        #region base info
        /// <summary>
        /// HDL统一协议格式:14bytes
        /// 举例: 来源   厂商代码 通讯方式  产品时间戳   产品类别 物模型类  通道号   大小类别
        //       1byte   1byte   1byte     4byte       1byte   2byte   2byte   2byte
        ///       1byte   1byte   1byte     4byte       1byte   2byte   2byte   2byte
        /// 来源:00   默认原生态系统数据 、01   网关或者其他A设备、02   调试软件、03   APP应用程序、04   第三方网关或者平台
        /// 厂商代码:01   HDL
        /// 通讯方式:01   HDL Bus、02   Zigbee、03 KNX、04 Z-Wave
        /// 产品时间戳:4bytes   以2020年1月1日算出的时间戳0.1s为单位
        /// 产品时间戳:4bytes   以2020年1月1日算出的时间戳0.1s为单位
        /// 产品类别:01   调光器、02 继电器、03   干接点模块、04   传感器、05 面板
        /// 物模型类型:
      ///     01   开关类:01 开关、02 插座、03
      ///     02   照明: 01 开关、02   调光、03   色温、04   LED
        ///     01   开关类:01 开关、02 插座、03
        ///     02   照明: 01 开关、02   调光、03   色温、04   LED
        ///     03   遮阳: 01   窗帘电机、02 百叶窗、03 开合帘、04 卷帘
      ///     04   恒温器:01 空调、02 地暖、03 毛细空调
        ///     04   恒温器:01 空调、02 地暖、03 毛细空调
        ///     05   新风      
        ///     06   影音      
        ///     07   音乐      
@@ -369,61 +55,19 @@
        /// 小类别   1byte   (预留)
        /// </summary>
        public string sid = "0301011234567801012301230123";
        /// <summary>
        /// A协议功能的特性
        /// 如:是AC功能:特性:on_off,mode,fan,temperature
        /// attri
        /// 备注
        /// </summary>
        public List<Trait> function = new List<Trait>();
        public string name;
        /// <summary>
        /// 房间ID列表
        /// 该功能添加到到房间列表
        /// 设备ID
        /// 云端负责生成
        /// </summary>
        public List<string> roomIdList = new List<string>();
        public string deviceId = "0";
        /// <summary>
        /// bus协议数据格式
        /// 使用A协议控制时,改属性为空
        /// 设备spk
        /// </summary>
        public BusData bus_Data;
        /// <summary>
        /// 延时
        /// </summary>
        public int delay = 0;
        /// <summary>
        /// 延时显示的文本
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string delayText
        {
            get
            {
                string text = "";
                switch (delay)
                {
                    case 0:
                        text = Language.StringByID(StringId.NoDelay);
                        break;
                    case 30:
                        text = "30s";
                        break;
                    case 60:
                        text = "1min";
                        break;
                    case 120:
                        text = "2min";
                        break;
                    case 300:
                        text = "5min";
                        break;
                }
                return text;
            }
        }
        #endregion
        public string spk = "";
        /// <summary>
        /// 功能类别
        /// 如:空调类、灯光类、窗帘类
@@ -445,48 +89,92 @@
                }
            }
        }
        ///// <summary>
        ///// 功能类型
        ///// </summary>
        public FunctionType functionType
        {
            get
            {
                var _functionTypeString = sid.Substring(16, 4);
                return (FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(_functionTypeString, 16));
            }
        }
        /// <summary>
        /// 备注
        /// A协议功能的特性
        /// 如:是AC功能:特性:on_off,mode,fan,temperature
        /// attri
        /// </summary>
        public string name;
        public List<FunctionAttributes> attributes = new List<FunctionAttributes>();
        /// <summary>
        /// 房间ID列表
        /// 该功能添加到到房间列表
        /// </summary>
        public List<string> roomIds = new List<string>();
        /// <summary>
        /// bus协议数据格式
        /// 使用A协议控制时,改属性为空
        /// </summary>
        public BusData bus;
        /// <summary>
        /// 是否收藏
        /// </summary>
        public bool collect = false;
        /// <summary>
        /// 是否在线
        /// </summary>
        public bool online = true;
        /// <summary>
        /// 云端数据创建的时间
        /// </summary>
        public string createTime = "";
        /// <summary>
        /// 云端数据修改的最后时间
        /// </summary>
        public string modifyTime = "";
        /// <summary>
        /// 删除标记
        /// 需要删除数据时,标记为:true
        /// 由云端删除成功之后,返回数据再清除本地数据
        /// </summary>
        public bool DeleteSign = false;
        #endregion
        /// <summary>
        /// 延时
        /// </summary>
        public int delay = 0;
        /// <summary>
        /// 最后控制的一次状态
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string lastState = "";
        Trait _trait_on_off;
        FunctionAttributes _trait_on_off;
        [Newtonsoft.Json.JsonIgnore]
        public Trait trait_on_off
        public FunctionAttributes trait_on_off
        {
            get
            {
                if (_trait_on_off == null)
                {
                    _trait_on_off = function.Find((obj) => obj.name == "on_off");
                    _trait_on_off = attributes.Find((obj) => obj.key == "on_off");
                    //找不到属性需要声明一个,防止报错闪退
                    if (_trait_on_off == null)
                    {
                        _trait_on_off = new Trait()
                        _trait_on_off = new FunctionAttributes()
                        {
                            name = "on_off",
                            value_key = new List<string> { "on", "off" },
                            key = "on_off",
                            value = new List<string> { "on", "off" },
                            max = 1,
                            min = 0,
                        };
                    }
                    _trait_on_off.value = "on";
                    _trait_on_off.curValue = "on";
                }
                return _trait_on_off;
            }
@@ -497,18 +185,14 @@
        }
        /// <summary>
        /// 是否收藏
        /// </summary>
        public bool collection = false;
        /// <summary>
        /// 使用次数
        /// </summary>
        public double usageCount = 0;
        /// <summary>
        /// 使用频率
        /// </summary>
        public double usageFrequency {
        public double usageFrequency
        {
            get
            {
                return usageCount / 7;
@@ -519,12 +203,12 @@
        /// </summary>
        public int fixedSerialNumber = int.MaxValue;
        public string GetBusId ()
        public string GetBusId()
        {
            string busId = "";
            if (bus_Data != null)
            if (bus != null)
            {
                busId = bus_Data.SubnetID + "_" + bus_Data.DeviceID + "_" + bus_Data.LoopID;
                busId = bus.SubnetID + "_" + bus.DeviceID + "_" + bus.LoopId;
            }
            return busId;
        }
@@ -536,16 +220,18 @@
        public string GetRoomListName()
        {
            string roomNameList = "";
            foreach(var roomId in roomIdList)
            foreach (var roomId in roomIds)
            {
                var findRoom = DB_ResidenceData.rooms.Find(obj => obj.sid == roomId);
                var findRoom = SpatialInfo.CurrentSpatial.RoomList.Find(obj => obj.roomId == roomId);
                if (findRoom == null)
                {
                    continue;
                if(roomNameList != "")
                }
                if (roomNameList != "")
                {
                    roomNameList += ",";
                }
                roomNameList += findRoom.floorName + findRoom.name;
                roomNameList += findRoom.floorName + findRoom.roomName;
            }
            if (roomNameList == "" && functionType == FunctionType.Scene)
            {
@@ -554,18 +240,418 @@
            return roomNameList;
        }
        /// <summary>
        /// 数据存储文件名
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string savePath
        {
            get
            {
                return "FunctionData_" + sid;
            }
        }
        /// <summary>
        /// 保存功能数据
        /// </summary>
        public void SaveFunctionData()
        public void SaveFunctionData(bool upSevser)
        {
            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
            FileUtils.WriteFileByBytes("FunctionData_" + this.sid, ssd);
            MainPage.Log($"Save FunctionData {this.functionType} : {this.sid}");
            if (upSevser)
            {
                var pm = new DAL.Server.HttpServerRequest();
                var pack = pm.UpdataDevcieInfo(this);
                if (pack.Code == DAL.Server.StateCode.SUCCESS)
                {
                    var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
                    Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd);
                }
                else
                {
                    Utlis.ShowTip(Language.StringByID(StringId.EditFunctionInfoFail) + "\r\nCode:" + pack.Code);
                }
            }
            else
            {
                var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
                Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd);
            }
        }
        /// <summary>
        /// 转换成场景功能对象
        /// </summary>
        /// <returns></returns>
        public SceneFunction ConvertSceneFunction()
        {
            var sFunc = new SceneFunction();
            foreach (var attr in attributes)
            {
                if (attr.curValue.ToString() == "{}")
                {
                    attr.curValue = "0";
                }
                if (attr.key == FunctionAttributeKey.SetTemp)
                {
                    double vv = 16;
                    Double.TryParse(attr.curValue.ToString(),out vv);
                    sFunc.status.Add(new SceneFunctionStatus() { key = attr.key, value = Convert.ToInt32(vv).ToString() });
                }
                else
                {
                    sFunc.status.Add(new SceneFunctionStatus() { key = attr.key, value = attr.curValue.ToString() });
                }
            }
            sFunc.sid = this.sid;
            return sFunc;
        }
        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime refreshTime = DateTime.MinValue;
        /// <summary>
        /// 获取本地控制数据
        /// </summary>
        public AlinkFunctionStatusObj GetGatewayAlinkControlData(Dictionary<string, string> commandDictionary)
        {
            var sendDataObj = new AlinkFunctionStatusObj();
            sendDataObj.id = Control.Ins.msg_id.ToString();
            sendDataObj.time_stamp = Control.Ins.Get_TimeStamp();
            var acd = new AlinkControlData();
            acd.sid = sid;
            foreach (var dic in commandDictionary)
            {
                var aca = new AlinkControlAttributes();
                aca.key = dic.Key;
                aca.value = dic.Value;
                acd.status.Add(aca);
            }
            sendDataObj.objects.Add(acd);
            return sendDataObj;
        }
        /// <summary>
        /// 获取Api控制数据
        /// </summary>
        /// <returns></returns>
        public ApiAlinkControlActionObj GetApiControlData(Dictionary<string, string> keyValues)
        {
            ApiAlinkControlActionObj aaao = new ApiAlinkControlActionObj();
            aaao.deviceId = this.deviceId;
            aaao.spk = this.spk;
            foreach (var kv in keyValues)
            {
                aaao.attributes.Add(new AlinkControlAttributes()
                {
                    key = kv.Key,
                    value = kv.Value,
                });
            }
            return aaao;
        }
    }
}
    /// <summary>
    /// 远程控制
    /// api a协议控制动作对象
    /// </summary>
    public class ApiAlinkControlActionObj
    {
        /// <summary>
        /// 设备ID
        /// </summary>
        public string deviceId = "0";
        /// <summary>
        /// spk
        /// 列:light.switch
        /// </summary>
        public string spk = "";
        public List<AlinkControlAttributes> attributes = new List<AlinkControlAttributes>();
        //[Newtonsoft.Json.JsonIgnore]
        public BusData bus = new BusData();
    }
    /// <summary>
    /// A协议控制数据的对象
    /// </summary>
    public class AlinkFunctionStatusObj
    {
        public List<AlinkControlData> objects = new List<AlinkControlData>();
        public string time_stamp = "";
        public string id = "";
    }
    /// <summary>
    /// 本地状态读取
    /// A协议状态读取格式对象
    /// </summary>
    public class AlinkReadFunctionStatusObj
    {
        public string id = "0";
        public List<Dictionary<string, string>> objects = new List<Dictionary<string, string>>();
        public string time_stamp = "";
    }
    /// <summary>
    /// A协议控制数据
    /// </summary>
    public class AlinkControlData
    {
        public string sid = "";
        public List<AlinkControlAttributes> status = new List<AlinkControlAttributes>();
    }
    /// <summary>
    /// a协议控制动作数据
    /// </summary>
    public class AlinkControlAttributes
    {
        /// <summary>
        /// 属性名
        /// 列:on_off
        /// </summary>
        public string key = "";
        /// <summary>
        /// 属性值
        /// 列:on
        /// </summary>
        public string value = "";
    }
    /// <summary>
    /// 功能属性
    /// 属性字段解析:attri :属性内容,value 属性的值,max 最大值 min 最小值
    /// </summary>
    [System.Serializable]
    public class FunctionAttributes
    {
        /// <summary>
        /// 属性键名
        /// </summary>
        public string key;
        /// <summary>
        /// 属性的值列表
        /// </summary>
        public List<string> value = new List<string>();
        /// <summary>
        /// 最大值
        /// </summary>
        public int max = 100;
        /// <summary>
        /// 最小值
        /// </summary>
        public int min = 0;
        /// <summary>
        /// 数据类型
        /// </summary>
        public string data_type = "";
        /// <summary>
        /// 当前值
        /// </summary>
        public object curValue = new object();
    }
    /// <summary>
    /// 功能属性键名列表
    /// </summary>
    public static class FunctionAttributeKey
    {
        /// <summary>
        /// 开关
        /// </summary>
        public const string OnOff = "on_off";
        /// <summary>
        /// 亮度
        /// </summary>
        public const string Brightness = "brightness";
        /// <summary>
        /// 颜色
        /// </summary>
        public const string RGB = "rgb";
        /// <summary>
        /// 渐变时间
        /// </summary>
        public const string FadeTime = "fade_time";
        /// <summary>
        /// 模式
        /// </summary>
        public const string Mode = "mode";
        /// <summary>
        /// 风速
        /// </summary>
        public const string FanSpeed = "fan";
        /// <summary>
        /// 设置温度
        /// </summary>
        public const string SetTemp = "set_temp";
        /// <summary>
        /// 延时
        /// </summary>
        public const string Delay = "delay";
        /// <summary>
        /// 色温
        /// </summary>
        public const string CCT = "cct";
        /// <summary>
        /// 百分比
        /// </summary>
        public const string Percent = "percent";
        /// <summary>
        /// 室内温度
        /// </summary>
        public const string IndoorTemp = "room_temp";
    }
    /// <summary>
    /// 设备功能oid
    /// </summary>
    public class FunctionOid
    {
        public string oid;
        public string name;
        public string machine_id;
        public string net_id;
        public string dev_id;
        public string channels;
    }
    /// <summary>
    /// 兼容旧协议控制
    /// </summary>
    public class BusData
    {
        public string addresses = "FFFF";
        [Newtonsoft.Json.JsonIgnore]
        public byte SubnetID
        {
            get
            {
                return Convert.ToByte(addresses.Substring(0, 2), 16);
            }
        }
        [Newtonsoft.Json.JsonIgnore]
        public byte DeviceID
        {
            get
            {
                return Convert.ToByte(addresses.Substring(2, 2), 16);
            }
        }
        public byte LoopId
        {
            get
            {
                return Convert.ToByte(loopId, 16);
            }
        }
        public string loopId;
    }
    public static class SPK
    {
        /// <summary>
        /// (开关灯)
        /// </summary>
        public const string LightSwitch = "light.switch";
        /// <summary>
        /// (调光灯)
        /// </summary>
        public const string LightDimming = "light.dimming";
        /// <summary>
        /// (RGB灯)
        /// </summary>
        public const string LightRGB = "light.rgb";
        /// <summary>
        /// (RGBW灯)
        /// </summary>
        public const string LightRGBW = "light.rgbw";
        /// <summary>
        /// (CCT灯)
        /// </summary>
        public const string LightCCT = "light.cct";
        /// <summary>
        /// (开关窗帘)
        /// </summary>
        public const string CurtainSwitch = "curtain.switch";
        /// <summary>
        /// (开合帘)
        /// </summary>
        public const string CurtainTrietex = "curtain.trietex";
        /// <summary>
        /// (百叶帘)
        /// </summary>
        public const string CurtainShades = "curtain.shades";
        /// <summary>
        /// (卷帘)
        /// </summary>
        public const string CurtainRoller = "curtain.roller";
        /// <summary>
        /// (空调)
        /// </summary>
        public const string AcStandard = "ac.standard";
        /// <summary>
        /// (地热)
        /// </summary>
        public const string FloorHeatStandard = "floorHeat.standard";
        /// <summary>
        /// (新风)
        /// </summary>
        public const string AirFreshStandard = "airFresh.standard";
        /// <summary>
        /// (音乐)
        /// </summary>
        public const string MusicStandard = "music.standard";
        /// <summary>
        /// (亮度传感器)
        /// </summary>
        public const string SensorLight = "sensor.light";
        /// <summary>
        /// (温度传感器)
        /// </summary>
        public const string SensorTemperature = "sensor.temperature";
        /// <summary>
        /// (红外移动传感器)
        /// </summary>
        public const string SensorPir = "sensor.pir";
        /// <summary>
        /// (门窗传感器)
        /// </summary>
        public const string SensorDoorWindow = "sensor.doorwindow";
        /// <summary>
        /// (PM2.5传感器)
        /// </summary>
        public const string SensorPm25 = "sensor.pm25";
        /// <summary>
        /// co2传感器
        /// </summary>
        public const string SensorCO2 = "sensor.co2";
        /// <summary>
        /// tvoc传感器
        /// </summary>
        public const string SensorTVOC = "sensor.tvoc";
        /// <summary>
        /// 湿度传感器
        /// </summary>
        public const string SensorHumidity = "sensor.humidity";
        /// <summary>
        /// (干接点)
        /// </summary>
        public const string DryContact = "dryContact.standard";
        /// <summary>
        /// 家电、插座
        /// </summary>
        public const string ElectricSocket = "electrical.socket";
        /// <summary>
        /// 家电、电视
        /// </summary>
        public const string ElectricTV = "electrical.tv";
        /// <summary>
        /// 家电、风扇
        /// </summary>
        public const string ElectricFan = "electrical.fan";
    }
}