feat: 에너지 데이터 추가 및 출력

hhsung_work
HyungJune Kim 10 months ago
parent e794514592
commit 9effacb0a5

@ -21,15 +21,22 @@ namespace SmartAquaViewer.DataAnalysis
/// 저수조 /// 저수조
/// </summary> /// </summary>
public WaterTank Tank { get; set; } = new(); public WaterTank Tank { get; set; } = new();
/// <summary> /// <summary>
/// 여과 시스템 /// 여과 시스템
/// </summary> /// </summary>
public FilteringSystem Filtering { get; set; } = new(); public FilteringSystem Filtering { get; set; } = new();
/// <summary> /// <summary>
/// 살균 시스템 /// 살균 시스템
/// </summary> /// </summary>
public SterilizingSystem Sterilizing { get; set; } = new(); public SterilizingSystem Sterilizing { get; set; } = new();
/// <summary>
/// 총 전력 소비 (킬로와트, kW)
/// </summary>
public double TotalEnergy { get; set; }
public WaterQualityVO() { } public WaterQualityVO() { }
public WaterQualityVO(DateTime RecordedTime, WaterTank tank, FilteringSystem filtering, SterilizingSystem sterilizing) public WaterQualityVO(DateTime RecordedTime, WaterTank tank, FilteringSystem filtering, SterilizingSystem sterilizing)
@ -40,6 +47,20 @@ namespace SmartAquaViewer.DataAnalysis
Sterilizing = sterilizing; 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);
}
/// <summary> /// <summary>
/// 샘플 데이터 리스트 생성 /// 샘플 데이터 리스트 생성
/// </summary> /// </summary>
@ -48,6 +69,18 @@ namespace SmartAquaViewer.DataAnalysis
var list = new List<WaterQualityVO>(); var list = new List<WaterQualityVO>();
var rand = new Random(); 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; if (totalRowsCount <= 0) return list;
double totalSeconds; double totalSeconds;
@ -68,6 +101,7 @@ namespace SmartAquaViewer.DataAnalysis
{ {
DateTime ts = start.AddSeconds(stepSeconds * i); DateTime ts = start.AddSeconds(stepSeconds * i);
var vo = new WaterQualityVO var vo = new WaterQualityVO
{ {
RecordedTime = ts, RecordedTime = ts,
@ -81,27 +115,36 @@ namespace SmartAquaViewer.DataAnalysis
), ),
Filtering = new FilteringSystem( Filtering = new FilteringSystem(
sandFilterPower: rand.Next(0, 2) == 1, sandFilterPower: rand.Next(0, 2) == 1,
sandFilterEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2), sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2),
sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2), sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2),
sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2), sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2),
sumpFlowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), sumpFlowRate: Math.Round(rand.NextDouble() * 5 + 1, 2),
sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2),
circulationPumpPower: rand.Next(0, 2) == 1, circulationPumpPower: rand.Next(0, 2) == 1,
circulationPumpEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
inverterControllerStatus: rand.Next(0, 2) == 1 ? "Normal" : "Error", inverterControllerStatus: rand.Next(0, 2) == 1 ? "Normal" : "Error",
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2),
heatPumpPower: rand.Next(0, 2) == 1, heatPumpPower: rand.Next(0, 2) == 1,
heatPumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), 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( Sterilizing = new SterilizingSystem(
ozoneGeneratorPower: rand.Next(0, 2) == 1, ozoneGeneratorPower: rand.Next(0, 2) == 1,
ozoneGeneratorEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
uvSterilizerId: "UV" + rand.Next(1, 100), uvSterilizerId: "UV" + rand.Next(1, 100),
uvSterilizerPower: rand.Next(0, 2) == 1, uvSterilizerPower: rand.Next(0, 2) == 1,
uvSterilizerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
ozoneDissolverPower: rand.Next(0, 2) == 1, ozoneDissolverPower: rand.Next(0, 2) == 1,
ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2), 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); list.Add(vo);
} }
@ -167,6 +210,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_sand_filter_power")] [Column("filter_sand_filter_power")]
public bool SandFilterPower { get; set; } public bool SandFilterPower { get; set; }
/// <summary>
/// 모래여과기 전력 (kW)
/// </summary>
[Column("filter_sand_filter_energy")]
public double SandFilterEnergy { get; set; }
/// <summary> /// <summary>
/// 섬프탱크 pH (산도) /// 섬프탱크 pH (산도)
/// </summary> /// </summary>
@ -203,6 +252,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_circulation_pump_power")] [Column("filter_circulation_pump_power")]
public bool CirculationPumpPower { get; set; } public bool CirculationPumpPower { get; set; }
/// <summary>
/// 순환펌프 전력 (kW)
/// </summary>
[Column("filter_circulation_pump_energy")]
public double CirculationPumpEnergy { get; set; }
/// <summary> /// <summary>
/// 인버터 제어기 상태 /// 인버터 제어기 상태
/// </summary> /// </summary>
@ -227,31 +282,48 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_heat_pump_temperature")] [Column("filter_heat_pump_temperature")]
public double HeatPumpTemperature { get; set; } public double HeatPumpTemperature { get; set; }
/// <summary>
/// 히트펌프 전력 (kW)
/// </summary>
[Column("filter_heat_pump_energy")]
public double HeatPumpEnergy { get; set; }
/// <summary> /// <summary>
/// 에어브로와 전원 (true: ON, false: OFF) /// 에어브로와 전원 (true: ON, false: OFF)
/// </summary> /// </summary>
[Column("filter_air_blower_power")] [Column("filter_air_blower_power")]
public bool AirBlowerPower { get; set; } public bool AirBlowerPower { get; set; }
/// <summary>
/// 에어브로와 전력 (kW)
/// </summary>
[Column("filter_air_blower_energy")]
public double AirBlowerEnergy { get; set; }
public FilteringSystem() { } public FilteringSystem() { }
public FilteringSystem( public FilteringSystem(
bool sandFilterPower, double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature, bool sandFilterPower, double sandFilterEnergy,
bool circulationPumpPower, string? inverterControllerStatus, double flowRate, double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature,
bool heatPumpPower, double heatPumpTemperature, bool airBlowerPower) bool circulationPumpPower, double circulationPumpEnergy, string? inverterControllerStatus, double flowRate,
bool heatPumpPower, double heatPumpTemperature, double heatPumpEnergy, bool airBlowerPower, double airBlowerEnergy)
{ {
SandFilterPower = sandFilterPower; SandFilterPower = sandFilterPower;
SandFilterEnergy = sandFilterEnergy;
SumpPH = sumpPH; SumpPH = sumpPH;
SumpORP = sumpORP; SumpORP = sumpORP;
SumpWaterLevel = sumpWaterLevel; SumpWaterLevel = sumpWaterLevel;
SumpFlowRate = sumpFlowRate; SumpFlowRate = sumpFlowRate;
SumpTemperature = sumpTemperature; SumpTemperature = sumpTemperature;
CirculationPumpPower = circulationPumpPower; CirculationPumpPower = circulationPumpPower;
CirculationPumpEnergy = circulationPumpEnergy;
InverterControllerStatus = inverterControllerStatus; InverterControllerStatus = inverterControllerStatus;
FlowRate = flowRate; FlowRate = flowRate;
HeatPumpPower = heatPumpPower; HeatPumpPower = heatPumpPower;
HeatPumpTemperature = heatPumpTemperature; HeatPumpTemperature = heatPumpTemperature;
HeatPumpEnergy = heatPumpEnergy;
AirBlowerPower = airBlowerPower; AirBlowerPower = airBlowerPower;
AirBlowerEnergy = airBlowerEnergy;
} }
} }
@ -264,6 +336,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_ozone_generator_power")] [Column("ster_ozone_generator_power")]
public bool OzoneGeneratorPower { get; set; } public bool OzoneGeneratorPower { get; set; }
/// <summary>
/// 오존 발생기 전력 (kW)
/// </summary>
[Column("ster_ozone_generator_energy")]
public double OzoneGeneratorEnergy { get; set; }
/// <summary> /// <summary>
/// 자외선 살균기 ID /// 자외선 살균기 ID
/// </summary> /// </summary>
@ -276,6 +354,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_uv_sterilizer_power")] [Column("ster_uv_sterilizer_power")]
public bool UVSterilizerPower { get; set; } public bool UVSterilizerPower { get; set; }
/// <summary>
/// 자외선 살균기 전력 (kW)
/// </summary>
[Column("ster_uv_sterilizer_energy")]
public double UVSterilizerEnergy { get; set; }
/// <summary> /// <summary>
/// 오존용해장치 전원 (true: ON, false: OFF) /// 오존용해장치 전원 (true: ON, false: OFF)
/// </summary> /// </summary>
@ -288,24 +372,42 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_ozone_dissolver_pressure")] [Column("ster_ozone_dissolver_pressure")]
public double OzoneDissolverPressure { get; set; } public double OzoneDissolverPressure { get; set; }
/// <summary>
/// 오존용해장치 전력 (kW)
/// </summary>
[Column("ster_ozone_dissolver_energy")]
public double OzoneDissolverEnergy { get; set; }
/// <summary> /// <summary>
/// 배오존장치 전원 (true: ON, false: OFF) /// 배오존장치 전원 (true: ON, false: OFF)
/// </summary> /// </summary>
[Column("ster_excess_ozone_destroyer_power")] [Column("ster_excess_ozone_destroyer_power")]
public bool ExcessOzoneDestroyerPower { get; set; } public bool ExcessOzoneDestroyerPower { get; set; }
/// <summary>
/// 배오존장치 전력 (kW)
/// </summary>
[Column("ster_excess_ozone_destroyer_energy")]
public double ExcessOzoneDestroyerEnergy { get; set; }
public SterilizingSystem() { } public SterilizingSystem() { }
public SterilizingSystem( public SterilizingSystem(
bool ozoneGeneratorPower, string uvSterilizerId, bool uvSterilizerPower, bool ozoneGeneratorPower, double ozoneGeneratorEnergy,
bool ozoneDissolverPower, double ozoneDissolverPressure, bool excessOzoneDestroyerPower) string uvSterilizerId, bool uvSterilizerPower, double uvSterilizerEnergy,
bool ozoneDissolverPower, double ozoneDissolverPressure, double ozoneDissolverEnergy,
bool excessOzoneDestroyerPower, double excessOzoneDestroyerEnergy)
{ {
OzoneGeneratorPower = ozoneGeneratorPower; OzoneGeneratorPower = ozoneGeneratorPower;
OzoneGeneratorEnergy = ozoneGeneratorEnergy;
UVSterilizerId = uvSterilizerId; UVSterilizerId = uvSterilizerId;
UVSterilizerPower = uvSterilizerPower; UVSterilizerPower = uvSterilizerPower;
UVSterilizerEnergy = uvSterilizerEnergy;
OzoneDissolverPower = ozoneDissolverPower; OzoneDissolverPower = ozoneDissolverPower;
OzoneDissolverPressure = ozoneDissolverPressure; OzoneDissolverPressure = ozoneDissolverPressure;
OzoneDissolverEnergy = ozoneDissolverEnergy;
ExcessOzoneDestroyerPower = excessOzoneDestroyerPower; ExcessOzoneDestroyerPower = excessOzoneDestroyerPower;
ExcessOzoneDestroyerEnergy = excessOzoneDestroyerEnergy;
} }
} }
} }

