using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using HDL_ON.DAL;
using HDL_ON.DAL.Server;
using Shared;
namespace HDL_ON.Entity
{
public class FunctionList
{
static FunctionList _FunctionList;
public static FunctionList List
{
get
{
if(_FunctionList == null)
{
_FunctionList = new FunctionList();
#region 恢复数据
var filePathList = Common.FileUtlis.Files.ReadFiles();
foreach (var filePath in filePathList)
{
_FunctionList.IniFunctionList(filePath);
}
#endregion
}
return _FunctionList;
}
}
///
/// 空调列表
///
public List aCs = new List();
///
/// 灯光列表
///
public List lights = new List();
///
/// 窗帘列表
///
public List curtains = new List();
///
/// 地热列表
///
public List floorHeatings = new List();
#region 家电列表 electricals
///
/// 家电列表
///
public List electricals
{
get
{
if(fans == null)
{
fans = new List();
}
if(switchSockets == null)
{
switchSockets = new List();
}
if(tVs == null)
{
tVs = new List();
}
var list = new List();
list.AddRange(fans);
list.AddRange(switchSockets);
list.AddRange(tVs);
return list;
}
}
///
/// 风扇列表
///
public List fans = new List();
///
/// 电视列表
///
public List tVs = new List();
///
/// 家电列表
///
public List switchSockets = new List();
#endregion
///
/// 环境传感器列表
///
public List sensorsEnvironmentalScience = new List();
///
/// 场景列表
///
public List scenes = new List();
///
/// 功能列表
///
List deviceFunctionList = new List();
///
/// 加载功能列表
/// todo 需要优化,后期不能保证能使用sid解析出是什么类型的设备
///
///
public void IniFunctionList(string filePath)
{
if (filePath.StartsWith("FunctionData_"))
{
var functionDataBytes = Common.FileUtlis.Files.ReadFile(filePath);
var functionDataString = System.Text.Encoding.UTF8.GetString(functionDataBytes);
var tempFunction = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
if (tempFunction == null)
{
Common.FileUtlis.Files.DeleteFile(filePath);
return;
}
if (tempFunction.DeleteSign)
{
//todo 删除云端数据 20201203--App不能删除功能数据
}
else
{
switch (tempFunction.spk)
{
case SPK.LightSwitch:
case SPK.LightDimming:
case SPK.LightRGB:
case SPK.LightRGBW:
case SPK.LightCCT:
var light = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.lights.Add(light);
deviceFunctionList.Add(light);
break;
case SPK.CurtainRoller:
case SPK.CurtainShades:
case SPK.CurtainSwitch:
case SPK.CurtainTrietex:
var curtain = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.curtains.Add(curtain);
deviceFunctionList.Add(curtain);
break;
case SPK.AcStandard:
var ac = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.aCs.Add(ac);
deviceFunctionList.Add(ac);
break;
case SPK.FloorHeatStandard:
var fh = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.floorHeatings.Add(fh);
deviceFunctionList.Add(fh);
break;
case SPK.SensorPm25:
case SPK.SensorCO2:
case SPK.SensorTVOC:
case SPK.SensorTemperature:
case SPK.SensorHumidity:
var sensor = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.sensorsEnvironmentalScience.Add(sensor);
deviceFunctionList.Add(sensor);
break;
case SPK.ElectricSocket:
var ele = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.switchSockets.Add(ele);
deviceFunctionList.Add(ele);
break;
case SPK.ElectricTV:
var tv = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.tVs.Add(tv);
deviceFunctionList.Add(tv);
break;
case SPK.ElectricFan:
var fan = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString);
_FunctionList.fans.Add(fan);
deviceFunctionList.Add(fan);
break;
}
}
}
if (filePath.StartsWith("SceneData_"))
{
var sceneDataBytes = Common.FileUtlis.Files.ReadFile(filePath);
var sceneDataString = System.Text.Encoding.UTF8.GetString(sceneDataBytes);
var tempScene = Newtonsoft.Json.JsonConvert.DeserializeObject(sceneDataString);
List.scenes.Add(tempScene);
}
}
///
/// 获取设备功能列表
///
public List GetDeviceFunctionList()
{
if (deviceFunctionList == null || deviceFunctionList.Count == 0)
{
deviceFunctionList = new List();
deviceFunctionList.AddRange(aCs);
deviceFunctionList.AddRange(lights);
deviceFunctionList.AddRange(curtains);
deviceFunctionList.AddRange(floorHeatings);
deviceFunctionList.AddRange(electricals);
deviceFunctionList.AddRange(sensorsEnvironmentalScience);
deviceFunctionList.AddRange(UI.Music.A31MusicModel.A31MusicModelList);
}
try
{
deviceFunctionList.OrderByDescending(o => o.usageCount).ToList();
}
catch (Exception ex)
{
MainPage.Log($"设备功能排序异常:{ex.Message}");
}
return deviceFunctionList;
}
///
/// 清空设备功能列表
///
public void Clear()
{
_FunctionList.aCs = new List();
_FunctionList.lights = new List();
_FunctionList.curtains = new List();
_FunctionList.floorHeatings = new List();
_FunctionList.tVs = new List();
_FunctionList.switchSockets = new List();
_FunctionList.fans = new List();
_FunctionList.sensorsEnvironmentalScience = new List();
_FunctionList.scenes = new List();
_FunctionList.deviceFunctionList = null;
_FunctionList = null;
}
///
/// 接收bus软件上传的功能
/// tcp方式
///
///
public void AddDeviceFunction(Function sidObj0)
{
switch (sidObj0.functionType)
{
case FunctionType.AC:
var sidObj = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.aCs.Add(sidObj);
sidObj.SaveFunctionData(false);
break;
case FunctionType.FloorHeating:
var sidObj1 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.floorHeatings.Add(sidObj1);
sidObj1.SaveFunctionData(false);
break;
case FunctionType.Dimmer:
case FunctionType.RGB:
case FunctionType.Relay:
var sidObj2 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.lights.Add(sidObj2);
sidObj2.SaveFunctionData(false);
break;
case FunctionType.Curtain:
case FunctionType.RollingShutter:
case FunctionType.MotorCurtain:
var sidObj3 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.curtains.Add(sidObj3 );
sidObj3.SaveFunctionData(false);
break;
case FunctionType.TV:
var sidObj4 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.tVs.Add(sidObj4);
sidObj4.SaveFunctionData(false);
break;
case FunctionType.Socket:
var sidObj5 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.switchSockets.Add(sidObj5);
sidObj5.SaveFunctionData(false);
break;
case FunctionType.Fan:
var sidObj6 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.fans.Add(sidObj6);
sidObj6.SaveFunctionData(false);
break;
case FunctionType.CO2:
case FunctionType.TVOC:
case FunctionType.PM25:
case FunctionType.Temp:
case FunctionType.Humidity:
var sidObj7 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0));
List.sensorsEnvironmentalScience.Add(sidObj7);
sidObj7.SaveFunctionData(false);
break;
}
}
///
/// 接收bus软件上传的功能
/// http udp
///
///
public void AddFunction(object obj)
{
var f = Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString());
if (f == null)
return;
switch (f.functionCategory)
{
case FunctionCategory.Thermostat:
switch (f.functionType)
{
case FunctionType.AC:
_FunctionList.aCs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionType.FloorHeating:
_FunctionList.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
}
break;
case FunctionCategory.Light:
_FunctionList.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionCategory.Curtain:
_FunctionList.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionCategory.Electrical:
switch(f.functionType)
{
case FunctionType.TV:
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionType.Socket:
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
case FunctionType.Fan:
_FunctionList.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
}
break;
case FunctionCategory.Sensor:
switch(f.functionType)
{
case FunctionType.TVOC:
case FunctionType.CO2:
case FunctionType.PM25:
case FunctionType.Humidity:
case FunctionType.Temp:
_FunctionList.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()));
break;
}
break;
}
}
///
/// 功能绑定房间
///
public string FunctionsBindRooms(List roomIds,List deviceIds)
{
var pm = new HttpServerRequest();
var pack = pm.BindDeviceToRoom(deviceIds, roomIds);
if(pack.Code == StateCode.SUCCESS)
{
}
else
{
Utlis.ShowTip(Shared.Language.StringByID(StringId.EditFunctionInfoFail) + "\r\nCode:" + pack.Code);
}
return pack.Code;
}
///
/// 下来云端设备数据
///
public void DownloadFunctionList()
{
new Thread(() =>
{
var pm = new HttpServerRequest();
var pack = pm.GetDeviceList();
if (pack.Code == StateCode.SUCCESS)
{
var deviceList = Newtonsoft.Json.JsonConvert.DeserializeObject(pack.Data.ToString());
if (deviceList != null)
{
if (List.GetDeviceFunctionList().Count > 0)
{
for (int i = 0; i < List.GetDeviceFunctionList().Count;)
{
var localFunction = List.GetDeviceFunctionList()[i];
if (localFunction.functionCategory == FunctionCategory.Music)
{
i++;
continue;
}
var newFunction = deviceList.list.Find((obj) => obj.deviceId == localFunction.deviceId);
if (newFunction == null)//如果云端最新数据没有该条数据,则本地需要删掉该数据记录
{
List.DeleteFunction(localFunction);
}
else
{
i++;
if (localFunction.modifyTime != newFunction.modifyTime)
{
MainPage.Log($"local:{localFunction.modifyTime}\r\n server:{newFunction.modifyTime}");
localFunction.name = newFunction.name;
localFunction.collect = newFunction.collect;
localFunction.modifyTime = newFunction.modifyTime;
localFunction.roomIds = newFunction.roomIds;
localFunction.bus = newFunction.bus;
localFunction.SaveFunctionData(false);
}
deviceList.list.Remove(newFunction);//操作完的数据清理掉,剩下的就是新增的功能
}
}
}
//处理剩下的新增功能
foreach (var newFunction in deviceList.list)
{
newFunction.SaveFunctionData(false);
List.IniFunctionList(newFunction.savePath);
}
}
//MainPage.Log($"读取云端设备数据:\r\n{ pack.Data.ToString()}");
}
else
{
MainPage.Log($"读取云端设备数据失败:\r\nCode:{pack.Code}; Msg:{pack.message}");
}
})
{ IsBackground = true }.Start();
}
///
/// 下载云端场景数据
///
public void DownloadSceneList()
{
new Thread(() =>
{
var pm = new HttpServerRequest();
var pack = pm.GetSceneList();
if(pack.Code == StateCode.SUCCESS)
{
//MainPage.Log($"读取云端场景数据:\r\n{pack.Data.ToString()}");
var sceneList = Newtonsoft.Json.JsonConvert.DeserializeObject>(pack.Data.ToString());
if (sceneList != null)
{
for (int i=0;i obj.userSceneId == localScene.userSceneId);
if (newScene == null)//如果云端最新数据没有该条数据,则本地需要删掉该数据记录
{
List.DeleteScene(localScene,false);
}
else
{
i++;
if (localScene.modifyTime != newScene.modifyTime)
{
localScene.name = newScene.name;
localScene.collect = newScene.collect;
localScene.modifyTime = newScene.modifyTime;
localScene.roomIds = newScene.roomIds;
localScene.SaveSceneData(false);
}
sceneList.Remove(newScene);//操作完的数据清理掉,剩下的就是新增的功能
}
}
//处理剩下的新增功能
foreach (var newScene in sceneList)
{
newScene.SaveSceneData(false);
List.scenes.Add(newScene);
}
}
}
else
{
MainPage.Log($"读取云端场景数据失败:\r\nCode:{pack.Code}; Msg:{pack.message}");
}
})
{ IsBackground = true }.Start();
}
///
/// 删除场景
///
public void DeleteScene(Scene scene,bool upSevser)
{
if (upSevser)
{
var pm = new HttpServerRequest();
var packCode = pm.DeleteScene(scene.userSceneId);
if (packCode == StateCode.SUCCESS)
{
Common.FileUtlis.Files.DeleteFile(scene.savePath);
List.scenes.Remove(scene);
}
else
{
Utlis.ShowTip(Shared.Language.StringByID(StringId.DeleteSceneFail) + "Code:" + packCode);
}
}
else
{
Common.FileUtlis.Files.DeleteFile(scene.savePath);
List.scenes.Remove(scene);
}
}
///
/// 删除本地功能文件
///
public void DeleteFunction(Function delTemp)
{
switch (delTemp.spk)
{
case SPK.LightSwitch:
case SPK.LightDimming:
case SPK.LightRGB:
case SPK.LightRGBW:
case SPK.LightCCT:
_FunctionList.lights.Remove(_FunctionList.lights.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
case SPK.CurtainRoller:
case SPK.CurtainShades:
case SPK.CurtainSwitch:
case SPK.CurtainTrietex:
_FunctionList.curtains.Remove(_FunctionList.curtains.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
case SPK.AcStandard:
_FunctionList.aCs.Remove(_FunctionList.aCs.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
case SPK.FloorHeatStandard:
_FunctionList.floorHeatings.Remove(_FunctionList.floorHeatings.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
case SPK.SensorPm25:
case SPK.SensorCO2:
case SPK.SensorTVOC:
case SPK.SensorTemperature:
case SPK.SensorHumidity:
_FunctionList.sensorsEnvironmentalScience.Remove(_FunctionList.sensorsEnvironmentalScience.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
case SPK.ElectricSocket:
_FunctionList.switchSockets.Remove(_FunctionList.switchSockets.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
case SPK.ElectricTV:
_FunctionList.tVs.Remove(_FunctionList.tVs.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
case SPK.ElectricFan:
_FunctionList.fans.Remove(_FunctionList.fans.Find((obj) => obj.deviceId == delTemp.deviceId));
break;
}
var removeTemp = deviceFunctionList.Find((obj) => obj.deviceId == delTemp.deviceId);
if(removeTemp!= null)
{
deviceFunctionList.Remove(removeTemp);
}
Common.FileUtlis.Files.DeleteFile(delTemp.savePath);
}
bool lockReadFunctionStatus = false;
///
/// 读取全部功能的状态
///
public void ReadAllFunctionStatus()
{
if (lockReadFunctionStatus)
{
MainPage.Log($"多次进入--返回");
return;
}
new Thread(() =>
{
if (lockReadFunctionStatus)
{
MainPage.Log($"多次进入--返回");
return;
}
MainPage.Log($"进入--读取");
lockReadFunctionStatus = true;
try
{
if (DriverLayer.Control.Ins.IsRemote)
{
var functionIds = new List();
foreach (var function in GetDeviceFunctionList())
{
functionIds.Add(function.deviceId);
}
DriverLayer.Control.Ins.SendApiReadCommand(functionIds);
}
else
{
foreach (var function in GetDeviceFunctionList())
{
switch (function.functionCategory)
{
case FunctionCategory.Light:
case FunctionCategory.Electrical:
case FunctionCategory.SwitchDevice:
case FunctionCategory.Curtain:
case FunctionCategory.Thermostat:
DriverLayer.Control.Ins.SendReadCommand(function);
break;
}
}
}
}
catch (Exception ex)
{
MainPage.Log($"Refresh Residence Function Status Error : {ex.Message}");
}
finally
{
lockReadFunctionStatus = false;
MainPage.Log($"结束--读取");
}
})
{ IsBackground = true }.Start();
}
#region 场景相关
///
/// 添加场景
///
public Scene AddScene(Scene scene,out string result)
{
Scene tempScene = null;
var pm = new HttpServerRequest();
var revPack = pm.AddScene(scene);
if (revPack.Code == StateCode.SUCCESS)
{
var sceneList = Newtonsoft.Json.JsonConvert.DeserializeObject>(revPack.Data.ToString());
tempScene = sceneList.Find((obj) => obj.userSceneId == scene.userSceneId);
var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(tempScene));
Common.FileUtlis.Files.WriteFileByBytes(scene.savePath, ssd);
}
result = revPack.Code;
return tempScene;
}
#endregion
#region 功能文本相关
///
/// 属性名称显示文本
/// 中英文显示
///
public string GetNameText(string key)
{
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.IndoorTemp:
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;
}
return text;
}
///
/// 属性值单位
///
public string GetUintString(string key)
{
var us = "";
switch (key)
{
case FunctionAttributeKey.SetTemp:
case FunctionAttributeKey.IndoorTemp:
us = "°C";
break;
case FunctionAttributeKey.Percent:
case FunctionAttributeKey.Brightness:
us = "%";
break;
}
return us;
}
///
/// 获取指定属性的显示文本
/// 中英文显示
///
public string GetValueText(string key, string value)
{
string text = "";
switch (key)
{
case FunctionAttributeKey.OnOff:
text = value == "on" ? Language.StringByID(StringId.On) : Language.StringByID(StringId.OFF);
break;
case FunctionAttributeKey.SetTemp:
case FunctionAttributeKey.IndoorTemp:
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;
}
///
/// 延时显示的文本
///
public string GetDelayText(string delay)
{
string 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;
}
#endregion
}
}