diff --git a/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs b/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs index f5cccf3..140997e 100644 --- a/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs +++ b/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs @@ -21,15 +21,22 @@ namespace SmartAquaViewer.DataAnalysis /// 저수조 /// public WaterTank Tank { get; set; } = new(); + /// /// 여과 시스템 /// public FilteringSystem Filtering { get; set; } = new(); + /// /// 살균 시스템 /// public SterilizingSystem Sterilizing { get; set; } = new(); + /// + /// 총 전력 소비 (킬로와트, kW) + /// + public double TotalEnergy { get; set; } + public WaterQualityVO() { } public WaterQualityVO(DateTime RecordedTime, WaterTank tank, FilteringSystem filtering, SterilizingSystem sterilizing) @@ -40,6 +47,20 @@ namespace SmartAquaViewer.DataAnalysis Sterilizing = sterilizing; } + public double CalculateTotalEnergy() + { + double total = 0; + total += Filtering.SandFilterEnergy; + total += Filtering.CirculationPumpEnergy; + total += Filtering.HeatPumpEnergy; + total += Filtering.AirBlowerEnergy; + total += Sterilizing.OzoneGeneratorEnergy; + total += Sterilizing.UVSterilizerEnergy; + total += Sterilizing.OzoneDissolverEnergy; + total += Sterilizing.ExcessOzoneDestroyerEnergy; + return Math.Round(total, 2); + } + /// /// 샘플 데이터 리스트 생성 /// @@ -48,6 +69,18 @@ namespace SmartAquaViewer.DataAnalysis var list = new List(); var rand = new Random(); + double CalculateTotalEnergy(WaterQualityVO vo) + { + return vo.Filtering.SandFilterEnergy + + vo.Filtering.CirculationPumpEnergy + + vo.Filtering.HeatPumpEnergy + + vo.Filtering.AirBlowerEnergy + + vo.Sterilizing.OzoneGeneratorEnergy + + vo.Sterilizing.UVSterilizerEnergy + + vo.Sterilizing.OzoneDissolverEnergy + + vo.Sterilizing.ExcessOzoneDestroyerEnergy; + } + if (totalRowsCount <= 0) return list; double totalSeconds; @@ -67,6 +100,7 @@ namespace SmartAquaViewer.DataAnalysis for (int i = 0; i < totalRowsCount; i++) { DateTime ts = start.AddSeconds(stepSeconds * i); + var vo = new WaterQualityVO { @@ -81,27 +115,36 @@ namespace SmartAquaViewer.DataAnalysis ), Filtering = new FilteringSystem( sandFilterPower: rand.Next(0, 2) == 1, + sandFilterEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2), sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2), sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2), sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2), sumpFlowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), circulationPumpPower: rand.Next(0, 2) == 1, + circulationPumpEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2), inverterControllerStatus: rand.Next(0, 2) == 1 ? "Normal" : "Error", flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), heatPumpPower: rand.Next(0, 2) == 1, heatPumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), - airBlowerPower: rand.Next(0, 2) == 1 + heatPumpEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2), + airBlowerPower: rand.Next(0, 2) == 1, + airBlowerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2) ), Sterilizing = new SterilizingSystem( ozoneGeneratorPower: rand.Next(0, 2) == 1, + ozoneGeneratorEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2), uvSterilizerId: "UV" + rand.Next(1, 100), uvSterilizerPower: rand.Next(0, 2) == 1, + uvSterilizerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2), ozoneDissolverPower: rand.Next(0, 2) == 1, ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2), - excessOzoneDestroyerPower: rand.Next(0, 2) == 1 - ) + ozoneDissolverEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2), + excessOzoneDestroyerPower: rand.Next(0, 2) == 1, + excessOzoneDestroyerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2) + ), }; + vo.TotalEnergy = CalculateTotalEnergy(vo); list.Add(vo); } @@ -167,6 +210,12 @@ namespace SmartAquaViewer.DataAnalysis [Column("filter_sand_filter_power")] public bool SandFilterPower { get; set; } + /// + /// 모래여과기 전력 (kW) + /// + [Column("filter_sand_filter_energy")] + public double SandFilterEnergy { get; set; } + /// /// 섬프탱크 pH (산도) /// @@ -203,6 +252,12 @@ namespace SmartAquaViewer.DataAnalysis [Column("filter_circulation_pump_power")] public bool CirculationPumpPower { get; set; } + /// + /// 순환펌프 전력 (kW) + /// + [Column("filter_circulation_pump_energy")] + public double CirculationPumpEnergy { get; set; } + /// /// 인버터 제어기 상태 /// @@ -227,31 +282,48 @@ namespace SmartAquaViewer.DataAnalysis [Column("filter_heat_pump_temperature")] public double HeatPumpTemperature { get; set; } + /// + /// 히트펌프 전력 (kW) + /// + [Column("filter_heat_pump_energy")] + public double HeatPumpEnergy { get; set; } + /// /// 에어브로와 전원 (true: ON, false: OFF) /// [Column("filter_air_blower_power")] public bool AirBlowerPower { get; set; } + /// + /// 에어브로와 전력 (kW) + /// + [Column("filter_air_blower_energy")] + public double AirBlowerEnergy { get; set; } + public FilteringSystem() { } public FilteringSystem( - bool sandFilterPower, double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature, - bool circulationPumpPower, string? inverterControllerStatus, double flowRate, - bool heatPumpPower, double heatPumpTemperature, bool airBlowerPower) + bool sandFilterPower, double sandFilterEnergy, + double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature, + bool circulationPumpPower, double circulationPumpEnergy, string? inverterControllerStatus, double flowRate, + bool heatPumpPower, double heatPumpTemperature, double heatPumpEnergy, bool airBlowerPower, double airBlowerEnergy) { SandFilterPower = sandFilterPower; + SandFilterEnergy = sandFilterEnergy; SumpPH = sumpPH; SumpORP = sumpORP; SumpWaterLevel = sumpWaterLevel; SumpFlowRate = sumpFlowRate; SumpTemperature = sumpTemperature; CirculationPumpPower = circulationPumpPower; + CirculationPumpEnergy = circulationPumpEnergy; InverterControllerStatus = inverterControllerStatus; FlowRate = flowRate; HeatPumpPower = heatPumpPower; HeatPumpTemperature = heatPumpTemperature; + HeatPumpEnergy = heatPumpEnergy; AirBlowerPower = airBlowerPower; + AirBlowerEnergy = airBlowerEnergy; } } @@ -264,6 +336,12 @@ namespace SmartAquaViewer.DataAnalysis [Column("ster_ozone_generator_power")] public bool OzoneGeneratorPower { get; set; } + /// + /// 오존 발생기 전력 (kW) + /// + [Column("ster_ozone_generator_energy")] + public double OzoneGeneratorEnergy { get; set; } + /// /// 자외선 살균기 ID /// @@ -276,6 +354,12 @@ namespace SmartAquaViewer.DataAnalysis [Column("ster_uv_sterilizer_power")] public bool UVSterilizerPower { get; set; } + /// + /// 자외선 살균기 전력 (kW) + /// + [Column("ster_uv_sterilizer_energy")] + public double UVSterilizerEnergy { get; set; } + /// /// 오존용해장치 전원 (true: ON, false: OFF) /// @@ -288,24 +372,42 @@ namespace SmartAquaViewer.DataAnalysis [Column("ster_ozone_dissolver_pressure")] public double OzoneDissolverPressure { get; set; } + /// + /// 오존용해장치 전력 (kW) + /// + [Column("ster_ozone_dissolver_energy")] + public double OzoneDissolverEnergy { get; set; } + /// /// 배오존장치 전원 (true: ON, false: OFF) /// [Column("ster_excess_ozone_destroyer_power")] public bool ExcessOzoneDestroyerPower { get; set; } + /// + /// 배오존장치 전력 (kW) + /// + [Column("ster_excess_ozone_destroyer_energy")] + public double ExcessOzoneDestroyerEnergy { get; set; } + public SterilizingSystem() { } public SterilizingSystem( - bool ozoneGeneratorPower, string uvSterilizerId, bool uvSterilizerPower, - bool ozoneDissolverPower, double ozoneDissolverPressure, bool excessOzoneDestroyerPower) + bool ozoneGeneratorPower, double ozoneGeneratorEnergy, + string uvSterilizerId, bool uvSterilizerPower, double uvSterilizerEnergy, + bool ozoneDissolverPower, double ozoneDissolverPressure, double ozoneDissolverEnergy, + bool excessOzoneDestroyerPower, double excessOzoneDestroyerEnergy) { OzoneGeneratorPower = ozoneGeneratorPower; + OzoneGeneratorEnergy = ozoneGeneratorEnergy; UVSterilizerId = uvSterilizerId; UVSterilizerPower = uvSterilizerPower; + UVSterilizerEnergy = uvSterilizerEnergy; OzoneDissolverPower = ozoneDissolverPower; OzoneDissolverPressure = ozoneDissolverPressure; + OzoneDissolverEnergy = ozoneDissolverEnergy; ExcessOzoneDestroyerPower = excessOzoneDestroyerPower; + ExcessOzoneDestroyerEnergy = excessOzoneDestroyerEnergy; } } } diff --git a/SmartAquaViewer/View/EnegyView.xaml b/SmartAquaViewer/View/EnegyView.xaml index 3842f22..2d8d269 100644 --- a/SmartAquaViewer/View/EnegyView.xaml +++ b/SmartAquaViewer/View/EnegyView.xaml @@ -9,12 +9,12 @@ - + - + @@ -24,9 +24,45 @@ - + + + + - + + + + + + + + + + + + + + + + + + + diff --git a/SmartAquaViewer/View/MonitoringView.xaml.cs b/SmartAquaViewer/View/MonitoringView.xaml.cs index 5e8d16d..3ff4e62 100644 --- a/SmartAquaViewer/View/MonitoringView.xaml.cs +++ b/SmartAquaViewer/View/MonitoringView.xaml.cs @@ -18,7 +18,6 @@ using SmartAquaViewer.Classes; using SmartAquaViewer.DataAnalysis; using SmartAquaViewer.Model; using SmartAquaViewer.ViewModel; -using SmartAquaViewer.Model; namespace SmartAquaViewer.View { diff --git a/SmartAquaViewer/ViewModel/EnergyViewModel.cs b/SmartAquaViewer/ViewModel/EnergyViewModel.cs index 3ac2e56..157d6d0 100644 --- a/SmartAquaViewer/ViewModel/EnergyViewModel.cs +++ b/SmartAquaViewer/ViewModel/EnergyViewModel.cs @@ -5,12 +5,18 @@ using System.Linq; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; +using SmartAquaViewer.DataAnalysis; +using SmartAquaViewer.Model; namespace SmartAquaViewer.ViewModel { public class EnergyViewModel : INotifyPropertyChanged { - public EnergyViewModel() { } + public List WaterQualityList { get; set; } + public EnergyViewModel() + { + WaterQualityList = Datas.GetWaterQualityVO(); + } public event PropertyChangedEventHandler? PropertyChanged; private void OnPropertyChanged([CallerMemberName] string? name = null)