Files
Web_CRICS_Server_VS2010_Prod/WebSite/Controllers/IoTController.cs

7269 lines
450 KiB
C#
Raw Normal View History

2025-12-11 09:17:16 +08:00
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);
2025-12-11 09:17:16 +08:00
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; }
}
2025-12-11 09:17:16 +08:00
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; }
}
2025-12-11 09:17:16 +08:00
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; }
}
2025-12-11 09:17:16 +08:00
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");
2025-12-11 09:17:16 +08:00
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; }
}
2025-12-11 09:17:16 +08:00
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;
}
}
2025-12-11 09:17:16 +08:00
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);
2025-12-11 09:17:16 +08:00
}, 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; }
}
}