using System; using System.Collections.Generic; using HDL_ON.DAL; using HDL_ON.DAL.Net; using Shared; namespace HDL_ON.Entity { public class DB_ResidenceData { public DB_ResidenceData() { } /// /// 0:bus网关 /// 1:A协议网关 /// public int GatewayType = 1; /// /// 住宅基础信息 /// public RegionInfoRes residecenInfo { get { if (MainPage.NoLoginMode) { return new RegionInfoRes() { Name = "本地模式" }; } else { var curRegion = MainPage.LoginUser.regionList.Find((obj) => obj.RegionID == CurReginID); //if (curRegion == null) //{ // CurReginID = MainPage.LoginUser.regionList[0].RegionID; // return MainPage.LoginUser.regionList[0]; //} return curRegion; } } } /// /// 当前选择的住宅索引 /// 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 = System.Text.Encoding.UTF8.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 }); instance.SaveResidenceData(); } new Light() { sid = "030101123456780202010005ABCD", name = "灯光1", function = new List() { new Trait { name="on_off", max=100,min = 0, value_key= new List { "on","off"} }, }, roomIdList = new List() { "0001" }, bus_Data = new BusData { SubnetID = 42, DeviceID = 6, LoopID = 1, }, }.SaveFunctionData(); #if DEBUG11 if (rooms.Count == 0 ) { //-------------------- var r111 = new Room() { sid = "0001", name = "客厅", floorId = "", backgroundImage = "Classification/Room/Roombg.png" }; rooms.Add(r111); instance.floors.Add(new Floor() { sid = "000022222", name = "1F" }); r111.SaveRoomData(); 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"} }, }, 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; ins_Room = null; ins_OidList = null; ins_Function = null; if (MainPage.IsRemote) { Mqtt_Cloud.DisConnectRemoteMqttClient("退出登录,或者切换住宅"); } } /// /// 住宅图片 /// public string residenceImage; /// /// 当前住宅的网关MAC /// public string residenceGatewayMAC = "0281B9078C000000";// "00964E19C4467B1E"; /// /// 保存住宅数据 /// public void SaveResidenceData() { if (this == null || this.residecenInfo == null) return; var ssd = System.Text.Encoding.UTF8.GetBytes(Newtonsoft.Json.JsonConvert.SerializeObject(this)); FileUtils.WriteFileByBytes("DB_ResidenceData", ssd); MainPage.Log("Save DB_ResidenceData"); } /// /// 当前选择的楼层 /// public string CurFoor = Language.StringByID(StringId.All); #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 = System.Text.Encoding.UTF8.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 = System.Text.Encoding.UTF8.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 = System.Text.Encoding.UTF8.GetString(lightsDataBytes); ins_Function.lights.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(lightsString)); break; case FunctionType.Curtain: case FunctionType.MotorCurtain: case FunctionType.RollingShutter: //恢复窗帘数据 var curtainsDataBytes = FileUtils.ReadFile(filePath); var curtainsString = System.Text.Encoding.UTF8.GetString(curtainsDataBytes); ins_Function.curtains.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(curtainsString)); break; case FunctionType.FloorHeating: //恢复地热数据 var fhDataBytes = FileUtils.ReadFile(filePath); var fhString = System.Text.Encoding.UTF8.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 = System.Text.Encoding.UTF8.GetString(sesDataBytes); ins_Function.sensorsEnvironmentalScience.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(sesString)); break; case FunctionType.Socket: //恢复插座数据 var eleDataBytes = FileUtils.ReadFile(filePath); var eleString = System.Text.Encoding.UTF8.GetString(eleDataBytes); ins_Function.switchSockets.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(eleString)); break; case FunctionType.TV: //恢复电视数据 var eleDataBytes1 = FileUtils.ReadFile(filePath); var eleString1 = System.Text.Encoding.UTF8.GetString(eleDataBytes1); ins_Function.tVs.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(eleString1)); break; case FunctionType.Fan: //恢复风扇数据 var eleDataBytes2 = FileUtils.ReadFile(filePath); var eleString2 = System.Text.Encoding.UTF8.GetString(eleDataBytes2); ins_Function.fans.Add(Newtonsoft.Json.JsonConvert.DeserializeObject(eleString2)); break; case FunctionType.Scene: //恢复场景数据 var scenesDataBytes = FileUtils.ReadFile(filePath); var scenesString = System.Text.Encoding.UTF8.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(); foreach (var filePath in filePathList) { if (filePath.StartsWith("FunctionData_") && filePath.Length == 13 + 28) { FileUtils.DeleteFile(filePath); } } ins_Function = new FunctionList(); ins_Function.aCs = new List(); ins_Function.lights = new List(); ins_Function.curtains = new List(); ins_Function.floorHeatings = new List(); ins_Function.sensorsEnvironmentalScience = new List(); ins_Function.switchSockets = new List(); ins_Function.tVs = new List(); ins_Function.fans = new List(); ins_Function.scenes = new List(); } /// /// 删除功能 /// public static void DelSceneFunction(string fSid) { var f = functionList.scenes.Find((obj) => obj.sid == fSid); if (f != null) { FileUtils.DeleteFile(f.savePath); functionList.scenes.Remove(f); } } /// /// 刷新住宅里面的搜索设备状态 /// public void RefreshResidenceFunctionStatus() { new System.Threading.Thread(() => { try { foreach (var function in functionList.GetAllDeviceFunctionList()) { System.Threading.Thread.Sleep(100); switch (function.functionCategory) { case FunctionCategory.Light: case FunctionCategory.Electrical: case FunctionCategory.SwitchDevice: case FunctionCategory.Curtain: case FunctionCategory.Thermostat: if (DB_ResidenceData.residenceData.GatewayType == 0) { DriverLayer.Control.ins.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("AProtocolData_FunctionOid"); 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 SaveFunctionOidJsonDataList(string oidJsonString) { oidJsonString = oidJsonString.Replace("add", "get_list_response"); var oidBytes = System.Text.Encoding.UTF8.GetBytes(oidJsonString); FileUtils.WriteFileByBytes("AProtocolData_FunctionOid", oidBytes); } #endregion } }