wxr
2020-04-21 f718d23a262a5a8e1241fdeaeb4153399f95e79d
HDL_ON/Entity/Function/Function.cs
@@ -1,61 +1,301 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json.Linq;
using HDL_ON;
namespace HDL_ON.Entity
{
    /// <summary>
    /// 功能属性
    /// 属性字段解析:attri :属性内容,value 属性的值,max 最大值 min 最小值
    /// </summary>
    public class Trait
    {
        /// <summary>
        /// 属性内容
        /// </summary>
        public string attri;
        /// <summary>
        /// 属性的值
        /// </summary>
        public List<string> value;
        /// <summary>
        /// 最大值
        /// </summary>
        public int max;
        /// <summary>
        /// 最小值
        /// </summary>
        public int min;
    }
    public class Function
    {
        /*
        HDL统一协议格式:16bytes
        厂商代号:2bytes
        通讯方式:有线/无线/ZIGBEE等1bytes
        产品识别码:以添加设备的年月日时分秒 + 随机数8bytes
        产品识别码:以添加设备的年月日时分秒 + 随机数  8bytes  Category
        功能类别:1bytes
        数据表索引地址:2bytes
        回路:2bytes
        举例: 0001-00-201910120900002567-01-0001-0001
        举例: 0001-00-2019101209001234-01-0001-0001
        */
        public Function()
        {
            dicPropert = new Dictionary<string, string>();
            if (trait == null || trait.Count == 0)
            {
                foreach (var t in trait)
                {
                    dicPropert.TryAdd(t.attri,t.min.ToString());
                }
            }
        }
        /// <summary>
        /// 当前设备类型
        /// </summary>
        public FunctionType funcType = FunctionType.UnKown;
        /// <summary>
        /// 功能分类
        /// </summary>
        public string funcClassification;
        #region base info
        /// <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;
        public string sid = "00010112345678901234560101230123AABB";
        /// <summary>
        /// 备注
        /// A协议功能的通行
        /// 如:是AC功能:特性:on_off,mode,fan,temperature
        /// attri
        /// </summary>
        public string Name;
        /// <summary>
        /// 保存数据时的文件名
        /// </summary>
        public string SavePath = "";
        /// <summary>
        /// A协议数据格式
        /// </summary>
        public string A_Protocol;
        /// <summary>
        /// bus协议数据格式
        /// </summary>
        public string Bus_Protocol;
        public List<Trait> trait = new List<Trait>();
        /// <summary>
        /// 房间ID列表
        /// 该功能添加到到房间列表
        /// </summary>
        public List<string> roomIdList = new List<string>();
        /// <summary>
        /// bus协议数据格式
        /// 使用A协议控制时,改属性为空
        /// </summary>
        public BusData bus_Data;
        #endregion
        /// <summary>
        /// 功能附带的属性与值的列表
        /// </summary>
        public Dictionary<string, string> dicPropert;
        /// <summary>
        /// 功能类别
        /// 如:空调类、灯光类、窗帘类
        /// </summary>
        public FunctionCategory functionCategory
        {
            get
            {
                try
                {
                    var _functionCategoryString = sid.Substring(24, 2);
                    return (FunctionCategory)Enum.ToObject(typeof(FunctionCategory), Convert.ToInt32(_functionCategoryString));
                }
                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));
            }
        }
        /// <summary>
        /// 备注
        /// </summary>
        public string name;
        /// <summary>
        /// A协议厂商代码
        /// </summary>
        public string vendor_code
        {
            get
            {
                string vendorCode = "HDL";
                var code = sid.Substring(0, 4);
                if (code == "0001")
                    vendorCode = "HDL";
                return vendorCode;
            }
        }
        /// <summary>
        /// 最后控制的一次状态
        /// </summary>
        public string lastState = "";
        /// <summary>
        /// 开关状态
        /// 0:关
        /// 1:开
        /// </summary>
        [Newtonsoft.Json.JsonIgnore]
        public string on_off
        {
            get
            {
                try
                {
                    string o = "off";
                    dicPropert.TryGetValue("on_off", out o);
                    return o == "" ? "off" : o;
                }
                catch
                {
                    MainPage.Log("on_off 数据获取失败.");
                    dicPropert.TryAdd("on_off", "0");
                    return "off";
                }
            }
            set
            {
                try
                {
                    dicPropert["on_off"] = value.ToString();
                }
                catch
                {
                    MainPage.Log("on_off 数据刷新失败.");
                    dicPropert.TryAdd("on_off", value.ToString());
                }
            }
        }
        /// <summary>
        /// 是否收藏
        /// </summary>
        public bool collection = false;
        /// <summary>
        /// 使用次数
        /// </summary>
        public double usageCount = 0;
        /// <summary>
        /// 使用频率
        /// </summary>
        public double usageFrequency {
            get
            {
                return usageCount / 7;
            }
        }
        /// <summary>
        /// 固定的序号
        /// </summary>
        public int fixedSerialNumber = int.MaxValue;
        /// <summary>
        /// A协议数据
        /// </summary>
        public List<string> PropertyArray
        {
            get
            {
                try
                {
                    if (trait == null)
                        return new List<string>();
                    var proArr = new List<string>();
                    foreach (var pro in trait)
                    {
                        if (!dicPropert.ContainsKey(pro.attri))
                        {
                            dicPropert.TryAdd(pro.attri, "0");
                        }
                        if (!proArr.Contains(pro.attri))
                        {
                            proArr.Add(pro.attri);
                        }
                    }
                    return proArr;
                }
                catch (Exception ex)
                {
                    MainPage.Log($"Get PropertyArray error : {ex.Message}");
                    return new List<string>();
                }
            }
        }
        /// <summary>
        /// 获取A协议控制字符串
        /// </summary>
        /// <param name="command">控制命令:write,read</param>
        /// <returns></returns>
        public virtual JObject GetSendJObject(CommandType_A command)
        {
            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;
        }
        public string GetBusId ()
        {
            string busId = "";
            if (bus_Data != null)
            {
                busId = bus_Data.SubnetID + "_" + bus_Data.DeviceID + "_" + bus_Data.LoopID;
            }
            return busId;
        }
        /// <summary>
        /// 获取设备添加到房间的房间名称
        /// </summary>
        /// <returns></returns>
        public string GetRoomListName()
        {
            string roomNameList = "";
            foreach(var roomId in roomIdList)
            {
                var findRoom = DB_ResidenceData.residenceData.rooms.Find(obj => obj.sid == roomId);
                if (findRoom == null)
                    continue;
                if(roomNameList != "")
                {
                    roomNameList += ",";
                }
                roomNameList += findRoom.floor + "·" + findRoom.name;
            }
            return roomNameList;
        }
        /// <summary>
        /// 更新时间
        /// </summary>
        public DateTime refreshTime = DateTime.MinValue;
    }
}