using System;
|
using System.Collections.Generic;
|
using HDL_ON.Common;
|
using HDL_ON.DAL.Server;
|
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;
|
/// <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 = "";
|
|
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 = "off";
|
}
|
return _trait_on_off;
|
}
|
//set
|
//{
|
// _trait_on_off = value;
|
//}
|
}
|
|
/// <summary>
|
/// 使用次数
|
/// </summary>
|
public double controlCounter = 0;
|
/// <summary>
|
/// 使用频率
|
/// </summary>
|
public double usageFrequency
|
{
|
get
|
{
|
return controlCounter / 7;
|
}
|
}
|
/// <summary>
|
/// 固定的序号
|
/// </summary>
|
public int fixedSerialNumber = int.MaxValue;
|
|
/// <summary>
|
/// 收藏功能
|
/// </summary>
|
public void CollectFunction()
|
{
|
var result = "";
|
//var waitPage = new Loading();
|
|
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);
|
});
|
}
|
})
|
{ 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()
|
{
|
string busId = "";
|
if (bus != null)
|
{
|
busId = bus.SubnetID + "_" + bus.DeviceID + "_" + bus.LoopId;
|
}
|
return busId;
|
}
|
|
/// <summary>
|
/// 获取设备添加到房间的房间名称
|
/// </summary>
|
/// <returns></returns>
|
public string GetRoomListName()
|
{
|
string roomNameList = "";
|
foreach (var roomId in roomIds)
|
{
|
var findRoom = SpatialInfo.CurrentSpatial.RoomList.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.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>
|
//public void SaveFunctionData(bool upSevser)
|
//{
|
// if (upSevser)
|
// {
|
// new System.Threading.Thread(() =>
|
// {
|
// var pm = new HttpServerRequest();
|
// var pack = pm.UpdataDevcieInfo(this);
|
// if (pack.Code == StateCode.SUCCESS)
|
// {
|
// var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
|
// FileUtlis.Files.WriteFileByBytes(savePath, ssd);
|
// }
|
// else
|
// {
|
// IMessageCommon.Current.ShowErrorInfoAlter(pack.Code);
|
// }
|
// })
|
// { IsBackground = true }.Start();
|
// }
|
// else
|
// {
|
// var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this));
|
// FileUtlis.Files.WriteFileByBytes(savePath, ssd);
|
// }
|
//}
|
|
|
/// <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 = 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;
|
aaao.bus = this.bus;
|
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>
|
/// value
|
/// </summary>
|
public const string Value = "value";
|
}
|
/// <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";
|
}
|
|
}
|