Files

7269 lines
450 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data;
using WebSite.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System.Diagnostics;
using Service;
using Domain;
using Common;
using CommonEntity;
using System.Threading;
using System.Threading.Tasks;
using System.Web.Caching;
using System.Text;
using RestSharp;
using System.Net;
using System.Configuration;
namespace WebSite.Controllers
{
public class IoTController : BaseController
{
private static string _huawei_vtId = System.Configuration.ConfigurationManager.AppSettings["huawei_vtId"];
private static string _huawei_cuid = System.Configuration.ConfigurationManager.AppSettings["huawei_cuid"];
private const int AuthorityID = 13;
private static log4net.ILog logger = log4net.LogManager.GetLogger(typeof(IoTController));
public IHostManager HostManager { get; set; }
public ISysHotelManager SysHotelManager { get; set; }
public IHostModalManager HostModalManager { get; set; }
public IRoomTypeSceneManager RoomTypeSceneManager { get; set; }
public ILightControlManager LightControlManager { get; set; }
public IRoomTypeWXMenusManager RoomTypeWXMenusManager { get; set; }
public IRoomTypeChannelsManager RoomTypeChannelsManager { get; set; }
public ActionResult Index()
{
return View();
}
/// <summary>
/// 如果存在取电服务记录且不是打开状态则返回false不可控制设备除了空调,不存在取电服务,可以控制
/// </summary>
/// <param name="host"></param>
/// <returns></returns>
private bool CheckGetPower(Host host)
{
bool Result = BBB(host);
try
{
string KKK1 = CacheKey.TakeCardOnLine + "_" + host.HostNumber;
CommonEntity.DataTongJi.MTakeCardData Chaka = CSRedisCacheHelper.Get_Partition<CommonEntity.DataTongJi.MTakeCardData>(KKK1, 5);
if (Chaka != null)
{
string KeyFilter1 = "NEWDiff";
string KeyFilter2 = "OLDDiff";
if (Chaka.Status == 0x01 && Result == false)
{
RCUHost.RCUHostCommon.tools.LanJieData(KeyFilter1, host.SysHotel.Code);
}
if (Chaka.Status == 0x02 && Result == true)
{
RCUHost.RCUHostCommon.tools.LanJieData(KeyFilter2, host.SysHotel.Code);
}
Result = Result || Chaka.Status == 0x01;
if (Result == true)
{
return true;
}
}
}
catch (Exception ex)
{
logger.Error("取电数据不同" + ex.Message);
}
return Result;
}
public static bool BBB(Host host)
{
if (!host.SysHotel.IsVoincePowerOn)
{
return true;//不需要取电服务打开即可控制
}
//if (host.RoomCard != null)
//{
// return true;//已插卡即可控制
//}
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + "004000001";
var hostModal = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
if (hostModal == null)
{
return false;
}
if (hostModal != null && hostModal.Status != 1)
{
return false;
}
return true;
}
public static List<int> ButString = new List<int>() { 1697, 1866, 1601, 2170 };
public bool AssertFault(int hotelcode)
{
if (ButString.Contains(hotelcode))
{
return true;
}
return false;
}
#region TCL电视新版
public string ControlClass_Disconvery = "发现设备";
public string ControlClass_KongZhiSheBei = "设备控制";
public string ControlClass_SceneKongZhi = "场景控制";
[HttpPost()]
public ActionResult DeleteCUID(string Key)
{
HttpContext.Cache.Remove(Key);
return Json(new { result = "success" }, JsonRequestBehavior.AllowGet);
}
/// <summary>
/// 小度对接
/// </summary>
/// <returns></returns>
public ActionResult XiaoDu()
{
string IP = "";
string PPP = Request.UserHostAddress;
string III = Request.ServerVariables["REMOTE_ADDR"];
if (string.IsNullOrEmpty(III))
{
IP = PPP;
}
else
{
IP = III;
}
string g_requestid = "";
int g_hotelcode = 0;
string g_hotelid = "";
string g_roomnum = "";
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
string platformName = "小度音箱";
try
{
Domain.IoTXiaoDuEntity.Request.AppliancesRequest request = JsonConvert.DeserializeObject<Domain.IoTXiaoDuEntity.Request.AppliancesRequest>(reqData);//得到小度请求
if (string.IsNullOrEmpty(request.payload.cuid))
{
//logger.Error("设备cuid不能为空" + reqData + ",来自:" + GetClientIP());
return Json(ReturnXiaoDuError(request.header, "UnexpectedInformationReceivedError"), JsonRequestBehavior.AllowGet);//该消息表示由于请求消息中属性信息错误,导致技能无法处理请求消息。
}
Host host = null;
string xiaoduCUID = request.payload.cuid;
string NameSpaceName = request.header.@namespace;
if (NameSpaceName.StartsWith("X2BOS"))
{
platformName = "TCL电视";
//host = HostManager.GetByTCLCUID(request.payload.cuid);
host = TCLDataQuery(xiaoduCUID);
}
else if (NameSpaceName.StartsWith("DuerOS"))
{
//host = HostManager.GetByXiaoDuCUID(request.payload.cuid);//根据小度音箱序列号获取对应RCU主机
host = XiaoDuQuery(xiaoduCUID);
}
else
{
if (string.IsNullOrEmpty(NameSpaceName))
{
NameSpaceName = "未知平台";
}
platformName = NameSpaceName;
}
//if (request.header.@namespace.StartsWith("X2BOS"))
//{
// platformName = "TCL电视";
// host = HostManager.GetByTCLCUID(request.payload.cuid);
//}
//else
//{
// host = HostManager.GetByXiaoDuCUID(request.payload.cuid);//根据小度音箱序列号获取对应RCU主机
//}
string messageid = request.header.messageId;
string messageid1 = request.payload.cuid;
if (string.IsNullOrEmpty(messageid))
{
messageid = System.Guid.NewGuid().ToString("");
}
string logmsgid = messageid;
if (!string.IsNullOrEmpty(messageid1))
{
logmsgid = messageid + messageid1;
}
if (host == null)
{
//logger.Error(platformName + "cuid(" + request.payload.cuid + ")尚未绑定客房主机");
return Json(ReturnXiaoDuError(request.header, "TargetHardwareMalfunctionError"), JsonRequestBehavior.AllowGet);//"小度音箱(" + request.payload.cuid + ")尚未绑定客房主机"
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期");
return Json(ReturnXiaoDuError(request.header, "ExpiredAccessTokenError"), JsonRequestBehavior.AllowGet);//该消息表示请求消息中access token过期不能使用。
}
string a = host.SysHotel.ID.ToString();
string hotelname = host.SysHotel.Name;
string b = host.RoomNumber;
string c = host.SysHotel.Code;
int hotel_code = 0;
int.TryParse(c, out hotel_code);
g_hotelid = a;
g_hotelcode = hotel_code;
g_roomnum = b;
g_requestid = messageid;
string Key = CacheKey.IOTKey;
bool is_monitor = true;
//永远统计
//var qqq = CSRedisCacheHelper.ForeverGet<List<IOT_Monitor_Host>>(Key);
//if (qqq != null && qqq.Count > 0)
//{
// var df = qqq.Where(A => A.HotelID.Equals(a) && A.RoomNumber.Equals(b));
// if (df.Count() > 0)
// {
// is_monitor = true;
// }
//}
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.RemoteIP = IP;
i.Step = 0;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
i.CommandDescription = reqData;
SendMQTTData.Send(i);
}
switch (request.header.@namespace)
{
#region
case "DuerOS.ConnectedHome.Discovery"://小度平台发现设备
case "X2BOS.ConnectedHome.Discovery"://TCL平台发现设备
{
if (is_monitor)
{
string sss = "发现设备";
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_KongZhiSheBei;
i.Step = 1;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
//小度精灵统计
string KKK = platformName + "Discovery";
RCUHost.RCUHostCommon.tools.LanJieData(KKK, host.SysHotel.Code);
Domain.IoTXiaoDuEntity.DiscoverResponse.AppliancesResponse response = null;
//string MyCacheKey = platformName + "Discovery_" + b + "_" + c;
//string MyCacheKey = platformName + "Discovery_" + a + "_" + b;
//var Data = HttpContext.Cache.Get(MyCacheKey);
//if (Data != null)
//{
// response = Data as Domain.IoTXiaoDuEntity.DiscoverResponse.AppliancesResponse;
//}
//else
{
List<Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredAppliances> appliances = new List<Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredAppliances>();
//获取需要控制设备的分组信息
List<Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredGroups> groups = new List<Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredGroups>();
List<string> applianceIds = new List<string>();
//获取需要控制的场景
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == host.RoomType.ID && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
foreach (RoomTypeScene scene in sceneModals)
{
string aliasName = string.IsNullOrEmpty(scene.AliasName) ? scene.Name : scene.AliasName;//获取别名
appliances.Add(new Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredAppliances
{
actions = new List<string> { "turnOn" },
applianceTypes = new List<string> { "SCENE_TRIGGER" },
additionalApplianceDetails = new Dictionary<string, string>() { { "TYPE", "SCENE_TRIGGER" } },
applianceId = scene.ID.ToString(),
friendlyDescription = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + scene.Name,
friendlyName = scene.Name,
nicknames = new List<string>(aliasName.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)), //new List<string> { scene.Name },
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(scene.Type),
version = "V1",
reachable = true
});
applianceIds.Add(scene.ID.ToString());
}
//场景分组
groups.Add(new Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredGroups
{
groupName = "",
applianceIds = applianceIds,
groupNotes = "Boonlive-" + host.SysHotel.Name + "(" + host.RoomNumber + ")" + "场景分组",
additionalGroupDetails = new Dictionary<string, string>()
});
applianceIds = new List<string>();
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
#region TCL设备 使
//获取 组设备
List<HostModal> TTT = new List<HostModal>();
var Q = hostModals.Where(A => A.Modal.MultipleGroupID != 0);
if (Q.Count() > 0)
{
var P = Q.GroupBy(A => A.Modal.MultipleGroupID);
foreach (var item in P)
{
//获取每一组的数据
int ID = item.Key;
var ll = item.Select(A => A.Modal.ModalAddress).ToArray();
//这个是组名字,每一个数据的组名字都一样的
string NNN = item.FirstOrDefault().Modal.MultipleTCLName;
//每一组的数据
HostModal hh = new HostModal();
hh.Modal = new RoomTypeModal();
hh.Modal.Name = NNN;
hh.Modal.Type = item.FirstOrDefault().Modal.Type;
hh.Modal.ModalAddress = string.Join("_", ll);
TTT.Add(hh);
}
}
var QQ = hostModals.Where(A => A.Modal.MultipleGroupID == 0).ToList();
#endregion
//组数据和非组数据 合在一块
QQ.AddRange(TTT);
hostModals = QQ;
foreach (HostModal hostModal in QQ)
{
List<string> applianceTypes = new List<string>();
List<string> actions = new List<string>();
switch (hostModal.Modal.Type)
{
case DeviceType.Dimmer://LED调光
case DeviceType.Traic://可控硅调光
case DeviceType.PWMDimmer://PWM调光
case DeviceType.PWMExpand://PWM扩展
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.Strip://灯带调光
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
applianceTypes.Add("LIGHT");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setBrightnessPercentage");
actions.Add("incrementBrightnessPercentage");
actions.Add("decrementBrightnessPercentage");
//阿宝添加的RGB
// 这和文档上不一样,是那边的工作人员给我说的
//actions.Add("setLightingRgbColour");
actions.Add("setLightingRgb");
break;
case DeviceType.ColorTemp://色温
applianceTypes.Add("LIGHT");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setBrightnessPercentage");
actions.Add("incrementBrightnessPercentage");
actions.Add("decrementBrightnessPercentage");
actions.Add("setColorTemperature");
actions.Add("incrementColorTemperature");
actions.Add("decrementColorTemperature");
break;
case DeviceType.AirConditioner:
applianceTypes.Add("AIR_CONDITION");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setTemperature");
actions.Add("incrementTemperature");
actions.Add("decrementTemperature");
actions.Add("setFanSpeed");
actions.Add("incrementFanSpeed");
actions.Add("decrementFanSpeed");
actions.Add("setMode");
//actions.Add("getTemperatureReading");
//actions.Add("getTargetTemperature");
break;
case DeviceType.Curtain:
if (hostModal.Modal.Name.IndexOf("窗帘") > -1)
{
applianceTypes.Add("CURTAIN");//窗帘
}
else if (hostModal.Modal.Name.IndexOf("窗纱") > -1)
{
applianceTypes.Add("CURT_SIMP");//窗纱
}
else
{
applianceTypes.Add("SWITCH");//卷帘、天幕等
}
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("pause");
actions.Add("continue");
break;
case DeviceType.TV:
applianceTypes.Add("TV_SET");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setTVChannel");
actions.Add("decrementTVChannel");
actions.Add("incrementTVChannel");
actions.Add("returnTVChannel");
actions.Add("setVolume");
actions.Add("setVolumeMute");
actions.Add("incrementVolume");
actions.Add("decrementVolume");
actions.Add("setDirection");
break;
case DeviceType.Music:
applianceTypes.Add("TV_SET");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setVolume");
actions.Add("incrementVolume");
actions.Add("decrementVolume");
actions.Add("setVolumeMute");
break;
default:
if ((hostModal.Modal.Name != null && hostModal.Modal.Name.IndexOf("灯") > -1) ||
(hostModal.Modal.EnglishName != null && hostModal.Modal.EnglishName.ToLower().IndexOf("light") > -1) ||
(hostModal.Modal.TWName != null && hostModal.Modal.TWName.IndexOf("燈") > -1))
{
applianceTypes.Add("LIGHT");
}
else
{
applianceTypes.Add("SWITCH");
}
actions.Add("turnOn");
actions.Add("turnOff");
break;
}
string aliasName = string.IsNullOrEmpty(hostModal.Modal.AliasName) ? hostModal.Modal.Name : hostModal.Modal.AliasName;//获取别名
appliances.Add(new Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredAppliances
{
actions = actions,
applianceTypes = applianceTypes,
additionalApplianceDetails = new Dictionary<string, string>() { { "TYPE", applianceTypes[0] } },
applianceId = hostModal.Modal.ModalAddress,
friendlyDescription = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + hostModal.Modal.Name,
friendlyName = hostModal.Modal.Name,
nicknames = new List<string>(aliasName.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)),
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(hostModal.Modal.Type),
version = "V1",
reachable = true
});
applianceIds.Add(hostModal.Modal.ModalAddress);// + "#" + applianceTypes[0]);
}
//添加所有灯虚拟回路
appliances.Add(new Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredAppliances
{
actions = new List<string>() { "turnOn", "turnOff", "setBrightnessPercentage", "incrementBrightnessPercentage", "decrementBrightnessPercentage" },
applianceTypes = new List<string>() { "LIGHT" },
additionalApplianceDetails = new Dictionary<string, string>() { { "TYPE", "LIGHT" } },
applianceId = "000000001",
friendlyDescription = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->所有灯",
friendlyName = "所有灯",
//nicknames = new List<string> { "所有灯", "打开灯", "关闭灯", "开灯", "关灯", "灯" },
manufacturerName = "宝来威(Boonlive)",
modelName = "所有灯",
version = "V1",
reachable = true
});
applianceIds.Add("000000001");//#LIGHT");
//房间分组
groups.Add(new Domain.IoTXiaoDuEntity.DiscoverResponse.DiscoveredGroups
{
groupName = "",//分组为空
applianceIds = applianceIds,
groupNotes = "Boonlive-" + host.SysHotel.Name + "(" + host.RoomNumber + ")" + "房间分组",
additionalGroupDetails = new Dictionary<string, string>() { }
});
//找到可控场景和设备响应小度DuerOS
response = new Domain.IoTXiaoDuEntity.DiscoverResponse.AppliancesResponse
{
header = new Domain.IoTXiaoDuEntity.Header
{
messageId = request.header.messageId,
@namespace = request.header.@namespace,
name = "DiscoverAppliancesResponse",
payloadVersion = request.header.payloadVersion
},
payload = new Domain.IoTXiaoDuEntity.DiscoverResponse.Payload
{
discoveredAppliances = appliances,
discoveredGroups = groups
}
};
//HttpContext.Cache.Insert(MyCacheKey, response, null, DateTime.Now.AddMinutes(20), Cache.NoSlidingExpiration);
}
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 4;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
i.CommandDescription = "DiscoveryResponse";
SendMQTTData.Send(i);
}
//logger.Error(string.Format("{3}(酒店:{0},房号:{1})本次获取设备数量:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, response.payload.discoveredAppliances.Count.ToString(), platformName));
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
#endregion
case "DuerOS.ConnectedHome.Control"://小度控制消息
case "X2BOS.ConnectedHome.Control"://TCL平台控制设备
{
//小度精灵统计
string KKK = platformName + "Control";
RCUHost.RCUHostCommon.tools.LanJieData(KKK, host.SysHotel.Code);
bool is_online = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC);
if (is_monitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") is_online: " + is_online.ToString();
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_KongZhiSheBei;
i.Step = 1;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid; i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
if (!is_online)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
return Json(ReturnXiaoDuError(request.header, "TargetOfflineError"), JsonRequestBehavior.AllowGet);//当技能检测到目标设备没有连接到设备云或者设备云不在线时会给DuerOS发送TargetOfflineError消息。
}
bool is_take_card = CheckGetPower(host);
if (is_monitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") 取电: " + is_take_card.ToString();
IOTMonitorData i = new IOTMonitorData();
i.Step = 2;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid; i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
if (!is_take_card)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
return Json(ReturnXiaoDuError(request.header, "UnsupportedOperationError"), JsonRequestBehavior.AllowGet);
}
//正常情况下
//"appliance":{"additionalApplianceDetails":{"TYPE":"LIGHT"}
string applianceType = "SCENE_TRIGGER";//设备类型
if (request.payload.appliance.additionalApplianceDetails.ContainsKey("TYPE"))
{
applianceType = request.payload.appliance.additionalApplianceDetails["TYPE"];
}
string modalAddress = request.payload.appliance.applianceId;//设备地址或场景ID
if (modalAddress.IndexOf("&") > -1)
{
modalAddress = modalAddress.Split('&')[0];
}
string confirmationName = "TurnOnConfirmation";
Domain.IoTXiaoDuEntity.ControlResponse.Payload payload = new Domain.IoTXiaoDuEntity.ControlResponse.Payload();
List<Domain.IoTXiaoDuEntity.ControlResponse.Attributes> attributes = new List<Domain.IoTXiaoDuEntity.ControlResponse.Attributes>();
if (modalAddress.StartsWith("00000000"))//所有灯控制
{
#region
var devices = new List<RCUHost.Protocols.Device>();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("控制客房(" + host.RoomNumber + ")所有灯:");
var hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.Name.Contains("灯") && r.Modal.WXActiveIndicator).ToList();
List<IotDeviceData> devicelist = new List<IotDeviceData>();
foreach (HostModal hostModal in hostModals)
{
switch (hostModal.Modal.Type)
{
case DeviceType.Relay:
case DeviceType.Expand:
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.Strip:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.A9IORelay:
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
case DeviceType.ColorTemp:
Domain.IoTXiaoDuEntity.ControlResponse.PreviousState previousState = new Domain.IoTXiaoDuEntity.ControlResponse.PreviousState();
previousState.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(hostModal.Brightness) };//原来的亮度
int status = hostModal.Status;
int brightness = hostModal.Brightness;
var device = new RCUHost.Protocols.Device();
device.Address = hostModal.Modal.ModalAddress;
device.AddressType = RCUHost.Protocols.AddressType.DeviceAddress;
device.Type = hostModal.Modal.Type;
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID.ToString() + "_" + device.Address;
var hostModal_T = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
switch (request.header.name)
{
case "TurnOnRequest"://打开
confirmationName = "TurnOnConfirmation";
status = 1;
brightness = 100;
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
break;
case "TurnOffRequest"://关闭
confirmationName = "TurnOffConfirmation";
status = 2;
brightness = 0;
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
break;
case "SetBrightnessPercentageRequest"://设置亮度
if (hotel_code == 1085 || hotel_code == 1001 || hotel_code == 1003 || hotel_code > 2000)
{
//logger.Error("查询的Key值:"+KKey);
if (hostModal_T != null && hostModal_T.Status == 2) { continue; }
}
confirmationName = "SetBrightnessPercentageConfirmation";
status = 1;
brightness = Convert.ToInt16(request.payload.brightness.value);
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
break;
case "IncrementBrightnessPercentageRequest"://调亮
if (hotel_code == 1085 || hotel_code == 1001 || hotel_code == 1003 || hotel_code > 2000)
{
if (hostModal_T != null && hostModal_T.Status == 2) { continue; }
}
confirmationName = "IncrementBrightnessPercentageConfirmation";
status = 1;
brightness += Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness > 100)
{
brightness = 100;
}
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
break;
case "DecrementBrightnessPercentageRequest"://调暗
if (hotel_code == 1085 || hotel_code == 1001 || hotel_code == 1003 || hotel_code > 2000)
{
if (hostModal_T != null && hostModal_T.Status == 2) { continue; }
}
confirmationName = "DecrementBrightnessPercentageConfirmation";
status = 1;
brightness -= Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness < 0)
{
brightness = 0;
status = 2;
}
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
break;
}
attributes.Add(new Domain.IoTXiaoDuEntity.ControlResponse.Attributes() { name = "name", value = "所有灯", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
attributes.Add(new Domain.IoTXiaoDuEntity.ControlResponse.Attributes() { name = "turnOnState", value = status == 1 ? "ON" : "OFF", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
device.Status = (byte)status;
device.Brightness = (byte)brightness;
devices.Add(device);
sb.Append(hostModal.Modal.Name + "");
break;
}
IotDeviceData iii = new IotDeviceData();
iii.DeviceAddress = hostModal.Modal.ModalAddress;
iii.DeviceName = hostModal.Modal.Name;
devicelist.Add(iii);
}
string JKKey = System.Guid.NewGuid().ToString("N");
//if (hotel_code == 1697||hotel_code==1866||hotel_code==1601)
if (AssertFault(hotel_code))
{
for (int i = 0; i < 3; i++)
{
Thread.Sleep(200);
LightControlManager.AllDeviceControl_Repeat(JKKey, host, devices);
}
}
else
{
LightControlManager.AllDeviceControl(host, devices);
}
sb.Append("动作:" + request.header.name);
switch (request.header.name)
{
case "SetBrightnessPercentageRequest":
sb.Append(",设定值:" + request.payload.brightness.value);
break;
case "IncrementBrightnessPercentageRequest":
sb.Append(",增加值:" + request.payload.deltaPercentage.value);
break;
case "DecrementBrightnessPercentageRequest":
sb.Append(",减少值:" + request.payload.deltaPercentage.value);
break;
}
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_KongZhiSheBei;
i.WhichOneDevice = devicelist;
i.Step = 3;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
i.CommandDescription = sb.ToString();
SendMQTTData.Send(i);
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
#endregion
}
else
{
switch (applianceType)
{
#region
case "SCENE_TRIGGER"://场景控制
case "ACTIVITY_TRIGGER":
{
var scene = RoomTypeSceneManager.Get(int.Parse(modalAddress));
if (scene == null)
{
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 3.01;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
string sss = string.Format("找不到此情景");
i.CommandDescription = sss.ToString();
SendMQTTData.Send(i);
}
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的场景ID{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress, platformName));
return Json(ReturnXiaoDuError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_SceneKongZhi;
i.SceneName = scene.Name;
i.Step = 3;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
i.CommandDescription = "场景控制";
SendMQTTData.Send(i);
}
attributes.Add(new Domain.IoTXiaoDuEntity.ControlResponse.Attributes() { name = "name", value = scene.Name, scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
attributes.Add(new Domain.IoTXiaoDuEntity.ControlResponse.Attributes() { name = "turnOnState", value = "ON", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
string KeyRepeat = System.Guid.NewGuid().ToString("N");
//if (hotel_code == 1697||hotel_code==1866||hotel_code==1601)
if (AssertFault(hotel_code))
{
for (int i = 0; i < 3; i++)
{
Thread.Sleep(200);
// LightControlManager.ApplyScene(host, scene);
LightControlManager.ApplyScene_Repeat(KeyRepeat, host, scene);
}
}
else
{
LightControlManager.ApplyScene(host, scene);
}
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 3.1;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
string sss = string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID);
i.CommandDescription = sss.ToString();
SendMQTTData.Send(i);
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, platformName, host.SysHotel.ID);
}
break;
#endregion
#region
default:
{
//var hostModal = HostModalManager.GetByModalAddress(host.ID, modalAddress);//设备控制
var rgb_rgb = request.payload.lightingRgb;
HostModal hostModal = null;
List<HostModal> hostmodal_L = new List<HostModal>();
if (modalAddress.Contains("_"))
{
string[] mmm = modalAddress.Split('_');
foreach (var item in mmm)
{
hostModal = GetDataFromCache(host, item);
if (hostModal != null)
{
hostmodal_L.Add(hostModal);
}
}
}
else
{
hostModal = GetDataFromCache(host, modalAddress);
}
if (hostmodal_L.Count == 0 && hostModal == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的回路Address{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress, platformName));
return Json(ReturnXiaoDuError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
int status = 0;
int brightness = 100;
int temperature = 25;
int fanSpeed = 1;
int mode = 1;
int valve = 1;
System.Text.StringBuilder sb = new System.Text.StringBuilder();
Domain.IoTXiaoDuEntity.ControlResponse.PreviousState previousState = new Domain.IoTXiaoDuEntity.ControlResponse.PreviousState();
if (hostmodal_L.Count == 0)
{
status = hostModal.Status;
brightness = hostModal.Brightness;
temperature = hostModal.SettingTemp;
fanSpeed = hostModal.FanSpeed;
mode = hostModal.Mode;
valve = hostModal.Valve;
sb.Append("控制客房(" + host.RoomNumber + ")设备(" + hostModal.Modal.Name + hostModal.Modal.ModalAddress + ")");
previousState.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(hostModal.Brightness) };//原来的亮度
}
else
{
previousState.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = 0 };//原来的亮度
}
#region
switch (request.header.name)
{
//灯光亮度百分比控制
case "SetCurtainPercentageRequest":
break;
//RGB灯光颜色控制
case "SetLightingRgbRequest":
var rgb = request.payload.lightingRgb;
confirmationName = "SetLightingRgbConfirmation";
status = 1;
brightness = 100;
//每个设备的控制值要变一下
foreach (var item in hostmodal_L)
{
int rrr = 0;
if (item.Modal.TCLDeviceName.Equals("红"))
{
//传过来的是0-255
//这边用的是0-100
int.TryParse(rgb.value.r, out rrr);
}
else if (item.Modal.TCLDeviceName.Equals("绿"))
{
int.TryParse(rgb.value.g, out rrr);
}
else if (item.Modal.TCLDeviceName.Equals("蓝"))
{
int.TryParse(rgb.value.b, out rrr);
}
double everydata = rrr / 2.55;
int roundedNumber = (int)Math.Round(everydata);
item.Status = status;
item.Brightness = roundedNumber;
}
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("状态RGB调光");
break;
case "TurnOnRequest"://打开
confirmationName = "TurnOnConfirmation";
status = 1;
brightness = 100;
foreach (var item in hostmodal_L)
{
item.Status = status;
item.Brightness = brightness;
}
if (hostModal.Modal.Type == DeviceType.TV)//电视开关时内容传0
{
mode = 0;
}
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("状态:打开");
break;
case "TurnOffRequest"://关闭
confirmationName = "TurnOffConfirmation";
status = 2;
brightness = 0;
foreach (var item in hostmodal_L)
{
item.Status = status;
item.Brightness = brightness;
}
if (hostModal.Modal.Type == DeviceType.TV)//电视开关时内容传0
{
mode = 0;
}
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("状态:关闭");
break;
case "SetBrightnessPercentageRequest"://设置亮度
confirmationName = "SetBrightnessPercentageConfirmation";
status = 1;
brightness = Convert.ToInt16(request.payload.brightness.value);
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("设亮度:" + brightness);
#region RGB组设备的控制
if (rgb_rgb != null)
{
//这个是 组设备的 亮度设置
if (hostmodal_L.Count > 0)
{
foreach (var item in hostmodal_L)
{
double yuanlai = 0;
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + item.Modal.ModalAddress;
var obj = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
if (obj != null)
{
HostModal_Cache hhh = obj as HostModal_Cache;
yuanlai = hhh.Brightness;
}
double data = yuanlai * (brightness / 100);
int rrr = 0;
if (item.Modal.TCLDeviceName.Equals("红"))
{
//传过来的是0-255
//这边用的是0-100
int.TryParse(rgb_rgb.value.r, out rrr);
}
else if (item.Modal.TCLDeviceName.Equals("绿"))
{
int.TryParse(rgb_rgb.value.g, out rrr);
}
else if (item.Modal.TCLDeviceName.Equals("蓝"))
{
int.TryParse(rgb_rgb.value.b, out rrr);
}
int roundedNumber = (int)Math.Round(data);
item.Status = status;
item.Brightness = roundedNumber;
}
}
}
#endregion
break;
case "IncrementBrightnessPercentageRequest"://调亮
confirmationName = "IncrementBrightnessPercentageConfirmation";
status = 1;
brightness += Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness > 100)
{
brightness = 100;
}
#region RGB组设备的控制
if (rgb_rgb != null)
{
if (hostmodal_L.Count > 0)
{
foreach (var item in hostmodal_L)
{
double yuanlai = 0;
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + item.Modal.ModalAddress;
var obj = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
if (obj != null)
{
HostModal_Cache hhh = obj as HostModal_Cache;
yuanlai = hhh.Brightness;
}
double data = yuanlai * (1 + (brightness / 100));
int rrr = 0;
if (item.Modal.TCLDeviceName.Equals("红"))
{
//传过来的是0-255
//这边用的是0-100
int.TryParse(rgb_rgb.value.r, out rrr);
}
else if (item.Modal.TCLDeviceName.Equals("绿"))
{
int.TryParse(rgb_rgb.value.g, out rrr);
}
else if (item.Modal.TCLDeviceName.Equals("蓝"))
{
int.TryParse(rgb_rgb.value.b, out rrr);
}
int roundedNumber = (int)Math.Round(data);
item.Status = status;
item.Brightness = rrr;
}
}
}
#endregion
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("调亮:" + request.payload.deltaPercentage.value + ",结果:" + brightness);
break;
case "DecrementBrightnessPercentageRequest"://调暗
confirmationName = "DecrementBrightnessPercentageConfirmation";
status = 1;
brightness -= Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness < 0)
{
brightness = 0;
status = 2;
}
#region RGB组设备的控制
if (rgb_rgb != null)
{
if (hostmodal_L.Count > 0)
{
foreach (var item in hostmodal_L)
{
double yuanlai = 0;
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + item.Modal.ModalAddress;
var obj = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
if (obj != null)
{
HostModal_Cache hhh = obj as HostModal_Cache;
yuanlai = hhh.Brightness;
}
double data = yuanlai * (1 - (brightness / 100));
int rrr = 0;
if (item.Modal.AliasName.Equals("红") || item.Modal.Name.Contains("红"))
{
//传过来的是0-255
//这边用的是0-100
int.TryParse(rgb_rgb.value.r, out rrr);
}
else if (item.Modal.Name.Contains("绿") || item.Modal.AliasName.Equals("绿"))
{
int.TryParse(rgb_rgb.value.g, out rrr);
}
else if (item.Modal.Name.Contains("蓝") || item.Modal.AliasName.Equals("蓝"))
{
int.TryParse(rgb_rgb.value.b, out rrr);
}
int roundedNumber = (int)Math.Round(data);
item.Status = status;
item.Brightness = rrr;
}
}
}
#endregion
payload.brightness = new Domain.IoTXiaoDuEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("调暗:" + request.payload.deltaPercentage.value + ",结果:" + brightness);
break;
case "SetColorTemperatureRequest"://设置色温
previousState.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "SetColorTemperatureConfirmation";
status = 3;
if (request.header.@namespace.Equals("X2BOS.ConnectedHome.Control"))
{
temperature = XiaoDuToBLW(request.payload.colorTemperature.value);
}
else
{
temperature = XiaoDuToBLW(request.payload.targetTemperature.value);
}
if (temperature < 0)
{
temperature = 0;
}
else if (temperature > 100)
{
temperature = 100;
}
//阿宝修改的TCL 非要把值设置成2700K-6500K之间
if (request.header.@namespace.Equals("X2BOS.ConnectedHome.Control"))
{
int TTT = XiaoDuToBLW(request.payload.colorTemperature.value);
int HHH = TTT - 2700;
//38是这样来的 6500-2700/100
double UUU = HHH / 38;
int roundedNumber = (int)Math.Round(UUU);
if (roundedNumber < 0)
{
roundedNumber = 0;
}
temperature = roundedNumber;
}
payload.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("设色温:" + temperature);
break;
case "IncrementColorTemperatureRequest"://调高灯光色温
previousState.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "IncrementColorTemperatureConfirmation";
status = 3;
if (request.header.@namespace.Equals("X2BOS.ConnectedHome.Control"))
{
int TTT = XiaoDuToBLW(request.payload.deltaValue.value);
double UUU = TTT / 38;
int roundedNumber = (int)Math.Round(UUU);
if (roundedNumber < 0)
{
roundedNumber = 0;
}
temperature -= roundedNumber;
}
else
{
temperature += Convert.ToInt16(request.payload.deltaValue.value.ToString());
if (temperature > 100)
{
temperature = 100;
}
}
payload.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调高灯光色温:" + request.payload.deltaValue.value + ",结果:" + temperature);
break;
case "DecrementColorTemperatureRequest"://降低灯光色温
previousState.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "DecrementColorTemperatureConfirmation";
status = 3;
if (request.header.@namespace.Equals("X2BOS.ConnectedHome.Control"))
{
int TTT = XiaoDuToBLW(request.payload.deltaValue.value);
double UUU = TTT / 38;
int roundedNumber = (int)Math.Round(UUU);
if (roundedNumber < 0)
{
roundedNumber = 0;
}
temperature += roundedNumber;
}
else
{
temperature -= Convert.ToInt16(request.payload.deltaValue.value);
if (temperature < 0)
{
temperature = 0;
}
}
payload.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调低灯光色温:" + request.payload.deltaValue.value + ",结果:" + temperature);
break;
case "SetTemperatureRequest"://设置温度
previousState.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "SetTemperatureConfirmation";
status = 1;
temperature = XiaoDuToBLW(request.payload.targetTemperature.value);
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
payload.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("设温:" + temperature);
break;
case "IncrementTemperatureRequest"://调高温度
previousState.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "IncrementTemperatureConfirmation";
status = 1;
temperature += Convert.ToInt16(request.payload.deltaValue.value.ToString());
if (temperature > 32)
{
temperature = 32;
}
payload.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调高温度:" + request.payload.deltaValue.value + ",结果:" + temperature);
break;
case "DecrementTemperatureRequest"://调低温度
previousState.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "DecrementTemperatureConfirmation";
status = 1;
temperature -= Convert.ToInt16(request.payload.deltaValue.value);
if (temperature < 16)
{
temperature = 16;
}
payload.temperature = new Domain.IoTXiaoDuEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调低温度:" + request.payload.deltaValue.value + ",结果:" + temperature);
break;
case "SetFanSpeedRequest"://设置风速
previousState.fanSpeed = new Domain.IoTXiaoDuEntity.FanSpeed() { value = fanSpeed };
confirmationName = "SetFanSpeedConfirmation";
status = 1;
if (request.payload.fanSpeed.level != null && !string.IsNullOrEmpty(request.payload.fanSpeed.level))
{
switch (request.payload.fanSpeed.level.ToLower())
{
case "high":
case "max":
fanSpeed = 3;
break;
case "middle":
fanSpeed = 2;
break;
case "auto":
fanSpeed = 0;
break;
default:
fanSpeed = 1;
break;
}
sb.Append("设风速:" + request.payload.fanSpeed.level);
}
else
{
fanSpeed = Convert.ToInt16(request.payload.fanSpeed.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
else if (fanSpeed > 3)
{
fanSpeed = 3;
}
sb.Append("设风速:" + fanSpeed);
}
payload.fanSpeed = new Domain.IoTXiaoDuEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
break;
case "IncrementFanSpeedRequest"://调高风速
previousState.fanSpeed = new Domain.IoTXiaoDuEntity.FanSpeed() { value = fanSpeed };
confirmationName = "IncrementFanSpeedConfirmation";
status = 1;
fanSpeed += Convert.ToInt16(request.payload.deltaValue.value);
if (fanSpeed > 3)
{
fanSpeed = 3;
}
payload.fanSpeed = new Domain.IoTXiaoDuEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
sb.Append("调高风速:" + request.payload.deltaValue.value + ",结果:" + fanSpeed);
break;
case "DecrementFanSpeedRequest"://调低风速
previousState.fanSpeed = new Domain.IoTXiaoDuEntity.FanSpeed() { value = fanSpeed };
confirmationName = "DecrementFanSpeedConfirmation";
status = 1;
fanSpeed -= Convert.ToInt16(request.payload.deltaValue.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
payload.fanSpeed = new Domain.IoTXiaoDuEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
sb.Append("调低风速:" + request.payload.deltaValue.value + ",结果:" + fanSpeed);
break;
case "SetModeRequest"://设置模式
previousState.mode = new Domain.IoTXiaoDuEntity.Mode() { value = ModeToString(mode) };
confirmationName = "SetModeConfirmation";
status = 1;
mode = ModeToInt(request.payload.mode.value);
if (mode == -1)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})不支持该空调模式:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, request.payload.mode.value, platformName));
return Json(ReturnXiaoDuError(request.header, "UnsupportedTargetError"), JsonRequestBehavior.AllowGet);
}
payload.mode = new Domain.IoTXiaoDuEntity.Mode() { deviceType = request.payload.mode.deviceType, value = request.payload.mode.value };
payload.previousState = previousState;
sb.Append("模式:" + request.payload.mode.value);
break;
case "PauseRequest"://暂停
confirmationName = "PauseConfirmation";
status = 6;
sb.Append("状态:暂停");
break;
case "ContinueRequest"://继续
confirmationName = "ContinueConfirmation";
status = 1;
sb.Append("状态:继续");
break;
case "SetTVChannelRequest"://电视跳转频道
confirmationName = "SetTVChannelConfirmation";
status = 4;
int channelNumber = 0;
if (int.TryParse(request.payload.deltaValue.value, out channelNumber))
{
valve = channelNumber;
}
else
{
var channel = RoomTypeChannelsManager.LoadAll(host.RoomType.ID).Where(r => r.Name.Contains(request.payload.deltaValue.value)).FirstOrDefault();
if (channel != null)
{
valve = channel.Code;
}
else
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的电视频道:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, request.payload.deltaValue.value, platformName));
return Json(ReturnXiaoDuError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
}
sb.Append("调整频道至:" + valve);
break;
case "IncrementTVChannelRequest"://电视下一频道
confirmationName = "IncrementTVChannelConfirmation";
status = 1;
mode = 5;
sb.Append("频道:加");
break;
case "DecrementTVChannelRequest"://电视上一频道
confirmationName = "DecrementTVChannelConfirmation";
status = 1;
mode = 6;
sb.Append("频道:减");
break;
case "ReturnTVChannelRequest"://返回上一个观看频道
confirmationName = "ReturnTVChannelConfirmation";
status = 1;
mode = 15;
sb.Append("电视:回看");
break;
case "IncrementVolumeRequest"://增大音量
confirmationName = "IncrementVolumeConfirmation";
status = 1;
mode = 3;
sb.Append("音量:加");
break;
case "DecrementVolumeRequest"://减小音量
confirmationName = "DecrementVolumeConfirmation";
status = 1;
mode = 4;
sb.Append("音量:减");
break;
//case "SetVolumeRequest"://设置音量
// confirmationName = "SetVolumeConfirmation";
// break;
case "SetVolumeMuteRequest"://设置静音
confirmationName = "SetVolumeMuteConfirmation";
status = 1;
mode = 1;
sb.Append("音量:静音");
break;
case "SetDirectionRequest"://设置方向:扫地机,遥控器上下左右
confirmationName = "SetDirectionConfirmation";
status = 1;
string value = request.payload.direction.value.ToUpper();
switch (value)
{
case "FORWARD":
mode = 7;
break;
case "BACKWARD":
mode = 8;
break;
case "LEFT":
mode = 9;
break;
case "RIGHT":
mode = 10;
break;
}
sb.Append("移动方向:" + value);
break;
default:
return Json(ReturnXiaoDuError(request.header, "UnsupportedTargetError"), JsonRequestBehavior.AllowGet);
}
#endregion
var strq = "";
if (hostmodal_L.Count == 0)
{
strq = hostModal.Modal.Name;
}
else
{
strq = hostmodal_L.FirstOrDefault().Modal.MultipleTCLName;
}
attributes.Add(new Domain.IoTXiaoDuEntity.ControlResponse.Attributes()
{
name = "name",
//value = hostModal.Modal.Name,
value = strq,
scale = "",
timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false),
uncertaintyInMilliseconds = "10"
});
attributes.Add(new Domain.IoTXiaoDuEntity.ControlResponse.Attributes() { name = "turnOnState", value = status == 1 ? "ON" : "OFF", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.ControlClass = ControlClass_KongZhiSheBei;
i.WhichOneDevice = new List<IotDeviceData>()
{
new IotDeviceData(){DeviceName=hostModal.Modal.Name,DeviceAddress=hostModal.Modal.ModalAddress}
};
i.Step = 3;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.CreateTime = DateTime.Now;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
//i.RequestId = messageid;
i.RequestId = logmsgid;
i.Platform = platformName;
i.CommandDescription = sb.ToString();
SendMQTTData.Send(i);
}
//如果是调光的话 就这样控制
if (hostmodal_L.Count > 0)
{
foreach (var item in hostmodal_L)
{
HostModalManager.SetDevice(host, item, status, item.Brightness, temperature, fanSpeed, mode, valve);
}
}
else
{
string KongTiaoControlName = request.header.name;
bool bsa = hostModal.Modal.Type == DeviceType.AirConditioner;
string KKKey = System.Guid.NewGuid().ToString("N");
bool wendu1 = KongTiaoControlName.Equals("IncrementTemperatureRequest") || KongTiaoControlName.Equals("IncrementTemperatureRequest") || KongTiaoControlName.Equals("SetTemperatureRequest");
bool fengsu1 = KongTiaoControlName.Equals("SetFanSpeedRequest") || KongTiaoControlName.Equals("IncrementFanSpeedRequest") || KongTiaoControlName.Equals("DecrementFanSpeedRequest");
bool moshi1 = KongTiaoControlName.Equals("SetModeRequest");
//特殊酒店
if (AssertFault(hotel_code))
{
for (int i = 0; i < 3; i++)
{
Thread.Sleep(200);
//对房间设备进行操作
//HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
if (request.header.name.Equals("TurnOnRequest") && hostModal.Modal.Type == DeviceType.AirConditioner)
{
HostModalManager.SetDevice_Repeat(KKKey, host, hostModal, status, 0, 0, 0, 0, 0);
}
else if (wendu1 && bsa)
{
HostModalManager.SetDevice(host, hostModal, 0, 0, temperature, 0, 0, 0);
}
else if (fengsu1 && bsa)
{
HostModalManager.SetDevice(host, hostModal, 0, 0, 0, fanSpeed, 0, 0);
}
else if (moshi1 && bsa)
{
HostModalManager.SetDevice(host, hostModal, 0, 0, 0, 0, mode, 0);
}
else
{
HostModalManager.SetDevice_Repeat(KKKey, host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
}
}
}
else
{
if (KongTiaoControlName.Equals("TurnOnRequest") && bsa)
{
HostModalManager.SetDevice(host, hostModal, status, 0, 0, 0, 0, 0);
}
else if (wendu1 && bsa)
{
HostModalManager.SetDevice(host, hostModal, 0, 0, temperature, 0, 0, 0);
}
else if (fengsu1 && bsa)
{
HostModalManager.SetDevice(host, hostModal, 0, 0, 0, fanSpeed, 0, 0);
}
else if (moshi1 && bsa)
{
HostModalManager.SetDevice(host, hostModal, 0, 0, 0, 0, mode, 0);
}
else
{
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
}
}
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
}
break;
#endregion
}
}
payload.attributes = attributes;
//操作完成响应小度
Domain.IoTXiaoDuEntity.ControlResponse.ControlAppResponse response = new Domain.IoTXiaoDuEntity.ControlResponse.ControlAppResponse
{
header = new Domain.IoTXiaoDuEntity.Header
{
messageId = request.header.messageId,
@namespace = request.header.@namespace,
name = confirmationName,
payloadVersion = request.header.payloadVersion
},
payload = payload
};
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 4;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = a;
i.HotelCode = hotel_code;
i.RoomNumber = b;
i.RequestId = logmsgid;
i.Platform = platformName;
i.CommandDescription = "success";
SendMQTTData.Send(i);
}
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
default:
return Json(ReturnXiaoDuError(request.header, "UnsupportedTargetError"), JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 3.1;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = g_hotelid;
i.HotelCode = g_hotelcode;
i.RoomNumber = g_roomnum;
i.RequestId = g_requestid;
i.Platform = platformName;
string sss = ex.Message;
i.CommandDescription = ex.Message;
SendMQTTData.Send(i);
logger.Error(string.Format("处理小度或TCL电视语音设备命令异常数据{0},异常:{1}", reqData, ex.ToString()));
return Json(ex.Message, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 查询小度并且入库
/// </summary>
/// <param name="XiaoDuCUID"></param>
/// <returns></returns>
private Host XiaoDuQuery(string XiaoDuCUID)
{
Host host = null;
string XiaoDuKongZhiKey = CacheKey.XiaoDuYuYin + "_" + XiaoDuCUID;
var UXV = HttpContext.Cache.Get(XiaoDuKongZhiKey);
if (UXV != null)
{
host = UXV as Host;
}
else
{
//host = HostManager.GetByTCLCUID(XiaoDuCUID);
host = HostManager.GetByXiaoDuCUID(XiaoDuCUID);//根据小度音箱序列号获取对应RCU主机
if (host != null)
{
string code = host.SysHotel.Code;
string roomno = host.RoomNumber;
string KKA = CacheKey.XiaoDuCacheUpdate + "_" + code + "_" + roomno;
CSRedisCacheHelper.Set_PartitionWithTime<string>(KKA, XiaoDuCUID, 120);
HttpContext.Cache.Insert(XiaoDuKongZhiKey, host, null, DateTime.Now.AddMinutes(20), Cache.NoSlidingExpiration);
}
}
return host;
}
/// <summary>
/// TCL
/// </summary>
/// <param name="XiaoDuCUID"></param>
/// <returns></returns>
private Host TCLDataQuery(string TCLCUID)
{
Host host = null;
string XiaoDuKongZhiKey = CacheKey.TCLYuYin + "_" + TCLCUID;
var UXV = HttpContext.Cache.Get(XiaoDuKongZhiKey);
if (UXV != null)
{
host = UXV as Host;
}
else
{
host = HostManager.GetByTCLCUID(TCLCUID);
if (host != null)
{
string code = host.SysHotel.Code;
string roomno = host.RoomNumber;
string KKA = CacheKey.XiaoDuCacheUpdate + "_" + code + "_" + roomno;
CSRedisCacheHelper.Set_PartitionWithTime<string>(KKA, TCLCUID, 120);
HttpContext.Cache.Insert(XiaoDuKongZhiKey, host, null, DateTime.Now.AddMinutes(20), Cache.NoSlidingExpiration);
}
}
return host;
}
/// <summary>
/// 从缓存中取出数据
/// </summary>
/// <param name="host"></param>
/// <param name="modalAddress"></param>
/// <returns></returns>
private HostModal GetDataFromCache(Host host, string modalAddress)
{
//HostModal hostModal = new HostModal();
//RoomTypeModal rrr1 = new RoomTypeModal();
//hostModal.Modal = rrr1;
HostModal hostModal = HostModalManager.GetByModalAddress(host.ID, modalAddress);//设备控制
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + modalAddress;
var hostModal_T = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
if (hostModal_T != null)
{
hostModal.Status = hostModal_T.Status;
hostModal.Brightness = hostModal_T.Brightness;
var aaa = hostModal_T.AirConditionData;
hostModal.SettingTemp = aaa.SettingTemp;
hostModal.FanSpeed = aaa.FanSpeed;
hostModal.Mode = aaa.Mode;
hostModal.Valve = aaa.Valve;
hostModal.CurrentTemp = aaa.CurrentTemp;
}
//else
//{
// //模式1制冷2制热3送风
// //风速0自动1低2中3高
// hostModal = new HostModal();
// hostModal.Modal = new RoomTypeModal() { Name = "12", ModalAddress = "007000001" };
// hostModal.Status = 0;
// hostModal.Brightness = 100;
// hostModal.SettingTemp = 25;
// hostModal.FanSpeed = 3;
// hostModal.Mode = 3;
// hostModal.Valve = 2;
// hostModal.CurrentTemp = 25;
//}
return hostModal;
}
/// <summary>
/// 返回错误信息
/// </summary>
/// <param name="header"></param>
/// <param name="errorName"></param>
/// <returns></returns>
private Domain.IoTXiaoDuEntity.Error.ErrorResponse ReturnXiaoDuError(Domain.IoTXiaoDuEntity.Header header, string errorName)
{
Domain.IoTXiaoDuEntity.Error.ErrorResponse err = new Domain.IoTXiaoDuEntity.Error.ErrorResponse
{
header = new Domain.IoTXiaoDuEntity.Header
{
messageId = header.messageId,
@namespace = header.@namespace,
name = errorName,
payloadVersion = header.payloadVersion
},
payload = new Domain.IoTXiaoDuEntity.Error.Payload { }
};
return err;
}
/// <summary>
/// 空调模式转换
/// </summary>
/// <param name="mode"></param>
/// <returns></returns>
private string ModeToString(int mode)
{
string result = "AUTO";
switch (mode)
{
case 1:
result = "COOL";
break;
case 2:
result = "HEAT";
break;
case 3:
result = "FAN";
break;
}
return result;
}
/// <summary>
/// 空调模式转换
/// </summary>
/// <param name="mode"></param>
/// <returns></returns>
private int ModeToInt(string mode)
{
int result = 0;
if (mode != null)
{
switch (mode.ToUpper())
{
case "COOL":
case "COLD":
result = 1;
break;
case "HEAT":
case "HOT":
result = 2;
break;
case "FAN":
case "DRY":
result = 3;
break;
default:
result = -1;
break;
}
}
return result;
}
/// <summary>
/// 小度类型转换
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private int XiaoDuToBLW(string value)
{
switch (value.ToLower())
{
case "min"://最小
return 0;
case "max"://最大
return 100;
case "low"://低
return 1;
case "middle"://中
return 2;
case "high"://高
return 3;
case "step":
return 1;
default:
double result = 0;
if (!Double.TryParse(value, out result))
{
result = 26;
}
return Convert.ToInt32(result);
}
}
private string StatusToString(int status)
{
return status == 1 ? "on" : "off";
}
#endregion
#region TCL电视智能语音对接
public ActionResult GetDevicesForTV()
{
return GetDevicesForTCL();
}
public ActionResult GetDevicesForTCL()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
try
{
Domain.IoTTCLEntity.TCLRequest request = JsonConvert.DeserializeObject<Domain.IoTTCLEntity.TCLRequest>(reqData);//得到TCL请求
string tclCUID = request.info.hotel + "&" + request.info.room;
Host host = HostManager.GetByTCLCUID(tclCUID);//根据TCL的酒店ID和房号获取对应主机
if (host == null)
{
request.code = "100";
request.msg = string.Format("TV设备(hotel:{0},room:{1})尚未绑定客房主机", request.info.hotel, request.info.room);
//logger.Error(request.msg);
return Json(request, JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
request.code = "100";
request.msg = "当前访问酒店已过期";
//return Json(request, JsonRequestBehavior.AllowGet);
}
List<Domain.IoTTCLEntity.TCLData> data = new List<Domain.IoTTCLEntity.TCLData>();
//获取需要控制的场景
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == host.RoomType.ID && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
foreach (RoomTypeScene scene in sceneModals)
{
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = scene.ID.ToString(), deviceType = "scene", deviceName = scene.Name });
}
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
foreach (HostModal hostModal in hostModals)
{
switch (hostModal.Modal.Type)
{
case DeviceType.Relay:
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "light", deviceName = hostModal.Modal.Name });
break;
case DeviceType.AirConditioner:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "air#switch", deviceName = hostModal.Modal.Name });
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "air#temp", deviceName = hostModal.Modal.Name });
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "air#mode", deviceName = hostModal.Modal.Name });
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "air#wind", deviceName = hostModal.Modal.Name });
break;
case DeviceType.Curtain:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "curtain", deviceName = hostModal.Modal.Name });
break;
case DeviceType.ServiceInfo:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "service", deviceName = hostModal.Modal.Name });
break;
}
}
request.code = "0";
request.data = data;
//logger.Error(string.Format("TV(酒店:{0},房号:{1})本次获取设备数量:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, data.Count.ToString()));
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(request),
ContentType = "application/json"
};
}
catch (Exception ex)
{
Domain.IoTTCLEntity.TCLRequest request = new Domain.IoTTCLEntity.TCLRequest();
request.code = "101";
request.msg = ex.Message;
logger.Error(string.Format("RequestData:{0},error:{1}", reqData, ex.ToString()));
return Json(request, JsonRequestBehavior.AllowGet);
}
}
public ActionResult SetDevicesForTV()
{
return SetDevicesForTCL();
}
public ActionResult SetDevicesForTCL()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
try
{
Domain.IoTTCLEntity.TCLRequest request = JsonConvert.DeserializeObject<Domain.IoTTCLEntity.TCLRequest>(reqData);//得到TCL请求
string tclCUID = request.info.hotel + "&" + request.info.room;
Host host = HostManager.GetByTCLCUID(tclCUID);//根据TCL的酒店ID和房号获取对应主机
if (host == null)
{
request.code = "100";
request.msg = string.Format("TV设备(hotel:{0},room:{1})尚未绑定客房主机", request.info.hotel, request.info.room);
//logger.Error(request.msg);
return Json(request, JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
request.code = "100";
request.msg = "当前访问酒店已过期";
//return Json(request, JsonRequestBehavior.AllowGet);
}
if (!Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC))
{
request.code = "100";
request.msg = string.Format("TV设备(hotel:{0},room:{1})网络异常", request.info.hotel, request.info.room);
return Json(request, JsonRequestBehavior.AllowGet);
}
if (!CheckGetPower(host))
{
request.code = "100";
request.msg = string.Format("TV设备(hotel:{0},room:{1})非取电状态,不可控制!", request.info.hotel, request.info.room);
return Json(request, JsonRequestBehavior.AllowGet);
}
foreach (Domain.IoTTCLEntity.TCLData data in request.data)
{
if (data.deviceType == "scene")
{
var scene = RoomTypeSceneManager.Get(int.Parse(data.deviceID));
if (scene == null)
{
return Json("没有找到对应的场景", JsonRequestBehavior.AllowGet);
}
LightControlManager.ApplyScene(host, scene);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, "TCL TV", host.SysHotel.ID);
}
else
{
var hostModal = HostModalManager.GetByModalAddress(host.ID, data.deviceID);//设备控制
if (hostModal == null)
{
return Json("没有找到对应的设备", JsonRequestBehavior.AllowGet);
}
int status = 0;//hostModal.Status;
int brightness = 0;//hostModal.Brightness;
int temperature = 0;//hostModal.SettingTemp;
int fanSpeed = 0;//hostModal.FanSpeed;
int mode = 0;//hostModal.Mode;
int valve = 0;//hostModal.Valve;
switch (data.value)
{
case "on":
status = 1;
brightness = 100;
break;
case "off":
status = 2;
brightness = 0;
break;
default:
switch (data.deviceType)
{
case "air#temp":
//status = 1;
temperature = Convert.ToInt16(data.value);
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
break;
case "air#mode":
//status = 1;
mode = ModeToInt(data.value.ToUpper());
break;
case "air#wind":
//status = 1;
fanSpeed = XiaoDuToBLW(data.value);
break;
}
break;
}
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
string action = "打开";
if (status == 2)
{
action = "关闭";
}
else if (status == 6)
{
action = "暂停";
}
string detail = string.Format("{0}客房{1}{2}({3})", action, host.RoomNumber, hostModal.Modal.Name, data.deviceID);
SaveSystemLog(AuthorityID, "设备控制", detail, true, "TCL TV", host.SysHotel.ID);
}
}
request.code = "0";
request.msg = "控制成功";
return Json(request, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
Domain.IoTTCLEntity.TCLRequest request = new Domain.IoTTCLEntity.TCLRequest();
request.code = "101";
request.msg = ex.Message;
logger.Error(string.Format("RequestData:{0},error:{1}", reqData, ex.ToString()));
return Json(request, JsonRequestBehavior.AllowGet);
}
}
public ActionResult GetDevicesStatusForTV()
{
return GetDevicesStatusForTCL();
}
public ActionResult GetDevicesStatusForTCL()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
try
{
Domain.IoTTCLEntity.TCLRequest request = JsonConvert.DeserializeObject<Domain.IoTTCLEntity.TCLRequest>(reqData);//得到TCL请求
string tclCUID = request.info.hotel + "&" + request.info.room;
Host host = HostManager.GetByTCLCUID(tclCUID);//根据TCL的酒店ID和房号获取对应主机
if (host == null)
{
request.code = "100";
request.msg = string.Format("TV设备(hotel:{0},room:{1})尚未绑定客房主机", request.info.hotel, request.info.room);
//logger.Error(request.msg);
return Json(request, JsonRequestBehavior.AllowGet);
}
List<Domain.IoTTCLEntity.TCLData> data = new List<Domain.IoTTCLEntity.TCLData>();
if (null == request.data || request.data.Count == 0)
{
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
foreach (HostModal hostModal in hostModals)
{
switch (hostModal.Modal.Type)
{
case DeviceType.Relay:
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "light", deviceName = hostModal.Modal.Name, value = StatusToString(hostModal.Status) });
break;
case DeviceType.Curtain:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "curtain", deviceName = hostModal.Modal.Name, value = StatusToString(hostModal.Status) });
break;
case DeviceType.ServiceInfo:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "service", deviceName = hostModal.Modal.Name, value = StatusToString(hostModal.Status) });
break;
}
}
}
else
{
foreach (Domain.IoTTCLEntity.TCLData tclData in request.data)
{
HostModal hostModal = HostModalManager.GetByModalAddress(host.ID, tclData.deviceID);
if (null != hostModal)
{
switch (hostModal.Modal.Type)
{
case DeviceType.Relay:
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "light", deviceName = hostModal.Modal.Name, value = StatusToString(hostModal.Status) });
break;
case DeviceType.Curtain:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "curtain", deviceName = hostModal.Modal.Name, value = StatusToString(hostModal.Status) });
break;
case DeviceType.ServiceInfo:
data.Add(new Domain.IoTTCLEntity.TCLData() { deviceID = hostModal.Modal.ModalAddress, deviceType = "service", deviceName = hostModal.Modal.Name, value = StatusToString(hostModal.Status) });
break;
}
}
}
}
request.code = "0";
request.data = data;
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(request),
ContentType = "application/json"
};
}
catch (Exception ex)
{
Domain.IoTTCLEntity.TCLRequest request = new Domain.IoTTCLEntity.TCLRequest();
request.code = "101";
request.msg = ex.Message;
logger.Error(string.Format("RequestData:{0},error:{1}", reqData, ex.ToString()));
return Json(request, JsonRequestBehavior.AllowGet);
}
}
#endregion
#region DUI语音对接
/// <summary>
/// DUI语音对接主动上报ApiKeyb4b4c81c01e446b4b40f85b196c6aaec
/// </summary>
/// <returns></returns>
public ActionResult Dui()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
string msg;
try
{
Domain.IoTDUIEntity.Request.AppliancesRequest request = JsonConvert.DeserializeObject<Domain.IoTDUIEntity.Request.AppliancesRequest>(reqData);//得到DUI请求
string accessToken = request.payload.accessToken;
if (string.IsNullOrEmpty(accessToken))
{
msg = "accessToken不能为空";
return Json(ReturnDUIError(request.header, "ACCESS_TOKEN_INVALIDATE", msg), JsonRequestBehavior.AllowGet);
}
string hotelCode = accessToken.Substring(0, accessToken.IndexOf("BLW"));
SysHotel hotel = SysHotelManager.GetByCode(hotelCode);//根据酒店编码获取酒店
if (hotel == null)
{
msg = "DUI未找到对应酒店(accessToken:" + hotelCode + ")";
//logger.Error(msg);
return Json(ReturnDUIError(request.header, "ACCESS_TOKEN_INVALIDATE", msg), JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > hotel.ValidateDate)//酒店已到期
{
//return Json(ReturnDUIError(request.header, "ACCESS_TOKEN_INVALIDATE", "当前访问酒店已过期"), JsonRequestBehavior.AllowGet);
}
string roomNumber = request.payload.group;//控制的时候DUI不传入房号
if (string.IsNullOrEmpty(roomNumber))
{
if (null == request.payload.appliance || string.IsNullOrEmpty(request.payload.appliance.applianceId))
{
msg = "DUI无法获取房号payload.appliance.applianceId为空";
logger.Error(msg);
return Json(ReturnDUIError(request.header, "DEVICE_IS_NOT_EXIST", msg), JsonRequestBehavior.AllowGet);
}
roomNumber = request.payload.appliance.applianceId.Split('&')[2];//获取房号
}
Host host = HostManager.GetByRoomNumber(roomNumber, hotel.ID);
if (host == null)
{
msg = string.Format("DUI未找到对应客房主机(hotelCode:{0},roomNumber:{1})", hotelCode, roomNumber);
//logger.Error(msg);
return Json(ReturnDUIError(request.header, "DEVICE_IS_NOT_EXIST", msg), JsonRequestBehavior.AllowGet);
}
//判断技能类型
switch (request.header.@namespace)
{
case "DUI.SmartHome.Discovery"://发现设备
{
List<Domain.IoTDUIEntity.DiscoverResponse.DiscoveredAppliances> appliances = new List<Domain.IoTDUIEntity.DiscoverResponse.DiscoveredAppliances>();
List<string> applianceIds = new List<string>();
//获取需要控制的场景
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == host.RoomType.ID && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
foreach (RoomTypeScene scene in sceneModals)
{
string aliasNames = string.IsNullOrEmpty(scene.AliasName) ? "" : scene.AliasName;
appliances.Add(new Domain.IoTDUIEntity.DiscoverResponse.DiscoveredAppliances
{
applianceId = scene.ID + "&" + "SCENE_TRIGGER" + "&" + roomNumber,
group = host.RoomNumber,//房号
friendlyName = scene.Name,
aliasNames = new List<string>(aliasNames.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)),
applianceType = "SCENE_TRIGGER",
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(scene.Type),
zone = "",//host.RoomType.Name,//房型名称
description = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + scene.Name,
actions = new List<string> { "turnOn" },
additionalApplianceDetails = new Dictionary<string, string>()
});
applianceIds.Add(scene.ID + "&" + "SCENE_TRIGGER");
}
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
applianceIds = new List<string>();
foreach (HostModal hostModal in hostModals)
{
string applianceType;
List<string> actions = new List<string>();
switch (hostModal.Modal.Type)
{
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
applianceType = "LIGHT";
actions.Add("TurnOn");
actions.Add("TurnOff");
actions.Add("SetBrightness");
actions.Add("IncreaseBrightness");
actions.Add("DecreaseBrightness");
break;
case DeviceType.Strip://灯带如果000回路打勾则是调色否则是调光
applianceType = "LIGHT";
actions.Add("TurnOn");
actions.Add("TurnOff");
//if (hostModal.Modal.ModalAddress.Substring(6) == "000")
//{
// actions.Add("SetColorTemperature");
// actions.Add("IncreaseColorTemperature");
// actions.Add("DecreaseColorTemperature");
//}
//else
//{
actions.Add("SetBrightness");
actions.Add("IncreaseBrightness");
actions.Add("DecreaseBrightness");
//}
break;
case DeviceType.AirConditioner:
applianceType = "AIR_CONDITION";
actions.Add("TurnOn");
actions.Add("TurnOff");
actions.Add("SetTemperature");
actions.Add("IncreaseTemperature");
actions.Add("DecreaseTemperature");
actions.Add("SetWindSpeed");
actions.Add("IncreaseWindSpeed");
actions.Add("DecreaseWindSpeed");
actions.Add("SetMode");
break;
case DeviceType.Curtain:
applianceType = "CURTAIN";
actions.Add("TurnOn");
actions.Add("TurnOff");
actions.Add("Pause");
actions.Add("Continue");
break;
case DeviceType.TV:
applianceType = "TV_SET";
actions.Add("TurnOn");
actions.Add("TurnOff");
actions.Add("SetChannel");
actions.Add("SetChannelName");
actions.Add("IncreaseChannel");
actions.Add("DecreaseChannel");
actions.Add("returnTVChannel");
actions.Add("SetVolume");
actions.Add("IncreaseVolume");
actions.Add("DecreaseVolume");
actions.Add("SetMute");
actions.Add("CancelMute");
break;
case DeviceType.Music:
applianceType = "TV_SET";
actions.Add("TurnOn");
actions.Add("TurnOff");
actions.Add("SetVolume");
actions.Add("IncreaseVolume");
actions.Add("DecreaseVolume");
actions.Add("SetMute");
actions.Add("CancelMute");
break;
default:
applianceType = "SWITCH";
actions.Add("TurnOn");
actions.Add("TurnOff");
break;
}
string aliasNames = string.IsNullOrEmpty(hostModal.Modal.AliasName) ? "" : hostModal.Modal.AliasName;
appliances.Add(new Domain.IoTDUIEntity.DiscoverResponse.DiscoveredAppliances
{
applianceId = hostModal.Modal.ModalAddress + "&" + applianceType + "&" + roomNumber,
group = host.RoomNumber,//房号
friendlyName = hostModal.Modal.Name,
aliasNames = new List<string>(aliasNames.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)),
applianceType = applianceType,
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(hostModal.Modal.Type),
zone = "",//host.RoomType.Name,//房型名称
description = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + hostModal.Modal.Name,
actions = actions,
additionalApplianceDetails = new Dictionary<string, string>()
});
applianceIds.Add(hostModal.Modal.ModalAddress + "&" + applianceType);
}
//找到可控场景和设备响应小度DuerOS
Domain.IoTDUIEntity.DiscoverResponse.AppliancesResponse response = new Domain.IoTDUIEntity.DiscoverResponse.AppliancesResponse
{
header = new Domain.IoTDUIEntity.Header
{
messageId = request.header.messageId,
@namespace = request.header.@namespace,
name = "DiscoverResponse",
payloadVersion = request.header.payloadVersion
},
payload = new Domain.IoTDUIEntity.DiscoverResponse.Payload
{
appliances = appliances
}
};
logger.Error(string.Format("DUI(酒店:{0},房号:{1})本次获取设备数量:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, response.payload.appliances.Count.ToString()));
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
case "DUI.SmartHome.Control"://控制消息
{
if (!CheckGetPower(host))
{
return Json(ReturnDUIError(request.header, "NOT_SUPPORT_ON_CURRENT_STATUS", "非取电状态,不可控制!"), JsonRequestBehavior.AllowGet);
}
if (!Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC))
{
return Json(ReturnDUIError(request.header, "IOT_DEVICE_OFFLINE", "当前客房主机不在线"), JsonRequestBehavior.AllowGet);
}
string modalAddress = request.payload.appliance.applianceId.Split('&')[0];//设备地址或场景ID
string applianceType = request.payload.appliance.applianceId.Split('&')[1];//设备类型
if (applianceType == "SCENE_TRIGGER")//场景控制
{
var scene = RoomTypeSceneManager.Get(int.Parse(modalAddress));
if (scene == null)
{
logger.Error(string.Format("DUI(酒店:{0},房号:{1})未找到对应的场景ID{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress));
return Json(ReturnDUIError(request.header, "DEVICE_IS_NOT_EXIST", "场景未找到(id:" + modalAddress + ")"), JsonRequestBehavior.AllowGet);
}
LightControlManager.ApplyScene(host, scene);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, "DUI TV", host.SysHotel.ID);
}
else
{
var hostModal = HostModalManager.GetByModalAddress(host.ID, modalAddress);//设备控制
if (hostModal == null)
{
logger.Error(string.Format("DUI(酒店:{0},房号:{1})未找到对应的回路Address{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress));
return Json(ReturnDUIError(request.header, "DEVICE_IS_NOT_EXIST", "设备未找到(modalAddress:" + modalAddress + ")"), JsonRequestBehavior.AllowGet);
}
int status = hostModal.Status;
int brightness = hostModal.Brightness;
int temperature = hostModal.SettingTemp;
int fanSpeed = hostModal.FanSpeed;
int mode = hostModal.Mode;
int valve = hostModal.Valve;
switch (request.header.name)
{
case "TurnOn"://打开
status = 1;
brightness = 100;
break;
case "TurnOff"://关闭
status = 2;
brightness = 0;
break;
case "SetBrightness"://设置亮度
status = 1;
brightness = DuiToBLW(request.payload.brightness.value);
break;
case "IncreaseBrightness"://调亮
status = 1;
brightness += DuiToBLW(request.payload.deltaBrightness.value);
if (brightness > 100)
{
brightness = 100;
}
break;
case "DecreaseBrightness"://调暗
status = 1;
brightness -= DuiToBLW(request.payload.deltaBrightness.value);
if (brightness < 0)
{
brightness = 0;
status = 2;
}
break;
case "SetColorTemperature":
break;
case "IncreaseColorTemperature":
break;
case "DecreaseColorTemperature":
break;
case "SetTemperature"://设置温度
status = 1;
temperature = DuiToBLW(request.payload.temperature.value);
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
break;
case "IncreaseTemperature"://调高温度
status = 1;
temperature += DuiToBLW(request.payload.deltaTemperature.value);
if (temperature > 32)
{
temperature = 32;
}
break;
case "DecreaseTemperature"://调低温度
status = 1;
temperature -= DuiToBLW(request.payload.deltaTemperature.value);
if (temperature < 16)
{
temperature = 16;
}
break;
case "SetVolume"://设置音量
case "IncreaseVolume"://增大音量
case "DecreaseVolume"://减小音量
case "SetMute"://设置静音
case "CancelMute"://取消静音
case "SetChannel"://设置频道
case "SetChannelName"://设置频道
case "IncreaseChannel"://设置频道
case "DecreaseChannel"://设置频道
break;
case "SetWindSpeed"://设置风速
status = 1;
fanSpeed = DuiToBLW(request.payload.speedLevel.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
else if (fanSpeed > 3)
{
fanSpeed = 3;
}
break;
case "IncreaseWindSpeed"://调高风速
status = 1;
fanSpeed += DuiToBLW(request.payload.deltaSpeedLevel.value);
if (fanSpeed > 3)
{
fanSpeed = 3;
}
break;
case "DecreaseWindSpeed"://调低风速
status = 1;
fanSpeed -= DuiToBLW(request.payload.deltaSpeedLevel.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
break;
case "SetMode"://设置模式
status = 1;
mode = ModeToInt(request.payload.mode.value);
break;
case "CancelMode"://取消模式
break;
case "Pause"://暂停
status = 6;
break;
case "Continue"://继续
status = 1;
break;
default:
return Json(ReturnDUIError(request.header, "DEVICE_NOT_SUPPORT_FUNCTION", "设备不支持该操作"), JsonRequestBehavior.AllowGet);
}
if (hostModal.Modal.Type == DeviceType.Strip && hostModal.Modal.ModalAddress.Substring(6) == "000")//如果是000回路则是调色否则是调光
{
HostModalManager.SetDevice(host, hostModal, brightness == 0 ? 2 : 1, brightness, 0, 0, 0, 0);
//001回路R颜色
hostModal = HostModalManager.GetByModalAddress(host.ID, hostModal.Modal.ModalAddress.Substring(0, 8) + "1");
HostModalManager.SetDevice(host, hostModal, brightness == 0 ? 2 : 1, brightness, 0, 0, 0, 0);
//002回路G颜色
hostModal = HostModalManager.GetByModalAddress(host.ID, hostModal.Modal.ModalAddress.Substring(0, 8) + "2");
HostModalManager.SetDevice(host, hostModal, brightness == 0 ? 2 : 1, brightness, 0, 0, 0, 0);
//003回路B颜色
hostModal = HostModalManager.GetByModalAddress(host.ID, hostModal.Modal.ModalAddress.Substring(0, 8) + "3");
HostModalManager.SetDevice(host, hostModal, brightness == 0 ? 2 : 1, brightness, 0, 0, 0, 0);
}
else
{
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
}
string action = "打开";
if (status == 2)
{
action = "关闭";
}
else if (status == 6)
{
action = "暂停";
}
string detail = string.Format("{0}客房{1}{2}({3})", action, host.RoomNumber, hostModal.Modal.Name, modalAddress);
SaveSystemLog(AuthorityID, "设备控制", detail, true, "DUI TV", host.SysHotel.ID);
}
//操作完成响应DUI
Domain.IoTDUIEntity.ControlResponse.ControlAppResponse response = new Domain.IoTDUIEntity.ControlResponse.ControlAppResponse
{
header = new Domain.IoTDUIEntity.Header
{
@namespace = request.header.@namespace,
name = request.header.name + "Response",
messageId = request.header.messageId,
payloadVersion = request.header.payloadVersion
},
payload = new Domain.IoTDUIEntity.ControlResponse.Payload { }
};
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
case "DUI.SmartHome.Query":
{
return Json(ReturnDUIError(request.header, "INVALIDATE_PARAMS", "namespace:" + request.header.@namespace), JsonRequestBehavior.AllowGet);
}
default:
return Json(ReturnDUIError(request.header, "INVALIDATE_PARAMS", "namespace:" + request.header.@namespace), JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
logger.Error(string.Format("处理DUI命令异常数据{0},异常:{1}", reqData, ex.ToString()));
return Json(ex.Message, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// Dui平台增量型转换
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private int DuiToBLW(string value)
{
switch (value.ToLower())
{
case "min"://最小
return 0;
case "max"://最大
return 100;
case "low"://低
return 1;
case "mid"://中
return 2;
case "high"://高
return 3;
case "step":
return 1;
default:
return Convert.ToInt16(value);
}
}
/// <summary>
/// 返回错误信息
/// </summary>
/// <param name="header"></param>
/// <param name="errorName"></param>
/// <returns></returns>
private Domain.IoTDUIEntity.Error.ErrorResponse ReturnDUIError(Domain.IoTDUIEntity.Header header, string errorCode, string message)
{
Domain.IoTDUIEntity.Error.ErrorResponse err = new Domain.IoTDUIEntity.Error.ErrorResponse
{
header = new Domain.IoTDUIEntity.Header
{
messageId = header.messageId,
@namespace = header.@namespace,
name = "ErrorResponse",
payloadVersion = header.payloadVersion
},
payload = new Domain.IoTDUIEntity.Error.Payload
{
errorCode = errorCode,
message = message
}
};
return err;
}
#endregion
#region
/// <summary>
/// 华为设备获取技能
/// </summary>
/// <returns></returns>
public ActionResult HuaWeiDiscoverDevices()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
//logger.Error(string.Format("收到华为大屏同步数据请求:{0},来自:{1}", reqData, GetClientIP()));
Domain.IoTHuaWeiEntity.SmartHomeContentInfoRsp rsp = new Domain.IoTHuaWeiEntity.SmartHomeContentInfoRsp();
try
{
Domain.IoTHuaWeiEntity.SmartHomeContentInfoReq req = JsonConvert.DeserializeObject<Domain.IoTHuaWeiEntity.SmartHomeContentInfoReq>(reqData);//得到华为请求
//var hosts = HostManager.LoadAll("1003").ToList();//指定酒店,同步设备技能
var host = HostManager.GetByHuaWeiCUID(_huawei_cuid);//获取按配置的主机的技能
List<Domain.IoTHuaWeiEntity.SmartHomeContentInfoItem> data = new List<Domain.IoTHuaWeiEntity.SmartHomeContentInfoItem>();
if (host != null)//foreach (Host host in hosts)
{
//获取需要控制的场景
List<Domain.IoTHuaWeiEntity.SmartHomeSceneRuleObjDef> sceneRuleList = new List<Domain.IoTHuaWeiEntity.SmartHomeSceneRuleObjDef>();
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == host.RoomType.ID && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
foreach (RoomTypeScene scene in sceneModals)
{
sceneRuleList.Add(new Domain.IoTHuaWeiEntity.SmartHomeSceneRuleObjDef
{
name = "SMARTHOME_SCENE_IFTTT",
value = scene.Name,
valueAlias = new string[] { }
});
}
//获取需要控制的设备
List<Domain.IoTHuaWeiEntity.SmartHomePayloadObjDef> payload = new List<Domain.IoTHuaWeiEntity.SmartHomePayloadObjDef>();
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
foreach (HostModal hostModal in hostModals)
{
Domain.IoTHuaWeiEntity.SmartHomePayloadObjDef playloadItem = new Domain.IoTHuaWeiEntity.SmartHomePayloadObjDef();
playloadItem.deviceType = hostModal.Modal.Name;//设备类型:默认回路名称
playloadItem.actionList = new string[] { "SMARTHOME_SWITCH_ON", "SMARTHOME_SWITCH_OFF" };//默认具有开和关意图
switch (hostModal.Modal.Type)
{
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.Strip://灯带调光
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
playloadItem.actionList = new string[]
{
"SMARTHOME_SWITCH_ON", //打开
"SMARTHOME_SWITCH_OFF", //关闭
"SMARTHOME_TURN_BRIGHTER", //调亮
"SMARTHOME_TURN_DARKER", //调暗
"SMARTHOME_SET_BRIGHTNESS", //最亮
"SMARTHOME_SET_DARKER" //最暗
};
break;
case DeviceType.AirConditioner:
playloadItem.actionList = new string[]
{
"SMARTHOME_SWITCH_ON",
"SMARTHOME_SWITCH_OFF",
"SMARTHOME_SET_MODE",
"SMARTHOME_INC_TEMP",
"SMARTHOME_DEC_TEMPERATURE",
"SMARTHOME_SET_TEMP",
"SMARTHOME_INC_WINDSPEED",
"SMARTHOME_DEC_WINDSPEED",
"SMARTHOME_SET_WINDSPEED"
};
break;
case DeviceType.Curtain:
playloadItem.actionList = new string[] { "SMARTHOME_SWITCH_ON", "SMARTHOME_SWITCH_OFF", "SMARTHOME_PAUSE" };
break;
default:
playloadItem.actionList = new string[] { "SMARTHOME_SWITCH_ON", "SMARTHOME_SWITCH_OFF" };
break;
}
List<Domain.IoTHuaWeiEntity.SmartHomeDeviceObjDef> deviceList = new List<Domain.IoTHuaWeiEntity.SmartHomeDeviceObjDef>();
deviceList.Add(new Domain.IoTHuaWeiEntity.SmartHomeDeviceObjDef()
{
name = "smarthome.devicename",
value = hostModal.Modal.Name,
valueAlias = new string[] { }
});
playloadItem.deviceList = deviceList;
payload.Add(playloadItem);
}
//组织给华为同步的数据
data.Add(new Domain.IoTHuaWeiEntity.SmartHomeContentInfoItem()
{
countryCode = "CN",
deviceType = "3",
language = "zh-CN",
vtId = _huawei_vtId,
payload = payload,
sceneRuleList = sceneRuleList
});
//logger.Error(string.Format("{3}(酒店:{0},房号:{1})本次获取设备数量:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, (payload.Count + sceneRuleList.Count).ToString(), platformName));
}
rsp.data = data;
rsp.pagination = new Domain.IoTHuaWeiEntity.PaginationRsp() { next = "0", total = data.Count };
rsp.expectedNextTimestamp = "0";
rsp.errorCode = "0";
rsp.errorMessage = "OK";
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(rsp),
ContentType = "application/json"
};
}
catch (Exception ex)
{
rsp.errorCode = "32";
rsp.errorMessage = ex.Message;
logger.Error(string.Format("华为大屏同步数据请求异常,数据:{0},异常:{1},来自:{2}", reqData, ex.ToString(), GetClientIP()));
return Json(rsp);
}
}
/// <summary>
/// 华为设备意图请求控制
/// </summary>
/// <returns></returns>
public ActionResult HuaWeiControlDevices()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
string reqDataMsg = string.Format("收到华为大屏控制设备请求:{0},来自:{1}", reqData, GetClientIP());
reqData = reqData.Replace("smarthome.devicetype", "smarthomeDevicetype")
.Replace("smarthome.devicename", "smarthomeDevicename")
.Replace("smarthome.rulename", "smarthomeRulename")
.Replace("smarthome.room", "smarthomeRoom")
.Replace("smarthome.charactervalue", "smarthomeCharactervalue")
.Replace("smarthome.alldevice", "smarthomeAlldevice")
.Replace("smarthome.target", "smarthomeTarget")
.Replace("smarthome.action", "smarthomeAction")
.Replace("null", "");
Domain.IoTHuaWeiEntity.SmartHomeIntentRsp rsp = new Domain.IoTHuaWeiEntity.SmartHomeIntentRsp();
string platformName = "华为大屏";
try
{
Domain.IoTHuaWeiEntity.SmartHomeIntentReq req = JsonConvert.DeserializeObject<Domain.IoTHuaWeiEntity.SmartHomeIntentReq>(reqData);//得到华为意图请求
rsp.version = req.version;
rsp.reply = new Domain.IoTHuaWeiEntity.Reply() { isEndSession = true };
if (string.IsNullOrEmpty(req.endpoint.device.deviceId))
{
rsp.errorCode = "1";
rsp.errorMessage = platformName + "deviceId(" + req.endpoint.device.deviceId + ")无效";
logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
Host host = HostManager.GetByHuaWeiCUID(req.endpoint.device.deviceId);//根据deviceId获取对应RCU主机
if (host == null)
{
rsp.errorCode = "101";
rsp.errorMessage = platformName + "deviceId(" + req.endpoint.device.deviceId + ")尚未绑定客房主机";
//logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
rsp.errorCode = "101";
rsp.errorMessage = "当前访问酒店(" + host.SysHotel.Name + ")已过期";
//logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
//if (!CheckGetPower(host.ID))
//{
// rsp.errorCode = "101";
// rsp.errorMessage = "酒店(" + host.SysHotel.Name + ")客房(" + host.RoomNumber + "):非取电状态,不可控制!";
// logger.Error(rsp.errorMessage);
// return Json(rsp);
//}
if (req.inquire.intent.name.StartsWith("SMARTHOME_SCENE"))//场景控制
{
string modalName = "";
if (req.inquire.intent.slots.smarthomeRulename.values != null)
{
modalName = req.inquire.intent.slots.smarthomeRulename.values[0].real;
}
if (string.IsNullOrEmpty(modalName))
{
rsp.errorCode = "1";
rsp.errorMessage = "需要控制的场景名称不能为空";
logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
var scene = RoomTypeSceneManager.Get(host.RoomType, modalName);
if (scene == null)
{
rsp.errorCode = "101";
rsp.errorMessage = string.Format("{3}(酒店:{0},房号:{1})未找到对应的控制场景,名称:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalName, platformName);
logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
LightControlManager.ApplyScene(host, scene);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, platformName, host.SysHotel.ID);
}
else
{
string prefix = "", modalName = "";//设备名称优先取type然后取name
if (req.inquire.intent.slots.smarthomeAlldevice != null && req.inquire.intent.slots.smarthomeAlldevice.values != null)
{
prefix = req.inquire.intent.slots.smarthomeAlldevice.values[0].real;//所有设备
}
if (prefix == "" && req.inquire.intent.slots.smarthomeRoom != null && req.inquire.intent.slots.smarthomeRoom.values != null)
{
prefix = req.inquire.intent.slots.smarthomeRoom.values[0].real; //设备所在位置
}
if (req.inquire.intent.slots.smarthomeDevicetype.values != null)
{
modalName = req.inquire.intent.slots.smarthomeDevicetype.values[0].real;//设备类型
}
else if (req.inquire.intent.slots.smarthomeDevicename.values != null)
{
modalName = req.inquire.intent.slots.smarthomeDevicename.values[0].real;//设备名称
}
else if (req.inquire.intent.slots.smarthomeTarget.values != null)
{
modalName = req.inquire.intent.slots.smarthomeTarget.values[0].real;//服务或客需名称
}
modalName = prefix + modalName;//前缀+名称,如所有灯
if (string.IsNullOrEmpty(modalName))
{
rsp.errorCode = "1";
rsp.errorMessage = "需要控制的设备或服务名称不能为空";
logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
System.Text.StringBuilder sb = new System.Text.StringBuilder();
switch (modalName)
{
case "所有灯":
case "总控":
var hostModals = HostModalManager.LoadAllLight(host.ID);
foreach (var hostModal1 in hostModals)
{
int status1 = hostModal1.Status;
int brightness1 = hostModal1.Brightness;
int temperature1 = hostModal1.SettingTemp;
int fanSpeed1 = hostModal1.FanSpeed;
int mode1 = hostModal1.Mode;
int valve1 = hostModal1.Valve;
switch (req.inquire.intent.name)
{
case "SMARTHOME_SWITCH_ON":
status1 = 1;
brightness1 = 100;
break;
case "SMARTHOME_SWITCH_OFF":
status1 = 2;
brightness1 = 0;
break;
default:
rsp.errorCode = "31";
rsp.errorMessage = "不支持或尚未同步此意图:" + req.inquire.intent.name;
logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
HostModalManager.SetDevice(host, hostModal1, status1, brightness1, temperature1, fanSpeed1, mode1, valve1);//对房间设备进行操作
}
if (req.inquire.utterance != null && req.inquire.utterance.original != null)
{
sb.Append(req.inquire.utterance.original);
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
break;
default:
var hostModal = HostModalManager.GetByModalName(host.ID, modalName);//设备控制
if (hostModal == null)
{
rsp.errorCode = "101";
rsp.errorMessage = string.Format("{3}(酒店:{0},房号:{1})未找到对应的控制设备或服务,名称:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalName, platformName);
logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
sb.Append("控制客房(" + host.RoomNumber + ")设备(" + hostModal.Modal.Name + hostModal.Modal.ModalAddress + ")");
int status = hostModal.Status;
int brightness = hostModal.Brightness;
int temperature = hostModal.SettingTemp;
int fanSpeed = hostModal.FanSpeed;
int mode = hostModal.Mode;
int valve = hostModal.Valve;
switch (req.inquire.intent.name)
{
case "SMARTHOME_SWITCH_ON":
case "SMARTHOME_SET_BRIGHTNESS"://最亮
status = 1;
brightness = 100;
sb.Append("打开");
break;
case "SMARTHOME_SET_BRIGHTER"://最暗
status = 1;
brightness = 10;
sb.Append("打开(最暗)");
break;
case "SMARTHOME_SWITCH_OFF":
status = 2;
brightness = 0;
sb.Append("关闭");
break;
case "SMARTHOME_TURN_BRIGHTER":
status = 1;
brightness += 10;
if (brightness > 100)
{
brightness = 100;
}
sb.Append("调亮");
break;
case "SMARTHOME_TURN_DARKER":
status = 1;
brightness -= 10;
if (brightness < 0)
{
brightness = 0;
status = 2;
}
sb.Append("调暗");
break;
case "SMARTHOME_PAUSE":
status = 6;
sb.Append("暂停");
break;
case "SMARTHOME_SET_MODE":
status = 1;
switch (req.inquire.intent.slots.smarthomeCharactervalue.values[0].real)
{
case "制冷":
mode = 1;
break;
case "制热":
mode = 2;
break;
default://送风
mode = 3;
break;
}
sb.Append("设定模式:" + req.inquire.intent.slots.smarthomeCharactervalue.values[0].real);
break;
case "SMARTHOME_INC_TEMP":
status = 1;
temperature++;
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
sb.Append("调高温度1°");
break;
case "SMARTHOME_DEC_TEMPERATURE":
status = 1;
temperature--;
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
sb.Append("调低温度1°");
break;
case "SMARTHOME_SET_TEMP":
status = 1;
temperature = Convert.ToInt16(req.inquire.intent.slots.smarthomeCharactervalue.values[0].real);
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
sb.Append("设温:" + temperature);
break;
case "SMARTHOME_INC_WINDSPEED":
status = 1;
fanSpeed++;
if (fanSpeed > 3)
{
fanSpeed = 3;
}
sb.Append("调高风速");
break;
case "SMARTHOME_DEC_WINDSPEED":
status = 1;
fanSpeed--;
if (fanSpeed > 3)
{
fanSpeed = 3;
}
sb.Append("调低风速");
break;
case "SMARTHOME_SET_WINDSPEED":
status = 1;
switch (req.inquire.intent.slots.smarthomeCharactervalue.values[0].real)
{
case "低风":
fanSpeed = 1;
break;
case "中风":
fanSpeed = 2;
break;
case "高风":
fanSpeed = 3;
break;
default://自动风
fanSpeed = 0;
break;
}
sb.Append("设定风速:" + fanSpeed);
break;
case "SMARTHOME_SERVICE":
case "SMARTHOME_CUSTOMERDEMAND":
string action = req.inquire.intent.slots.smarthomeAction.values[0].real;
status = action == "打开" ? 1 : 2;
sb.Append("控制服务(" + modalName + ")" + action);
break;
default:
rsp.errorCode = "31";
rsp.errorMessage = "不支持或尚未同步此意图:" + req.inquire.intent.name;
logger.Error(rsp.errorMessage);
//logger.Error(reqDataMsg);
return Json(rsp);
}
if (req.inquire.utterance != null && req.inquire.utterance.original != null)
{
sb.Append(",原意:" + req.inquire.utterance.original);
}
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
break;
}
}
rsp.errorCode = "0";
rsp.errorMessage = "OK";
return Json(rsp);
}
catch (Exception ex)
{
rsp.errorCode = "32";
rsp.errorMessage = ex.Message;
logger.Error("华为大屏控制设备或服务异常:" + ex.ToString());
logger.Error(reqDataMsg);
return Json(rsp);
}
}
#endregion
#region
/// <summary>
/// 飞尔智能(科大讯飞)对接
/// </summary>
/// <returns></returns>
public ActionResult FeiEr()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
try
{
Domain.IoTFerErEntity.Request request = JsonConvert.DeserializeObject<Domain.IoTFerErEntity.Request>(reqData);//得到飞尔请求
//if (string.IsNullOrEmpty(request.payload.cuid))
//{
// logger.Error("第三方语音设备cuid不能为空" + reqData + ",来自:" + GetClientIP());
// return Json(ReturnXiaoDuError(request.header, "UnexpectedInformationReceivedError"), JsonRequestBehavior.AllowGet);
//}
//string platformName = "小度音箱";
//Host host = null;
//if (request.header.@namespace.StartsWith("X2BOS"))
//{
// platformName = "TCL电视";
// host = HostManager.GetByTCLCUID(request.payload.cuid);
//}
//else
//{
// host = HostManager.GetByXiaoDuCUID(request.payload.cuid);//根据小度音箱序列号获取对应RCU主机
//}
//if (host == null)
//{
// logger.Error(platformName + "cuid(" + request.payload.cuid + ")尚未绑定客房主机");
// return Json(ReturnXiaoDuError(request.header, "TargetHardwareMalfunctionError"), JsonRequestBehavior.AllowGet);//"小度音箱(" + request.payload.cuid + ")尚未绑定客房主机"
//}
//if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
//{
// logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期");
return Json("", JsonRequestBehavior.AllowGet);
//}
}
catch (Exception ex)
{
logger.Error(string.Format("处理飞尔智能命令异常,数据:{0},异常:{1}", reqData, ex.ToString()));
return Json(ex.Message, JsonRequestBehavior.AllowGet);
}
}
#endregion
#region
/// <summary>
/// 岚正播放盒语音对接
/// </summary>
/// <returns></returns>
public ActionResult LZ()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
try
{
Domain.IoTLZEntity.DiscoverAppliancesRequest request = JsonConvert.DeserializeObject<Domain.IoTLZEntity.DiscoverAppliancesRequest>(reqData);//岚正播放盒语音对接
string platformName = "岚正播放盒";
if (string.IsNullOrEmpty(request.payload.cuid))
{
logger.Error(platformName + "cuid不能为空" + reqData + ",来自:" + GetClientIP());
return Json(ReturnLZError(request.header, "UnexpectedInformationReceivedError"), JsonRequestBehavior.AllowGet);
}
Host host = HostManager.GetByTCLCUID(request.payload.cuid);//根据播放盒序列号获取对应RCU主机
if (host == null)
{
logger.Error(platformName + "cuid(" + request.payload.cuid + ")尚未绑定客房主机");
return Json(ReturnLZError(request.header, "TargetHardwareMalfunctionError"), JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期");
return Json(ReturnLZError(request.header, "ExpiredAccessTokenError"), JsonRequestBehavior.AllowGet);
}
switch (request.header.@namespace)
{
case "LZOS.Discovery"://发现设备
{
List<Domain.IoTLZEntity.DiscoveredAppliances> appliances = new List<Domain.IoTLZEntity.DiscoveredAppliances>();
//获取需要控制设备的分组信息
List<Domain.IoTLZEntity.DiscoveredGroups> groups = new List<Domain.IoTLZEntity.DiscoveredGroups>();
List<string> applianceIds = new List<string>();
//获取需要控制的场景
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == host.RoomType.ID && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
foreach (RoomTypeScene scene in sceneModals)
{
string aliasName = string.IsNullOrEmpty(scene.AliasName) ? scene.Name : scene.AliasName;//获取别名
appliances.Add(new Domain.IoTLZEntity.DiscoveredAppliances
{
actions = new List<string> { "turnOn" },
applianceTypes = new List<string> { "SCENE_TRIGGER" },
additionalApplianceDetails = new Dictionary<string, string>() { { "SCENE", "SCENE" } },
applianceId = scene.ID + "&" + "SCENE_TRIGGER",
friendlyDescription = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + scene.Name,
friendlyName = scene.Name,
nicknames = new List<string>(aliasName.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)),
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(scene.Type),
version = "V1",
isReachable = true
});
applianceIds.Add(scene.ID + "&" + "SCENE_TRIGGER");
}
//场景分组
groups.Add(new Domain.IoTLZEntity.DiscoveredGroups
{
groupId = "1",
groupName = "场景",
applianceIds = applianceIds,
groupNotes = "Boonlive-" + host.SysHotel.Name + "(" + host.RoomNumber + ")" + "场景分组",
additionalGroupDetails = new Dictionary<string, string>()
});
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
applianceIds = new List<string>();
foreach (HostModal hostModal in hostModals)
{
List<string> applianceTypes = new List<string>();
List<string> actions = new List<string>();
switch (hostModal.Modal.Type)
{
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.Strip://灯带调光
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
applianceTypes.Add("LIGHT");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setBrightnessPercentage");
actions.Add("incrementBrightnessPercentage");
actions.Add("decrementBrightnessPercentage");
break;
case DeviceType.AirConditioner:
applianceTypes.Add("AIR_CONDITION");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setTemperature");
actions.Add("incrementTemperature");
actions.Add("decrementTemperature");
actions.Add("setFanSpeed");
actions.Add("incrementFanSpeed");
actions.Add("decrementFanSpeed");
actions.Add("setMode");
break;
case DeviceType.Curtain:
if (hostModal.Modal.Name.IndexOf("窗帘") > -1)
{
applianceTypes.Add("CURTAIN");//窗帘
}
else if (hostModal.Modal.Name.IndexOf("窗纱") > -1)
{
applianceTypes.Add("CURT_SIMP");//窗纱
}
else
{
applianceTypes.Add("SWITCH");//卷帘、天幕等
}
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("pause");
actions.Add("continue");
break;
case DeviceType.TV:
applianceTypes.Add("TV_SET");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setTVChannel");
actions.Add("decrementTVChannel");
actions.Add("incrementTVChannel");
actions.Add("returnTVChannel");
actions.Add("setVolume");
actions.Add("setVolumeMute");
actions.Add("incrementVolume");
actions.Add("decrementVolume");
actions.Add("setDirection");
break;
case DeviceType.Music:
applianceTypes.Add("TV_SET");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setVolume");
actions.Add("incrementVolume");
actions.Add("decrementVolume");
actions.Add("setVolumeMute");
break;
default:
if (hostModal.Modal.Name.IndexOf("灯") > -1 ||
hostModal.Modal.EnglishName.ToLower().IndexOf("light") > -1 ||
hostModal.Modal.TWName.IndexOf("燈") > -1)
{
applianceTypes.Add("LIGHT");
}
else
{
applianceTypes.Add("SWITCH");
}
actions.Add("turnOn");
actions.Add("turnOff");
break;
}
appliances.Add(new Domain.IoTLZEntity.DiscoveredAppliances
{
actions = actions,
applianceTypes = applianceTypes,
applianceId = hostModal.Modal.ModalAddress + "&" + applianceTypes[0],
additionalApplianceDetails = new Dictionary<string, string>() { { "TYPE", Common.Tools.GetDescription(hostModal.Modal.Type) } },
friendlyDescription = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + hostModal.Modal.Name,
friendlyName = hostModal.Modal.Name,
nicknames = new List<string> { hostModal.Modal.Name },
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(hostModal.Modal.Type),
version = "V1",
isReachable = true
});
applianceIds.Add(hostModal.Modal.ModalAddress + "&" + applianceTypes[0]);
}
//房间分组
groups.Add(new Domain.IoTLZEntity.DiscoveredGroups
{
groupId = "1",
groupName = "房间",
applianceIds = applianceIds,
groupNotes = "Boonlive-" + host.SysHotel.Name + "(" + host.RoomNumber + ")" + "房间分组",
additionalGroupDetails = new Dictionary<string, string>() { }
});
//找到可控场景和设备响应小度DuerOS
Domain.IoTLZEntity.DiscoverAppliancesResponse response = new Domain.IoTLZEntity.DiscoverAppliancesResponse
{
header = new Domain.IoTLZEntity.Header
{
name = "DiscoverAppliancesResponse",
@namespace = request.header.@namespace,
},
payload = new Domain.IoTLZEntity.Payload
{
discoveredAppliances = appliances,
discoveredGroups = groups
}
};
logger.Error(string.Format("{3}(酒店:{0},房号:{1})本次获取设备数量:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, response.payload.discoveredAppliances.Count.ToString(), platformName));
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
case "LZOS.Control"://控制设备
{
if (!Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC))
{
//logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
return Json(ReturnLZError(request.header, "TargetOfflineError"), JsonRequestBehavior.AllowGet);//当技能检测到目标设备没有连接到设备云或者设备云不在线时会给DuerOS发送TargetOfflineError消息。
}
if (!CheckGetPower(host))
{
//logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
return Json(ReturnLZError(request.header, "UnsupportedOperationError"), JsonRequestBehavior.AllowGet);
}
string[] applianceIds = request.payload.appliance.applianceId.Split('&');
if (applianceIds.Length < 2)
{
logger.Error(platformName + "applianceId参数有误" + request.payload.appliance.applianceId);
return Json(ReturnLZError(request.header, "UnexpectedInformationReceivedError"), JsonRequestBehavior.AllowGet);
}
string modalAddress = applianceIds[0];//设备地址或场景ID
string applianceTypes = applianceIds[1];//设备类型
string confirmationName = "TurnOnConfirmation";
Domain.IoTLZEntity.Payload payload = new Domain.IoTLZEntity.Payload();
List<Domain.IoTLZEntity.Attributes> attributes = new List<Domain.IoTLZEntity.Attributes>();
switch (applianceTypes)
{
case "SCENE_TRIGGER"://场景控制
case "ACTIVITY_TRIGGER":
{
var scene = RoomTypeSceneManager.Get(int.Parse(modalAddress));
if (scene == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的场景ID{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress, platformName));
return Json(ReturnLZError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "name", value = scene.Name, scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "turnOnState", value = "ON", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
LightControlManager.ApplyScene(host, scene);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, platformName, host.SysHotel.ID);
}
break;
default:
{
var hostModal = HostModalManager.GetByModalAddress(host.ID, modalAddress);//设备控制
if (hostModal == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的回路Address{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress, platformName));
return Json(ReturnLZError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
Domain.IoTLZEntity.PreviousState previousState = new Domain.IoTLZEntity.PreviousState();
previousState.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(hostModal.Brightness) };//原来的亮度
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("控制客房(" + host.RoomNumber + ")设备(" + hostModal.Modal.Name + hostModal.Modal.ModalAddress + ")");
int status = hostModal.Status;
int brightness = hostModal.Brightness;
int temperature = hostModal.SettingTemp;
int fanSpeed = hostModal.FanSpeed;
int mode = hostModal.Mode;
int valve = hostModal.Valve;
switch (request.header.name)
{
case "TurnOnRequest"://打开
confirmationName = "TurnOnConfirmation";
status = 1;
brightness = 100;
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("状态:打开");
break;
case "TurnOffRequest"://关闭
confirmationName = "TurnOffConfirmation";
status = 2;
brightness = 0;
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("状态:关闭");
break;
case "SetBrightnessPercentageRequest"://设置亮度
confirmationName = "SetBrightnessPercentageConfirmation";
status = 1;
brightness = Convert.ToInt16(request.payload.brightness.value);
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("亮度:" + brightness);
break;
case "IncrementBrightnessPercentageRequest"://调亮
confirmationName = "IncrementBrightnessPercentageConfirmation";
status = 1;
brightness += Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness > 100)
{
brightness = 100;
}
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("调亮:" + request.payload.deltaPercentage.value);
break;
case "DecrementBrightnessPercentageRequest"://调暗
confirmationName = "DecrementBrightnessPercentageConfirmation";
status = 1;
brightness -= Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness < 0)
{
brightness = 0;
status = 2;
}
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("调暗:" + request.payload.deltaPercentage.value);
break;
case "SetTemperatureRequest"://设置温度
previousState.temperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "SetTemperatureConfirmation";
status = 1;
temperature = XiaoDuToBLW(request.payload.targetTemperature.value.ToString());
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
payload.targetTemperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("设温:" + temperature);
break;
case "IncrementTemperatureRequest"://调高温度
previousState.temperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "IncrementTemperatureConfirmation";
status = 1;
temperature += Convert.ToInt16(request.payload.deltaValue.value);
if (temperature > 32)
{
temperature = 32;
}
payload.targetTemperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调高温度:" + request.payload.deltaValue.value);
break;
case "DecrementTemperatureRequest"://调低温度
previousState.temperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "DecrementTemperatureConfirmation";
status = 1;
temperature -= Convert.ToInt16(request.payload.deltaValue.value);
if (temperature < 16)
{
temperature = 16;
}
payload.targetTemperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调低温度:" + request.payload.deltaValue.value);
break;
case "SetFanSpeedRequest"://设置风速
previousState.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
confirmationName = "SetFanSpeedConfirmation";
status = 1;
if (request.payload.fanSpeed.level != null & !string.IsNullOrEmpty(request.payload.fanSpeed.level))
{
switch (request.payload.fanSpeed.level.ToLower())
{
case "high":
case "max":
fanSpeed = 3;
break;
case "middle":
fanSpeed = 2;
break;
case "auto":
fanSpeed = 0;
break;
default:
fanSpeed = 1;
break;
}
sb.Append("设置风速:" + request.payload.fanSpeed.level);
}
else
{
fanSpeed = Convert.ToInt16(request.payload.fanSpeed.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
else if (fanSpeed > 3)
{
fanSpeed = 3;
}
sb.Append("设置风速:" + fanSpeed);
}
payload.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
break;
case "IncrementFanSpeedRequest"://调高风速
previousState.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
confirmationName = "IncrementFanSpeedConfirmation";
status = 1;
fanSpeed += Convert.ToInt16(request.payload.deltaValue.value);
if (fanSpeed > 3)
{
fanSpeed = 3;
}
payload.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
sb.Append("调高风速:" + request.payload.deltaValue.value);
break;
case "DecrementFanSpeedRequest"://调低风速
previousState.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
confirmationName = "DecrementFanSpeedConfirmation";
status = 1;
fanSpeed -= Convert.ToInt16(request.payload.deltaValue.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
payload.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
sb.Append("调低风速:" + request.payload.deltaValue.value);
break;
case "SetModeRequest"://设置模式
previousState.mode = new Domain.IoTLZEntity.Mode() { value = ModeToString(mode) };
confirmationName = "SetModeConfirmation";
status = 1;
mode = ModeToInt(request.payload.mode.value);
payload.mode = new Domain.IoTLZEntity.Mode() { deviceType = request.payload.mode.deviceType, value = request.payload.mode.value };
payload.previousState = previousState;
sb.Append("模式:" + request.payload.mode.value);
break;
case "PauseRequest"://暂停
confirmationName = "PauseConfirmation";
status = 6;
sb.Append("状态:暂停");
break;
case "ContinueRequest"://继续
confirmationName = "ContinueConfirmation";
status = 1;
sb.Append("状态:继续");
break;
case "SetTVChannelRequest"://电视跳转频道
confirmationName = "SetTVChannelConfirmation";
status = 4;
int channelNumber = 0;
if (int.TryParse(request.payload.deltaValue.value, out channelNumber))
{
valve = channelNumber;
}
else
{
var channel = RoomTypeChannelsManager.LoadAll(host.RoomType.ID).Where(r => r.Name.Contains(request.payload.deltaValue.value)).FirstOrDefault();
if (channel != null)
{
valve = channel.Code;
}
else
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的电视频道:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, request.payload.deltaValue.value, platformName));
return Json(ReturnLZError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
}
sb.Append("调整频道至:" + valve);
break;
case "IncrementTVChannelRequest"://电视下一频道
confirmationName = "IncrementTVChannelConfirmation";
status = 1;
mode = 5;
sb.Append("频道:加");
break;
case "DecrementTVChannelRequest"://电视上一频道
confirmationName = "DecrementTVChannelConfirmation";
status = 1;
mode = 6;
sb.Append("频道:减");
break;
case "ReturnTVChannelRequest"://返回上一个观看频道
confirmationName = "ReturnTVChannelConfirmation";
status = 1;
mode = 15;
sb.Append("电视:回看");
break;
case "IncrementVolumeRequest"://增大音量
confirmationName = "IncrementVolumeConfirmation";
status = 1;
mode = 3;
sb.Append("音量:加");
break;
case "DecrementVolumeRequest"://减小音量
confirmationName = "DecrementVolumeConfirmation";
status = 1;
mode = 4;
sb.Append("音量:减");
break;
//case "SetVolumeRequest"://设置音量
// confirmationName = "SetVolumeConfirmation";
// break;
case "SetVolumeMuteRequest"://设置静音
confirmationName = "SetVolumeMuteConfirmation";
status = 1;
mode = 1;
sb.Append("音量:静音");
break;
default:
return Json(ReturnLZError(request.header, "UnsupportedTargetError"), JsonRequestBehavior.AllowGet);
}
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "name", value = hostModal.Modal.Name, scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "turnOnState", value = status == 1 ? "ON" : "OFF", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
}
break;
}
payload.attributes = attributes;
//操作完成响应小度
Domain.IoTLZEntity.ControlAppliancesResponse response = new Domain.IoTLZEntity.ControlAppliancesResponse
{
header = new Domain.IoTLZEntity.Header
{
@namespace = request.header.@namespace,
name = confirmationName
},
payload = payload
};
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
default:
return Json(ReturnLZError(request.header, "UnsupportedTargetError"), JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
logger.Error(string.Format("处理岚正播放盒命令异常,数据:{0},异常:{1}", reqData, ex.ToString()));
return Json(ex.Message, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 返回错误信息
/// </summary>
/// <param name="header"></param>
/// <param name="errorName"></param>
/// <returns></returns>
private Domain.IoTLZEntity.ErrorResponse ReturnLZError(Domain.IoTLZEntity.Header header, string errorName)
{
Domain.IoTLZEntity.ErrorResponse err = new Domain.IoTLZEntity.ErrorResponse
{
header = new Domain.IoTLZEntity.Header
{
@namespace = header.@namespace,
name = errorName
},
payload = new Domain.IoTLZEntity.Payload { }
};
return err;
}
#endregion
#region
#endregion
#region
#endregion
#region
/*
* clientId: C485849C
* clientSecret: 8C9FB-6D854-CE2A0-16DAD-2AD7A
* tokenUrl: https://boonlive-rcu.com/oauth2/token1
* grantType: authorization_code如果是刷新 Token 则为 refresh_token
* webService: https://boonlive-rcu.com/iot/xiaomi
*/
/// <summary>
/// 小米小爱音箱对接
/// </summary>
/// <returns></returns>
public ActionResult XiaoMi()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
logger.Error(reqData);
try
{
Domain.IoTXiaoMiEntity.Body body = JsonConvert.DeserializeObject<Domain.IoTXiaoMiEntity.Body>(reqData);//得到小爱请求
if (string.IsNullOrEmpty(body.data.uniqueKey))
{
logger.Error("小爱设备cuid不能为空" + reqData + ",来自:" + GetClientIP());
return Json(ReturnXiaoMiError(-1, "设备cuid不能为空"), JsonRequestBehavior.AllowGet);//该消息表示由于请求消息中属性信息错误,导致技能无法处理请求消息。
}
Host host = host = HostManager.GetByXiaoDuCUID(body.data.uniqueKey);//根据小度音箱序列号获取对应RCU主机
if (host == null)
{
logger.Error("小爱音箱cuid(" + body.data.uniqueKey + ")尚未绑定客房主机");
return Json(ReturnXiaoMiError(-1, "小爱cuid(" + body.data.uniqueKey + ")尚未绑定客房主机"), JsonRequestBehavior.AllowGet);//"小度音箱(" + request.payload.cuid + ")尚未绑定客房主机"
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error("小爱音箱当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期");
return Json(ReturnXiaoMiError(-1, "小爱音箱当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期"), JsonRequestBehavior.AllowGet);//该消息表示请求消息中access token过期不能使用。
}
switch (body.intent)
{
case "":
break;
}
return Json("", JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
logger.Error(string.Format("处理小爱语音设备命令异常,数据:{0},异常:{1}", reqData, ex.ToString()));
return Json(ex.Message, JsonRequestBehavior.AllowGet);
}
}
private Domain.IoTXiaoMiEntity.Error ReturnXiaoMiError(int code, string desc)
{
return new Domain.IoTXiaoMiEntity.Error() { code = code, description = desc };
}
#endregion
#region
/*
* clientId: C485849C
* clientSecret: 8C9FB-6D854-CE2A0-16DAD-2AD7A
* tokenUrl: https://boonlive-rcu.com/oauth2/token1
* grantType: authorization_code如果是刷新 Token 则为 refresh_token
* webService: https://boonlive-rcu.com/iot/aligenie
* accessKey:f522013dcbfbe5ed77f33f4aa232292b
* accessSecret:8470c5ab75bec8f39cd0ffb2eb99a8e6
*/
/// <summary>
/// 天猫精灵音箱对接
/// </summary>
/// <returns></returns>
public ActionResult aligenie()
{
string IP = "";
string PPP = Request.UserHostAddress;
string III = Request.ServerVariables["REMOTE_ADDR"];
if (string.IsNullOrEmpty(III))
{
IP = PPP;
}
else
{
IP = III;
}
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
//logger.Error(reqData);
string g_requestid = "";
int g_hotelcode = 0;
string g_hotelid = "";
string g_roomnum = "";
string platformName = "天猫精灵";
try
{
Domain.IoTAliGenieEntity.Request req = JsonConvert.DeserializeObject<Domain.IoTAliGenieEntity.Request>(reqData);//得到天猫精灵请求
if (string.IsNullOrEmpty(req.baseInfo.hotelId) || string.IsNullOrEmpty(req.baseInfo.roomNo))
{
logger.Error(platformName + "hotelId和roomNo不能为空" + reqData + ",来自:" + GetClientIP());
return Json(ReturnAliGenieError("hotelId和roomNo不能为空", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);//该消息表示由于请求消息中属性信息错误,导致技能无法处理请求消息。
}
string idd = req.baseInfo.hotelId;
string roo = req.baseInfo.roomNo;
string RequestId = req.baseInfo.requestId;
g_requestid = RequestId;
Host host = null;
string TianMaoKongZhiKey = CacheKey.TianMaoJingLing + "_" + idd + "_" + roo;
var UXV = HttpContext.Cache.Get(TianMaoKongZhiKey);
if (UXV != null)
{
host = UXV as Host;
}
else
{
host = HostManager.GetByTianMaoCUID(req.baseInfo.hotelId + "&" + req.baseInfo.roomNo);//根据小度音箱序列号获取对应RCU主机
if (host != null)
{
string TianMaoKongZhiKeyDB = CacheKey.TianMaoJingLing + "_" + host.SysHotel.ID + "_" + host.RoomNumber;
HttpContext.Cache.Insert(TianMaoKongZhiKey, host, null, DateTime.Now.AddHours(24), Cache.NoSlidingExpiration);
HttpContext.Cache.Insert(TianMaoKongZhiKeyDB, host, null, DateTime.Now.AddHours(24), Cache.NoSlidingExpiration);
}
}
if (host == null)
{
logger.Error(platformName + "(" + req.baseInfo.hotelId + "&" + req.baseInfo.roomNo + ")尚未绑定客房主机");
return Json(ReturnAliGenieError(platformName + "(" + req.baseInfo.hotelId + "&" + req.baseInfo.roomNo + ")尚未绑定客房主机", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期");
//return Json(ReturnAliGenieError("当前访问酒店已过期", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);//该消息表示请求消息中access token过期不能使用。
}
long Requesttime = req.baseInfo.requestTime;
string a = host.SysHotel.ID.ToString(); ;
string b = host.RoomNumber;
string c = host.SysHotel.Code;
int co = 0;
int.TryParse(c, out co); ;
string Key = CacheKey.IOTKey;
g_requestid = RequestId;
g_hotelid = a;
g_roomnum = b;
g_hotelcode = co;
bool is_monitor = true;
//var qqq = CSRedisCacheHelper.ForeverGet<List<IOT_Monitor_Host>>(Key);
//if (qqq != null && qqq.Count > 0)
//{
// //is_monitor = qqq.Any(A => A.HotelID.Equals(a) && A.RoomNumber.Equals(b));
// var df = qqq.Where(A => A.HotelID.Equals(a) && A.RoomNumber.Equals(b));
// if (df.Count() > 0)
// {
// is_monitor = true;
// }
//}
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.RemoteIP = IP;
i.Step = 0;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = reqData;
SendMQTTData.Send(i);
}
switch (req.command.commandType.ToUpper())
{
case "QUERYALL"://小度平台发现设备
{
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_Disconvery;
i.Step = 1;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = "发现设备";
SendMQTTData.Send(i);
}
string ChaXunKey = CacheKey.TianMaoJingLingQuerryAll + "_" + a + "_" + b;
Domain.IoTAliGenieEntity.Response response = null;
var Data = HttpContext.Cache.Get(ChaXunKey);
if (Data != null)
{
response = Data as Domain.IoTAliGenieEntity.Response;
}
else
{
//获取需要控制设备的分组信息
List<Domain.IoTAliGenieEntity.GroupsItem> groups = new List<Domain.IoTAliGenieEntity.GroupsItem>();
List<Domain.IoTAliGenieEntity.SceneModeItem> sceneModes = new List<Domain.IoTAliGenieEntity.SceneModeItem>();
List<Domain.IoTAliGenieEntity.DevicesItem> devices = new List<Domain.IoTAliGenieEntity.DevicesItem>();
Domain.IoTAliGenieEntity.DevicesItem devicesItem;
//获取需要控制的场景通过api推送https://openapi.aligenie.com/v1.0/ip/importHotelConfig
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == host.RoomType.ID && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
//List<Domain.IoTAliGenieEntity.RcuCustomScenes> rcuCustomScenes = new List<Domain.IoTAliGenieEntity.RcuCustomScenes>();
foreach (RoomTypeScene scene in sceneModals)
{
Domain.IoTAliGenieEntity.SceneModeItem item = new Domain.IoTAliGenieEntity.SceneModeItem();
//Domain.IoTAliGenieEntity.RcuCustomScenes rcuCustomScene = new Domain.IoTAliGenieEntity.RcuCustomScenes();
item.SceneId = scene.ID.ToString();
item.Name = scene.Name;
item.Icon = "";
item.Description = "";
List<string> corpusList = new List<string>() { item.Name, "打开" + item.Name };
if (!string.IsNullOrEmpty(scene.AliasName))
{
corpusList.Add(scene.AliasName);//别名不为空才添加
//item.CorpusList = new List<string>(scene.AliasName.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries));//别名不为空才添加
}
item.CorpusList = corpusList;
item.isDisplayScreen = 1;
sceneModes.Add(item);// 同步技能上报
}
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
foreach (HostModal hostModal in hostModals)
{
devicesItem = new Domain.IoTAliGenieEntity.DevicesItem();
devicesItem.number = hostModal.Modal.ModalAddress;
devicesItem.deviceName = hostModal.Modal.Name;
if (!string.IsNullOrEmpty(hostModal.Modal.AliasName))
{
devicesItem.aliasList = new List<string>(hostModal.Modal.AliasName.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries));//别名不为空才添加
}
switch (hostModal.Modal.Type)
{
case DeviceType.AirConditioner:
devicesItem.name = "Aircondition";
break;
case DeviceType.Curtain:
if (hostModal.Modal.Name.IndexOf("窗帘") > -1)
{
devicesItem.name = "Curtain";
}
else if (hostModal.Modal.Name.IndexOf("窗纱") > -1)
{
devicesItem.name = "LaceCurtain";
}
else
{
devicesItem.name = "Curtain";
}
break;
case DeviceType.TV:
devicesItem.name = "TV";
break;
default:
devicesItem.name = "DimmingLight";
break;
}
devices.Add(devicesItem);
}
//添加所有灯
devices.Add(new Domain.IoTAliGenieEntity.DevicesItem()
{
number = "000000001",
deviceName = "所有灯",
name = "DimmingLight"
});
groups.Add(new Domain.IoTAliGenieEntity.GroupsItem
{
groupName = "房间",
groupId = "room",
devices = devices
});
//找到可控场景和设备,响应天猫精灵
response = new Domain.IoTAliGenieEntity.Response
{
result = new Domain.IoTAliGenieEntity.Result()
{
enableInfraredDeviceImport = false,
enableMeshDeviceImport = false,
groups = groups,
sceneModes = sceneModes
},
responseTime = Common.TimeHelper.DateTimeToStamp(DateTime.Now),
requestId = req.baseInfo.requestId,
success = true,
message = "success",
statusCode = 200
};
Data = response;
HttpContext.Cache.Insert(ChaXunKey, Data, null, DateTime.Now.AddMinutes(24), Cache.NoSlidingExpiration);
}
//天猫精灵统计
string KKK = "TianMaoQueryAll";
RCUHost.RCUHostCommon.tools.LanJieData(KKK, host.SysHotel.Code);
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 4;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = "TianMao_QueryAllSuccess";
SendMQTTData.Send(i);
}
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
case "CONTROL"://天猫控制消息
{
//天猫精灵统计
string KKK = "TianMaoCONTROL";
RCUHost.RCUHostCommon.tools.LanJieData(KKK, host.SysHotel.Code);
bool is_online = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC);
if (is_monitor)
{
string desc = platformName + "酒店:" + host.SysHotel.Name + host.SysHotel.Code + " 房间号:" + host.RoomNumber + " 在线状态:" + is_online.ToString();
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_KongZhiSheBei;
i.Step = 1;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = desc;
SendMQTTData.Send(i);
}
if (!is_online)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
return Json(ReturnAliGenieError("当前访问rcu主机不在线", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);//当技能检测到目标设备没有连接到设备云或者设备云不在线时会给DuerOS发送TargetOfflineError消息。
}
bool is_card_in = CheckGetPower(host);
if (host.SysHotel.Code == "2079")
{
is_card_in = true;
}
if (is_monitor)
{
string desc = platformName + "酒店: " + host.SysHotel.Name + host.SysHotel.Code + "房间号:" + host.RoomNumber + " 取电状态: " + is_card_in.ToString();
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 2;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = desc;
SendMQTTData.Send(i);
}
if (!is_card_in)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
return Json(ReturnAliGenieError("当前访问客房尚未取电", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);
}
try
{
foreach (Domain.IoTAliGenieEntity.DevicesItem devicesItem in req.command.devices)
{
switch (devicesItem.name)
{
case "Mode":
{
RoomTypeScene scene = null;
if (devicesItem.modeType != null && devicesItem.modeType.ToLower() == "custom" && devicesItem.mode.Length < 9)
{
scene = RoomTypeSceneManager.Get(host.RoomType, Convert.ToInt16(devicesItem.mode));//BLW上报的场景
}
else
{
scene = RoomTypeSceneManager.Get(host.RoomType, devicesItem.mode);//天猫平台预定义的场景sleep
//新添加的代码,以前这是 是碰运气碰对了
if (scene == null)
{
scene = RoomTypeSceneManager.Get(host.RoomType, devicesItem.modeName);//天猫平台预定义的场景sleep
}
}
if (is_monitor)
{
string desc = "模式控制";
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_SceneKongZhi;
i.SceneName = scene.Name;
i.CreateTime = DateTime.Now;
i.Step = 3;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = desc;
SendMQTTData.Send(i);
}
if (scene == null)
{
logger.Error(string.Format("{0}(酒店:{1},房号:{2})未找到对应的场景ID{3}modeType{4}", platformName, host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, devicesItem.mode, devicesItem.modeType));
if (is_monitor)
{
string desc = "找不到此模式";
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 4;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = desc;
SendMQTTData.Send(i);
}
return Json(ReturnAliGenieError("未找到对应的场景", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);
}
else
{
if (is_monitor)
{
string desc = "模式控制";
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_SceneKongZhi;
i.SceneName = scene.Name;
i.CreateTime = DateTime.Now;
i.Step = 3;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = desc;
SendMQTTData.Send(i);
}
}
LightControlManager.ApplyScene(host, scene);
if (is_monitor)
{
string desc = "房间模式控制完毕";
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 4;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = desc;
SendMQTTData.Send(i);
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, platformName, host.SysHotel.ID);
}
break;
default:
{
switch (devicesItem.number)
{
case "000000001"://所有灯
{
List<IotDeviceData> lli = new List<IotDeviceData>();
var devices = new List<RCUHost.Protocols.Device>();
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("控制客房(" + host.RoomNumber + ")所有灯:");
var hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.Name.Contains("灯") && r.Modal.WXActiveIndicator).ToList();
foreach (HostModal hostModal in hostModals)
{
switch (hostModal.Modal.Type)
{
case DeviceType.Relay:
case DeviceType.Expand:
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.Strip:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.A9IORelay:
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
case DeviceType.ColorTemp:
int status = hostModal.Status;
int brightness = hostModal.Brightness;
var device = new RCUHost.Protocols.Device();
device.Address = hostModal.Modal.ModalAddress;
device.AddressType = RCUHost.Protocols.AddressType.DeviceAddress;
device.Type = hostModal.Modal.Type;
switch (devicesItem.name)
{
case "Light"://灯光
switch (devicesItem.@switch)
{
case 1:
status = 1;
brightness = 100;
//sb.Append("状态:打开");
break;
default:
status = 2;
brightness = 0;
//sb.Append("状态:关闭");
break;
}
break;
case "DimmingLight"://调光
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID.ToString() + "_" + device.Address;
var hostModal_T = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
bool JumpBrightcontrol = true;
var is_100 = devicesItem.value.HasValue;
if (is_100)
{
if (devicesItem.value == 100)
{
JumpBrightcontrol = false;
}
}
if (co == 1085 || co == 1001 || co == 1003 || co > 2000)
{
//logger.Error("查询的Key值:"+KKey);
if (hostModal_T != null && hostModal_T.Status == 2 && JumpBrightcontrol == true) { continue; }
}
if (devicesItem.value.HasValue)
{
switch (devicesItem.value)
{
case 0:
status = 2;
brightness = 0;
//sb.Append("状态:关闭");
break;
default:
status = 1;
brightness = (int)devicesItem.value;
//sb.Append("状态:打开,亮度:" + brightness);
break;
}
}
if (devicesItem.value_up.HasValue)
{
status = 1;
brightness += (int)devicesItem.value_up;
if (brightness > 100)
{
brightness = 100;
}
//sb.Append("调亮:" + devicesItem.value_up);
}
if (devicesItem.value_down.HasValue)
{
status = 1;
brightness -= (int)devicesItem.value_down;
if (brightness < 0)
{
brightness = 0;
status = 2;
}
//sb.Append("调暗:" + devicesItem.value_down);
}
break;
}
device.Status = (byte)status;
device.Brightness = (byte)brightness;
devices.Add(device);
sb.Append(hostModal.Modal.Name + "");
IotDeviceData iotdata = new IotDeviceData();
iotdata.DeviceAddress = hostModal.Modal.ModalAddress;
iotdata.DeviceName = hostModal.Modal.Name;
break;
}
}
LightControlManager.AllDeviceControl(host, devices);
sb.Append("动作:" + (devicesItem.@switch == 1 ? "打开" : "关闭"));
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.ControlClass = ControlClass_KongZhiSheBei;
i.WhichOneDevice = lli;
i.CreateTime = DateTime.Now;
i.Step = 3.0;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = "房间所有灯控制。" + sb.ToString();
SendMQTTData.Send(i);
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
}
break;
default:
{
//var hostModal = HostModalManager.GetByModalAddress(host.ID, devicesItem.number);//设备控制
HostModal hostModal = new HostModal();
RoomTypeModal redalert = new RoomTypeModal();
hostModal.Modal = redalert;
string KKey = CacheKey.HostModalStatus_Prefix + "_" + host.ID + "_" + devicesItem.number;
var hostModal_T = CSRedisCacheHelper.Get_Partition<HostModal_Cache>(KKey);
if (hostModal_T != null)
{
hostModal.HostID = hostModal_T.HostID;
hostModal.Status = hostModal_T.Status;
hostModal.Brightness = hostModal_T.Brightness;
var aaa = hostModal_T.AirConditionData;
hostModal.SettingTemp = aaa.SettingTemp;
hostModal.CurrentTemp = aaa.CurrentTemp;
hostModal.FanSpeed = aaa.FanSpeed;
hostModal.Mode = aaa.Mode;
hostModal.Valve = aaa.Valve;
hostModal.Modal.Type = hostModal_T.ModalType;
hostModal.Modal.ModalAddress = hostModal_T.Modal.ModalAddress;
}
else
{
//hostModal = HostModalManager.GetByModalAddress(host.ID, modalAddress);//设备控制
hostModal = HostModalManager.GetByModalAddress(host.ID, devicesItem.number);//设备控制
}
if (hostModal == null)
{
string hhh = string.Format("{3}(酒店:{0},房号:{1})未找到对应的回路Address{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, devicesItem.number, platformName);
logger.Error(hhh);
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 3.1;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = hhh;
SendMQTTData.Send(i);
}
return Json(ReturnAliGenieError("未找到对应的回路", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);
}
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("控制客房(" + host.RoomNumber + ")设备(" + hostModal.Modal.Name + hostModal.Modal.ModalAddress + ")");
int status = hostModal.Status;
int brightness = hostModal.Brightness;
int temperature = hostModal.SettingTemp;
int fanSpeed = hostModal.FanSpeed;
int mode = hostModal.Mode;
int valve = hostModal.Valve;
switch (devicesItem.name)
{
case "Light"://灯光
case "Door"://门
case "ExhaustFan"://排气扇
switch (devicesItem.@switch)
{
case 1:
status = 1;
brightness = 100;
sb.Append("状态:打开");
break;
default:
status = 2;
brightness = 0;
sb.Append("状态:关闭");
break;
}
break;
case "DimmingLight"://调光
if (devicesItem.value.HasValue)
{
switch (devicesItem.value)
{
case 0:
status = 2;
brightness = 0;
sb.Append("状态:关闭");
break;
default:
status = 1;
brightness = (int)devicesItem.value;
sb.Append("状态:打开,亮度:" + brightness);
break;
}
}
if (devicesItem.value_up.HasValue)
{
status = 1;
brightness += (int)devicesItem.value_up;
if (brightness > 100)
{
brightness = 100;
}
sb.Append("调亮:" + devicesItem.value_up);
}
if (devicesItem.value_down.HasValue)
{
status = 1;
brightness -= (int)devicesItem.value_down;
if (brightness < 0)
{
brightness = 0;
status = 2;
}
sb.Append("调暗:" + devicesItem.value_down);
}
break;
case "Aircondition"://空调
if (devicesItem.@switch.HasValue)
{
switch (devicesItem.@switch)
{
case 1:
status = 1;
sb.Append("状态:打开");
break;
default:
status = 2;
sb.Append("状态:关闭");
break;
}
}
if (devicesItem.mode != null)
{
status = 1;
mode = ModeToInt(devicesItem.mode);
sb.Append("模式:" + devicesItem.mode);
}
if (devicesItem.fanSpeed.HasValue)
{
switch (devicesItem.fanSpeed)
{
case 0://风速是0关闭空调
status = 2;
fanSpeed = (int)devicesItem.fanSpeed;
sb.Append("空调:关闭");
break;
default:
status = 1;
fanSpeed = (int)devicesItem.fanSpeed;
sb.Append("设置风速:" + devicesItem.fanSpeed);
break;
}
}
if (devicesItem.fanSpeed_up.HasValue)
{
status = 1;
fanSpeed += (int)devicesItem.fanSpeed_up;
if (fanSpeed > 3)
{
fanSpeed = 3;
}
sb.Append("调高风速:" + devicesItem.fanSpeed_up);
}
if (devicesItem.fanSpeed_down.HasValue)
{
status = 1;
fanSpeed -= (int)devicesItem.fanSpeed_down;
if (fanSpeed < 1)
{
fanSpeed = 1;
}
sb.Append("调低风速:" + devicesItem.fanSpeed_down);
}
if (devicesItem.temperature.HasValue)
{
status = 1;
temperature = (int)devicesItem.temperature;
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
sb.Append("设温:" + temperature);
}
if (devicesItem.temperature_up.HasValue)
{
status = 1;
temperature += (int)devicesItem.temperature_up;
if (temperature > 32)
{
temperature = 32;
}
sb.Append("调高温度:" + devicesItem.temperature_up);
}
if (devicesItem.temperature_down.HasValue)
{
status = 1;
temperature -= (int)devicesItem.temperature_down;
if (temperature < 16)
{
temperature = 16;
}
sb.Append("调低温度:" + devicesItem.temperature_down);
}
break;
case "Curtain":
case "LaceCurtain":
if (devicesItem.@switch.HasValue)
{
switch (devicesItem.@switch)
{
case 1:
status = 1;
brightness = 100;
sb.Append("状态:打开");
break;
default:
status = 2;
brightness = 0;
sb.Append("状态:关闭");
break;
}
}
if (devicesItem.value.HasValue)
{
switch (devicesItem.value)
{
case 0:
status = 2;
brightness = 0;
sb.Append("状态:关闭");
break;
default:
status = 1;
brightness = (int)devicesItem.value;
sb.Append("状态:打开,拉开:" + brightness);
break;
}
}
if (devicesItem.value_up.HasValue)
{
status = 1;
brightness += (int)devicesItem.value_up;
if (brightness > 100)
{
brightness = 100;
}
sb.Append("调高:" + devicesItem.value_up);
}
if (devicesItem.value_down.HasValue)
{
status = 1;
brightness -= (int)devicesItem.value_down;
if (brightness < 0)
{
brightness = 0;
status = 2;
}
sb.Append("调低:" + devicesItem.value_down);
}
if (devicesItem.action != null)
{
switch (devicesItem.action)
{
case "pause":
status = 6;
sb.Append("状态:暂停");
break;
case "continue":
status = 1;
sb.Append("状态:继续");
break;
}
}
break;
case "TV":
if (devicesItem.@switch.HasValue)
{
switch (devicesItem.@switch)
{
case 1:
status = 1;
brightness = 100;
sb.Append("状态:打开");
break;
default:
status = 2;
brightness = 0;
mode = 0;//电视开关时内容传0
sb.Append("状态:关闭");
break;
}
}
if (devicesItem.channelName != null)
{
status = 4;
var channel = RoomTypeChannelsManager.LoadAll(host.RoomType.ID).Where(r => r.Name.Contains(devicesItem.channelName)).FirstOrDefault();
if (channel != null)
{
valve = channel.Code;
}
else
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的电视频道:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, devicesItem.channelName, platformName));
return Json(ReturnAliGenieError("未找到对应的电视频道", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);
}
sb.Append("调整频道至:" + valve);
}
if (devicesItem.channelNumber.HasValue)
{
status = 4;
valve = (int)devicesItem.channelNumber;
sb.Append("调整频道至:" + valve);
}
if (devicesItem.channelNumber_up.HasValue)
{
status = 1;
mode = 5;
sb.Append("频道:加");
}
if (devicesItem.channelNumber_down.HasValue)
{
status = 1;
mode = 6;
sb.Append("频道:减");
}
if (devicesItem.volume.HasValue)
{
}
if (devicesItem.volume_up.HasValue)
{
status = 1;
mode = 3;
sb.Append("音量:加");
}
if (devicesItem.volume_down.HasValue)
{
status = 1;
mode = 4;
sb.Append("音量:减");
}
if (devicesItem.mute.HasValue)
{
if (devicesItem.mute == 1)
{
status = 1;
mode = 1;
sb.Append("音量:静音");
}
else
{
status = 1;
mode = 0;
sb.Append("音量:取消静音");
}
}
break;
default:
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 3.10;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = "不支持此操作";
SendMQTTData.Send(i);
}
return Json(ReturnAliGenieError("不支持此操作", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);
}
List<IotDeviceData> miaoll = new List<IotDeviceData>();
miaoll.Add(new IotDeviceData() { DeviceName = hostModal.Modal.TCLDeviceName, DeviceAddress = hostModal.Modal.ModalAddress });
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
sb.Append(string.Format("status: {0}, brightness: {1} ,temp: {2}", status, brightness, temperature));
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.WhichOneDevice = miaoll;
i.ControlClass = ControlClass_KongZhiSheBei;
i.Step = 3;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = sb.ToString();
SendMQTTData.Send(i);
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
}
break;
}
}
break;
}
}
}
catch (Exception exc)
{
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 3.20;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = "异常:" + exc.Message;
SendMQTTData.Send(i);
}
} //操作完成响应天猫精灵
Domain.IoTAliGenieEntity.Response response = new Domain.IoTAliGenieEntity.Response
{
responseTime = Common.TimeHelper.DateTimeToStamp(DateTime.Now),
requestId = req.baseInfo.requestId,
success = true,
message = "success",
statusCode = 200,
result = new Domain.IoTAliGenieEntity.Result() { status = new List<Domain.IoTAliGenieEntity.DevicesItem>() }
};
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 4;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = a;
i.RoomNumber = b;
i.HotelCode = co;
i.RequestId = RequestId;
i.Platform = platformName;
i.CommandDescription = "success";
SendMQTTData.Send(i);
}
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
default:
return Json(ReturnAliGenieError("不支持此操作", req.baseInfo.requestId), JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 4.1;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = g_hotelid;
i.RoomNumber = g_roomnum;
i.HotelCode = g_hotelcode;
i.RequestId = g_requestid;
i.Platform = platformName;
i.CommandDescription = "exception: " + ex.Message;
SendMQTTData.Send(i);
logger.Error(string.Format("处理天猫精灵设备命令异常,数据:{0},异常:{1}", reqData, ex.ToString()));
return Json(ReturnAliGenieError("处理天猫精灵设备命令异常", "0"), JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 返回天猫精灵错误
/// </summary>
/// <param name="errorName"></param>
/// <param name="requestId"></param>
/// <returns></returns>
private Domain.IoTAliGenieEntity.Response ReturnAliGenieError(string errorName, string requestId)
{
Domain.IoTAliGenieEntity.Response err = new Domain.IoTAliGenieEntity.Response
{
success = false,
responseTime = Common.TimeHelper.DateTimeToStamp(DateTime.Now),
message = errorName,
requestId = requestId,
statusCode = 500
};
return err;
}
#endregion
#region OpenAI电视机对接()
/// <summary>
/// OpenAI电视机对接
/// APPIDca4jsq4h
/// appsecrectfd56ae71e3d34b9f94b3378a99170af4
/// </summary>
/// <returns></returns>
public ActionResult openaitv()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
logger.Error(reqData);
try
{
string platformName = "华视美达电视";
Domain.IoTOpenAIEntity.Request req = JsonConvert.DeserializeObject<Domain.IoTOpenAIEntity.Request>(reqData);
if (string.IsNullOrEmpty(req.hotelId) || string.IsNullOrEmpty(req.roomNumber))
{
logger.Error(platformName + "hotelId和roomNumber不能为空" + reqData + ",来自:" + GetClientIP());
return Json(ReturnOpenAI("401", "hotelId和roomNumber不能为空", req.requestId), JsonRequestBehavior.AllowGet);//该消息表示由于请求消息中属性信息错误,导致技能无法处理请求消息。
}
Host host = HostManager.GetByHuaWeiCUID(req.hotelId + "&" + req.roomNumber);//根据小度音箱序列号获取对应RCU主机
if (host == null)
{
logger.Error(platformName + "(" + req.hotelId + "&" + req.roomNumber + ")尚未绑定客房主机");
return Json(ReturnOpenAI("401", "尚未绑定客房主机", req.requestId), JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期");
return Json(ReturnOpenAI("500", "当前访问酒店已过期", req.requestId), JsonRequestBehavior.AllowGet);//该消息表示请求消息中access token过期不能使用。
}
if (!Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC))
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
return Json(ReturnOpenAI("403", "当前访问rcu主机不在线", req.requestId), JsonRequestBehavior.AllowGet);//当技能检测到目标设备没有连接到设备云或者设备云不在线时会给DuerOS发送TargetOfflineError消息。
}
if (!CheckGetPower(host))
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
return Json(ReturnOpenAI("403", "当前访问客房尚未取电", req.requestId), JsonRequestBehavior.AllowGet);
}
switch (req.skill)
{
case "scene"://华视美达电视
{
RoomTypeScene scene = RoomTypeSceneManager.Get(host.RoomType, req.sceneName);
if (scene == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的场景:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, req.sceneName, platformName));
return Json(ReturnOpenAI("411", "未找到对应的场景", req.requestId), JsonRequestBehavior.AllowGet);
}
LightControlManager.ApplyScene(host, scene);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, platformName, host.SysHotel.ID);
}
break;
case "smartControl":
{
var hostModal = HostModalManager.GetByModalName(host.ID, req.deviceName);//设备控制
if (hostModal == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的设备Address{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, req.deviceName, platformName));
return Json(ReturnOpenAI("402", "未找到对应的设备", req.requestId), JsonRequestBehavior.AllowGet);
}
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("控制客房(" + host.RoomNumber + ")设备(" + hostModal.Modal.Name + hostModal.Modal.ModalAddress + ")");
int status = hostModal.Status;
int brightness = hostModal.Brightness;
int temperature = hostModal.SettingTemp;
int fanSpeed = hostModal.FanSpeed;
int mode = hostModal.Mode;
int valve = hostModal.Valve;
switch (req.device)
{
case "light"://灯光
switch (req.insType)
{
case "on":
status = 1;
brightness = 100;
sb.Append("状态:打开");
break;
default:
status = 2;
brightness = 0;
sb.Append("状态:关闭");
break;
}
break;
case "curtain":
switch (req.insType)
{
case "on":
status = 1;
brightness = Convert.ToInt16(req.value);
sb.Append("状态:打开");
break;
default:
status = 2;
brightness = 0;
sb.Append("状态:关闭");
break;
}
break;
case "airControl"://空调
switch (req.insType)
{
case "on":
status = 1;
sb.Append("空调:打开");
break;
case "temp":
status = 1;
temperature = Convert.ToInt16(req.value);
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
sb.Append("设温:" + temperature);
break;
case "mode":
status = 1;
mode = ModeToInt(req.value);
sb.Append("模式:" + req.value);
break;
case "windspeed":
status = 1;
fanSpeed = Convert.ToInt16(req.value);
sb.Append("设置风速:" + req.value);
break;
case "winddir":
status = 1;
sb.Append("设置风向:" + req.value);
break;
default:
status = 2;
sb.Append("空调:关闭");
break;
}
break;
default:
return Json(ReturnOpenAI("500", "不支持此操作", req.requestId), JsonRequestBehavior.AllowGet);
}
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
}
break;
default:
return Json(ReturnOpenAI("500", "不支持此操作", req.requestId), JsonRequestBehavior.AllowGet);
}
return Json(ReturnOpenAI("200", "操作成功", req.requestId), JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
logger.Error(string.Format("处理OpenAI电视机命令异常数据{0},异常:{1}", reqData, ex.ToString()));
return Json(ReturnOpenAI("500", "处理OpenAI电视机命令异常", "0"), JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 返回
/// </summary>
/// <param name="code"></param>
/// <param name="msg"></param>
/// <param name="requestId"></param>
/// <returns></returns>
private Domain.IoTOpenAIEntity.Response ReturnOpenAI(string code, string msg, string requestId)
{
Domain.IoTOpenAIEntity.Response err = new Domain.IoTOpenAIEntity.Response
{
code = code,
msg = msg,
requestId = requestId,
timestamp = Common.TimeHelper.DateTimeToStamp(DateTime.Now)
};
return err;
}
#endregion
#region AI遥控器
/// <summary>
/// http://api?userId=13000000000&roomNum=8002&command="温度+"&mode="空调温度加"&timestamp=1686800490&sign=
/// </summary>
/// <returns></returns>
public ActionResult RemoteControl()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
if (string.IsNullOrEmpty(reqData))
{
return Json(ReturnRemoteControlError(-1, "参数不能为空"), JsonRequestBehavior.AllowGet);
}
//logger.Error("收到遥控器控制命令:" + reqData);
try
{
string platformName = "遥控器";
reqData = Common.Tools.UrlParamsToJson(reqData);
Domain.IoTRemoteControlEntity.Request req = JsonConvert.DeserializeObject<Domain.IoTRemoteControlEntity.Request>(reqData);//得到长虹AI遥控器请求
if (string.IsNullOrEmpty(req.userId))
{
return Json(ReturnRemoteControlError(-1, "设备userId不能为空"), JsonRequestBehavior.AllowGet);
}
if (string.IsNullOrEmpty(req.roomNum))
{
return Json(ReturnRemoteControlError(-1, "设备roomNum不能为空"), JsonRequestBehavior.AllowGet);
}
Host host = host = HostManager.GetByRoomNumber(req.roomNum, req.userId);
if (host == null)
{
return Json(ReturnRemoteControlError(-1, "未找到对应酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")和客房(" + host.RoomNumber + ")"), JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > host.SysHotel.ValidateDate)
{
return Json(ReturnRemoteControlError(-1, "控制当前酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期"), JsonRequestBehavior.AllowGet);
}
if (!Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC))
{
return Json(ReturnRemoteControlError(-1, "控制当前酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线"), JsonRequestBehavior.AllowGet);
}
if (!CheckGetPower(host))
{
return Json(ReturnRemoteControlError(-1, "控制当前酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电"), JsonRequestBehavior.AllowGet);
}
if (req.mode.IndexOf("模式") > -1 && req.mode.IndexOf("空调模式") == -1)
{
RoomTypeScene scene = RoomTypeSceneManager.Get(host.RoomType, req.mode);
if (scene == null)
{
string msg = string.Format("(酒店:{0},房号:{1})未找到对应的场景mode{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, req.mode);
return Json(ReturnRemoteControlError(-1, msg), JsonRequestBehavior.AllowGet);
}
LightControlManager.ApplyScene(host, scene);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, platformName, host.SysHotel.ID);
}
else
{
HostModal hostModal = null;
if (req.mode.IndexOf("窗帘") > -1)
{
hostModal = HostModalManager.GetByModalName(host.ID, "窗帘");
}
else if (req.mode.IndexOf("空调") > -1)
{
hostModal = HostModalManager.GetByModalName(host.ID, "空调");
}
else if (req.mode.IndexOf("排风扇") > -1)
{
hostModal = HostModalManager.GetByModalName(host.ID, "排风扇");
}
if (hostModal == null)
{
string msg = string.Format("(酒店:{0},房号:{1})未找到对应的({2})回路", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, req.mode);
return Json(ReturnRemoteControlError(-1, msg), JsonRequestBehavior.AllowGet);
}
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("控制客房(" + host.RoomNumber + ")设备(" + hostModal.Modal.Name + hostModal.Modal.ModalAddress + ")");
int status = 0;//hostModal.Status;
int brightness = 0;//hostModal.Brightness;
int temperature = 0;//hostModal.SettingTemp;
int fanSpeed = 0;//hostModal.FanSpeed;
int mode = 0;//hostModal.Mode;
int valve = 0;//hostModal.Valve;
if (req.mode.IndexOf("打开") > -1)
{
status = 1;
brightness = 100;
sb.Append("打开");
}
else if (req.mode.IndexOf("关闭") > -1)
{
status = 2;
brightness = 0;
sb.Append("关闭");
}
else if (req.mode.IndexOf("开关") > -1)
{
status = hostModal.Status == 1 ? 2 : 1;//当前开则关,当前关则开
brightness = status == 1 ? 100 : 0;
sb.Append(status == 1 ? "打开" : "关闭");
}
else if (req.mode == "空调温度加")
{
temperature = hostModal.SettingTemp + 1;
if (temperature > 32)
{
temperature = 32;
}
sb.Append("空调温度加:" + temperature);
}
else if (req.mode == "空调温度减")
{
temperature = hostModal.SettingTemp - 1;
if (temperature < 16)
{
temperature = 16;
}
sb.Append("空调温度减:" + temperature);
}
else if (req.mode == "空调风速调节")
{
fanSpeed = hostModal.FanSpeed + 1;
if (fanSpeed > 3)
{
fanSpeed = 1;
}
sb.Append("空调风速调节:" + fanSpeed);
}
else if (req.mode == "空调模式调节")
{
mode = hostModal.Mode + 1;
if (mode > 3)
{
mode = 1;
}
sb.Append("空调模式调节:" + mode);
}
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
}
return Json(ReturnRemoteControlError(0), JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
logger.Error(string.Format("处理长虹AI遥控器命令异常数据{0},异常:{1}", reqData, ex.ToString()));
return Json(ReturnRemoteControlError(-1, ex.Message), JsonRequestBehavior.AllowGet);
}
}
/// <summary>
///
/// </summary>
/// <param name="code">0成功-1失败</param>
/// <param name="msg">失败原因</param>
/// <returns></returns>
private Domain.IoTRemoteControlEntity.Error ReturnRemoteControlError(int code, string msg = "succes")
{
if (code != 0)
{
logger.Error(string.Format("处理遥控器命令异常:{0},来自:{1}", msg, GetClientIP()));
}
return new Domain.IoTRemoteControlEntity.Error() { code = code, msg = msg };
}
#endregion
#region
/// <summary>
/// 酒店列表
/// </summary>
/// <returns></returns>
[HttpGet()]
public ActionResult ChuangWei_HotelInfo()
{
ReturnInfo r = new ReturnInfo();
r.code = 200;
string msg = "查询成功";
int code = 200;
r.msg = msg;
IList<object> list = new List<object>();
var Q = Request.Headers["Authorization"];
if (Q != null)
{
JWTData JJJ = null;
string Token = Q.ToString();
if (!string.IsNullOrEmpty(Token))
{
var TuT = SignKeyCommon.TokenValidate(Token, out JJJ, out code, out msg);
if (TuT)
{
var hotels = SysHotelManager.LoadAll().Where(A => !A.IsDeleted).ToList();
foreach (SysHotel hotel in hotels)
{
if (hotel.IsUseSkyworthTV)
{
list.Add(new
{
id = hotel.ID,
name = hotel.Name
});
}
}
}
else
{
r.code = code;
r.msg = msg;
}
}
r.data = list;
}
else
{
r.code = 10030;
r.msg = msg;
}
return Json(r, JsonRequestBehavior.AllowGet);
}
[HttpGet()]
public ActionResult ChuangWei_RoomInfo(string hotelId)
{
ReturnInfo r = new ReturnInfo();
r.code = 200;
string msg = "";
int code = 200;
IList<object> list = new List<object>();
string Token = "";
var AuthData = Request.Headers["Authorization"];
if (AuthData != null)
{
JWTData JJJ = null;
Token = AuthData.ToString();
var TuT = SignKeyCommon.TokenValidate(Token, out JJJ, out code, out msg);
if (TuT)
{
int hid = 0;
int.TryParse(hotelId, out hid);
var hosts = HostManager.LoadAll(hid).OrderBy(A => A.RoomNumber);
foreach (Host hotel in hosts)
{
list.Add(new
{
id = hotel.ID,
name = hotel.RoomNumber
});
}
msg = "查询成功";
}
else
{
r.code = code;
r.msg = msg;
}
r.data = list;
}
else
{
r.code = 10030;
r.msg = msg;
}
return Json(r, JsonRequestBehavior.AllowGet);
}
[HttpGet()]
public ActionResult ChuangWei_DeviceInfo(int HotelId, int RoomId, string TimeStamp)
{
ReturnInfo r1 = new ReturnInfo();
r1.code = 200;
string msg = "请求成功";
r1.msg = msg;
IList<DD> list = new List<DD>();
IList<HostModal> hostModalsAllData = HostModalManager.LoadByHostID(RoomId).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
//IList<HostModal> hostModalsAllData = HostModalManager.LoadByHostID(RoomId).Where(r => r.Modal.WXActiveIndicator).ToList();
IList<HostModal> hostModals = hostModalsAllData.Where(r => r.Modal.MultipleGroupID == 0).ToList();
IList<HostModal> hostModalsGroup = hostModalsAllData.Where(r => r.Modal.MultipleGroupID != 0).ToList();
foreach (HostModal modal in hostModals)
{
switch (modal.Modal.Type)
{
case DeviceType.Relay://主机继电器
case DeviceType.Dimmer://LED调光
case DeviceType.PWMDimmer://PWM调光
case DeviceType.PWMExpand://PWM扩展
case DeviceType.PBLED:
case DeviceType.Traic://可控硅调光
case DeviceType.Strip://灯带调光
case DeviceType.A9IORelay:
case DeviceType.LVout://弱电输出
case DeviceType.Expand://扩展继电器
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
case DeviceType.ColorTemp:
DD light = new DD
{
deviceId = "LIGHT_" + modal.HostID + "_" + modal.Modal.ModalAddress,
deviceType = "LIGHT",
deviceName = ReturnNameByLanguage(modal.Modal.Name, modal.Modal.EnglishName, modal.Modal.TWName),
};
list.Add(light);
break;
default:
break;
}
#region
switch (modal.Modal.Type)
{
case DeviceType.Curtain:
DD cu = new DD
{
deviceId = "CURTAIN_" + modal.HostID + "_" + modal.Modal.ModalAddress,
deviceType = "CURTAIN",
deviceName = ReturnNameByLanguage(modal.Modal.Name, modal.Modal.EnglishName, modal.Modal.TWName),
};
list.Add(cu);
break;
}
#endregion
#region
switch (modal.Modal.Type)
{
case DeviceType.AirConditioner:
DD air = new DD
{
deviceId = "AIR_" + modal.HostID + "_" + modal.Modal.ModalAddress,
deviceType = "AIR",
deviceName = ReturnNameByLanguage(modal.Modal.Name, modal.Modal.EnglishName, modal.Modal.TWName),
};
list.Add(air);
break;
}
#endregion
}
#region TCL设备 使
//获取 组设备
List<HostModal> TTT = new List<HostModal>();
var Q = hostModalsGroup.Where(A => A.Modal.MultipleGroupID != 0);
if (Q.Count() > 0)
{
var P = Q.GroupBy(A => A.Modal.MultipleGroupID);
foreach (var item in P)
{
//获取每一组的数据
int ID = item.Key;
var ll = item.Select(A => A.Modal.ModalAddress).ToArray();
//这个是组名字,每一个数据的组名字都一样的
var N1 = item.FirstOrDefault();
//每一组的数据
HostModal hh = new HostModal();
hh.HostID = ID;
hh.Modal = new RoomTypeModal();
hh.Modal.Name = N1.Modal.MultipleTCLName; ;
hh.Modal.Type = N1.Modal.Type;
hh.Modal.ModalAddress = string.Join("#", ll);
TTT.Add(hh);
}
}
foreach (var item in TTT)
{
DD light = new DD
{
deviceId = "LIGHT_" + item.HostID + "_" + item.Modal.ModalAddress,
deviceType = "LIGHT",
deviceName = ReturnNameByLanguage(item.Modal.Name, item.Modal.EnglishName, item.Modal.TWName),
};
list.Add(light);
}
#endregion
#region
var hhh = hostModals.FirstOrDefault();
if (hhh != null)
{
var typeid = hhh.Modal.RoomType.ID;
//获取需要控制的场景
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == typeid && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
foreach (RoomTypeScene scene in sceneModals)
{
string aliasName = string.IsNullOrEmpty(scene.AliasName) ? scene.Name : scene.AliasName;//获取别名
DD sss = new DD
{
deviceId = "SCENE_" + scene.ID + "_" + scene.GroupAddress,
deviceType = "SCENE",
deviceName = aliasName
};
list.Add(sss);
}
}
#endregion
r1.data = list;
return Json(r1, JsonRequestBehavior.AllowGet);
}
[HttpPost()]
public ActionResult GetAllDevice(int hostid)
{
List<DD> ll = new List<DD>();
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(hostid).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
foreach (HostModal modal in hostModals)
{
switch (modal.Modal.Type)
{
case DeviceType.Relay://主机继电器
case DeviceType.Dimmer://LED调光
case DeviceType.PWMDimmer://PWM调光
case DeviceType.PWMExpand://PWM扩展
case DeviceType.PBLED:
case DeviceType.Traic://可控硅调光
case DeviceType.Strip://灯带调光
case DeviceType.A9IORelay:
case DeviceType.LVout://弱电输出
case DeviceType.Expand://扩展继电器
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
case DeviceType.ColorTemp:
DD light = new DD
{
deviceId = "LIGHT_" + modal.HostID + "_" + modal.Modal.ModalAddress,
deviceType = "LIGHT",
deviceName = ReturnNameByLanguage(modal.Modal.Name, modal.Modal.EnglishName, modal.Modal.TWName),
};
ll.Add(light);
break;
default:
break;
}
}
return Json(ll, JsonRequestBehavior.AllowGet);
}
public static string[] controll_all_open = new string[] { "开灯", "打开所有灯", "打开灯", "开灯光", "打开所有灯光", "打开灯光", "打开全开模式", "全开模式" };
public static string[] controll_all_close = new string[] { "关灯", "关闭所有灯", "关闭灯", "关灯光", "关闭所有灯光", "关闭灯光", "打开全关模式", "全关模式" };
[HttpPost()]
public ActionResult ChuangWei_DeviceCommandControl()
{
//返回控制结果
ReturnInfo result = new ReturnInfo();
result.code = 1;
result.msg = "执行成功";
try
{
byte[] byts = new byte[Request.InputStream.Length];
Request.InputStream.Read(byts, 0, byts.Length);
string jsonData = System.Text.Encoding.UTF8.GetString(byts);
logger.Error("chuangwei 控制指令为: " + jsonData);
var UUU = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonData);
string Token = "";
int code = 0;
string msg = "";
var AuthData = Request.Headers["Authorization"];
if (AuthData != null)
{
JWTData JJJ = null;
Token = AuthData.ToString();
var TuT = SignKeyCommon.TokenValidate(Token, out JJJ, out code, out msg);
if (!TuT)
{
code = 0;
result.code = code;
result.msg = "Token验证不通过";
return Json(result, JsonRequestBehavior.AllowGet);
}
}
string HotelId = UUU["hotelId"];
//这里 创维传过来的实际上是房间号
//真想打死他们啊,在这里 耗费了很久的时间
string RoomNumber = UUU["roomId"];
string VoiceCmd = UUU["voiceCmd"];
string TimeStamp = UUU["timeStamp"];
//string HotelId = "";
//string RoomId = "";
//string VoiceCmd = "";
//string TimeStamp = "";
int hid = 0;
int.TryParse(HotelId, out hid);
string platformName = "创维电视";
var request = Newtonsoft.Json.JsonConvert.DeserializeObject<ChuangWeiCommandData>(VoiceCmd);
var a11 = request.nlp_cmd.data;
var a22 = JsonConvert.DeserializeObject<List<MessageData>>(a11);
//这里的 roomid 实际上是 房间号
//创维文档上写的和实际上不符
//是个大坑
Host host = HostManager.GetByRoomNumber(RoomNumber, hid);
if (host == null)
{
result.code = 0;
result.msg = "不存在此房间";
return Json(result, JsonRequestBehavior.AllowGet);
}
string a = host.SysHotel.ID.ToString();
string room_number = host.RoomNumber;
string hotel_code_str = host.SysHotel.Code;
int hotel_code = 0;
int.TryParse(hotel_code_str, out hotel_code);
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error("已经过期");
result.code = 0;
result.msg = "当前酒店已经过期";
return Json(result, JsonRequestBehavior.AllowGet);
}
#region
string Key = CacheKey.IOTKey;
bool is_monitor = false;
var qqq = CSRedisCacheHelper.ForeverGet<List<IOT_Monitor_Host>>(Key);
if (qqq != null && qqq.Count > 0)
{
var df = qqq.Where(A => A.HotelID.Equals(HotelId) && A.RoomNumber.Equals(host.RoomNumber));
if (df.Count() > 0)
{
is_monitor = true;
}
}
bool is_online = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC);
if (is_monitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") is_online: " + is_online.ToString();
IOTMonitorData i = new IOTMonitorData();
i.Step = 1;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = HotelId;
i.HotelCode = hotel_code;
i.RoomNumber = room_number;
i.RequestId = "";
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
#endregion
if (!is_online)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
result.code = 0;
result.msg = "当前房间主机不在线,无法控制";
return Json(result, JsonRequestBehavior.AllowGet);
}
bool is_take_card = CheckGetPower(host);
if (is_monitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") 取电: " + is_take_card.ToString();
IOTMonitorData i = new IOTMonitorData();
i.Step = 2;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = HotelId;
i.HotelCode = hotel_code;
i.RoomNumber = room_number;
i.RequestId = "";
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
if (!is_take_card)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
result.code = 0;
result.msg = "当前房间没有取电,不能在这种情况下控制";
return Json(result, JsonRequestBehavior.AllowGet);
}
string query = request.query;
Device data_return = new Device();
#region
bool b1 = controll_all_open.Contains(query);
bool b2 = controll_all_close.Contains(query);
if (b1 || b2)
{
int status = 0;
int brightness = 100;
var devices1 = new List<RCUHost.Protocols.Device>();
var hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.Name.Contains("灯") && r.Modal.WXActiveIndicator).ToList();
foreach (HostModal hostModal in hostModals)
{
switch (hostModal.Modal.Type)
{
case DeviceType.Relay:
case DeviceType.Expand:
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.Strip:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.A9IORelay:
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
case DeviceType.ColorTemp:
int status1 = hostModal.Status;
int brightness1 = hostModal.Brightness;
var device = new RCUHost.Protocols.Device();
device.Address = hostModal.Modal.ModalAddress;
device.AddressType = RCUHost.Protocols.AddressType.DeviceAddress;
device.Type = hostModal.Modal.Type;
//全开
if (b1)
{
status = 1;
brightness = 100;
}
//全关
else if (b2)
{
status = 2;
brightness = 0;
}
device.Status = (byte)status;
device.Brightness = (byte)brightness;
devices1.Add(device);
break;
}
}
LightControlManager.AllDeviceControl(host, devices1);
}
#endregion
else
{
foreach (var G_item in a22)
{
header hh = G_item.header;
payload pp = G_item.payload;
// id SCENE_15639_0.27.0
string deviceIdn = pp.appliance.additionalApplianceDetails.deviceId;
string[] mmo = deviceIdn.Split('_');
string deviceid = mmo[1];
string modalAddress = mmo[2];
var Deviceinfo = pp.appliance.additionalApplianceDetails;
var TTTy = Deviceinfo.deviceType;
var M_DeviceId = Deviceinfo.deviceId;
var M_DeviceName = Deviceinfo.deviceName;
//消息id
string messageid = hh.messageId;
if (TTTy.Equals("SCENE"))
{
#region
if (hh.name.Equals("TurnOnRequest"))
{
//var scene = RoomTypeSceneManager.Get(int.Parse(modalAddress));
var scene = RoomTypeSceneManager.Get(int.Parse(deviceid));
if (scene == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的场景ID{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress, platformName));
return Json("", JsonRequestBehavior.AllowGet);
}
LightControlManager.ApplyScene(host, scene);
if (is_monitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 3.1;
i.CreateTime = DateTime.Now;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = HotelId;
i.HotelCode = hotel_code;
i.RoomNumber = room_number;
i.RequestId = "";
i.Platform = platformName;
string sss = string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID);
i.CommandDescription = sss.ToString();
SendMQTTData.Send(i);
}
}
#endregion
}
else
{
int status = 0;
int brightness = 100;
int temperature = 25;
int fanSpeed = 1;
int mode = 1;
int air_value = 0;
HostModal item = GetDataFromCache(host, modalAddress);
if (item != null)
{
status = item.Status;
mode = item.Mode;
temperature = item.SettingTemp;
fanSpeed = item.FanSpeed;
brightness = item.Brightness;
air_value = item.Valve;
}
if (item != null)
{
data_return.deviceName = item.Modal.Name;
#region
if (TTTy.Equals("LIGHT"))
{
data_return.deviceId = "LIGHT_" + item.HostID + "_" + item.Modal.ModalAddress;
data_return.deviceType = "LIGHT";
if (hh.name.Equals("TurnOnRequest"))
{
status = 1;
brightness = 100;
}
else if (hh.name.Equals("TurnOffRequest"))
{
status = 2;
brightness = 0;
}
else if (hh.name.Equals("SetBrightnessPercentageRequest"))
{
status = 1;
brightness = Convert.ToInt16(pp.brightness.value);
}
else if (hh.name.Equals("IncrementBrightnessPercentageRequest"))//调亮
{
status = 1;
brightness = item.Brightness;
brightness += Convert.ToInt16(pp.brightness.value);
if (brightness > 100)
{
brightness = 100;
}
}
else if (hh.name.Equals("DecrementBrightnessPercentageRequest"))//调暗
{
status = 1;
brightness = item.Brightness;
brightness -= Convert.ToInt16(pp.brightness.value);
if (brightness < 0)
{
brightness = 0;
status = 2;
}
}
else if (hh.name.Equals("SetColorTemperatureRequest"))//设置色温
{
status = 3;
temperature = XiaoDuToBLW(pp.targetTemperature.value);
if (temperature < 0)
{
temperature = 0;
}
else if (temperature > 100)
{
temperature = 100;
}
}
else if (hh.name.Equals("IncrementColorTemperatureRequest")) //调高灯光色温
{
status = 1;
temperature = item.CurrentTemp;
//brightness = item.Brightness;
//temperature = 0;
double GV = 0;
double.TryParse(pp.deltaPercentage.value.ToString(), out GV);
int gh = Convert.ToInt32(GV);
//brightness += Convert.ToInt16(gh);
//if (brightness > 100)
//{
// brightness = 100;
//}
temperature += Convert.ToInt16(gh);
if (temperature > 100)
{
temperature = 100;
}
}
else if (hh.name.Equals("DecrementColorTemperatureRequest"))//降低灯光色温
{
status = 1;
//temperature = 0;
temperature = item.CurrentTemp;
//brightness = item.Brightness;
double GV = 0;
double.TryParse(pp.deltaPercentage.value.ToString(), out GV);
int gh = Convert.ToInt32(GV);
//brightness -= Convert.ToInt16(gh);
//if (brightness < 0)
//{
// brightness = 0;
// status = 2;
//}
temperature -= Convert.ToInt16(gh);
if (temperature < 0)
{
temperature = 0;
}
}
//冷色调
else if (hh.name.Equals("colorTemperatureInKelvin"))
{
}
}
else if (TTTy.Equals("AIR")) //这里和文档上不一样
{
if (hh.name.Equals("TurnOnRequest"))
{
status = 1;
brightness = 100;
}
else if (hh.name.Equals("TurnOffRequest"))
{
status = 2;
brightness = 0;
}
else if (hh.name.Equals("SetTemperatureRequest"))
{
status = 1;
temperature = XiaoDuToBLW(pp.targetTemperature.value);
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
}
else if (hh.name.Equals("IncrementTemperatureRequest"))
{
status = 1;
temperature = item.SettingTemp;
temperature += Convert.ToInt16(pp.deltaValue.value.ToString());
if (temperature > 32)
{
temperature = 32;
}
}
else if (hh.name.Equals("DecrementTemperatureRequest"))
{
status = 1;
temperature = item.SettingTemp;
temperature -= Convert.ToInt16(pp.deltaValue.value);
if (temperature < 16)
{
temperature = 16;
}
}
else if (hh.name.Equals("SetFanSpeedRequest"))
{
status = 1;
if (pp.fanSpeed.level != null && !string.IsNullOrEmpty(pp.fanSpeed.level))
{
switch (pp.fanSpeed.level.ToLower())
{
case "high":
case "max":
case "高":
fanSpeed = 3;
break;
case "middle":
case "中":
fanSpeed = 2;
break;
case "auto":
case "自动":
fanSpeed = 0;
break;
default:
fanSpeed = 1;
break;
}
}
else
{
fanSpeed = Convert.ToInt16(pp.fanSpeed.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
else if (fanSpeed > 3)
{
fanSpeed = 3;
}
}
}
else if (hh.name.Equals("IncrementFanSpeedRequest"))
{
status = 1;
fanSpeed = item.FanSpeed;
fanSpeed += Convert.ToInt16(pp.deltaValue.value);
if (fanSpeed > 3)
{
fanSpeed = 3;
}
}
else if (hh.name.Equals("DecrementFanSpeedRequest"))
{
status = 1;
fanSpeed = item.FanSpeed;
fanSpeed -= Convert.ToInt16(pp.deltaValue.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
}
else if (hh.name.Equals("SetModeRequest"))
{
status = 1;
mode = ModeToInt(pp.mode.value);
if (mode == -1)
{
//logger.Error(string.Format("{3}(酒店:{0},房号:{1})不支持该空调模式:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, request.payload.mode.value, platformName));
}
}
}
else if (TTTy.Equals("CURTAIN"))
{
if (hh.name.Equals("TurnOnRequest"))
{
status = 1;
brightness = 100;
}
else if (hh.name.Equals("TurnOffRequest"))
{
status = 2;
brightness = 0;
}
else if (hh.name.Equals("PauseRequest"))
{
status = 6;
}
}
else
{
}
logger.Error("创维控制指令为: status: " + status + " brightness: " + item.Brightness);
HostModalManager.SetDevice(host, item, status, brightness, temperature, fanSpeed, mode, air_value);
#endregion
}
}
}
}
result.data = data_return;
}
catch (Exception ex)
{
result.code = 0;
result.msg = ex.Message;
string s = JsonConvert.SerializeObject(result);
logger.Error("创维控制失败: " + s);
}
string sjk = JsonConvert.SerializeObject(result);
logger.Error("控制结果为: " + sjk);
return Json(result, JsonRequestBehavior.AllowGet);
}
/// <summary>
/// 创建增加的 一键投诉
/// https://客控IOT后台BaseUrl/sky/api/customer/complaint/
/// </summary>
/// <param name="hotelId"></param>
/// <param name="roomId"></param>
/// <param name="timeStamp"></param>
/// <returns></returns>
[HttpPost()]
public ActionResult ChuangWei_TouSu(string hotelId, string roomId, string timeStamp)
{
ReturnInfo result = new ReturnInfo();
result.code = 1;
result.msg = "执行成功";
try
{
logger.Error("收到创维电视的一键投诉功能 hotelid: " + hotelId + " RoomNum:" + roomId);
//byte[] byts = new byte[Request.InputStream.Length];
//Request.InputStream.Read(byts, 0, byts.Length);
//string jsonData = System.Text.Encoding.UTF8.GetString(byts);
//logger.Error("chuangwei 控制指令为: " + jsonData);
//var UUU = JsonConvert.DeserializeObject<Dictionary<string, string>>(jsonData);
string Token = "";
int code = 0;
string msg = "";
var AuthData = Request.Headers["Authorization"];
if (AuthData != null)
{
JWTData JJJ = null;
Token = AuthData.ToString();
var TuT = SignKeyCommon.TokenValidate(Token, out JJJ, out code, out msg);
if (!TuT)
{
code = 0;
result.code = code;
result.msg = "Token验证不通过";
return Json(result, JsonRequestBehavior.AllowGet);
}
}
//string HotelId = UUU["hotelId"];
string HotelId = hotelId;
//这里 创维传过来的实际上是房间号
//真想打死他们啊,在这里 耗费了很久的时间
//string RoomNumber = UUU["roomId"];
string RoomNumber = roomId;
//string VoiceCmd = UUU["voiceCmd"];
//string TimeStamp = UUU["timeStamp"];
string TimeStamp = timeStamp;
//string HotelId = "";
//string RoomId = "";
//string VoiceCmd = "";
//string TimeStamp = "";
int hid = 0;
int.TryParse(HotelId, out hid);
string platformName = "创维电视";
//var request = Newtonsoft.Json.JsonConvert.DeserializeObject<ChuangWeiCommandData>(VoiceCmd);
//var a11 = request.nlp_cmd.data;
//var a22 = JsonConvert.DeserializeObject<List<MessageData>>(a11);
//这里的 roomid 实际上是 房间号
//创维文档上写的和实际上不符
//是个大坑
Host host = HostManager.GetByRoomNumber(RoomNumber, hid);
if (host == null)
{
result.code = 0;
result.msg = "不存在此房间";
return Json(result, JsonRequestBehavior.AllowGet);
}
string a = host.SysHotel.ID.ToString();
string room_number = host.RoomNumber;
string hotel_code_str = host.SysHotel.Code;
int hotel_code = 0;
int.TryParse(hotel_code_str, out hotel_code);
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error("已经过期");
result.code = 0;
result.msg = "当前酒店已经过期";
return Json(result, JsonRequestBehavior.AllowGet);
}
#region
string Key = CacheKey.IOTKey;
bool is_monitor = false;
var qqq = CSRedisCacheHelper.ForeverGet<List<IOT_Monitor_Host>>(Key);
if (qqq != null && qqq.Count > 0)
{
var df = qqq.Where(A => A.HotelID.Equals(HotelId) && A.RoomNumber.Equals(host.RoomNumber));
if (df.Count() > 0)
{
is_monitor = true;
}
}
bool is_online = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC);
if (is_monitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") is_online: " + is_online.ToString();
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 1;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = HotelId;
i.HotelCode = hotel_code;
i.RoomNumber = room_number;
i.RequestId = "";
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
#endregion
if (!is_online)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
result.code = 0;
result.msg = "当前房间主机不在线,无法控制";
return Json(result, JsonRequestBehavior.AllowGet);
}
bool is_take_card = CheckGetPower(host);
if (is_monitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") 取电: " + is_take_card.ToString();
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 2;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = HotelId;
i.HotelCode = hotel_code;
i.RoomNumber = room_number;
i.RequestId = "";
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
if (!is_take_card)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
result.code = 0;
result.msg = "当前房间没有取电,不能在这种情况下控制";
return Json(result, JsonRequestBehavior.AllowGet);
}
//给麦工 宝镜系统推送数据
string TouSu_URL = host.SysHotel.DeviceStatusPushURL;
//当设备或服务状态发生变化时,推送给指定的第三方接口
if ((!string.IsNullOrEmpty(TouSu_URL)))
{
Tuple<string, string, string> tup = new Tuple<string, string, string>(hotel_code_str, RoomNumber, TouSu_URL);
Task.Factory.StartNew((tupobj) =>
{
Tuple<string, string, string> ttt = tupobj as Tuple<string, string, string>;
XuanZhuResponse resp = new XuanZhuResponse();
resp.code = ttt.Item1;
resp.roomNumber = ttt.Item2;
resp.address = "004000004";
resp.name = "投诉";
resp.status = 1;
string nnn = Newtonsoft.Json.JsonConvert.SerializeObject(resp);
logger.Error("投诉信息给宝镜推送: " + nnn);
//XuanZhuOperation.ReportService(ttt.Item3, resp);
MyHttp.SendHttpData(ttt.Item3, resp);
}, tup);
}
int status = 1;
int brightness = 100;
//询问过工程部的人一键投诉的地址是004000004 这是固定的
HostModal item = GetDataFromCache(host, "004000004");
HostModalManager.SetDevice(host, item, status, brightness);
result.code = 200;
string mmm = host.SysHotel.TouSuResponseData;
if (!string.IsNullOrEmpty(mmm))
{
result.msg = mmm;
}
else
{
result.msg = "您的投诉信息,我们已经收到,会尽快为您处理";
}
return Json(result, JsonRequestBehavior.AllowGet);
}
catch (Exception ex)
{
logger.Error("创维电视一键投诉功能异常:" + ex.Message);
result.code = 500;
result.msg = "error:" + ex.Message;
return Json(result, JsonRequestBehavior.AllowGet);
}
}
#endregion
#region
/// <summary>
/// 嗨喂语音对接
/// </summary>
/// <returns></returns>
public ActionResult HaiW()
{
Request.InputStream.Position = 0;
byte[] reqBody = new byte[Request.InputStream.Length];
Request.InputStream.Read(reqBody, 0, reqBody.Length);
string reqData = System.Text.Encoding.UTF8.GetString(reqBody);
try
{
logger.Error("HiWei:" + reqData);
bool isMonitor = true;
Domain.IoTHiWeiEntity.DiscoverAppliancesRequest request = JsonConvert.DeserializeObject<Domain.IoTHiWeiEntity.DiscoverAppliancesRequest>(reqData);//岚正播放盒语音对接
string platformName = "嗨喂";
if (string.IsNullOrEmpty(request.payload.cuid))
{
logger.Error(platformName + "cuid不能为空" + reqData + ",来自:" + GetClientIP());
return Json(ReturnHiWeiError(request.header, "UnexpectedInformationReceivedError"), JsonRequestBehavior.AllowGet);
}
Host host = HostManager.GetByHiWeiCUID(request.payload.cuid);//根据播放盒序列号获取对应RCU主机
if (host == null)
{
logger.Error(platformName + "cuid(" + request.payload.cuid + ")尚未绑定客房主机");
return Json(ReturnHiWeiError(request.header, "TargetHardwareMalfunctionError"), JsonRequestBehavior.AllowGet);
}
if (DateTime.Now > host.SysHotel.ValidateDate)//酒店已到期
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")已过期");
return Json(ReturnHiWeiError(request.header, "ExpiredAccessTokenError"), JsonRequestBehavior.AllowGet);
}
string messageid = request.payload.cuid;
messageid = Guid.NewGuid().ToString("N") + messageid;
string hotelid = host.SysHotel.ID.ToString();
int hotelcode = 0;
int.TryParse(host.SysHotel.Code, out hotelcode);
string roomno = host.RoomNumber;
if (isMonitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 0;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = hotelid;
i.HotelCode = hotelcode;
i.RoomNumber = roomno;
i.RequestId = messageid;
i.Platform = platformName;
i.CommandDescription = reqData;
SendMQTTData.Send(i);
}
bool is_online = Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC);
if (isMonitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") is_online: " + is_online.ToString();
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 1;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = hotelid;
i.HotelCode = hotelcode;
i.RoomNumber = roomno;
i.RequestId = messageid;
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
if (!is_online)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
return Json(ReturnHiWeiError(request.header, "TargetOfflineError"), JsonRequestBehavior.AllowGet);//当技能检测到目标设备没有连接到设备云或者设备云不在线时会给DuerOS发送TargetOfflineError消息。
}
bool is_take_card = CheckGetPower(host);
if (isMonitor)
{
string sss = "酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")房间号:(" + host.RoomNumber + ") 取电: " + is_take_card.ToString();
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 2;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = hotelid;
i.HotelCode = hotelcode;
i.RoomNumber = roomno;
i.RequestId = messageid;
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
if (!is_take_card)
{
logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
return Json(ReturnHiWeiError(request.header, "UnsupportedOperationError"), JsonRequestBehavior.AllowGet);
}
switch (request.header.@namespace)
{
#region
case "LZOS.Discovery"://发现设备
{
//小度精灵统计
string KKK = platformName + "Discovery";
RCUHost.RCUHostCommon.tools.LanJieData(KKK, host.SysHotel.Code);
List<Domain.IoTHiWeiEntity.DiscoveredAppliances> appliances = new List<Domain.IoTHiWeiEntity.DiscoveredAppliances>();
//获取需要控制设备的分组信息
List<Domain.IoTHiWeiEntity.DiscoveredGroups> groups = new List<Domain.IoTHiWeiEntity.DiscoveredGroups>();
List<string> applianceIds = new List<string>();
//获取需要控制的场景
IList<RoomTypeScene> sceneModals = RoomTypeSceneManager.LoadAll().Where(r => r.RoomType.ID == host.RoomType.ID && r.ActiveIndicator).OrderBy(r => r.Sort).ToList();
foreach (RoomTypeScene scene in sceneModals)
{
string aliasName = string.IsNullOrEmpty(scene.AliasName) ? scene.Name : scene.AliasName;//获取别名
appliances.Add(new Domain.IoTHiWeiEntity.DiscoveredAppliances
{
actions = new List<string> { "turnOn" },
applianceTypes = new List<string> { "SCENE_TRIGGER" },
additionalApplianceDetails = new Dictionary<string, string>() { { "SCENE", "SCENE" } },
applianceId = scene.ID + "&" + "SCENE_TRIGGER",
friendlyDescription = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + scene.Name,
friendlyName = scene.Name,
nicknames = new List<string>(aliasName.Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries)),
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(scene.Type),
version = "V1",
isReachable = true
});
applianceIds.Add(scene.ID + "&" + "SCENE_TRIGGER");
}
//场景分组
groups.Add(new Domain.IoTHiWeiEntity.DiscoveredGroups
{
groupId = "1",
groupName = "场景",
applianceIds = applianceIds,
groupNotes = "Boonlive-" + host.SysHotel.Name + "(" + host.RoomNumber + ")" + "场景分组",
additionalGroupDetails = new Dictionary<string, string>()
});
//获取需要控制的设备信息
IList<HostModal> hostModals = HostModalManager.LoadByHostID(host.ID).Where(r => r.Modal.WXActiveIndicator).OrderBy(r => r.Modal.Type).ToList();
applianceIds = new List<string>();
foreach (HostModal hostModal in hostModals)
{
List<string> applianceTypes = new List<string>();
List<string> actions = new List<string>();
switch (hostModal.Modal.Type)
{
case DeviceType.Dimmer:
case DeviceType.Traic:
case DeviceType.PWMDimmer:
case DeviceType.PWMExpand:
case DeviceType.PBLED:
case DeviceType.LVout://弱电输出
case DeviceType.Strip://灯带调光
case DeviceType.PB20:
case DeviceType.PB20_LD:
case DeviceType.PB20_LS:
applianceTypes.Add("LIGHT");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setBrightnessPercentage");
actions.Add("incrementBrightnessPercentage");
actions.Add("decrementBrightnessPercentage");
break;
case DeviceType.AirConditioner:
applianceTypes.Add("AIR_CONDITION");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setTemperature");
actions.Add("incrementTemperature");
actions.Add("decrementTemperature");
actions.Add("setFanSpeed");
actions.Add("incrementFanSpeed");
actions.Add("decrementFanSpeed");
actions.Add("setMode");
break;
case DeviceType.Curtain:
if (hostModal.Modal.Name.IndexOf("窗帘") > -1)
{
applianceTypes.Add("CURTAIN");//窗帘
}
else if (hostModal.Modal.Name.IndexOf("窗纱") > -1)
{
applianceTypes.Add("CURT_SIMP");//窗纱
}
else
{
applianceTypes.Add("SWITCH");//卷帘、天幕等
}
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("pause");
actions.Add("continue");
break;
case DeviceType.TV:
applianceTypes.Add("TV_SET");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setTVChannel");
actions.Add("decrementTVChannel");
actions.Add("incrementTVChannel");
actions.Add("returnTVChannel");
actions.Add("setVolume");
actions.Add("setVolumeMute");
actions.Add("incrementVolume");
actions.Add("decrementVolume");
actions.Add("setDirection");
break;
case DeviceType.Music:
applianceTypes.Add("TV_SET");
actions.Add("turnOn");
actions.Add("turnOff");
actions.Add("setVolume");
actions.Add("incrementVolume");
actions.Add("decrementVolume");
actions.Add("setVolumeMute");
break;
default:
if (hostModal.Modal.Name.IndexOf("灯") > -1 ||
hostModal.Modal.EnglishName.ToLower().IndexOf("light") > -1 ||
hostModal.Modal.TWName.IndexOf("燈") > -1)
{
applianceTypes.Add("LIGHT");
}
else
{
applianceTypes.Add("SWITCH");
}
actions.Add("turnOn");
actions.Add("turnOff");
break;
}
appliances.Add(new Domain.IoTHiWeiEntity.DiscoveredAppliances
{
actions = actions,
applianceTypes = applianceTypes,
applianceId = hostModal.Modal.ModalAddress + "&" + applianceTypes[0],
additionalApplianceDetails = new Dictionary<string, string>() { { "TYPE", Common.Tools.GetDescription(hostModal.Modal.Type) } },
friendlyDescription = "Boonlive->" + host.SysHotel.Name + "->" + host.RoomNumber + "->" + hostModal.Modal.Name,
friendlyName = hostModal.Modal.Name,
nicknames = new List<string> { hostModal.Modal.Name },
manufacturerName = "宝来威(Boonlive)",
modelName = Common.Tools.GetDescription(hostModal.Modal.Type),
version = "V1",
isReachable = true
});
applianceIds.Add(hostModal.Modal.ModalAddress + "&" + applianceTypes[0]);
}
//房间分组
groups.Add(new Domain.IoTHiWeiEntity.DiscoveredGroups
{
groupId = "1",
groupName = "房间",
applianceIds = applianceIds,
groupNotes = "Boonlive-" + host.SysHotel.Name + "(" + host.RoomNumber + ")" + "房间分组",
additionalGroupDetails = new Dictionary<string, string>() { }
});
//找到可控场景和设备响应小度DuerOS
Domain.IoTHiWeiEntity.DiscoverAppliancesResponse response = new Domain.IoTHiWeiEntity.DiscoverAppliancesResponse
{
header = new Domain.IoTHiWeiEntity.Header
{
name = "DiscoverAppliancesResponse",
@namespace = request.header.@namespace,
},
payload = new Domain.IoTHiWeiEntity.Payload
{
discoveredAppliances = appliances,
discoveredGroups = groups
}
};
logger.Error(string.Format("{3}(酒店:{0},房号:{1})本次获取设备数量:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, response.payload.discoveredAppliances.Count.ToString(), platformName));
if (isMonitor)
{
string sss = "发现设备返回";
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 3;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = hotelid;
i.HotelCode = hotelcode;
i.RoomNumber = roomno;
i.RequestId = messageid;
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
#endregion
case "LZOS.Control"://控制设备
{
//小度精灵统计
string KKK = platformName + "Control";
RCUHost.RCUHostCommon.tools.LanJieData(KKK, host.SysHotel.Code);
bool nnv = !Common.CSRedisCacheHelper.Contains(host.HostNumber, host.MAC);
if (nnv)
{
//logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")不在线");
return Json(ReturnHiWeiError(request.header, "TargetOfflineError"), JsonRequestBehavior.AllowGet);//当技能检测到目标设备没有连接到设备云或者设备云不在线时会给DuerOS发送TargetOfflineError消息。
}
bool nnv1 = !CheckGetPower(host);
if (nnv1)
{
//logger.Error(platformName + "当前访问酒店(" + host.SysHotel.Name + host.SysHotel.Code + ")客房rcu(" + host.RoomNumber + ")尚未取电");
return Json(ReturnHiWeiError(request.header, "UnsupportedOperationError"), JsonRequestBehavior.AllowGet);
}
string[] applianceIds = request.payload.appliance.applianceId.Split('&');
if (applianceIds.Length < 2)
{
logger.Error(platformName + "applianceId参数有误" + request.payload.appliance.applianceId);
return Json(ReturnHiWeiError(request.header, "UnexpectedInformationReceivedError"), JsonRequestBehavior.AllowGet);
}
string modalAddress = applianceIds[0];//设备地址或场景ID
string applianceTypes = applianceIds[1];//设备类型
string confirmationName = "TurnOnConfirmation";
Domain.IoTLZEntity.Payload payload = new Domain.IoTLZEntity.Payload();
List<Domain.IoTLZEntity.Attributes> attributes = new List<Domain.IoTLZEntity.Attributes>();
switch (applianceTypes)
{
case "SCENE_TRIGGER"://场景控制
case "ACTIVITY_TRIGGER":
{
var scene = RoomTypeSceneManager.Get(int.Parse(modalAddress));
if (scene == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的场景ID{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress, platformName));
return Json(ReturnHiWeiError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "name", value = scene.Name, scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "turnOnState", value = "ON", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
LightControlManager.ApplyScene(host, scene);
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("SceneControl"), string.Format("打开客房({0})场景:{1}ID{2}", host.RoomNumber, scene.Name, scene.ID), true, platformName, host.SysHotel.ID);
}
break;
default:
{
if (isMonitor)
{
string sss = "控制设备开始";
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 3.1;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = hotelid;
i.HotelCode = hotelcode;
i.RoomNumber = roomno;
i.RequestId = messageid;
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
var hostModal = HostModalManager.GetByModalAddress(host.ID, modalAddress);//设备控制
if (hostModal == null)
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的回路Address{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, modalAddress, platformName));
return Json(ReturnHiWeiError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
Domain.IoTLZEntity.PreviousState previousState = new Domain.IoTLZEntity.PreviousState();
previousState.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(hostModal.Brightness) };//原来的亮度
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.Append("控制客房(" + host.RoomNumber + ")设备(" + hostModal.Modal.Name + hostModal.Modal.ModalAddress + ")");
int status = hostModal.Status;
int brightness = hostModal.Brightness;
int temperature = hostModal.SettingTemp;
int fanSpeed = hostModal.FanSpeed;
int mode = hostModal.Mode;
int valve = hostModal.Valve;
switch (request.header.name)
{
case "TurnOnRequest"://打开
confirmationName = "TurnOnConfirmation";
status = 1;
brightness = 100;
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("状态:打开");
break;
case "TurnOffRequest"://关闭
confirmationName = "TurnOffConfirmation";
status = 2;
brightness = 0;
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("状态:关闭");
break;
case "SetBrightnessPercentageRequest"://设置亮度
confirmationName = "SetBrightnessPercentageConfirmation";
status = 1;
brightness = Convert.ToInt16(request.payload.brightness.value);
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("亮度:" + brightness);
break;
case "IncrementBrightnessPercentageRequest"://调亮
confirmationName = "IncrementBrightnessPercentageConfirmation";
status = 1;
brightness += Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness > 100)
{
brightness = 100;
}
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("调亮:" + request.payload.deltaPercentage.value);
break;
case "DecrementBrightnessPercentageRequest"://调暗
confirmationName = "DecrementBrightnessPercentageConfirmation";
status = 1;
brightness -= Convert.ToInt16(request.payload.deltaPercentage.value);
if (brightness < 0)
{
brightness = 0;
status = 2;
}
payload.brightness = new Domain.IoTLZEntity.Brightness() { value = Convert.ToDouble(brightness) };
payload.previousState = previousState;
sb.Append("调暗:" + request.payload.deltaPercentage.value);
break;
case "SetTemperatureRequest"://设置温度
previousState.temperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "SetTemperatureConfirmation";
status = 1;
temperature = XiaoDuToBLW(request.payload.targetTemperature.value.ToString());
if (temperature < 16)
{
temperature = 16;
}
else if (temperature > 32)
{
temperature = 32;
}
payload.targetTemperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("设温:" + temperature);
break;
case "IncrementTemperatureRequest"://调高温度
previousState.temperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "IncrementTemperatureConfirmation";
status = 1;
temperature += Convert.ToInt16(request.payload.deltaValue.value);
if (temperature > 32)
{
temperature = 32;
}
payload.targetTemperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调高温度:" + request.payload.deltaValue.value);
break;
case "DecrementTemperatureRequest"://调低温度
previousState.temperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
confirmationName = "DecrementTemperatureConfirmation";
status = 1;
temperature -= Convert.ToInt16(request.payload.deltaValue.value);
if (temperature < 16)
{
temperature = 16;
}
payload.targetTemperature = new Domain.IoTLZEntity.Temperature() { value = Convert.ToDouble(temperature) };
payload.previousState = previousState;
sb.Append("调低温度:" + request.payload.deltaValue.value);
break;
case "SetFanSpeedRequest"://设置风速
previousState.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
confirmationName = "SetFanSpeedConfirmation";
status = 1;
if (request.payload.fanSpeed.level != null & !string.IsNullOrEmpty(request.payload.fanSpeed.level))
{
switch (request.payload.fanSpeed.level.ToLower())
{
case "high":
case "max":
fanSpeed = 3;
break;
case "middle":
fanSpeed = 2;
break;
case "auto":
fanSpeed = 0;
break;
default:
fanSpeed = 1;
break;
}
sb.Append("设置风速:" + request.payload.fanSpeed.level);
}
else
{
fanSpeed = Convert.ToInt16(request.payload.fanSpeed.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
else if (fanSpeed > 3)
{
fanSpeed = 3;
}
sb.Append("设置风速:" + fanSpeed);
}
payload.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
break;
case "IncrementFanSpeedRequest"://调高风速
previousState.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
confirmationName = "IncrementFanSpeedConfirmation";
status = 1;
fanSpeed += Convert.ToInt16(request.payload.deltaValue.value);
if (fanSpeed > 3)
{
fanSpeed = 3;
}
payload.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
sb.Append("调高风速:" + request.payload.deltaValue.value);
break;
case "DecrementFanSpeedRequest"://调低风速
previousState.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
confirmationName = "DecrementFanSpeedConfirmation";
status = 1;
fanSpeed -= Convert.ToInt16(request.payload.deltaValue.value);
if (fanSpeed < 1)
{
fanSpeed = 1;
}
payload.fanSpeed = new Domain.IoTLZEntity.FanSpeed() { value = fanSpeed };
payload.previousState = previousState;
sb.Append("调低风速:" + request.payload.deltaValue.value);
break;
case "SetModeRequest"://设置模式
previousState.mode = new Domain.IoTLZEntity.Mode() { value = ModeToString(mode) };
confirmationName = "SetModeConfirmation";
status = 1;
mode = ModeToInt(request.payload.mode.value);
payload.mode = new Domain.IoTLZEntity.Mode() { deviceType = request.payload.mode.deviceType, value = request.payload.mode.value };
payload.previousState = previousState;
sb.Append("模式:" + request.payload.mode.value);
break;
case "PauseRequest"://暂停
confirmationName = "PauseConfirmation";
status = 6;
sb.Append("状态:暂停");
break;
case "ContinueRequest"://继续
confirmationName = "ContinueConfirmation";
status = 1;
sb.Append("状态:继续");
break;
case "SetTVChannelRequest"://电视跳转频道
confirmationName = "SetTVChannelConfirmation";
status = 4;
int channelNumber = 0;
if (int.TryParse(request.payload.deltaValue.value, out channelNumber))
{
valve = channelNumber;
}
else
{
var channel = RoomTypeChannelsManager.LoadAll(host.RoomType.ID).Where(r => r.Name.Contains(request.payload.deltaValue.value)).FirstOrDefault();
if (channel != null)
{
valve = channel.Code;
}
else
{
logger.Error(string.Format("{3}(酒店:{0},房号:{1})未找到对应的电视频道:{2}", host.SysHotel.Code + host.SysHotel.Name, host.RoomNumber, request.payload.deltaValue.value, platformName));
return Json(ReturnHiWeiError(request.header, "UnableToGetValueError"), JsonRequestBehavior.AllowGet);
}
}
sb.Append("调整频道至:" + valve);
break;
case "IncrementTVChannelRequest"://电视下一频道
confirmationName = "IncrementTVChannelConfirmation";
status = 1;
mode = 5;
sb.Append("频道:加");
break;
case "DecrementTVChannelRequest"://电视上一频道
confirmationName = "DecrementTVChannelConfirmation";
status = 1;
mode = 6;
sb.Append("频道:减");
break;
case "ReturnTVChannelRequest"://返回上一个观看频道
confirmationName = "ReturnTVChannelConfirmation";
status = 1;
mode = 15;
sb.Append("电视:回看");
break;
case "IncrementVolumeRequest"://增大音量
confirmationName = "IncrementVolumeConfirmation";
status = 1;
mode = 3;
sb.Append("音量:加");
break;
case "DecrementVolumeRequest"://减小音量
confirmationName = "DecrementVolumeConfirmation";
status = 1;
mode = 4;
sb.Append("音量:减");
break;
//case "SetVolumeRequest"://设置音量
// confirmationName = "SetVolumeConfirmation";
// break;
case "SetVolumeMuteRequest"://设置静音
confirmationName = "SetVolumeMuteConfirmation";
status = 1;
mode = 1;
sb.Append("音量:静音");
break;
default:
return Json(ReturnHiWeiError(request.header, "UnsupportedTargetError"), JsonRequestBehavior.AllowGet);
}
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "name", value = hostModal.Modal.Name, scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
attributes.Add(new Domain.IoTLZEntity.Attributes() { name = "turnOnState", value = status == 1 ? "ON" : "OFF", scale = "", timestampOfSample = Common.TimeHelper.GetCurrentTimestamp(false), uncertaintyInMilliseconds = "10" });
//对房间设备进行操作
HostModalManager.SetDevice(host, hostModal, status, brightness, temperature, fanSpeed, mode, valve);
if (isMonitor)
{
IOTMonitorData i = new IOTMonitorData();
i.Step = 0;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.CreateTime = DateTime.Now;
i.TriggerTime = ti;
i.HotelId = hotelid;
i.HotelCode = hotelcode;
i.RoomNumber = roomno;
i.RequestId = messageid;
i.Platform = platformName;
i.CommandDescription = reqData;
SendMQTTData.Send(i);
}
SaveSystemLog(AuthorityID, HttpContext.InnerLanguage("DeviceControl"), sb.ToString(), true, platformName, host.SysHotel.ID);
}
break;
}
payload.attributes = attributes;
if (isMonitor)
{
string sss = "控制设备结束";
IOTMonitorData i = new IOTMonitorData();
i.CreateTime = DateTime.Now;
i.Step = 5;
string ti = CPUData.GetNowPrecise().ToString("yyyy-MM-dd HH:mm:ss.ffffff");
i.TriggerTime = ti;
i.HotelId = hotelid;
i.HotelCode = hotelcode;
i.RoomNumber = roomno;
i.RequestId = messageid;
i.Platform = platformName;
i.CommandDescription = sss;
SendMQTTData.Send(i);
}
//操作完成响应小度
Domain.IoTLZEntity.ControlAppliancesResponse response = new Domain.IoTLZEntity.ControlAppliancesResponse
{
header = new Domain.IoTLZEntity.Header
{
@namespace = request.header.@namespace,
name = confirmationName
},
payload = payload
};
return new ContentResult
{
Content = new System.Web.Script.Serialization.JavaScriptSerializer { MaxJsonLength = Int32.MaxValue }.Serialize(response),
ContentType = "application/json"
};
}
default:
return Json(ReturnHiWeiError(request.header, "UnsupportedTargetError"), JsonRequestBehavior.AllowGet);
}
}
catch (Exception ex)
{
logger.Error(string.Format("处理嗨喂播放盒命令异常,数据:{0},异常:{1}", reqData, ex.ToString()));
return Json(ex.Message, JsonRequestBehavior.AllowGet);
}
}
/// <summary>
/// 返回错误信息
/// </summary>
/// <param name="header"></param>
/// <param name="errorName"></param>
/// <returns></returns>
private Domain.IoTLZEntity.ErrorResponse ReturnHiWeiError(Domain.IoTHiWeiEntity.Header header, string errorName)
{
Domain.IoTLZEntity.ErrorResponse err = new Domain.IoTLZEntity.ErrorResponse
{
header = new Domain.IoTLZEntity.Header
{
@namespace = header.@namespace,
name = errorName
},
payload = new Domain.IoTLZEntity.Payload { }
};
return err;
}
#endregion
//public static string HiWeiKey = "HiWei_";
//public static string HiWeiAppId = ConfigurationManager.AppSettings["HiWeiAppId"].ToString();
//public static string HiWeiAppSecret = ConfigurationManager.AppSettings["HiWeiAppSecret"].ToString();
//[HttpGet()]
//public ActionResult HiWeiOAuthRequest(string response_type, string client_id, string client_secret, string redirect_uri)
//{
// try
// {
// Random r = new Random();
// int code = r.Next(1, 10000);
// string id = HiWeiAppId;
// string secret = HiWeiAppSecret;
// string Key = HiWeiKey + code;
// if (response_type.Equals("code") && client_id.Equals(id) && client_secret.Equals(secret))
// {
// var t1 = Guid.NewGuid().ToString();
// var t2 = Guid.NewGuid().ToString();
// var t3 = Guid.NewGuid().ToString();
// var t4 = Guid.NewGuid().ToString();
// var token = Convert.ToBase64String(Encoding.UTF8.GetBytes(t1 + "###" + t2));
// var reftoken = Convert.ToBase64String(Encoding.UTF8.GetBytes(t3 + "###" + t4));
// HiWeiToken g = new HiWeiToken();
// g.access_token = token;
// g.refresh_token = reftoken;
// g.expires_in = new TimeSpan(20, 0, 0).TotalSeconds;
// CSRedisCacheHelper.Set_PartitionWithTime<HiWeiToken>(Key, g, 3);
// var client1 = new RestClient(redirect_uri);
// var request1 = new RestRequest("", Method.POST);
// request1.AddParameter("code", code);
// var QQQ = client1.Execute(request1);
// HttpStatusCode HHH = QQQ.StatusCode;
// }
// else
// {
// return Json(new { Result = false, Msg = "Fault" }, JsonRequestBehavior.AllowGet);//该消息表示请求消息中access token过期不能使用。
// }
// return Json(new { Result = true, Msg = "Success" }, JsonRequestBehavior.AllowGet);//该消息表示请求消息中access token过期不能使用。
// }
// catch (Exception)
// {
// return Json(new { Result = false, Msg = "Fault" }, JsonRequestBehavior.AllowGet);//该消息表示请求消息中access token过期不能使用。
// }
//}
//[HttpPost()]
//public ActionResult gettoken()
//{
// try
// {
// string code = Request.Form["code"].ToString();
// string Key = HiWeiKey + code;
// var hi = CSRedisCacheHelper.Get_Partition<HiWeiToken>(Key);
// if (hi != null)
// {
// return Json(hi, JsonRequestBehavior.AllowGet);
// }
// else
// {
// return Json(new { Result = false, Msg = "没有授权" }, JsonRequestBehavior.AllowGet);
// }
// }
// catch (Exception ex)
// {
// return Json(ex.Message, JsonRequestBehavior.AllowGet);
// }
//}
}
public class HiWeiToken
{
public string access_token { get; set; }
public string refresh_token { get; set; }
public double expires_in { get; set; }
}
public class DD
{
public string deviceId { get; set; }
public string deviceType { get; set; }
public string deviceName { get; set; }
}
public class Device
{
public string deviceType { get; set; }
public string type { get; set; }
public string deviceId { get; set; }
public string deviceName { get; set; }
}
public class Appliance
{
public string applianceId { get; set; }
public Device additionalApplianceDetails { get; set; }
}
public class header
{
public string messageId { get; set; }
public string @namespace { get; set; }
public string name { get; set; }
public string payloadVersion { get; set; }
}
public class payload
{
public string accessToken { get; set; }
public Appliance appliance { get; set; }
public LiangDu brightness { get; set; }
public WenDu targetTemperature { get; set; }
public WenDu deltaValue { get; set; }
public FengSu fanSpeed { get; set; }
public MoShi mode { get; set; }
public SeWen deltaPercentage { get; set; }
}
public class SeWen
{
public string value { get; set; }
}
public class MoShi
{
public string value { get; set; }
}
public class FengSu
{
public string level { get; set; }
public int value { get; set; }
}
public class WenDu
{
public string value { get; set; }
}
public class LiangDu
{
public double value { get; set; }
}
public class MessageData
{
public header header { get; set; }
public payload payload { get; set; }
}
public class chuangweidata
{
//public List<MessageData> data { get; set; }
public string data { get; set; }
}
public class ChuangWeiCommandData
{
public string nlp_namespace { get; set; }
public string nlp_name { get; set; }
public string query { get; set; }
public chuangweidata nlp_cmd { get; set; }
public string cuid { get; set; }
public PackageData resourcePackage { get; set; }
}
public class PackageData
{
public string skillTitle { get; set; }
public string domain { get; set; }
public int aiState { get; set; }
public string voiceprint { get; set; }
public string skillSource { get; set; }
public string tips { get; set; }
}
public class ChuangWeiControlData
{
public string hotelId { get; set; }
public string roomId { get; set; }
public string timeStamp { get; set; }
public string voiceCmd { get; set; }
}
}