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;
|
}
|
}
|
/// <summary>
|
/// 云端唯一ID
|
/// </summary>
|
public string userSceneId = null;
|
/// <summary>
|
/// 场景sid
|
/// </summary>
|
public string sid = "";
|
/// <summary>
|
/// 场景名称
|
/// </summary>
|
public string name = "";
|
/// <summary>
|
/// 网关ID
|
/// </summary>
|
public string gatewayId = "";
|
/// <summary>
|
/// 云端oss存储图片的路径
|
/// </summary>
|
public string image = "";
|
/// <summary>
|
/// 所属房间列表
|
/// </summary>
|
public List<string> roomIds = new List<string>();
|
///// <summary>
|
///// 所属房间列表
|
///// </summary>
|
//public List<string> uids = new List<string>();
|
/// <summary>
|
/// 延时
|
/// </summary>
|
public string delay = "0";
|
/// <summary>
|
/// 场景的最后一次执行时间
|
/// </summary>
|
public string LastExecutionTime = "";
|
|
/// <summary>
|
/// 场景分组
|
/// </summary>
|
public string group = "1";
|
/// <summary>
|
/// 场景类型
|
/// </summary>
|
public SceneType sceneType = SceneType.OrdinaryScenes;
|
/// <summary>
|
/// 收藏标记
|
/// </summary>
|
public bool collect = false;
|
|
/// <summary>
|
/// 创建该场景的用户ID
|
/// </summary>
|
public string userId = "";
|
|
///// <summary>
|
///// 场景背景
|
///// </summary>
|
public string ImagePath
|
{
|
get
|
{
|
if (string.IsNullOrEmpty(image))
|
{
|
return "Intelligence/Gallery/scenebg1.png";
|
}
|
else
|
{
|
return image;
|
}
|
}
|
set
|
{
|
image = value;
|
}
|
}
|
|
|
/// <summary>
|
/// 场景功能列表
|
/// </summary>
|
public List<SceneFunction> functions = new List<SceneFunction>();
|
/// <summary>
|
/// 场景推送配置列表
|
/// </summary>
|
public List<ScenePushConfig> pushConfigs = new List<ScenePushConfig>();
|
|
/// <summary>
|
/// 生成逻辑sid方法
|
/// </summary>
|
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;
|
}
|
|
/// <summary>
|
/// 获取设备添加到房间的房间名称
|
/// </summary>
|
/// <returns></returns>
|
public string GetRoomListName()
|
{
|
string roomNameList = "";
|
foreach (var roomId in roomIds)
|
{
|
var findRoom = SpatialInfo.CurrentSpatial.RoomList.Find(obj => obj.roomId == roomId);
|
if (findRoom == null)
|
{
|
continue;
|
}
|
if (roomNameList != "")
|
{
|
roomNameList += ",";
|
}
|
roomNameList += findRoom.floorName + findRoom.roomName;
|
}
|
if (roomNameList == "" )
|
{
|
roomNameList = Shared.Language.StringByID(StringId.WholeZone);
|
}
|
return roomNameList;
|
}
|
|
/// <summary>
|
/// 数据存储文件名
|
/// </summary>
|
[Newtonsoft.Json.JsonIgnore]
|
public string savePath
|
{
|
get
|
{
|
return "SceneData_" + sid;
|
}
|
}
|
/// <summary>
|
/// 场景执行\倒计时
|
/// </summary>
|
/// <param name="btnShowDelay"></param>
|
public void SceneCountDown(Button btnShowDelay)
|
{
|
//场景正在倒计时执行中
|
if (LastExecutionTime != "" && Convert.ToDouble(LastExecutionTime) + Convert.ToDouble(delay) > Convert.ToDouble(Utlis.GetTimestamp(false)))
|
{
|
int time = 0;
|
int.TryParse(Convert.ToInt32(
|
Convert.ToDouble(LastExecutionTime) + Convert.ToDouble(delay) - Convert.ToDouble(Utlis.GetTimestamp(false))
|
).ToString(), out time);
|
if (time > 0)
|
{
|
new System.Threading.Thread(() =>
|
{
|
if (time > 0)
|
{
|
while (time > 0)
|
{
|
Application.RunOnMainThread(() =>
|
{
|
if (time > 60)
|
{
|
btnShowDelay.Text = (time / 60).ToString() + "min" + time % 60 + "s";
|
}
|
else
|
{
|
btnShowDelay.Text = time.ToString() + "s";
|
}
|
});
|
System.Threading.Thread.Sleep(1000);
|
time--;
|
}
|
Application.RunOnMainThread(() =>
|
{
|
btnShowDelay.Text = "";
|
});
|
}
|
})
|
{ IsBackground = true, Priority = System.Threading.ThreadPriority.BelowNormal }.Start();
|
}
|
}
|
}
|
/// <summary>
|
/// 保存场景数据文件
|
/// </summary>
|
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}");
|
}
|
|
/// <summary>
|
/// 收藏场景
|
/// </summary>
|
/// <returns></returns>
|
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();
|
}
|
|
/// <summary>
|
/// 编辑场景
|
/// </summary>
|
public string EditScene()
|
{
|
var pm = new HttpServerRequest();
|
var revPack = pm.EditScene(this);
|
if (revPack.Code == StateCode.SUCCESS)
|
{
|
var scenes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Scene>>(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;
|
}
|
|
/// <summary>
|
/// 修改场景
|
/// </summary>
|
public string UpdateScene()
|
{
|
var pm = new HttpServerRequest();
|
var revPack = pm.EditScene(this);
|
if (revPack.Code == StateCode.SUCCESS)
|
{
|
var scenes = Newtonsoft.Json.JsonConvert.DeserializeObject<List<Scene>>(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;
|
}
|
|
/// <summary>
|
/// 延时显示的文本
|
/// </summary>
|
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;
|
}
|
/// <summary>
|
/// 云端数据创建的时间
|
/// </summary>
|
public string createTime = "";
|
/// <summary>
|
/// 云端数据修改的最后时间
|
/// </summary>
|
public string modifyTime = "";
|
|
|
}
|
/// <summary>
|
/// 场景功能对象
|
/// </summary>
|
public class SceneFunction
|
{
|
public string sid = "";
|
|
public List<SceneFunctionStatus> status = new List<SceneFunctionStatus>();
|
/// <summary>
|
/// 功能延时
|
/// </summary>
|
public string delay = "0";
|
|
Function _localFunction;
|
/// <summary>
|
/// 本地对应的功能
|
/// </summary>
|
[Newtonsoft.Json.JsonIgnore]
|
public Function localFunction
|
{
|
get
|
{
|
if (_localFunction == null)
|
{
|
_localFunction = ConvertFunctionObject();
|
}
|
return _localFunction;
|
}
|
}
|
|
/// <summary>
|
/// 转换成功能对象
|
/// </summary>
|
/// <returns></returns>
|
Function ConvertFunctionObject()
|
{
|
var localFunction = FunctionList.List.GetDeviceFunctionList().Find((obj) => obj.sid == sid);
|
return localFunction;
|
}
|
|
|
/// <summary>
|
/// 解析场景功能数据
|
/// </summary>
|
/// <param name="sceneFunction"></param>
|
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 + "%";
|
}
|
return sceneFunctionInfo;
|
}
|
|
|
}
|
|
/// <summary>
|
/// 场景功能属性
|
/// </summary>
|
public class SceneFunctionStatus
|
{
|
public string key = "";
|
public string value = "";
|
|
/// <summary>
|
/// 属性名称显示文本
|
/// 中英文显示
|
/// </summary>
|
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;
|
}
|
return text;
|
}
|
|
|
/// <summary>
|
/// 属性值单位
|
/// </summary>
|
public string GetUintString()
|
{
|
var us = "";
|
switch (key)
|
{
|
case FunctionAttributeKey.SetTemp:
|
case FunctionAttributeKey.RoomTemp:
|
us = "°C";
|
break;
|
case FunctionAttributeKey.Percent:
|
case FunctionAttributeKey.Brightness:
|
us = "%";
|
break;
|
}
|
return us;
|
}
|
|
|
/// <summary>
|
/// 获取指定属性的显示文本
|
/// 中英文显示
|
/// </summary>
|
public string GetValueText()
|
{
|
string text = "";
|
switch (key)
|
{
|
case FunctionAttributeKey.OnOff:
|
text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
|
break;
|
case FunctionAttributeKey.SetTemp:
|
case FunctionAttributeKey.RoomTemp:
|
case FunctionAttributeKey.Brightness:
|
case FunctionAttributeKey.Percent:
|
if (value == "")
|
{
|
value = "0";
|
}
|
text = value;
|
break;
|
case FunctionAttributeKey.Mode:
|
switch (value)
|
{
|
//----空调
|
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;
|
//-----地热
|
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 (value)
|
{
|
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;
|
}
|
|
|
}
|
/// <summary>
|
/// 场景推送配置
|
/// </summary>
|
public class ScenePushConfig
|
{
|
/// <summary>
|
/// 推送方式
|
/// </summary>
|
public string pushMethod = "";
|
/// <summary>
|
/// 推送内容
|
/// </summary>
|
public string pushContent = "";
|
/// <summary>
|
/// 推送目标集合
|
/// </summary>
|
public List<string> pushTarget = new List<string>();
|
}
|
|
}
|