using System; using System.Collections.Generic; using System.Linq; using System.Threading; using HDL_ON.Common; 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(); } if (airCleaners == null) { airCleaners = new List(); } if (weepRobots == null) { weepRobots = new List(); } var list = new List(); list.AddRange(fans); list.AddRange(switchSockets); list.AddRange(tVs); list.AddRange(airCleaners); list.AddRange(weepRobots); return list; } } /// /// 风扇列表 /// public List fans = new List(); /// /// 电视列表 /// public List tVs = new List(); /// /// 家电列表 /// public List switchSockets = new List(); /// /// 空气净化器列表 /// public List airCleaners = new List(); /// /// 扫地机器人列表 /// public List weepRobots = new List(); #endregion /// /// 环境传感器列表 /// public List sensorsEnvironmentalScience = new List(); /// /// 安防设备列表 /// public List sensorsArm = new List(); public List scenes = new List(); /// /// 场景列表 /// //public List Scenes //{ // get // { // List.scenes = List.scenes.OrderByDescending(o => o.createTime).ToList(); // return List.scenes; // } //} /// /// 功能列表 /// 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); List.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); List.curtains.Add(curtain); deviceFunctionList.Add(curtain); break; case SPK.AcStandard: var ac = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.aCs.Add(ac); deviceFunctionList.Add(ac); break; case SPK.FloorHeatStandard: var fh = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.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); List.sensorsEnvironmentalScience.Add(sensor); deviceFunctionList.Add(sensor); break; case SPK.ElectricSocket: var ele = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.switchSockets.Add(ele); deviceFunctionList.Add(ele); break; case SPK.ElectricTV: var tv = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.tVs.Add(tv); deviceFunctionList.Add(tv); break; case SPK.ElectricFan: var fan = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.fans.Add(fan); deviceFunctionList.Add(fan); break; case SPK.ElectricTuyaAirCleaner: var airCleaner = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.airCleaners.Add(airCleaner); deviceFunctionList.Add(airCleaner); break; case SPK.ElectricTuyaFan: var tuyaFan = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.fans.Add(tuyaFan); deviceFunctionList.Add(tuyaFan); break; case SPK.ElectricTuyaWeepRobot: var tuyaWeepRobot = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.weepRobots.Add(tuyaWeepRobot); deviceFunctionList.Add(tuyaWeepRobot); break; case SPK.SensorSmoke: case SPK.SensorWater: case SPK.SensorGas: var ser = Newtonsoft.Json.JsonConvert.DeserializeObject(functionDataString); List.sensorsArm.Add(ser); deviceFunctionList.Add(ser); break; } } } if (filePath.StartsWith("SceneData_")) { var sceneDataBytes = 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(sensorsArm); deviceFunctionList.AddRange(UI.Music.A31MusicModel.A31MusicModelList); } try { deviceFunctionList = deviceFunctionList.OrderByDescending(o => o.controlCounter).ToList(); } catch (Exception ex) { MainPage.Log($"设备功能排序异常:{ex.Message}"); } return deviceFunctionList; } /// /// 清空设备功能列表 /// public void Clear() { List.aCs = new List(); List.lights = new List(); List.curtains = new List(); List.floorHeatings = new List(); List.tVs = new List(); List.switchSockets = new List(); List.fans = new List(); List.sensorsEnvironmentalScience = new List(); List.scenes = new List(); List.deviceFunctionList = null; _FunctionList = null; } /// /// 接收bus软件上传的功能 /// tcp方式 /// /// public void AddDeviceFunction(Function sidObj0) { switch (sidObj0.spk) { case SPK.AcStandard: var sidObj = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.aCs.Add(sidObj); sidObj.SaveFunctionFile(); break; case SPK.FloorHeatStandard: var sidObj1 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.floorHeatings.Add(sidObj1); sidObj1.SaveFunctionFile(); break; case SPK.LightDimming: case SPK.LightRGB: case SPK.LightSwitch: var sidObj2 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.lights.Add(sidObj2); sidObj2.SaveFunctionFile(); break; case SPK.CurtainSwitch: case SPK.CurtainRoller: case SPK.CurtainTrietex: var sidObj3 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.curtains.Add(sidObj3 ); sidObj3.SaveFunctionFile(); break; case SPK.ElectricTV: var sidObj4 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.tVs.Add(sidObj4); sidObj4.SaveFunctionFile(); break; case SPK.ElectricSocket: var sidObj5 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.switchSockets.Add(sidObj5); sidObj5.SaveFunctionFile(); break; case SPK.ElectricFan: var sidObj6 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.fans.Add(sidObj6); sidObj6.SaveFunctionFile(); break; case SPK.SensorCO2: case SPK.SensorTVOC: case SPK.SensorPm25: case SPK.SensorTemperature: case SPK.SensorHumidity: var sidObj7 = Newtonsoft.Json.JsonConvert.DeserializeObject(Newtonsoft.Json.JsonConvert.SerializeObject(sidObj0)); List.sensorsEnvironmentalScience.Add(sidObj7); sidObj7.SaveFunctionFile(); break; } } /// /// 接收bus软件上传的功能 /// http udp /// /// public void AddFunction(object obj) { var f = Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString()); if (f == null) return; switch (f.Spk_Prefix) { case FunctionCategory.AC: switch (f.spk) { case SPK.AcStandard: List.aCs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; } break; case FunctionCategory.FloorHeat: switch (f.spk) { case SPK.FloorHeatStandard: List.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; } break; case FunctionCategory.Light: List.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; case FunctionCategory.Curtain: List.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; case FunctionCategory.Electric: switch(f.spk) { case SPK.ElectricTV: List.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; case SPK.ElectricSocket: List.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; case SPK.ElectricFan: List.electricals.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; } break; case FunctionCategory.Sensor: switch (f.spk) { case SPK.SensorTVOC: case SPK.SensorCO2: case SPK.SensorPm25: case SPK.SensorHumidity: case SPK.SensorTemperature: List.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(obj.ToString())); break; case SPK.SensorWater: case SPK.SensorSmoke: case SPK.SensorGas: case SPK.SensorDryContact: case SPK.SensorShanLan: case SPK.SensorDuiShe: case SPK.SensorPir: case SPK.SensorDoorWindow: case SPK.SensoruUtrasonic: List.sensorsArm.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 { IMessageCommon.Current.ShowErrorInfoAlter(pack.Code); } return pack.Code; } /// /// 删除场景 /// todo /// public void DeleteScene(Scene scene,bool upSevser) { if (upSevser) { var pm = new HttpServerRequest(); var packCode = pm.DeleteScene(scene.userSceneId); if (packCode == StateCode.SUCCESS) { FileUtlis.Files.DeleteFile(scene.savePath); List.scenes.Remove(scene); } else { IMessageCommon.Current.ShowErrorInfoAlter(packCode); } } else { 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: List.lights.Remove(List.lights.Find((obj) => obj.deviceId == delTemp.deviceId)); break; case SPK.CurtainRoller: case SPK.CurtainShades: case SPK.CurtainSwitch: case SPK.CurtainTrietex: List.curtains.Remove(List.curtains.Find((obj) => obj.deviceId == delTemp.deviceId)); break; case SPK.AcStandard: List.aCs.Remove(List.aCs.Find((obj) => obj.deviceId == delTemp.deviceId)); break; case SPK.FloorHeatStandard: List.floorHeatings.Remove(List.floorHeatings.Find((obj) => obj.deviceId == delTemp.deviceId)); break; case SPK.SensorPm25: case SPK.SensorCO2: case SPK.SensorTVOC: case SPK.SensorTemperature: case SPK.SensorHumidity: List.sensorsEnvironmentalScience.Remove(List.sensorsEnvironmentalScience.Find((obj) => obj.deviceId == delTemp.deviceId)); break; case SPK.ElectricSocket: List.switchSockets.Remove(List.switchSockets.Find((obj) => obj.deviceId == delTemp.deviceId)); break; case SPK.ElectricTV: List.tVs.Remove(List.tVs.Find((obj) => obj.deviceId == delTemp.deviceId)); break; case SPK.ElectricFan: List.fans.Remove(List.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 page = new List(); int count = 0; foreach (var function in GetDeviceFunctionList()) { page.Add(function.deviceId); count++; if (count > 9) { DriverLayer.Control.Ins.SendApiReadCommand(page); page.Clear(); count = 0; } } DriverLayer.Control.Ins.SendApiReadCommand(page); } else { foreach (var function in GetDeviceFunctionList()) { switch (function.Spk_Prefix) { case FunctionCategory.Light: case FunctionCategory.Electric: case FunctionCategory.Curtain: case FunctionCategory.AC: case FunctionCategory.FloorHeat: 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 string AddScene(Scene scene, out Scene 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.sid == scene.sid); var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(tempScene)); FileUtlis.Files.WriteFileByBytes(scene.savePath, ssd); result = tempScene; } else { result = tempScene; } return revPack.Code; } #endregion #region 收藏功能 /// /// 收藏场景 /// public string CollectScene(Scene scene) { var result = ""; if (scene.collect) { result = ApiUtlis.Ins.HttpRequest.CollectDevice(scene.userSceneId).Code; } else { result = ApiUtlis.Ins.HttpRequest.CancelCollectDevice(scene.userSceneId).Code; } //提示错误 if (result != StateCode.SUCCESS) { IMessageCommon.Current.ShowErrorInfoAlter(result); } return result; } #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; case FunctionAttributeKey.FadeTime: text = Language.StringByID(StringId.FadeSpeed); 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 } }