using System; using System.Collections.Generic; using HDL_ON.DAL; namespace HDL_ON.Entity { public class DB_ResidenceData { public DB_ResidenceData() { } /// /// 0:A协议网关 /// 1:bus网关 /// 2:knx网关 /// public int GatewayType = 0; /// /// 住宅基础信息 /// public RegionInfoRes residecenInfo { get { if (MainPage.LocalMode) { return new RegionInfoRes() { Name = "本地模式" }; } else { return MainPage.LoginUser.regionList.Find((obj) => obj.RegionID == CurReginID); } } } /// /// 当前选择的住宅索引 /// public string CurReginID = ""; /// /// 楼层列表 /// public List floors = new List(); /// /// 功能类型列表 /// public List functionTypeList = new List(); static DB_ResidenceData instance; public static DB_ResidenceData residenceData { get { if (instance == null) { try { var residenceDataBytes = FileUtils.ReadFile("DB_ResidenceData"); var userConfigString = CommonPage.MyEncodingUTF8.GetString(residenceDataBytes); DB_ResidenceData temp = null; if (!string.IsNullOrEmpty(userConfigString)) { temp = Newtonsoft.Json.JsonConvert.DeserializeObject(userConfigString); } if (temp == null) { instance = new DB_ResidenceData { }; } else { instance = temp; } if (instance.functionTypeList.Count == 0) { instance.functionTypeList.AddRange(new List { ShowFunction.Light,ShowFunction.AC,ShowFunction.Curtain, ShowFunction.FloorHeating,ShowFunction.DoorLock, ShowFunction.Electric,ShowFunction.EnergyMonitoring, ShowFunction.Environmental, ShowFunction.FreshAir,ShowFunction.Music, ShowFunction.Panel,ShowFunction.SecurityMonitoring, ShowFunction.Sensor,ShowFunction.VideoIntercom }); } #if DEBUG //if (DB_ResidenceData.functionList.scenes.Count == 0) //{ // var s0 = new Scene() // { // sid = "030101123456780A0A010001ABCD", // name = "全关场景", // sceneType = SceneType.OrdinaryScenes, // roomIdList = new List() { "0001" }, // bus_SceneData = new Dictionary(), // }; // s0.bus_SceneData.Add("030101123456780202010002ABCD", new byte[] { 1, 0, 0, 0 }); // s0.bus_SceneData.Add("030101123456780202020005ABCD", new byte[] { 1, 0, 0, 0 }); // s0.bus_SceneData.Add("030101123456780202040006ABCD", new byte[] { 1, 0, 254, 0, 0, 3, 255, 0, 0, 0, 0 }); // s0.bus_SceneData.Add("030101123456780604010001ABCD", new byte[] { 1, 0, 32, 32, 32, 32, 32, 0, 0, 0, 1, 28, 0 }); // s0.bus_SceneData.Add("030101123456780303010003ABCD", new byte[] { 1, 2 }); // DB_ResidenceData.functionList.scenes.Add(s0); // var s1 = new Scene() // { // sid = "030101123456780A0A00010002ABCD", // name = "全开场景", // sceneType = SceneType.OrdinaryScenes, // roomIdList = new List() { "0001" }, // bus_SceneData = new Dictionary(), // }; // s1.bus_SceneData.Add("030101123456780202010002ABCD", new byte[] { 1, 100, 0, 0 }); // s1.bus_SceneData.Add("030101123456780202020005ABCD", new byte[] { 1, 100, 0, 0 }); // s1.bus_SceneData.Add("030101123456780202040006ABCD", new byte[] { 1, 100, 254, 0, 0, 3, 255, 0, 0, 0, 0 }); // s1.bus_SceneData.Add("030101123456780604010001ABCD", new byte[] { 1, 0, 32, 32, 32, 32, 32, 0, 1, 0, 1, 28, 0 }); // s1.bus_SceneData.Add("030101123456780303010003ABCD", new byte[] { 1, 1 }); // DB_ResidenceData.functionList.scenes.Add(s1); // var s2 = new Scene() // { // sid = "030101123456780A0A010004ABCD", // name = "电影场景", // sceneType = SceneType.MovieScene, // roomIdList = new List() { "0001" }, // }; // DB_ResidenceData.functionList.scenes.Add(s2); // var s3 = new Scene() // { // sid = "030101123456780A0A010005ABCD", // name = "电影场景2", // sceneType = SceneType.MovieScene, // roomIdList = new List() { "0001" }, // }; // DB_ResidenceData.functionList.scenes.Add(s3); //} if (rooms.Count == 0) { //-------------------- var r111 = new Room() { sid = "0001", name = "Room-1", floorId = "", backgroundImage = "Classification/Room/Roombg.png" }; rooms.Add(r111); instance.floors.Add(new Floor() { sid = "000022222", name = "1 F" }); new AC() { sid = "030101123456780604010001ABCD", name = "空调", function = new List() { new Trait { name="on_off", max=1,min = 0, value_key= new List { "on","off"} }, new Trait { name="mode", max = 2,min =0,value_key = new List{ "auto", "heat", "cool","dry" } }, new Trait { name = "fan",max = 3,min =0,value_key = new List{ "low", "medium", "high" ,"auto"} }, new Trait { name = "temperature", max = 32,min=16,value_key = new List{"up","down" } }, }, roomIdList = new List() { "0001" }, lastState = "制冷 中风 18°C", bus_Data = new BusData { SubnetID = 42, DeviceID = 8, LoopID = 1, }, }.SaveFunctionData(); new Light() { sid = "030101123456780202020002ABCD", name = "调光灯", function = new List() { new Trait { name="brightness", max=100,min = 0, value_key= new List { "up","down"} }, },//"brightness", roomIdList = new List() { "0001" }, lastState = "20%", bus_Data = new BusData { SubnetID = 42, DeviceID = 9, LoopID = 1, }, }.SaveFunctionData(); new Curtain() { sid = "030101123456780303010003ABCD", name = "窗帘模块", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="on_off", max=2,min = 0, value_key= new List { "on","off","stop"} }, },// "curtain", lastState = "开", bus_Data = new BusData { SubnetID = 42, DeviceID = 7, LoopID = 1, }, }.SaveFunctionData(); new Curtain() { sid = "030101123456780303030011ABCD", name = "开合帘", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="on_off", max=100,min = 0, value_key= new List { "on","off","stop"} }, },//"curtaintype", lastState = "20%", bus_Data = new BusData { SubnetID = 42, DeviceID = 7, LoopID = 11, }, }.SaveFunctionData(); new Curtain() { sid = "030101123456780503040012ABCD", name = "卷帘", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="on_off", max=2,min = 0, value_key= new List { "on","off","stop"} }, new Trait { name="percent", max=100,min = 0, value_key= new List { "percent" } }, },// "rollingshutter", lastState = "20%", bus_Data = new BusData { SubnetID = 42, DeviceID = 17, LoopID = 1, }, }.SaveFunctionData(); new FloorHeating() { sid = "030101123456780404020004ABCD", name = "地热", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="on_off", max=1,min = 0, value_key= new List { "on","off"} }, new Trait { name="mode", max = 2,min =0,value_key = new List{ "normal", "day", "night","timer","away" } }, new Trait { name = "temperature", max = 32,min=5,value_key = new List{"up","down" } }, },// lastState = "自动 25°C", bus_Data = new BusData { SubnetID = 111, DeviceID = 12, LoopID = 1 } }.SaveFunctionData(); new Light() { sid = "030101123456780202010005ABCD", name = "吊灯", function = new List() { new Trait { name="on_off", max=100,min = 0, value_key= new List { "on","off"} }, },//"on_off", roomIdList = new List() { "0001" }, bus_Data = new BusData { SubnetID = 42, DeviceID = 6, LoopID = 1, }, }.SaveFunctionData(); new Light() { sid = "030101123456780202040006ABCD", name = "RGB灯", function = new List() { new Trait { name="brightness", max=100,min = 0, value_key= new List { "on","off"} }, new Trait { name="color", max=100,min = 0, value_key= new List { "255", "255", "255" } }, },//"brightness,color", roomIdList = new List() { "0001" }, bus_Data = new BusData { SubnetID = 42, DeviceID = 4, LoopID = 1, }, }.SaveFunctionData(); new Fan() { sid = "030101123456781010020006ABCD", name = "风扇", function = new List() { new Trait { name="on_off", max=1,min = 0, value_key= new List { "on","off"} }, new Trait { name="percent", max=7,min = 0, value_key= new List { "percent" } }, },//"brightness,color", roomIdList = new List() { "0001" }, bus_Data = new BusData { SubnetID = 142, DeviceID = 4, LoopID = 11, }, }.SaveFunctionData(); new TV() { sid = "030101123456781010020006ABCD", name = "电视", function = new List() { new Trait { name="on_off", max=1,min = 0, value_key= new List { "on","off"} }, }, roomIdList = new List() { "0001" }, bus_Data = new BusData { SubnetID = 142, DeviceID = 4, LoopID = 111, }, }.SaveFunctionData(); new SwitchSocket() { sid = "030101123456780101020006ABCD", name = "插座", function = new List() { new Trait { name="on_off", max=1,min = 0, value_key= new List { "on","off"} }, },//"brightness,color", roomIdList = new List() { "0001" }, bus_Data = new BusData { SubnetID = 42, DeviceID = 6, LoopID = 1, }, }.SaveFunctionData(); new Sensor() { sid = "030101123456781005060006ABCD", name = "PM2.5", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="values", max=1,min = 0, value_key= new List { "22"} }, }, bus_Data = new BusData { SubnetID = 111, DeviceID = 15, LoopID = 1, }, }.SaveFunctionData(); new Sensor() { sid = "030101123456781005070006ABCD", name = "CO2", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="values", max=1,min = 0, value_key= new List { "1352"} }, }, bus_Data = new BusData { SubnetID = 111, DeviceID = 15, LoopID = 1, }, }.SaveFunctionData(); new Sensor() { sid = "030101123456781005020006ABCD", name = "温度", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="values", max=1,min = 0, value_key= new List { "28"} }, }, bus_Data = new BusData { SubnetID = 111, DeviceID = 15, LoopID = 1, }, }.SaveFunctionData(); new Sensor() { sid = "030101123456781005050006ABCD", name = "TVOC", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="values", max=1,min = 0, value_key= new List { "0.3"} }, }, bus_Data = new BusData { SubnetID = 111, DeviceID = 15, LoopID = 1, }, }.SaveFunctionData(); new Sensor() { sid = "030101123456781005030006ABCD", name = "湿度", roomIdList = new List() { "0001" }, function = new List() { new Trait { name="values", max=1,min = 0, value_key= new List { "15"} }, }, bus_Data = new BusData { SubnetID = 111, DeviceID = 15, LoopID = 1, }, }.SaveFunctionData(); instance.SaveResidenceData(); } #endif } catch (Exception ex) { MainPage.Log($"住宅数据初始化失败:{ex.Message}"); } instance.residenceImage = "Classification/Room/Roombg.png"; //初始化住宅功能数据 InitRoomFunction(); } return instance; } } /// /// 退出账号清空数据 /// public void EixtAccount() { instance = null; } /// /// 住宅图片 /// public string residenceImage; /// /// 当前住宅的网关MAC /// public string residenceGatewayMAC = "4E47323347591243"; /// /// 保存住宅数据 /// public void SaveResidenceData() { if (this == null|| this.residecenInfo==null) return; var ssd = CommonPage.MyEncodingUTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)); FileUtils.WriteFileByBytes("DB_ResidenceData", ssd); MainPage.Log("Save DB_ResidenceData"); } #region 房间数据相关 /// /// 初始化每个房间的功能数据 /// public static void InitRoomFunction() { new System.Threading.Thread(() => { try { //初始化住宅所有房间功能数据 foreach (var r in rooms) { r.GetRoomFunctions(true); } } catch (Exception ex) { MainPage.Log($"Init room function error : {ex.Message}"); } }) { IsBackground = true }.Start(); } static List ins_Room; public static List rooms { get { if (ins_Room == null) { try { ins_Room = new List { }; var filePathList = FileUtils.ReadFiles(); foreach (var filePath in filePathList) { if (filePath.StartsWith("RoomData_") ) { var roomDataBytes = FileUtils.ReadFile(filePath); var roomDataString = CommonPage.MyEncodingUTF8.GetString(roomDataBytes); var room = Newtonsoft.Json.JsonConvert.DeserializeObject(roomDataString); if(room != null) { ins_Room.Add(room); } } } } catch (Exception ex) { MainPage.Log($"功能数据初始化失败:{ex.Message}"); } } return ins_Room; } } /// /// 删除房间 /// /// public static void DelRoom (Room delRoom) { var tRoom = rooms.Find((obj) => obj.sid == delRoom.sid); if (tRoom!=null) { FileUtils.DeleteFile(delRoom.roomSavePath); rooms.Remove(tRoom); } } #endregion #region 功能数据 static FunctionList ins_Function; public static FunctionList functionList { get { if (ins_Function == null) { try { ins_Function = new FunctionList { }; #region 恢复数据 var filePathList = FileUtils.ReadFiles(); List fs = new List(); foreach (var filePath in filePathList) { if (filePath.StartsWith("FunctionData_") && filePath.Length == 13 + 28) { //var filePath = fp.Remove(0, 13); var _functionTypeString = filePath.Substring(16 + 13, 4); var ft = (FunctionType)Enum.ToObject(typeof(FunctionType), Convert.ToInt32(_functionTypeString, 16)); switch (ft) { case FunctionType.AC: //恢复空调数据 var acDataBytes = FileUtils.ReadFile(filePath); var acString = CommonPage.MyEncodingUTF8.GetString(acDataBytes); ins_Function.aCs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(acString)); break; case FunctionType.Relay: case FunctionType.Dimmer: case FunctionType.RGB: //恢复灯光数据 var lightsDataBytes = FileUtils.ReadFile(filePath); var lightsString = CommonPage.MyEncodingUTF8.GetString(lightsDataBytes); ins_Function.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(lightsString)); break; case FunctionType.Curtain: case FunctionType.MotorCurtain: //恢复窗帘数据 var curtainsDataBytes = FileUtils.ReadFile(filePath); var curtainsString = CommonPage.MyEncodingUTF8.GetString(curtainsDataBytes); ins_Function.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(curtainsString)); break; case FunctionType.FloorHeating: //恢复地热数据 var fhDataBytes = FileUtils.ReadFile(filePath); var fhString = CommonPage.MyEncodingUTF8.GetString(fhDataBytes); ins_Function.floorHeatings.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(fhString)); break; case FunctionType.PM25: case FunctionType.CO2: case FunctionType.TVOC: case FunctionType.Temp: case FunctionType.Humidity: //恢复环境数据 var sesDataBytes = FileUtils.ReadFile(filePath); var sesString = CommonPage.MyEncodingUTF8.GetString(sesDataBytes); ins_Function.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(sesString)); break; case FunctionType.Socket: //恢复插座数据 var eleDataBytes = FileUtils.ReadFile(filePath); var eleString = CommonPage.MyEncodingUTF8.GetString(eleDataBytes); ins_Function.switchSockets.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(eleString)); break; case FunctionType.TV: //恢复电视数据 var eleDataBytes1 = FileUtils.ReadFile(filePath); var eleString1 = CommonPage.MyEncodingUTF8.GetString(eleDataBytes1); ins_Function.tVs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(eleString1)); break; case FunctionType.Fan: //恢复风扇数据 var eleDataBytes2 = FileUtils.ReadFile(filePath); var eleString2 = CommonPage.MyEncodingUTF8.GetString(eleDataBytes2); ins_Function.fans.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(eleString2)); break; case FunctionType.Scene: //恢复场景数据 var scenesDataBytes = FileUtils.ReadFile(filePath); var scenesString = CommonPage.MyEncodingUTF8.GetString(scenesDataBytes); ins_Function.scenes.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(scenesString)); break; } } } #endregion } catch (Exception ex) { MainPage.Log($"功能数据初始化失败:{ex.Message}"); } } return ins_Function; } } /// /// 删除手机存储都所有功能数据 /// public static void DelAllFunctionData() { var filePathList = FileUtils.ReadFiles(); List fs = new List(); foreach (var filePath in filePathList) { if (filePath.StartsWith("FunctionData_") && filePath.Length == 13 + 24) { FileUtils.DeleteFile(filePath); } } ins_Function = new FunctionList(); } /// /// 刷新住宅里面的搜索设备状态 /// public void RefreshResidenceFunctionStatus() { new System.Threading.Thread(() => { try { foreach (var function in functionList.GetAllDeviceFunctionList()) { System.Threading.Thread.Sleep(100); //if (function.bus_Data != null) { switch (function.functionCategory) { case FunctionCategory.Light: case FunctionCategory.Electrical: case FunctionCategory.SwitchDevice: case FunctionCategory.Curtain: case FunctionCategory.Thermostat: Control.SendReadCommand(function); break; } } } } catch (Exception ex) { MainPage.Log($"Refresh Residence Function Status Error : {ex.Message}"); } }) { IsBackground = true }.Start(); } #endregion #region oid列表 a协议转bus协议控制使用 static List ins_OidList; public static List functionOidList { get { if (ins_OidList == null) { var bytes = FileUtils.ReadFile("FunctionOidData_AProtocol"); if (bytes == null || bytes.Length == 0) { ins_OidList = new List(); } else { var jsonString = System.Text.Encoding.UTF8.GetString(bytes); if (string.IsNullOrEmpty(jsonString)) { ins_OidList = new List(); } else { var list = Newtonsoft.Json.JsonConvert.DeserializeObject>(jsonString); if (list == null) { ins_OidList = new List(); } else { ins_OidList = list; } } } } return ins_OidList; } } /// /// 保存oid列表,每次保存都会覆盖 /// /// public static void SaveFunctionOidList(List functionOids) { ins_OidList = new List(); ins_OidList = functionOids; var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(ins_OidList)); FileUtils.WriteFileByBytes("FunctionOidData_AProtocol",ssd); } #endregion } }