using System;
|
using System.Collections.Generic;
|
using Shared;
|
using Newtonsoft;
|
namespace SuperGateWay
|
{
|
[System.Serializable]
|
public class SuperCommon
|
{
|
public byte SubnetID {
|
get {
|
return (byte)((uid >> 8) & 0xFF);
|
}
|
}
|
public byte DeviceID {
|
get {
|
return (byte)((uid >> 0) & 0xFF);
|
}
|
}
|
/// <summary>
|
/// 高级网关 server
|
/// 场景 scene
|
/// 逻辑 logic
|
/// 空调 air_conditioner
|
/// 窗帘 curtain
|
/// 开关 relay
|
/// 调光 dimmer
|
/// 面板 pannel
|
/// 传感器 sensor
|
/// 音乐 music
|
/// 混合 multi
|
/// </summary>
|
public string module;
|
public string name;
|
/// <summary>
|
/// 文件类型 4bit 驱动类型12bit 设备识别号 16bit
|
/// </summary>
|
public uint uid;
|
public List<Dictionary<string, object>> objects = new List<Dictionary<string, object>> { };
|
public virtual string FileName {
|
get {
|
return $"SuperGateWay_{typeof (SuperCommon).Name}_{uid.ToString ("X")}";
|
}
|
}
|
public static uint MakeDeviceNumber (byte subnetId, byte deviceId)
|
{
|
return (((uint)subnetId) << 8) | deviceId;
|
}
|
/// <summary>
|
/// 生成Uid
|
/// </summary>
|
/// <returns>反馈生成的UID</returns>
|
/// <param name="fileType">文件类型</param>
|
/// <param name="qudongType">驱动类型</param>
|
/// <param name="devieNumber">设备识别号</param>
|
public static uint MakeUid (uint fileType, uint qudongType, uint devieNumber)
|
{
|
return ((fileType << 28) & 0xF0000000) | ((qudongType << 16) & 0x0FFF0000) | (devieNumber & 0x0000FFFF);
|
}
|
|
/// <summary>
|
/// 生成Oid
|
/// </summary>
|
/// <returns>反馈生成的Oida</returns>
|
/// <param name="targetType">目标类型</param>
|
/// <param name="property">属性</param>
|
/// <param name="targetNumber">目标号</param>
|
public static uint MakeOid (uint targetType, uint property, uint targetNumber)
|
{
|
return ((targetType << 24) & 0xFF000000) | ((property << 16) & 0x00FF0000) | (targetNumber & 0x0000FFFF);
|
}
|
public static ulong MakeSid (uint uid, uint oid)
|
{
|
return (((ulong)uid) << 32) | oid;
|
}
|
public static SuperGateWayCommon GetBySid (string sid)
|
{
|
SuperGateWayCommon common = null;
|
try {
|
var sidUlong = Convert.ToUInt64 (sid, 16);
|
var subnetId = (byte)((sidUlong >> 40) & 0xFF);
|
var deviceId = (byte)((sidUlong >> 32) & 0xFF);
|
var deviceType = (byte)((sidUlong >> 24) & 0xFF);
|
var property = (byte)((sidUlong >> 16) & 0xFF);
|
var targetNumber = (uint)((sidUlong >> 0) & 0xFFFF);
|
|
switch (deviceType) {
|
case 0:
|
break;
|
case 1:
|
break;
|
//空调
|
case 2:
|
common = new SuperGateWayCommon { Type = DeviceType.HVAC, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
break;
|
//地热
|
case 3: {
|
common = new SuperGateWayCommon { Type = DeviceType.FoolHeat, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
}
|
break;
|
//新风
|
case 4: {
|
common = new SuperGateWayCommon { Type = DeviceType.FreshAir, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
}
|
break;
|
//窗帘
|
case 5:
|
if (property == 0) {
|
common = new SuperGateWayCommon { Type = DeviceType.CurtainModel, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else if (property == 1) {
|
common = new SuperGateWayCommon { Type = DeviceType.CurtainRoller, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Brightness", 0);
|
}
|
}
|
|
break;
|
//灯光,可能包含调光及开关
|
case 6:
|
if (property == 0) {
|
common = new SuperGateWayCommon { Type = DeviceType.LightSwitch, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else if (property == 1) {
|
common = new SuperGateWayCommon { Type = DeviceType.LightDimming, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Brightness", 0);
|
}
|
}
|
break;
|
//按键
|
case 7:
|
if (property == 0) {
|
common = new SuperGateWayCommon { Type = DeviceType.MechanicalSwitch, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else if (property == 1) {
|
common = new SuperGateWayCommon { Type = DeviceType.AutomaticSwitch, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 1);
|
}
|
}
|
break;
|
//音乐
|
case 8: {
|
common = new SuperGateWayCommon { Type = DeviceType.MusicModel, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Status", 2);
|
}
|
}
|
break;
|
//传感器
|
case 9: {
|
common = new SuperGateWayCommon { Type = DeviceType.Sensor, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Brightness", 30);
|
}
|
}
|
break;
|
//门锁
|
case 10: {
|
common = new SuperGateWayCommon { Type = DeviceType.DoorLock, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
}
|
break;
|
case 11:
|
break;
|
case 12:
|
break;
|
case 13:
|
break;
|
//干接点
|
case 14: {
|
common = new SuperGateWayCommon { Type = DeviceType.DryContact, SubnetID = subnetId, DeviceID = deviceId, LoopID = (byte)targetNumber };
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
}
|
break;
|
case 15:
|
break;
|
case 16:
|
break;
|
}
|
} catch { }
|
return common;
|
}
|
|
public static Dictionary<string, object> CommonToSidValue (Common common)
|
{
|
Dictionary<string, object> dictionary = null;
|
if (common is HVAC) {
|
var device = common as HVAC;
|
{
|
var uid = MakeUid (1, 1, MakeDeviceNumber (common.SubnetID, common.DeviceID));
|
var oid = MakeOid (2, 0, common.LoopID);
|
dictionary = new Dictionary<string, object> {
|
["sid"] = MakeSid (uid, oid).ToString ("X"),
|
["value"] = device.Power,
|
};
|
}
|
{
|
var uid = MakeUid (1, 1, MakeDeviceNumber (common.SubnetID, common.DeviceID));
|
var oid = MakeOid (2, 1, common.LoopID);
|
dictionary = new Dictionary<string, object> {
|
["sid"] = MakeSid (uid, oid).ToString ("X"),
|
["value"] = device.SetMode,
|
};
|
}
|
{
|
var uid = MakeUid (1, 1, MakeDeviceNumber (common.SubnetID, common.DeviceID));
|
var oid = MakeOid (2, 2, common.LoopID);
|
dictionary = new Dictionary<string, object> {
|
["sid"] = MakeSid (uid, oid).ToString ("X"),
|
["value"] = device.SetFanSpeed,
|
};
|
}
|
{
|
var uid = MakeUid (1, 1, MakeDeviceNumber (common.SubnetID, common.DeviceID));
|
var oid = MakeOid (2, 3, common.LoopID);
|
dictionary = new Dictionary<string, object> {
|
["sid"] = MakeSid (uid, oid).ToString ("X"),
|
["value"] = device.SetTemperature,
|
};
|
|
}
|
} else if (common is LightDimming) {
|
var device = common as LightDimming;
|
var uid = MakeUid (1, 1, MakeDeviceNumber (common.SubnetID, common.DeviceID));
|
var oid = MakeOid (6, 1, common.LoopID);
|
dictionary = new Dictionary<string, object> {
|
["sid"] = MakeSid (uid, oid).ToString ("X"),
|
["value"] = device.CurrentBrightness
|
};
|
} else if (common is LightSwitch) {
|
var device = common as LightSwitch;
|
var uid = MakeUid (1, 1, MakeDeviceNumber (common.SubnetID, common.DeviceID));
|
var oid = MakeOid (6, 0, common.LoopID);
|
dictionary = new Dictionary<string, object> {
|
["sid"] = MakeSid (uid, oid).ToString ("X"),
|
["value"] = device.CurrentBrightness
|
};
|
} else if (common is CurtainModel) {
|
var device = common as CurtainModel;
|
var uid = MakeUid (1, 1, MakeDeviceNumber (common.SubnetID, common.DeviceID));
|
var oid = MakeOid (5, 0, common.LoopID);
|
dictionary = new Dictionary<string, object> {
|
["sid"] = MakeSid (uid, oid).ToString ("X"),
|
["value"] = device.Status,
|
};
|
}
|
return dictionary;
|
}
|
|
public static SuperGateWayCommon GetCommon (string sid, GateWay gateWay)
|
{
|
SuperGateWayCommon common = new SuperGateWayCommon ();
|
try {
|
var sidUlong = Convert.ToUInt64 (sid, 16);
|
var subnetId = (byte)((sidUlong >> 40) & 0xFF);
|
var deviceId = (byte)((sidUlong >> 32) & 0xFF);
|
var deviceType = (byte)((sidUlong >> 24) & 0xFF);
|
var property = (byte)((sidUlong >> 16) & 0xFF);
|
var targetNumber = (uint)((sidUlong >> 0) & 0xFFFF);
|
|
common.SubnetID = subnetId;
|
common.DeviceID = deviceId;
|
common.LoopID = (byte)targetNumber;
|
|
switch (deviceType) {
|
case 0:
|
break;
|
case 1:
|
break;
|
//空调
|
case 2: {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.HVAC && c.CommonLoopID == common.CommonLoopID);
|
|
if (device == null) {
|
common.Type = DeviceType.HVAC;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
}
|
break;
|
//地热
|
case 3: {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.FoolHeat && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.FoolHeat;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
}
|
break;
|
//新风
|
case 4: {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.FreshAir && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.FreshAir;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
|
}
|
break;
|
//窗帘
|
case 5: {
|
if (property == 0) {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.CurtainModel && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.CurtainModel;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
|
} else if (property == 1) {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.CurtainRoller && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.CurtainRoller;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Brightness", 0);
|
}
|
} else {
|
common = device;
|
}
|
}
|
}
|
break;
|
//灯光,可能包含调光及开关
|
case 6: {
|
if (property == 0) {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.LightSwitch && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.LightSwitch;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
|
} else if (property == 1) {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.LightDimming && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.LightDimming;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Brightness", 0);
|
}
|
} else {
|
common = device;
|
}
|
}
|
}
|
break;
|
//按键
|
case 7: {
|
if (property == 0) {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.MechanicalSwitch && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.MechanicalSwitch;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
} else if (property == 1) {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.AutomaticSwitch && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.AutomaticSwitch;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 1);
|
}
|
} else {
|
common = device;
|
}
|
}
|
}
|
break;
|
//音乐
|
case 8: {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.MusicModel && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.MusicModel;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Status", 2);
|
}
|
} else {
|
common = device;
|
}
|
|
}
|
break;
|
//传感器
|
case 9: {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.Sensor && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.Sensor;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Brightness", 30);
|
}
|
} else {
|
common = device;
|
}
|
}
|
break;
|
//门锁
|
case 10: {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.DoorLock && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.DoorLock;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
}
|
break;
|
case 11:
|
break;
|
case 12:
|
break;
|
case 13:
|
break;
|
//干接点
|
case 14: {
|
var device = gateWay.Commons.Find ((c) => c.Type == DeviceType.DryContact && c.CommonLoopID == common.CommonLoopID);
|
if (device == null) {
|
common.Type = DeviceType.DryContact;
|
if (common.keyValuePairs.Count == 0) {
|
common.Add ("Power", 0);
|
}
|
} else {
|
common = device;
|
}
|
}
|
break;
|
case 15:
|
break;
|
case 16:
|
break;
|
}
|
} catch { }
|
return common;
|
}
|
}
|
}
|