using System; using System.Collections.Generic; using HDL_ON.Common; using HDL_ON.DAL.Server; using HDL_ON.UI; using Shared; namespace HDL_ON.Entity { public class SceneApiPack { static SceneApiPack _ScenePack; public static SceneApiPack ScenePack { get { if (_ScenePack == null) { _ScenePack = new SceneApiPack(); } return _ScenePack; } } } public class Scene { public Scene() { sid = NewSid(); if (!DB_ResidenceData.Instance.CheckWhetherGatewayIdIsNull()) { gatewayId = DB_ResidenceData.Instance.HomeGateway.gatewayId; } } /// /// 云端唯一ID /// public string userSceneId = null; /// /// 场景sid /// public string sid = ""; /// /// 场景名称 /// public string name = ""; /// /// 网关ID /// public string gatewayId = ""; /// /// 所属房间列表 /// public List roomIds = new List(); ///// ///// 所属房间列表 ///// //public List uids = new List(); /// /// 延时 /// public string delay = "0"; /// /// 场景的最后一次执行时间 /// public string LastExecutionTime = ""; /// /// 场景分组 /// public string group = "1"; /// /// 场景类型 /// 0:普通 /// 1:电影 /// 2:调光 /// public SceneType sceneType = SceneType.OrdinaryScenes; /// /// 收藏标记 /// public bool collect = false; /// /// 是否允许删除 /// public bool can_delete = true; /// /// 创建该场景的用户ID /// public string userId = UserInfo.Current.ID; /// /// 云端oss存储图片的路径 /// public string image = "Intelligence/Gallery/scenebg1.png"; ///// ///// 场景背景 ///// public string ImagePath { get { //if (string.IsNullOrEmpty(image)) //{ // return "Intelligence/Gallery/scenebg1.png"; //} //else //{ // return image; //} if(image == "") { image = "Intelligence/Gallery/scenebg1.png"; } if (image.Contains("Intelligence/Gallery/scenebg")) { return image; } else { var sceneImageInfo = OssSceneImages.Find((obj) => obj.defaultIconUrl == image); if (sceneImageInfo != null) { return sceneImageInfo.localUrl; } return image; } } set { var sceneImageInfo = OssSceneImages.Find((obj) => "Intelligence/Gallery/" + obj.defaultIconName + ".png" == value); if (sceneImageInfo != null) { image = sceneImageInfo.defaultIconUrl; } else { image = value; } } } /// /// 云端场景默认图库数据 /// 2022-08-03 10:57:31 wxr /// 配合豆豆修改云端数据 /// 调试宝、on pro和平台对应 /// public List OssSceneImages = new List() { new SceneImageInfo { defaultIconName = "scenebg1", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/781c397f-611a-48a2-a3ed-2520ffb971bb.png", localUrl = "Intelligence/Gallery/scenebg1.png", }, new SceneImageInfo { defaultIconName = "scenebg2", localUrl = "Intelligence/Gallery/scenebg2.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/be2a7c63-a6c0-427a-bb6d-f5c06f5b2f05.png" }, new SceneImageInfo { defaultIconName = "scenebg3", localUrl = "Intelligence/Gallery/scenebg3.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/5d801aca-03fb-4ef3-88ec-75ade3aa1c94.png" }, new SceneImageInfo { defaultIconName = "scenebg4", localUrl = "Intelligence/Gallery/scenebg4.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/a205306c-4fcd-4ea1-8e88-e84282dc0d54.png" }, new SceneImageInfo { defaultIconName = "scenebg5", localUrl = "Intelligence/Gallery/scenebg5.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/93a0acdc-14be-4776-a9fd-e0fc6f13c909.png" }, new SceneImageInfo { defaultIconName = "scenebg6", localUrl = "Intelligence/Gallery/scenebg6.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/45074923-2227-422a-be33-e37e6c3f9d23.png" }, new SceneImageInfo { defaultIconName = "scenebg7", localUrl = "Intelligence/Gallery/scenebg7.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/28b3e459-041e-4ea1-9ff9-57053c5357f4.png" }, new SceneImageInfo { defaultIconName = "scenebg8", localUrl = "Intelligence/Gallery/scenebg8.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/d470b979-cc06-4701-a2bd-7301856c9195.png" }, new SceneImageInfo { defaultIconName = "scenebg9", localUrl = "Intelligence/Gallery/scenebg9.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/1a130d03-86b2-4174-b986-6f6c312a959f.png" }, new SceneImageInfo { defaultIconName = "scenebg10", localUrl = "Intelligence/Gallery/scenebg10.png", defaultIconUrl = "http://hdl-hz-prod.oss-cn-hangzhou.aliyuncs.com/20/2022/07/54c1c7ab-9b63-4487-a77d-d5d3dadd9801.png" } }; /// /// 场景功能列表 /// public List functions = new List(); /// /// 场景推送配置列表 /// public List pushConfigs = new List(); /// /// 生成逻辑sid方法 /// public string NewSid() { string sceneId = ""; try { string sOidBeginsWith = "000101";//厂商 + 通讯方式 DateTime dt = DateTime.Now; DateTime startTime = TimeZoneInfo.ConvertTimeToUtc(new DateTime(2020, 1, 1)); long m = (long)((dt - startTime).TotalMilliseconds / 10); string sTimeSpan = "00000000"; byte[] arry = new byte[4]; arry[0] = (byte)(m & 0xFF); arry[1] = (byte)((m & 0xFF00) >> 8); arry[2] = (byte)((m & 0xFF0000) >> 16); arry[3] = (byte)((m >> 24) & 0xFF); sTimeSpan = arry[0].ToString("X2") + arry[1].ToString("X2") + arry[2].ToString("X2") + arry[3].ToString("X2"); if (sTimeSpan.Length >= 8) { sTimeSpan = sTimeSpan.Substring(0, 8); } else { sTimeSpan = Guid.NewGuid().ToString().Substring(0, 8); //sTimeSpan = "00000000"; } sceneId = sOidBeginsWith + sTimeSpan; sceneId += "0A"; sceneId += "0A01"; int maxId = 1; for (int i = 0; i < FunctionList.List.scenes.Count; i++) { string s = FunctionList.List.scenes[i].sid.Substring(20, 4); int iThisSceneId = Convert.ToInt16(s, 16); if (iThisSceneId > maxId) maxId = iThisSceneId; } sceneId += (maxId + 1).ToString("X4"); sceneId += "0000"; } catch { return sceneId; } return sceneId; } /// /// 获取设备添加到房间的房间名称 /// /// public string GetRoomListName() { string roomNameList = ""; foreach (var roomId in roomIds) { var findRoom = SpatialInfo.CurrentSpatial.RoomList.Find(obj => obj.roomId == roomId); if (findRoom == null) { continue; } if (roomNameList != "") { roomNameList += ","; } roomNameList += findRoom.floorName + findRoom.roomName; } if (roomNameList == "") { roomNameList = Shared.Language.StringByID(StringId.WholeZone); } return roomNameList; } /// /// 数据存储文件名 /// [Newtonsoft.Json.JsonIgnore] public string savePath { get { return "SceneData_" + sid; } } /// /// 执行倒计时 /// int countdownTime = 0; /// /// 重置执行倒计时 /// public void ResetCountdownTime() { countdownTime = 0; } /// /// 场景执行\倒计时 /// /// public void SceneCountDown(Button btnShowDelay) { //场景正在倒计时执行中 if (LastExecutionTime != "" && Convert.ToDouble(LastExecutionTime) + Convert.ToDouble(delay) > Convert.ToDouble(Utlis.GetTimestamp(false))) { int.TryParse(Convert.ToInt32( Convert.ToDouble(LastExecutionTime) + Convert.ToDouble(delay) - Convert.ToDouble(Utlis.GetTimestamp(false)) ).ToString(), out countdownTime); if (countdownTime > 0) { new System.Threading.Thread(() => { if (countdownTime > 0) { while (countdownTime > 0) { Application.RunOnMainThread(() => { if (countdownTime > 60) { btnShowDelay.Text = (countdownTime / 60).ToString() + "min" + countdownTime % 60 + "s"; } else { btnShowDelay.Text = countdownTime.ToString() + "s"; } }); System.Threading.Thread.Sleep(1000); countdownTime--; } Application.RunOnMainThread(() => { btnShowDelay.Text = ""; }); } }) { IsBackground = true, Priority = System.Threading.ThreadPriority.BelowNormal }.Start(); } } } /// /// 保存场景数据文件 /// public void SaveSceneFile() { var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)); FileUtlis.Files.WriteFileByBytes(savePath, ssd); MainPage.Log($"Save Scene Data : {savePath}"); } /// /// 收藏场景 /// /// public void CollectScene() { var result = StateCode.SUCCESS; new System.Threading.Thread(() => { if (collect) { result = ApiUtlis.Ins.HttpRequest.CollectScene(userSceneId); } else { result = ApiUtlis.Ins.HttpRequest.CancelCollectScene(userSceneId); } //提示错误 if (result != StateCode.SUCCESS) { Application.RunOnMainThread(() => { collect = !collect; IMessageCommon.Current.ShowErrorInfoAlter(result); }); } }) { IsBackground = true }.Start(); } /// /// 编辑场景 /// public string EditScene() { var pm = new HttpServerRequest(); var revPack = pm.EditScene(this); if (revPack.Code == StateCode.SUCCESS) { //重置执行倒计时 this.countdownTime = 0; if (MainPage.NoLoginMode) { var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)); Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd); } var scenes = Newtonsoft.Json.JsonConvert.DeserializeObject>(revPack.Data.ToString()); var tempScene = scenes.Find((obj) => obj.sid == sid); if (tempScene != null) { var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(tempScene)); Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd); } } return revPack.Code; } /// /// 修改场景 /// public string UpdateScene() { if (MainPage.NoLoginMode) { var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)); Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd); return "0"; } var pm = new HttpServerRequest(); var revPack = pm.EditScene(this); if (revPack.Code == StateCode.SUCCESS) { this.countdownTime = 0; var scenes = Newtonsoft.Json.JsonConvert.DeserializeObject>(revPack.Data.ToString()); var tempScene = scenes.Find((obj) => obj.sid == sid); if (tempScene != null) { var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(tempScene)); Common.FileUtlis.Files.WriteFileByBytes(savePath, ssd); } } return revPack.Code; } /// /// 延时显示的文本 /// public string GetDelayText() { var delayInt = 0; int.TryParse(delay, out delayInt); if (delayInt == 0) { return Language.StringByID(StringId.NoDelay); } string text = ""; if (delayInt > 60) { text = (delayInt / 60) + Language.StringByID(StringId.m) + (delayInt % 60) + Language.StringByID(StringId.s); } else { text = delayInt + Language.StringByID(StringId.s); } return text; switch (delay) { case "0": text = Language.StringByID(StringId.NoDelay); break; case "30": text = "30s"; break; case "60": text = "1min"; break; case "120": text = "2min"; break; case "300": text = "5min"; break; } return text; } /// /// 云端数据创建的时间 /// public string createTime = ""; /// /// 云端数据修改的最后时间 /// public string modifyTime = ""; } /// /// 场景功能对象 /// public class SceneFunction { public string sid = ""; public List status = new List(); /// /// 功能延时 /// public string delay = "0"; Function _localFunction; /// /// 本地对应的功能 /// [Newtonsoft.Json.JsonIgnore] public Function localFunction { get { if (_localFunction == null) { _localFunction = ConvertFunctionObject(); } return _localFunction; } } /// /// 转换成功能对象 /// /// private Function ConvertFunctionObject() { var localFunction = FunctionList.List.GetDeviceFunctionList().Find((obj) => obj.sid == sid); return localFunction; } /// /// 解析场景功能数据 /// /// public string GetFunctionScnenInfo() { var sceneFunctionInfo = ""; foreach (var sfs in status) { if (sfs.key == FunctionAttributeKey.OnOff) { if (sfs.value == "off") { return Language.StringByID(StringId.Close); } } } sceneFunctionInfo += Language.StringByID(StringId.Open) + " "; var modeState = status.Find((obj) => obj.key == FunctionAttributeKey.Mode); var tempState = status.Find((obj) => obj.key == FunctionAttributeKey.SetTemp); var fanState = status.Find((obj) => obj.key == FunctionAttributeKey.FanSpeed); if (modeState != null) { sceneFunctionInfo += modeState.GetValueText() + " "; } if (tempState != null) { sceneFunctionInfo += tempState.GetValueText() + " "; sceneFunctionInfo += tempState.GetUintString(); } if (fanState != null) { sceneFunctionInfo += fanState.GetValueText() + " "; } var briState = status.Find((obj) => obj.key == FunctionAttributeKey.Brightness); if (briState != null) { sceneFunctionInfo += briState.value + "%" + " "; } var perState = status.Find((obj) => obj.key == FunctionAttributeKey.Percent); if (perState != null) { sceneFunctionInfo += perState.value + "%" + " "; } var cctState = status.Find((obj) => obj.key == FunctionAttributeKey.CCT); if (cctState != null) { sceneFunctionInfo += cctState.value + "K" + " "; } var rgbState = status.Find((obj) => obj.key == FunctionAttributeKey.RGB); if (rgbState != null) { //sceneFunctionInfo += new cctState.value + "%" + " "; } var perAngle = status.Find((obj) => obj.key == FunctionAttributeKey.Angle); if (perAngle != null) { sceneFunctionInfo += " " + perAngle.value + "°"; } return sceneFunctionInfo; } } /// /// 场景功能属性 /// public class SceneFunctionStatus { public string key = ""; public string value = ""; public int max = 0; public int min = 0; /// /// 属性的值列表 /// public List valueList = new List(); /// /// 属性名称显示文本 /// 中英文显示 /// public string GetNameText() { string text = ""; switch (key) { case FunctionAttributeKey.OnOff: text = Language.StringByID(StringId.OnOff); break; case FunctionAttributeKey.Brightness: text = Language.StringByID(StringId.Brightness); break; case FunctionAttributeKey.RGB: text = Language.StringByID(StringId.ColorValue); break; case FunctionAttributeKey.Mode: text = Language.StringByID(StringId.Mode); break; case FunctionAttributeKey.FanSpeed: text = Language.StringByID(StringId.FanSpeed); break; case FunctionAttributeKey.SetTemp: text = Language.StringByID(StringId.Temp); break; case FunctionAttributeKey.RoomTemp: text = Language.StringByID(StringId.IndoorTemp); break; case FunctionAttributeKey.Delay: text = Language.StringByID(StringId.Delay); break; case FunctionAttributeKey.CCT: text = "CCT"; break; case FunctionAttributeKey.Percent: text = Language.StringByID(StringId.PercentAdjustment); break; case FunctionAttributeKey.FadeTime: text = Language.StringByID(StringId.FadeSpeed); break; case "angle": text = Language.StringByID(StringId.Angle); break; case "security": text = Language.StringByID(StringId.DeploymentStatus); break; } return text; } /// /// 属性值单位 /// public string GetUintString(string inputKey = "") { var us = ""; var swithchString = key; if (!string.IsNullOrEmpty(inputKey)) { swithchString = inputKey; } switch (swithchString) { case FunctionAttributeKey.SetTemp: case FunctionAttributeKey.RoomTemp: us = "°C"; break; case FunctionAttributeKey.Percent: case FunctionAttributeKey.Brightness: us = "%"; break; case FunctionAttributeKey.CCT: us = "K"; break; case FunctionAttributeKey.Angle: us = "°"; break; } return us; } /// /// 获取指定属性的显示文本 /// 中英文显示 /// public string GetValueText(string temp = "") { string catchString = value; if (temp != "") { catchString = temp; } string text = ""; switch (key) { case FunctionAttributeKey.Security: text = catchString == "true" ? Language.StringByID(StringId.Defense) : Language.StringByID(StringId.Undefense); break; case FunctionAttributeKey.OnOff: text = catchString == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF); break; case FunctionAttributeKey.SetTemp: case FunctionAttributeKey.RoomTemp: case FunctionAttributeKey.Brightness: case FunctionAttributeKey.Percent: case FunctionAttributeKey.CCT: case FunctionAttributeKey.Angle: int outT = 0; int.TryParse(catchString, out outT); if (outT < 0) catchString = "0"; if (catchString == "") { catchString = "0"; } text = catchString; break; case FunctionAttributeKey.Mode: switch (catchString) { //----空调 case "auto": text = Language.StringByID(StringId.Auto); break; case "cool": text = Language.StringByID(StringId.Cool); break; case "heat": text = Language.StringByID(StringId.Heat); break; case "dry": text = Language.StringByID(StringId.Dry); break; case "fan": text = Language.StringByID(StringId.AirSupply); break; //-----地热 // 1:普通,2:白天,3:夜晚,4:离开,5:时间 case "day": text = Language.StringByID(StringId.Day); break; case "night": text = Language.StringByID(StringId.Night); break; case "away": text = Language.StringByID(StringId.Away); break; case "normal": text = Language.StringByID(StringId.Normal); break; case "timer": text = Language.StringByID(StringId.Timer); break; } break; case FunctionAttributeKey.FanSpeed: switch (catchString) { case "high": text = Language.StringByID(StringId.HighWindSpeed); break; case "medium": text = Language.StringByID(StringId.MiddleWindSpeed); break; case "low": text = Language.StringByID(StringId.LowWindSpeed); break; case "auto": text = Language.StringByID(StringId.Auto); break; default: text = "low"; break; } break; case "high": text = Language.StringByID(StringId.HighWindSpeed); break; case "medium": text = Language.StringByID(StringId.MiddleWindSpeed); break; case "low": text = Language.StringByID(StringId.LowWindSpeed); break; case "auto": text = Language.StringByID(StringId.Auto); break; } return text; } } /// /// 场景推送配置 /// public class ScenePushConfig { /// /// 推送方式 /// public string pushMethod = ""; /// /// 推送内容 /// public string pushContent = ""; /// /// 推送目标集合 /// public List pushTarget = new List(); } public class SceneImageInfoList { //public Dictionary Dic_SceneImages; //public SceneImageInfoList() //{ // Dic_SceneImages = new Dictionary(); // foreach(var sceneImage in sceneImages) // { // Dic_SceneImages.Add(sceneImage.defaultIconName, sceneImage.defaultIconUrl); // } //} } public class SceneImageInfo { public string defaultIconName; public string defaultIconUrl; public string localUrl; } }