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 } }