using System; using System.Collections.Generic; using System.Linq; using System.Threading; using HDL_ON.DAL; using HDL_ON.DAL.Server; 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; /// /// 加载功能列表 /// 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: _FunctionList.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); break; case SPK.CurtainRoller: case SPK.CurtainShades: case SPK.CurtainSwitch: case SPK.CurtainTrietex: _FunctionList.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); break; case SPK.AcStandard: _FunctionList.aCs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); break; case SPK.FloorHeatStandard: //恢复地热数据 _FunctionList.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); break; case SPK.SensorPm25: case SPK.SensorCO2: case SPK.SensorTVOC: case SPK.SensorTemperature: case SPK.SensorHumidity: //恢复环境数据 _FunctionList.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); break; case SPK.ElectricSocket: //恢复插座数据 _FunctionList.switchSockets.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); break; case SPK.ElectricTV: //恢复电视数据 _FunctionList.tVs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); break; case SPK.ElectricFan: //恢复风扇数据 _FunctionList.fans.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString)); 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 GetAllFunction() { var fs = new List(); fs.AddRange(GetAllDeviceFunctionList()); return fs; } /// /// 获取设备功能列表 /// public List GetAllDeviceFunctionList() { //if (deviceFunctionList == null) { 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 ClearAllDeviceFunctionList() { aCs = new List(); lights = new List(); curtains = new List(); floorHeatings = new List(); tVs = new List(); switchSockets = new List(); fans = new List(); sensorsEnvironmentalScience = new List(); scenes = new List(); deviceFunctionList = 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)); DB_ResidenceData.functionList.aCs.Add(sidObj); sidObj.SaveFunctionData(false); break; case FunctionType.FloorHeating: var sidObj1 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); DB_ResidenceData.functionList.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)); DB_ResidenceData.functionList.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)); DB_ResidenceData.functionList.curtains.Add(sidObj3 ); sidObj3.SaveFunctionData(false); break; case FunctionType.TV: var sidObj4 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); DB_ResidenceData.functionList.tVs.Add(sidObj4); sidObj4.SaveFunctionData(false); break; case FunctionType.Socket: var sidObj5 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); DB_ResidenceData.functionList.switchSockets.Add(sidObj5); sidObj5.SaveFunctionData(false); break; case FunctionType.Fan: var sidObj6 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); DB_ResidenceData.functionList.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)); DB_ResidenceData.functionList.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) { ////将下载到到数据全部保存 //new Thread(() => { // foreach (var temp in deviceList.list) // { // temp.SaveFunctionData(); // } //}) //{ IsBackground = true }.Start(); for (int i =0;i < List.GetAllDeviceFunctionList().Count;) { var localFunction = List.GetAllDeviceFunctionList()[i]; var newFunction = deviceList.list.Find((obj) => obj.deviceId == localFunction.deviceId); if (newFunction == null)//如果云端最新数据没有该条数据,则本地需要删掉该数据记录 { List.DeleteFunction(localFunction); } else { i++; if (localFunction.modifyTime != newFunction.modifyTime) { localFunction.name = newFunction.name; localFunction.collect = newFunction.collect; localFunction.modifyTime = newFunction.modifyTime; localFunction.roomIds = newFunction.roomIds; localFunction.bus_Data = newFunction.bus_Data; 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) { ////将下载到到数据全部保存 //new Thread(() => { // foreach (var temp in sceneList) // { // temp.SaveSceneData(); // } //}) //{ IsBackground = true }.Start(); 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 DelAllFunctionData() { var filePathList = Common.FileUtlis.Files.ReadFiles(); foreach (var filePath in filePathList) { if (filePath.StartsWith("FunctionData_") && filePath.Length == 13 + 28) { Common.FileUtlis.Files.DeleteFile(filePath); } } _FunctionList = new FunctionList(); } /// /// 删除场景 /// 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; } 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 GetAllDeviceFunctionList()) { functionIds.Add(function.deviceId); } DriverLayer.Control.Ins.SendApiReadCommand(functionIds); } else { foreach (var function in GetAllDeviceFunctionList()) { 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(); } } }