@ -9,12 +9,12 @@
<Grid Background="#243851"> <Grid Background="#243851">
<Grid.RowDefinitions> <Grid.RowDefinitions>
<RowDefinition Height="160"/> <RowDefinition Height="160"/>
<RowDefinition Height="*"/> <RowDefinition Height="350"/>
<RowDefinition Height="*"/> <RowDefinition Height="*"/>
</Grid.RowDefinitions> </Grid.RowDefinitions>
<Grid.ColumnDefinitions> <Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/> <ColumnDefinition Width="*"/>
<ColumnDefinition Width="650"/> <ColumnDefinition Width="800"/>
</Grid.ColumnDefinitions> </Grid.ColumnDefinitions>
<Border Grid.ColumnSpan="2" Margin="20" BorderBrush="#3E4C60" BorderThickness="1" CornerRadius="10"> <Border Grid.ColumnSpan="2" Margin="20" BorderBrush="#3E4C60" BorderThickness="1" CornerRadius="10">
@ -24,9 +24,45 @@
</Border> </Border>
<Grid Grid.Row="1" Grid.RowSpan="2" Margin="20 0 20 20"> <ScrollViewer Grid.Row="1" Grid.RowSpan="2" Margin="20 0 20 20"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HorizontalAlignment="Center">
<DataGrid Style="{StaticResource DataGridStyle}" ItemsSource="{Binding WaterQualityList}"
RowStyle="{StaticResource DataGridRowStyle}" ColumnHeaderStyle="{StaticResource DataGridColumnHeaderStyle}">
<DataGrid.Columns>
<DataGridTextColumn
Header="시간"
Binding="{Binding RecordedTime, StringFormat=\{0:HH:mm:ss\}}"
ElementStyle="{StaticResource DataGridElmenetStyle}"/>
</Grid> <DataGridTextColumn Header="모래여과기" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Filtering.SandFilterEnergy}"/>
<DataGridTextColumn Header="순환펌프" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Filtering.CirculationPumpEnergy}"/>
<DataGridTextColumn Header="히트펌프" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Filtering.HeatPumpEnergy}"/>
<DataGridTextColumn Header="에어브로와" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Filtering.AirBlowerEnergy}"/>
<DataGridTextColumn Header="오존발생기" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Sterilizing.OzoneGeneratorEnergy}"/>
<DataGridTextColumn ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Sterilizing.UVSterilizerEnergy}">
<DataGridTextColumn.Header>
<StackPanel>
<TextBlock Text="자외선"/>
<TextBlock Text="살균기"/>
</StackPanel>
</DataGridTextColumn.Header>
</DataGridTextColumn>
<DataGridTextColumn Header="오존용해장치" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Sterilizing.OzoneDissolverEnergy}"/>
<DataGridTextColumn Header="배오존장치" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding Sterilizing.ExcessOzoneDestroyerEnergy}"/>
<DataGridTextColumn Header="총 전력" ElementStyle="{StaticResource DataGridElmenetStyle}"
Binding="{Binding TotalEnergy, StringFormat=\{0:F2\}}"/>
</DataGrid.Columns>
</DataGrid>
</ScrollViewer>
<Border Grid.Row="1" Grid.Column="1" Margin="0 0 20 20" CornerRadius="10" <Border Grid.Row="1" Grid.Column="1" Margin="0 0 20 20" CornerRadius="10"
Background="#384659" BorderBrush="#404F63" BorderThickness="1"> Background="#384659" BorderBrush="#404F63" BorderThickness="1">

@ -18,7 +18,6 @@ using SmartAquaViewer.Classes;
using SmartAquaViewer.DataAnalysis; using SmartAquaViewer.DataAnalysis;
using SmartAquaViewer.Model; using SmartAquaViewer.Model;
using SmartAquaViewer.ViewModel; using SmartAquaViewer.ViewModel;
using SmartAquaViewer.Model;
namespace SmartAquaViewer.View namespace SmartAquaViewer.View
{ {

@ -5,12 +5,18 @@ using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using SmartAquaViewer.DataAnalysis;
using SmartAquaViewer.Model;
namespace SmartAquaViewer.ViewModel namespace SmartAquaViewer.ViewModel
{ {
public class EnergyViewModel : INotifyPropertyChanged public class EnergyViewModel : INotifyPropertyChanged
{ {
public EnergyViewModel() { } public List<WaterQualityVO> WaterQualityList { get; set; }
public EnergyViewModel()
{
WaterQualityList = Datas.GetWaterQualityVO();
}
public event PropertyChangedEventHandler? PropertyChanged; public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string? name = null) private void OnPropertyChanged([CallerMemberName] string? name = null)

Loading…
Cancel
Save