| | |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Linq; |
| | | using Newtonsoft.Json.Linq; |
| | | using HDL_ON; |
| | | using Shared; |
| | | |
| | | namespace HDL_ON.Entity |
| | | { |
| | | /// <summary> |
| | | /// 功能类能满足数据使用要求,子类只是为了方便使用属性 |
| | | /// </summary> |
| | | 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 |
| | | /// 来源: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为单位
|
| | | /// 产品类别:01 调光器、02 继电器、03 干接点模块、04 传感器、05 面板
|
| | | /// 物模型类型:
|
| | | /// 01 开关类:01 开关、02 插座、03 |
| | | /// 02 照明: 01 开关、02 调光、03 色温、04 LED
|
| | | /// 03 遮阳: 01 窗帘电机、02 百叶窗、03 开合帘、04 卷帘
|
| | | /// 04 恒温器:01 空调、02 地暖、03 毛细空调 |
| | | /// 05 新风 |
| | | /// 06 影音 |
| | | /// 07 音乐 |
| | | /// 08 能源 |
| | | /// 09 安防 |
| | | /// 大类别 1bytes (预留)
|
| | | /// 小类别 1byte (预留) |
| | | /// </summary> |
| | | public string sid = "0301011234567801012301230123"; |
| | | |
| | | /// <summary> |
| | | /// A协议功能的特性 |
| | | /// 如:是AC功能:特性:on_off,mode,fan,temperature |
| | | /// attri |
| | | /// </summary> |
| | | public List<Trait> function = new List<Trait>(); |
| | | |
| | | /// <summary> |
| | | /// 房间ID列表 |
| | | /// 该功能添加到到房间列表 |
| | | /// </summary> |
| | | public List<string> roomIdList = new List<string>(); |
| | | |
| | | /// <summary> |
| | | /// bus协议数据格式 |
| | | /// 使用A协议控制时,改属性为空 |
| | | /// </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 |
| | | |
| | | /// <summary> |
| | | /// 功能类别 |
| | | /// 如:空调类、灯光类、窗帘类 |
| | | /// </summary> |
| | | public FunctionCategory functionCategory |
| | | { |
| | | get |
| | | { |
| | | try |
| | | { |
| | | var _functionCategoryString = sid.Substring(16, 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(16, 4); |
| | | return (FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(_functionTypeString, 16)); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 备注 |
| | | /// </summary> |
| | | public string name; |
| | | |
| | | /// <summary> |
| | | /// 最后控制的一次状态 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public string lastState = ""; |
| | | |
| | | Trait _trait_on_off; |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public Trait trait_on_off |
| | | { |
| | | get |
| | | { |
| | | if (_trait_on_off == null) |
| | | { |
| | | _trait_on_off = function.Find((obj) => obj.name == "on_off"); |
| | | //找不到属性需要声明一个,防止报错闪退 |
| | | if (_trait_on_off == null) |
| | | { |
| | | _trait_on_off = new Trait() |
| | | { |
| | | name = "on_off", |
| | | value_key = new List<string> { "on", "off" }, |
| | | max = 1, |
| | | min = 0, |
| | | }; |
| | | } |
| | | _trait_on_off.value = "on"; |
| | | } |
| | | return _trait_on_off; |
| | | } |
| | | //set |
| | | //{ |
| | | // _trait_on_off = value; |
| | | //} |
| | | } |
| | | |
| | | /// <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; |
| | | |
| | | 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.rooms.Find(obj => obj.sid == roomId); |
| | | if (findRoom == null) |
| | | continue; |
| | | if(roomNameList != "") |
| | | { |
| | | roomNameList += ","; |
| | | } |
| | | roomNameList += findRoom.floorName + findRoom.name; |
| | | } |
| | | if (roomNameList == "" && functionType == FunctionType.Scene) |
| | | { |
| | | roomNameList = Language.StringByID(StringId.WholeHouseScene); |
| | | } |
| | | return roomNameList; |
| | | } |
| | | /// <summary> |
| | | /// 保存功能数据 |
| | | /// </summary> |
| | | public void SaveFunctionData() |
| | | { |
| | | 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}"); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新时间 |
| | | /// </summary> |
| | | public DateTime refreshTime = DateTime.MinValue; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 功能属性 |
| | | /// 属性字段解析:attri :属性内容,value 属性的值,max 最大值 min 最小值 |
| | |
| | | /// 属性的值列表 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public List<string> value_key { |
| | | public List<string> value_key |
| | | { |
| | | get |
| | | { |
| | | return _value_key; |
| | |
| | | { |
| | | get |
| | | { |
| | | if(!string.IsNullOrEmpty( _uintString)) |
| | | if (!string.IsNullOrEmpty(_uintString)) |
| | | { |
| | | return _uintString; |
| | | } |
| | | var us = ""; |
| | | switch(name) |
| | | switch (name) |
| | | { |
| | | case "temperature": |
| | | us = "°C"; |
| | |
| | | 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 |
| | | /// 来源: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为单位
|
| | | /// 产品类别:01 调光器、02 继电器、03 干接点模块、04 传感器、05 面板
|
| | | /// 物模型类型:
|
| | | /// 01 开关类:01 开关、02 插座、03 |
| | | /// 02 照明: 01 开关、02 调光、03 色温、04 LED
|
| | | /// 03 遮阳: 01 窗帘电机、02 百叶窗、03 开合帘、04 卷帘
|
| | | /// 04 恒温器:01 空调、02 地暖、03 毛细空调 |
| | | /// 05 新风 |
| | | /// 06 影音 |
| | | /// 07 音乐 |
| | | /// 08 能源 |
| | | /// 09 安防 |
| | | /// 大类别 1bytes (预留)
|
| | | /// 小类别 1byte (预留) |
| | | /// </summary> |
| | | public string sid = "0301011234567801012301230123"; |
| | | |
| | | /// <summary> |
| | | /// A协议功能的特性 |
| | | /// 如:是AC功能:特性:on_off,mode,fan,temperature |
| | | /// attri |
| | | /// </summary> |
| | | public List<Trait> function = new List<Trait>(); |
| | | |
| | | /// <summary> |
| | | /// 房间ID列表 |
| | | /// 该功能添加到到房间列表 |
| | | /// </summary> |
| | | public List<string> roomIdList = new List<string>(); |
| | | |
| | | /// <summary> |
| | | /// bus协议数据格式 |
| | | /// 使用A协议控制时,改属性为空 |
| | | /// </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 |
| | | |
| | | /// <summary> |
| | | /// 功能类别 |
| | | /// 如:空调类、灯光类、窗帘类 |
| | | /// </summary> |
| | | public FunctionCategory functionCategory |
| | | { |
| | | get |
| | | { |
| | | try |
| | | { |
| | | var _functionCategoryString = sid.Substring(16, 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(16, 4); |
| | | return (FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(_functionTypeString, 16)); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 备注 |
| | | /// </summary> |
| | | public string name; |
| | | |
| | | /// <summary> |
| | | /// 最后控制的一次状态 |
| | | /// </summary> |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public string lastState = ""; |
| | | |
| | | Trait _trait_on_off; |
| | | [Newtonsoft.Json.JsonIgnore] |
| | | public Trait trait_on_off |
| | | { |
| | | get |
| | | { |
| | | if (_trait_on_off == null) |
| | | { |
| | | _trait_on_off = function.Find((obj) => obj.name == "on_off"); |
| | | //找不到属性需要声明一个,防止报错闪退 |
| | | if (_trait_on_off == null) |
| | | { |
| | | _trait_on_off = new Trait() |
| | | { |
| | | name = "on_off", |
| | | value_key = new List<string> { "on", "off" }, |
| | | max = 1, |
| | | min = 0, |
| | | }; |
| | | } |
| | | _trait_on_off.value = "on"; |
| | | } |
| | | return _trait_on_off; |
| | | } |
| | | //set |
| | | //{ |
| | | // _trait_on_off = value; |
| | | //} |
| | | } |
| | | |
| | | /// <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; |
| | | |
| | | 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.rooms.Find(obj => obj.sid == roomId); |
| | | if (findRoom == null) |
| | | continue; |
| | | if(roomNameList != "") |
| | | { |
| | | roomNameList += ","; |
| | | } |
| | | roomNameList += findRoom.floorName + findRoom.name; |
| | | } |
| | | if (roomNameList == "" && functionType == FunctionType.Scene) |
| | | { |
| | | roomNameList = Language.StringByID(StringId.WholeHouseScene); |
| | | } |
| | | return roomNameList; |
| | | } |
| | | /// <summary> |
| | | /// 保存功能数据 |
| | | /// </summary> |
| | | public void SaveFunctionData() |
| | | { |
| | | 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}"); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新时间 |
| | | /// </summary> |
| | | public DateTime refreshTime = DateTime.MinValue; |
| | | } |
| | | } |