wxr
2021-07-01 43b0d5870d528f23ecd6aeceb6cfd4325188b46f
HDL_ON/Entity/Function/Function.cs
@@ -1,265 +1,299 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
using HDL_ON;
using HDL_ON.Common;
using HDL_ON.DAL.Server;
using HDL_ON.DriverLayer;
using Shared;
namespace HDL_ON.Entity
{
    /// <summary>
    /// 功能属性
    /// 属性字段解析:attri :属性内容,value 属性的值,max 最大值 min 最小值
    /// 读取服务器空间信息返回到数据包
    /// </summary>
    public class Trait
    public class DevcieApiPack
    {
        public List<Function> list = new List<Function>();
        public string totalCount = "0";
        public string totalPage = "0";
        public string pageNo = "0";
        public string pageSize = "0";
    }
    /// <summary>
    /// 属性状态
    /// </summary>
    public class AttrState
    {
        /// <summary>
        /// 属性内容
        /// 属性键名
        /// </summary>
        public string attri;
        public string key;
        /// <summary>
        /// 属性的值
        /// 属性的值列表
        /// </summary>
        public List<string> value;
        public List<string> value = new List<string>();
        /// <summary>
        /// 最大值
        /// </summary>
        public int max;
        public int max = 100;
        /// <summary>
        /// 最小值
        /// </summary>
        public int min;
        public int min = 0;
        /// <summary>
        /// 数据类型
        /// </summary>
        public string data_type = "";
        /// <summary>
        /// 当前值
        /// app软件自定义属性
        /// 用来记录当前状态
        /// </summary>
        public object curValues;
        public string curValue = "";
    }
    /// <summary>
    /// 功能类能满足数据使用要求,子类只是为了方便使用属性
    /// </summary>
    public class Function
    {
        /*
        HDL统一协议格式:16bytes
        厂商代号:2bytes
        通讯方式:有线/无线/ZIGBEE等1bytes
        产品识别码:以添加设备的年月日时分秒 + 随机数  8bytes  Category
        功能类别:1bytes
        数据表索引地址:2bytes
        回路:2bytes
        举例: 0001-00-2019101209001234-01-0001-0001
              0001-01-14051D0A300C92C9-02-0202-0001-0001
        */
        public Function()
        {
            //dicPropert = new Dictionary<string, string>();
            //if (propertList == null || propertList.Count == 0)
            //{
            //    foreach (var t in propertList)
            //    {
            //        dicPropert.TryAdd(t.attri,t.min.ToString());
            //    }
            //}
        }
        #region base info
        #region 优化区域 2021-02-25
        /// <summary>
        /// 功能ID
        /// 厂商代码   2bytes;     01   HDL
        /// 通讯方式   1byte ;     01   HDL Bus; 02   Zigbee;03   KNX;04   Z-Wave
        /// 产品GUID   8bytes
        /// 产品类别   1byte ;     01  调光器;02继电器;03干接点模块;04传感器;05面板
        /// 物模型类型2bytes      01 开关类    --01开关;02插座
        ///                      02   照明     --01开关类;02调光类;03色温;04LED
        ///                      03   遮阳     --01窗帘电机;02百叶窗;03开合帘;04卷帘
        ///                      04   恒温器    --01空调;02地暖;03毛细空调
        ///                   05   新风
        ///                   06   影音
        ///                   07   音乐
        ///                      08   能源
        ///                      09   安防
        /// 通道号   2bytes
        /// Key_id  2bytes
        /// 更新的最后时间
        /// </summary>
        public string sid = "00010112345678901234560101230123AABB";
        public string time_stamp = "1615261019796";
        public string GeteTime()
        {
            try
            {
                DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区
                return startTime.AddMilliseconds(Convert.ToDouble(time_stamp)).ToString("s");
            }
            catch {
                return DateTime.MinValue.ToString("s");
            }
        }
        /// <summary>
        /// 获取属性列表
        /// </summary>
        /// <returns></returns>
        public List<string> GetAttributes()
        {
            var attrs = new List<string>();
            foreach(var attr in  attributes)
            {
                attrs.Add(attr.key);
            }
            return attrs;
        }
        /// <summary>
        /// 获取指定属性
        /// </summary>
        /// <returns></returns>
        public FunctionAttributes GetAttribute(string key)
        {
            var attr = attributes.Find((a) => a.key == key);
            return attr;
        }
        /// <summary>
        /// A协议功能的特性
        /// 如:是AC功能:特性:on_off,mode,fan,temperature
        /// attri
        /// 获取属性当前状态
        /// </summary>
        public List<Trait> function = new List<Trait>();
        /// <param name="key"></param>
        /// <returns></returns>
        public string GetAttrState(string key)
        {
            var attrState = attributes.Find((s) => s.key == key.ToString());
            if (attrState == null || string.IsNullOrEmpty(attrState.state))
            {
                return "0";
            }
            return attrState.state;
        }
        /// <summary>
        /// 设置属性状态
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns>修改结果</returns>
        public bool SetAttrState(string key, object value)
        {
            var attr = attributes.Find((s) => s.key == key);
            if (attr == null)
            {
                return false;
            }
            else
            {
                attr.state = value.ToString();
                attr.curValue = value.ToString();
            }
            return true;
        }
        /// <summary>
        /// 房间ID列表
        /// 该功能添加到到房间列表
        /// icon文件名称
        /// </summary>
        public List<string> roomIdList = new List<string>();
        public string IconName
        {
            get
            {
                return spk.Replace(".","");
            }
        }
        /// <summary>
        /// bus协议数据格式
        /// 使用A协议控制时,改属性为空
        /// 版本数据列表
        /// </summary>
        public BusData bus_Data;
        public List<VersionInfo> versions = new List<VersionInfo>();
        /// <summary>
        /// 上一次打开的亮度
        /// 灯光私有属性
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public int lastBrightness = 100;
        /// <summary>
        /// 工作模式对应的工作温度
        /// 地热私有属性
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public Dictionary<string, byte> Fh_Mode_Temp = new Dictionary<string, byte>();
        #endregion
        ///// <summary>
        ///// 功能附带的属性与值的列表
        ///// </summary>
        //public Dictionary<string, string> dicPropert;
        /// <summary>
        /// 功能类别
        /// 如:空调类、灯光类、窗帘类
        /// </summary>
        public FunctionCategory functionCategory
        {
            get
            {
                try
                {
                    var _functionCategoryString = sid.Substring(24, 2);
                    var _functionCategory = Convert.ToInt32(_functionCategoryString, 16);
                    return (FunctionCategory)Enum.ToObject(typeof(FunctionCategory), _functionCategory);
                }
                catch (Exception ex)
                {
                    MainPage.Log($"get FunctionCategory error : {ex.Message}");
                    return FunctionCategory.UnKown;
                }
            }
        }
        public FunctionType functionType
        {
            get
            {
                var _functionTypeString = sid.Substring(24, 4);
                return (FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(_functionTypeString, 16));
            }
        }
        #region base info
        public string sid = "0301011234567801012301230123";
        /// <summary>
        /// 备注
        /// </summary>
        public string name;
        /// <summary>
        /// A协议厂商代码
        /// 设备ID
        /// 云端负责生成
        /// </summary>
        public string vendor_code
        public string deviceId = "0";
        /// <summary>
        /// 设备spk
        /// </summary>
        public string spk = "";
        string spk_Prefix;
        /// <summary>
        /// spk前缀
        /// 大类
        /// 功能类别
        /// 如:空调类、灯光类、窗帘类
        /// </summary>
        public string Spk_Prefix
        {
            get
            {
                string vendorCode = "HDL";
                var code = sid.Substring(0, 4);
                if (code == "0001")
                    vendorCode = "HDL";
                return vendorCode;
                if (string.IsNullOrEmpty(spk_Prefix))
                {
                    spk_Prefix = spk.Split(".")[0];
                }
                return spk_Prefix;
            }
        }
        /// <summary>
        /// A协议功能的特性
        /// 如:是AC功能:特性:on_off,mode,fan,temperature
        /// attri
        /// </summary>
        public List<FunctionAttributes> attributes = new List<FunctionAttributes>();
        /// <summary>
        /// 最后控制的一次状态
        /// 房间ID列表
        /// 该功能添加到到房间列表
        /// </summary>
        public string lastState = "";
        public List<string> roomIds = new List<string>();
        [Newtonsoft.Json.JsonIgnore]
        public Trait trait_on_off;
        /// <summary>
        /// 开关状态
        /// 0:关
        /// 1:开
        /// bus协议数据格式
        /// 使用A协议控制时,改属性为空
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string on_off
        {
            get
            {
                try
                {
                    if (trait_on_off == null)
                    {
                        trait_on_off = function.Find((obj) => obj.attri == "on_off");
                        //找不到属性需要声明一个,防止报错闪退
                        if (trait_on_off == null)
                        {
                            trait_on_off = new Trait()
                            {
                                attri = "on_off",
                                value = new List<string> { "on", "off" },
                                max = 1,
                                min = 0,
                            };
                        }
                        trait_on_off.curValues = trait_on_off.value[trait_on_off.min];
                    }
                    return trait_on_off.curValues.ToString();
                }
                catch
                {
                    MainPage.Log("on_off 数据获取失败.");
                    function.Add( new Trait()
                    {
                        attri = "on_off",
                        value = new List<string> { "on", "off" },
                        max = 1,
                        min = 0,
                    });
                    return "off";
                }
            }
            set
            {
                try
                {
                    if (trait_on_off == null)
                    {
                        trait_on_off = function.Find((obj) => obj.attri == "on_off");
                        //找不到属性需要声明一个,防止报错闪退
                        if (trait_on_off == null)
                        {
                            trait_on_off = new Trait()
                            {
                                attri = "on_off",
                                value = new List<string> { "on", "off" },
                                max = 1,
                                min = 0,
                            };
                        }
                        trait_on_off.curValues = trait_on_off.min;
                    }
                    trait_on_off.curValues = value;
                }
                catch (Exception ex)
                {
                    MainPage.Log($"on_off 数据刷新失败: {ex.Message}");
                    function.Add(new Trait()
                    {
                        attri = "on_off",
                        value = new List<string> { "on", "off" },
                        max = 1,
                        min = 0,
                    });
                }
            }
        }
        public BusData bus;
        /// <summary>
        /// 是否收藏
        /// </summary>
        public bool collection = false;
        public bool collect = false;
        /// <summary>
        /// 是否在线
        /// </summary>
        public bool online = true;
        /// <summary>
        /// 云端数据创建的时间
        /// </summary>
        public string createTime = "";
        /// <summary>
        /// 云端数据修改的最后时间
        /// </summary>
        public string modifyTime = "";
        #endregion
        /// <summary>
        /// 延时
        /// </summary>
        public int delay = 0;
        /// <summary>
        /// 最后控制的一次状态
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string lastState = "";
        FunctionAttributes _trait_on_off;
        [Newtonsoft.Json.JsonIgnore]
        public FunctionAttributes trait_on_off
        {
            get
            {
                if (_trait_on_off == null)
                {
                    _trait_on_off = attributes.Find((obj) => obj.key == FunctionAttributeKey.OnOff);
                    //找不到属性需要声明一个,防止报错闪退
                    if (_trait_on_off == null)
                    {
                        _trait_on_off = new FunctionAttributes()
                        {
                            key = "on_off",
                            value = new List<string> { "on", "off" },
                            max = 1,
                            min = 0,
                        };
                        _trait_on_off.curValue = "off";
                    }
                }
                if(_trait_on_off.curValue.ToString() != "on"&& _trait_on_off.curValue.ToString() != "off" && _trait_on_off.curValue.ToString() != "stop")
                {
                    _trait_on_off.curValue = "off";
                }
                return _trait_on_off;
            }
        }
        /// <summary>
        /// 使用次数
        /// </summary>
        public double usageCount = 0;
        public double controlCounter = 0;
        /// <summary>
        /// 使用频率
        /// </summary>
        public double usageFrequency {
        public double usageFrequency
        {
            get
            {
                return usageCount / 7;
                return controlCounter / 7;
            }
        }
        /// <summary>
@@ -268,24 +302,76 @@
        public int fixedSerialNumber = int.MaxValue;
        /// <summary>
        /// 获取A协议控制字符串
        /// 收藏功能
        /// </summary>
        /// <param name="command">控制命令:write,read</param>
        /// <returns></returns>
        public virtual JObject GetSendJObject(CommandType_A command)
        public void CollectFunction()
        {
            var sendJob = new JObject { { "vendor_code", vendor_code }, { "Command", command.ToString() }, { "Type", "device" }, };
            var data = new JObject { { "sid", sid } };
            sendJob.Add("objects", data);
            return sendJob;
            var result = "";
            new System.Threading.Thread(() =>
            {
                if (collect)
                {
                    result = ApiUtlis.Ins.HttpRequest.CollectDevice(deviceId).Code;
                }
                else
                {
                    result = ApiUtlis.Ins.HttpRequest.CancelCollectDevice(deviceId).Code;
                }
                //提示错误
                if (result != StateCode.SUCCESS)
                {
                    Application.RunOnMainThread(() =>
                    {
                        collect = !collect;
                        IMessageCommon.Current.ShowErrorInfoAlter(result);
                    });
                }else
                {
                    Application.RunOnMainThread(() =>
                    {
                        UI.HomePage.RefreshFunctionView();
                    });
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 编辑功能绑定房间信息
        /// </summary>
        public void EditBindRoomInfo(string roomId)
        {
            var result = "";
            new System.Threading.Thread(() =>
            {
                if (collect)
                {
                    result = ApiUtlis.Ins.HttpRequest.BindDeviceToRoom(new List<string>() { deviceId }, new List<string>() { roomId }).Code;
                }
                else
                {
                    result = ApiUtlis.Ins.HttpRequest.UnbindDeviceToRoom(deviceId,roomId);
                }
                //提示错误
                if (result != StateCode.SUCCESS)
                {
                    Application.RunOnMainThread(() =>
                    {
                        collect = !collect;
                        IMessageCommon.Current.ShowErrorInfoAlter(result);
                    });
                }
            })
            { IsBackground = true }.Start();
        }
        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;
        }
@@ -297,24 +383,1094 @@
        public string GetRoomListName()
        {
            string roomNameList = "";
            foreach(var roomId in roomIdList)
            foreach (var roomId in roomIds)
            {
                var findRoom = DB_ResidenceData.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.floor + "·" + findRoom.name;
                roomNameList += findRoom.floorName +"-"+ findRoom.roomName;
            }
            if (roomNameList == "" )
            {
                roomNameList = Language.StringByID(StringId.WholeZone);
            }
            return roomNameList;
        }
        /// <summary>
        /// 数据存储文件名
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string savePath
        {
            get
            {
                return "FunctionData_" + sid;
            }
        }
        /// <summary>
        /// 保存功能文件
        /// </summary>
        public void SaveFunctionFile()
        {
            var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
            FileUtlis.Files.WriteFileByBytes(savePath, ssd);
        }
        /// <summary>
        /// 保存房间绑定信息
        /// </summary>
        public void UpdataRoomIds()
        {
            new System.Threading.Thread(() =>
            {
                var pack = ApiUtlis.Ins.HttpRequest.UpdataDevcieBindRoomInfo(this);
                //直接保存本地,
                SaveFunctionFile();
                if (pack.Code == StateCode.SUCCESS)
                {
                }
                else
                {
                    IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 更新功能信息
        /// </summary>
        public void UpdataFuncitonInfo()
        {
            new System.Threading.Thread(() =>
            {
                var pm = new HttpServerRequest();
                var pack = pm.UpdataDevcieInfo(this);
                SaveFunctionFile();
                if (pack.Code == StateCode.SUCCESS)
                {
                }
                else
                {
                    IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 更新功能名称
        /// </summary>
        public void UpdataFunctionName()
        {
            new System.Threading.Thread(() =>
            {
                var pm = new HttpServerRequest();
                var pack = pm.UpdataDevcieInfo(this);
                SaveFunctionFile();
                if (pack.Code == StateCode.SUCCESS)
                {
                }
                else
                {
                    IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
                }
            })
            { IsBackground = true }.Start();
        }
        /// <summary>
        /// 转换成场景功能对象
        /// </summary>
        /// <returns></returns>
        public SceneFunction ConvertSceneFunction()
        {
            var sFunc = new SceneFunction();
            foreach (var attr in attributes)
            {
                switch (attr.key)
                {
                    case FunctionAttributeKey.OnOff:
                    case FunctionAttributeKey.Brightness:
                    case FunctionAttributeKey.Mode:
                    case FunctionAttributeKey.SetTemp:
                    case FunctionAttributeKey.FanSpeed:
                    case FunctionAttributeKey.Percent:
                    //case FunctionAttributeKey.FadeTime:
                        if (attr.curValue.ToString() == "{}")
                        {
                            if (attr.key == FunctionAttributeKey.OnOff)
                            {
                                attr.curValue = "off";
                            }
                            else
                            {
                                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() });
                        }
                        break;
                }
            }
            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 = Utlis.GetTimestamp();
            var acd = new AlinkStatusData();
            acd.sid = sid;
            foreach (var dic in commandDictionary)
            {
                var aca = new AttributesStatus();
                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;
            aaao.bus = this.bus;
            foreach (var kv in keyValues)
            {
                aaao.attributes.Add(new AttributesStatus()
                {
                    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<AttributesStatus> attributes = new List<AttributesStatus>();
        //[Newtonsoft.Json.JsonIgnore]
        public BusData bus = new BusData();
    }
    /// <summary>
    /// A协议控制数据的对象
    /// </summary>
    public class AlinkFunctionStatusObj
    {
        public List<AlinkStatusData> objects = new List<AlinkStatusData>();
        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 AlinkStatusData
    {
        /*
         mqtt接收的状态数据没有deviceId
        接口反馈的数据有
         */
        /// <summary>
        ///
        /// </summary>
        public string sid = "";
        /// <summary>
        /// 设备ID
        /// 云端负责生成
        /// </summary>
        public string deviceId = "0";
        public List<AttributesStatus> status = new List<AttributesStatus>();
    }
    /// <summary>
    /// a协议控制动作数据
    /// </summary>
    public class AttributesStatus
    {
        /// <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 string state = "";
        /// <summary>
        /// 当前值
        /// </summary>
        public object curValue = new object();
    }
    /// <summary>
    /// 功能属性键名列表
    /// </summary>
    public static class FunctionAttributeKey
    {
        public const string _null = "";
        /// <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 Swing = "swing";
        /// <summary>
        /// 工作模式
        /// 地热/地冷/功率地热/功率地冷
        /// </summary>
        public const string WorkMode = "mode_work";
        /// <summary>
        /// 风速
        /// </summary>
        public const string FanSpeed = "fan";
        /// <summary>
        /// 手动风向
        /// </summary>
        public const string FanManual = "fan_manual";
        /// <summary>
        /// 自动风向
        /// </summary>
        public const string FanAuto = "fan_auto";
        /// <summary>
        /// 设置温度
        /// </summary>
        public const string SetTemp = "set_temp";
        /// <summary>
        /// 温度加减
        /// </summary>
        public const string SetTempStep = "set_temp_step";
        /// <summary>
        /// 温度模式
        /// 空调、地热//app自加
        /// </summary>
        public const string TempType = "temperature_type";
        /// <summary>
        /// 时间标记
        /// 地热//app自加
        /// </summary>
        public const string TimeFlag = "time_flag";
        /// <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 RoomTemp = "room_temp";
        /// <summary>
        /// value
        /// </summary>
        public const string Value = "value";
        /// <summary>
        /// 状态,传感器
        /// </summary>
        public const string Status = "status";
        /// <summary>
        /// 毫米波传感器,动作状态
        /// </summary>
        public const string ActionStatus = "action_state";
        /// <summary>
        /// 电量状态
        /// </summary>
        public const string BatteryState = "battery_state";
        /// <summary>
        /// 烘干
        /// </summary>
        public const string HotDry = "hot_dry";
        /// <summary>
        /// 风干
        /// </summary>
        public const string WindDry = "wind_dry";
        /// <summary>
        /// 消毒
        /// </summary>
        public const string Disinfect = "disinfect";
        /// <summary>
        /// 上升下降
        /// </summary>
        public const string Position = "position";
        /// <summary>
        /// 进度
        /// </summary>
        public const string PositionPercent = "position_percent";
        /// <summary>
        /// 烘干时间
        /// </summary>
        public const string HotDryTime = "hot_dry_time";
        /// <summary>
        /// 烘干剩余时间
        /// </summary>
        public const string HotDryTimeLeft = "hot_dry_time_surplus";
        /// <summary>
        /// 风干时间
        /// </summary>
        public const string WindDryTime = "wind_dry_time";
        /// <summary>
        /// 风干剩余时间
        /// </summary>
        public const string WindDryTimeLeft = "wind_dry_time_surplus";
        /// <summary>
        /// 消毒时间
        /// </summary>
        public const string DisinfectTime = "disinfect_time";
        /// <summary>
        /// 消毒剩余时间
        /// </summary>
        public const string DisinfectTimeLeft = "disinfect_time_surplus";
        /// <summary>
        /// 负离子
        /// </summary>
        public const string Anion = "anion";
        /// <summary>
        /// 负离子时间
        /// </summary>
        public const string AnionTime = "anion_time";
        /// <summary>
        /// 负离子剩余时间
        /// </summary>
        public const string AnionTimeLeft = "anion_time_surplus";
        /// <summary>
        /// 打开等级(风扇)
        /// </summary>
        public const string OpenLevel = "openLevel";
        /// <summary>
        /// 红外按键
        /// </summary>
        public const string Key = "key";
        /// <summary>
        /// 节能
        /// </summary>
        public const string Energy = "energy";
        /// <summary>
        /// 湿度
        /// </summary>
        public const string Humidity = "humidity";
        /// <summary>
        /// 室内温度
        /// </summary>
        public const string IndoorTemp = "indoor_temp";
        /// <summary>
        /// 室内湿度
        /// </summary>
        public const string IndoorHumidity = "indoor_humidity";
        /// <summary>
        /// 过滤网剩余量
        /// </summary>
        public const string FilterRemain = "filter_remain";
        /// <summary>
        /// 过滤网是否超时警告
        /// </summary>
        public const string FilterTimeout = "filter_timeout";
        #region tuya
        /// <summary>
        /// 涂鸦水阀开启时间
        /// </summary>
        public const string TuyaWaterTime = "countdown_1";
        #endregion
        /// <summary>
        /// 功率
        /// </summary>
        public const string Power = "power";
        /// <summary>
        /// 总电量
        /// </summary>
        public const string TotalElectricity = "total_electricity";
    }
    /// <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
            {
                try
                {
                    return Convert.ToByte(loopId, 16);
                }catch
                {
                    return 0;
                }
            }
        }
        public string loopId;
    }
    public static class SPK
    {
        #region 灯光
        /// <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>
        /// 灯光spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> LightSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(LightCCT);
            spkList.Add(LightDimming);
            spkList.Add(LightRGB);
            spkList.Add(LightRGBW);
            spkList.Add(LightSwitch);
            return spkList;
        }
        #endregion
        #region 窗帘
        /// <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>
        /// 窗帘spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> CurtainSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(CurtainRoller);
            spkList.Add(CurtainSwitch);
            spkList.Add(CurtainShades);
            spkList.Add(CurtainTrietex);
            return spkList;
        }
        #endregion
        #region 空调
        /// <summary>
        /// (空调)
        /// </summary>
        public const string AcStandard = "ac.standard";
        /// <summary>
        /// (红外空调)
        /// </summary>
        public const string AcIr= "ir.ac";
        /// <summary>
        /// 空调spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> AcSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(AcStandard);
            spkList.Add(AcIr);
            return spkList;
        }
        #endregion
        #region 地热
        /// <summary>
        /// (地热)
        /// </summary>
        public const string FloorHeatStandard = "floorHeat.standard";
        /// <summary>
        /// 地热spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> FhSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(FloorHeatStandard);
            return spkList;
        }
        #endregion
        #region 新风
        /// <summary>
        /// (新风)
        /// </summary>
        public const string AirFreshStandard = "airFresh.standard";
        /// <summary>
        /// 新风 ——金茂定制
        /// </summary>
        public const string AirFreshJinmao = "airFresh.jinmao";
        /// <summary>
        /// 新风spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> AirFreshSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(AirFreshStandard);
            spkList.Add(AirFreshJinmao);
            return spkList;
        }
        #endregion
        #region 能源
        /// <summary>
        /// 能源模块
        /// </summary>
        public const string EnergyStandard = "energy.standard";
        /// <summary>
        /// 能源-电能
        /// </summary>
        public const string ElectricEnergy = "energy.electric";
        /// <summary>
        /// 能源spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> EnergySpkList()
        {
            var spkList = new List<string>();
            spkList.Add(ElectricEnergy);
            return spkList;
        }
        #endregion
        #region 音乐
        /// <summary>
        /// (音乐)
        /// </summary>
        public const string MusicStandard = "music.standard";
        /// <summary>
        /// 音乐spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> MusicSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(MusicStandard);
            return spkList;
        }
        #endregion
        #region 传感器
        #region 安防传感器
        /// <summary>
        /// (亮度传感器)
        /// </summary>
        public const string SensorLight = "sensor.light";
        /// <summary>
        /// (红外移动传感器)
        /// </summary>
        public const string SensorPir = "sensor.pir";
        /// <summary>
        /// (门窗传感器)
        /// </summary>
        public const string SensorDoorWindow = "sensor.doorwindow";
        /// <summary>
        /// 烟雾传感器
        /// </summary>
        public const string SensorSmoke = "sensor.smoke";
        /// <summary>
        /// 水浸传感器
        /// </summary>
        public const string SensorWater = "sensor.water";
        /// <summary>
        /// 燃气传感器
        /// </summary>
        public const string SensorGas = "sensor.gas";
        /// <summary>
        /// 红外珊栏传感器
        /// </summary>
        public const string SensorShanLan = "sensor.shanlan";
        /// <summary>
        /// 红外对射传感器
        /// </summary>
        public const string SensorDuiShe = "sensor.duishe";
        /// <summary>
        /// 超声波传感器
        /// </summary>
        public const string SensoruUtrasonic = "sensor.ultrasonic";
        /// <summary>
        /// (干接点)
        /// </summary>
        public const string SensorDryContact = "sensor.dryContact";
        /// <summary>
        /// 毫米波传感器
        /// </summary>
        public const string SenesorMegahealth = "sensor.megahealth";
        /// <summary>
        /// 安防传感器spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> ArmSensorSpkList()
        {
            var spkList = new List<string>();
            //spkList.Add(SensorLight);
            spkList.Add(SensorPir);
            spkList.Add(SensorDoorWindow);
            spkList.Add(SensorSmoke);
            spkList.Add(SensorWater);
            //spkList.Add(SensorGas);
            //spkList.Add(SensorShanLan);
            //spkList.Add(SensorDuiShe);
            //spkList.Add(SensoruUtrasonic);
            //spkList.Add(SensorDryContact);
            spkList.Add(SenesorMegahealth);
            return spkList;
        }
        #endregion
        #region 环境传感器
        /// <summary>
        /// (温度传感器)
        /// </summary>
        public const string SensorTemperature = "sensor.temperature";
        /// <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>
        /// 环境传感器spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> EnvironSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(SensorTemperature);
            spkList.Add(SensorPm25);
            spkList.Add(SensorCO2);
            spkList.Add(SensorTVOC);
            spkList.Add(SensorHumidity);
            return spkList;
        }
        #endregion
        #endregion
        #region 家电
        /// <summary>
        /// 家电、插座
        /// </summary>
        public const string ElectricSocket = "electrical.socket";
        /// <summary>
        /// 家电、电视
        /// </summary>
        public const string ElectricTV = "electrical.tv";
        /// <summary>
        /// 红外、电视
        /// </summary>
        public const string TvIr = "ir.tv";
        /// <summary>
        /// 红外、小米电视
        /// </summary>
        public const string TvXmIr = "ir.tvxm";
        /// <summary>
        /// 家电、风扇
        /// </summary>
        public const string ElectricFan = "electrical.fan";
        /// <summary>
        /// 凉霸
        /// </summary>
        public const string ClothesHanger = "electrical.racks";
        /// <summary>
        /// 红外遥控器
        /// </summary>
        public const string IrLearn = "ir.learn";
        /// <summary>
        /// 红外投影仪
        /// </summary>
        public const string PjtIr = "ir.pjt";
        /// <summary>
        /// 红外机顶盒
        /// </summary>
        public const string StbIr = "ir.stb";
        /// <summary>
        /// 红外影碟机
        /// </summary>
        public const string DvDIr = "ir.dvd";
        /// <summary>
        /// 红外空气净化器
        /// </summary>
        public const string PurifierIr = "ir.air_purifier";
        /// <summary>
        /// 红外热水器
        /// </summary>
        public const string HeaterIr = " ir.water_heater";
        /// <summary>
        /// 红外风扇
        /// </summary>
        public const string FanIr = "ir.fan";
        #region 涂鸦
        /// <summary>
        /// 家电、涂鸦空气净化器
        /// </summary>
        public const string ElectricTuyaAirCleaner = "electrical.Q1RsefNf91tIXyyQ";
        /// <summary>
        /// 家电、涂鸦电风扇
        /// </summary>
        public const string ElectricTuyaFan = "electrical.tyqborgovyzytytz";
        /// <summary>
        /// 家电、涂鸦扫地机器人
        /// </summary>
        public const string ElectricTuyaWeepRobot = "electrical.ai6HtccKFIw3dxo3";
        /// <summary>
        /// 家电、涂鸦水阀
        /// </summary>
        public const string ElectricTuyaWaterValve = "electrical.koiGhMKwLf2ZP81g";
        #endregion
        /// <summary>
        /// 家电spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> ElectricalSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(ElectricSocket);
            spkList.Add(ElectricTV);
            spkList.Add(TvIr);
            spkList.Add(TvXmIr);
            spkList.Add(ElectricFan);
            spkList.Add(FanIr);
            spkList.Add(ClothesHanger);
            spkList.Add(IrLearn);
            spkList.Add(PjtIr);
            spkList.Add(StbIr);
            spkList.Add(ElectricTuyaAirCleaner);
            spkList.Add(ElectricTuyaFan);
            spkList.Add(ElectricTuyaWeepRobot);
            spkList.Add(ElectricTuyaWaterValve);
            return spkList;
        }
        #endregion
        #region 设备类
        /// <summary>
        /// 红外宝
        /// </summary>
        public const string IrModule = "ir.module";
        /// <summary>
        /// 设备类spk列表
        /// </summary>
        /// <returns></returns>
        public static List<string> DeviceSpkList()
        {
            var spkList = new List<string>();
            spkList.Add(IrModule);
            return spkList;
        }
        #endregion
        #region 第三方spk列表
        /// <summary>
        /// 获取所有第三方品牌功能的spk
        /// </summary>
        /// <returns></returns>
        public static List<string> GetAll3tySPK()
        {
            var spkList = new List<string>();
            spkList.Add(ElectricTuyaAirCleaner);
            spkList.Add(ElectricTuyaFan);
            spkList.Add(ElectricTuyaWaterValve);
            spkList.Add(ElectricTuyaWeepRobot);
            spkList.Add(SenesorMegahealth);
            return spkList;
        }
        /// <summary>
        /// 获取第三方设备spk
        /// </summary>
        /// <returns></returns>
        public static List<string> Get3tySpk(BrandType brandType)
        {
            var list = new List<string>();
            switch (brandType)
            {
                case BrandType.Tuya:
                    list.Add(ElectricTuyaAirCleaner);
                    list.Add(ElectricTuyaFan);
                    list.Add(ElectricTuyaWaterValve);
                    list.Add(ElectricTuyaWeepRobot);
                    break;
                case BrandType.All3tyBrand:
                    list.Add(SenesorMegahealth);//兆观
                    break;
            }
            return list;
        }
        #endregion
        /// <summary>
        /// 第三方品牌列表
        /// </summary>
        public enum BrandType
        {
            All = 0,
            Hdl = 1,
            Tuya = 2,
            /// <summary>
            /// 兆观
            /// </summary>
            Megahealth = 3,
            All3tyBrand = 999,
        }
    }
    /// <summary>
    /// 功能类别
    /// </summary>
    public static class FunctionCategory
    {
        /// <summary>
        ///(灯)
        /// </summary>
        public const string Light = "light";
        /// <summary>
        /// (窗帘)
        /// </summary>
        public const string Curtain = "curtain";
        /// <summary>
        /// (空调)
        /// </summary>
        public const string AC = "ac";
        /// <summary>
        /// (地热)
        /// </summary>
        public const string FloorHeat = "floorHeat";
        /// <summary>
        /// (新风)
        /// </summary>
        public const string AirFresh = "airFresh";
        /// <summary>
        /// (音乐)
        /// </summary>
        public const string Music = "music";
        /// <summary>
        /// (传感器)
        /// </summary>
        public const string Sensor = "sensor";
        /// <summary>
        /// (干接点)
        /// </summary>
        public const string DryContact = "dryContact";
        /// <summary>
        /// 家电
        /// </summary>
        public const string Electric = "electrical";
        /// <summary>
        /// 红外设备
        /// </summary>
        public const string IR = "ir";
    }
public class VersionInfo
{
    public string module = "";
    public string version = "";
}
}