using System;
|
using System.Collections.Generic;
|
using HDL_ON.DriverLayer;
|
using Shared;
|
|
namespace HDL_ON.Entity
|
{
|
/// <summary>
|
/// 读取服务器空间信息返回到数据包
|
/// </summary>
|
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 Function
|
{
|
public Function()
|
{
|
}
|
|
#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>
|
/// 备注
|
/// </summary>
|
public string name;
|
/// <summary>
|
/// 设备ID
|
/// 云端负责生成
|
/// </summary>
|
public string deviceId = "0";
|
/// <summary>
|
/// 设备spk
|
/// </summary>
|
public string spk = "";
|
/// <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;
|
}
|
}
|
}
|
///// <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 List<FunctionAttributes> attributes = new List<FunctionAttributes>();
|
|
/// <summary>
|
/// 房间ID列表
|
/// 该功能添加到到房间列表
|
/// </summary>
|
public List<string> roomIds = new List<string>();
|
|
/// <summary>
|
/// bus协议数据格式
|
/// 使用A协议控制时,改属性为空
|
/// </summary>
|
public BusData bus_Data;
|
/// <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 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;
|
}
|
}
|
|
/// <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 == "on_off");
|
//找不到属性需要声明一个,防止报错闪退
|
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 = "on";
|
}
|
return _trait_on_off;
|
}
|
//set
|
//{
|
// _trait_on_off = value;
|
//}
|
}
|
|
/// <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 roomIds)
|
{
|
var findRoom = DB_ResidenceData.residenceData.Rooms.Find(obj => obj.roomId == roomId);
|
if (findRoom == null)
|
{
|
continue;
|
}
|
if (roomNameList != "")
|
{
|
roomNameList += ",";
|
}
|
roomNameList += findRoom.floorName + findRoom.roomName;
|
}
|
if (roomNameList == "" && functionType == FunctionType.Scene)
|
{
|
roomNameList = Language.StringByID(StringId.WholeHouseScene);
|
}
|
return roomNameList;
|
}
|
/// <summary>
|
/// 数据存储文件名
|
/// </summary>
|
[Newtonsoft.Json.JsonIgnore]
|
public string savePath
|
{
|
get
|
{
|
return "FunctionData_" + sid;
|
}
|
}
|
/// <summary>
|
/// 保存功能数据
|
/// </summary>
|
public void SaveFunctionData(bool upSevser)
|
{
|
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));
|
FileUtils.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));
|
FileUtils.WriteFileByBytes(savePath, ssd);
|
}
|
}
|
|
|
/// <summary>
|
/// 转换成场景功能对象
|
/// </summary>
|
/// <returns></returns>
|
public SceneFunction ConvertSceneFunction()
|
{
|
var sFunc = new SceneFunction();
|
foreach (var attr in attributes)
|
{
|
sFunc.status.Add(new SceneFunctionStatus() { key = attr.key, value = attr.curValue.ToString() });
|
}
|
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;
|
var aca = new AlinkControlAttributes();
|
foreach (var dic in commandDictionary)
|
{
|
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>
|
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();
|
|
//----app自定义
|
/// <summary>
|
/// 属性值单位
|
/// </summary>
|
string _uintString;
|
[Newtonsoft.Json.JsonIgnore]
|
public string uintString
|
{
|
get
|
{
|
if (!string.IsNullOrEmpty(_uintString))
|
{
|
return _uintString;
|
}
|
var us = "";
|
switch (key)
|
{
|
case "temperature":
|
case "set_temperature":
|
us = "°C";
|
break;
|
case "percent":
|
case "brightness":
|
us = "%";
|
break;
|
}
|
return us;
|
}
|
}
|
|
/// <summary>
|
/// 属性名称显示文本
|
/// 中英文显示
|
/// </summary>
|
[Newtonsoft.Json.JsonIgnore]
|
public string name_text
|
{
|
get
|
{
|
string text = "";
|
switch (key)
|
{
|
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":
|
case "set_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(curValue.ToString());
|
}
|
|
/// <summary>
|
/// 获取指定属性的显示文本
|
/// 中英文显示
|
/// </summary>
|
public string GetValueText(string value)
|
{
|
string text = "";
|
value = value.Replace("{}", "");
|
switch (key)
|
{
|
case "on_off":
|
text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
|
break;
|
case "temperature":
|
case "set_temperature":
|
case "brightness":
|
case "percent":
|
if (value == "")
|
{
|
this.curValue = 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.Contains("cool"))
|
{
|
this.curValue = "cool";
|
text = Language.StringByID(StringId.Cool);
|
}
|
else if (this.value.Contains("day"))
|
{
|
this.curValue = "day";
|
text = Language.StringByID(StringId.Day);
|
}
|
else
|
{
|
foreach (var v in this.value)
|
{
|
this.curValue = 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.Contains("low"))
|
{
|
this.curValue = "low";
|
text = Language.StringByID(StringId.LowWindSpeed);
|
}
|
else
|
{
|
foreach (var v in this.value)
|
{
|
this.curValue = 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>
|
/// 功能属性键名列表
|
/// </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 Color = "color";
|
/// <summary>
|
/// 模式
|
/// </summary>
|
public const string Mode = "mode";
|
/// <summary>
|
/// 风速
|
/// </summary>
|
public const string FanSpeed = "fan";
|
/// <summary>
|
/// 温度
|
/// </summary>
|
public const string Temp = "temperature";
|
/// <summary>
|
/// 延时
|
/// </summary>
|
public const string Delay = "delay";
|
/// <summary>
|
/// 色温
|
/// </summary>
|
public const string CCT = "cct";
|
/// <summary>
|
/// 百分比
|
/// </summary>
|
public const string Percent = "percent";
|
}
|
/// <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;
|
}
|
|
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 = "electric.socket ";
|
/// <summary>
|
/// 家电、电视
|
/// </summary>
|
public const string ElectricTV = "electric.tv";
|
/// <summary>
|
/// 家电、风扇
|
/// </summary>
|
public const string ElectricFan = "electric.fan";
|
}
|
|
}
|