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

hhsung_work
HyungJune Kim 10 months ago
parent e794514592
commit 9effacb0a5

@ -21,15 +21,22 @@ namespace SmartAquaViewer.DataAnalysis
/// 저수조
/// </summary>
public WaterTank Tank { get; set; } = new();
/// <summary>
/// 여과 시스템
/// </summary>
public FilteringSystem Filtering { get; set; } = new();
/// <summary>
/// 살균 시스템
/// </summary>
public SterilizingSystem Sterilizing { get; set; } = new();
/// <summary>
/// 총 전력 소비 (킬로와트, kW)
/// </summary>
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);
}
/// <summary>
/// 샘플 데이터 리스트 생성
/// </summary>
@ -48,6 +69,18 @@ namespace SmartAquaViewer.DataAnalysis
var list = new List<WaterQualityVO>();
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; }
/// <summary>
/// 모래여과기 전력 (kW)
/// </summary>
[Column("filter_sand_filter_energy")]
public double SandFilterEnergy { get; set; }
/// <summary>
/// 섬프탱크 pH (산도)
/// </summary>
@ -203,6 +252,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_circulation_pump_power")]
public bool CirculationPumpPower { get; set; }
/// <summary>
/// 순환펌프 전력 (kW)
/// </summary>
[Column("filter_circulation_pump_energy")]
public double CirculationPumpEnergy { get; set; }
/// <summary>
/// 인버터 제어기 상태
/// </summary>
@ -227,31 +282,48 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_heat_pump_temperature")]
public double HeatPumpTemperature { get; set; }
/// <summary>
/// 히트펌프 전력 (kW)
/// </summary>
[Column("filter_heat_pump_energy")]
public double HeatPumpEnergy { get; set; }
/// <summary>
/// 에어브로와 전원 (true: ON, false: OFF)
/// </summary>
[Column("filter_air_blower_power")]
public bool AirBlowerPower { get; set; }
/// <summary>
/// 에어브로와 전력 (kW)
/// </summary>
[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; }
/// <summary>
/// 오존 발생기 전력 (kW)
/// </summary>
[Column("ster_ozone_generator_energy")]
public double OzoneGeneratorEnergy { get; set; }
/// <summary>
/// 자외선 살균기 ID
/// </summary>
@ -276,6 +354,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_uv_sterilizer_power")]
public bool UVSterilizerPower { get; set; }
/// <summary>
/// 자외선 살균기 전력 (kW)
/// </summary>
[Column("ster_uv_sterilizer_energy")]
public double UVSterilizerEnergy { get; set; }
/// <summary>
/// 오존용해장치 전원 (true: ON, false: OFF)
/// </summary>
@ -288,24 +372,42 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_ozone_dissolver_pressure")]
public double OzoneDissolverPressure { get; set; }
/// <summary>
/// 오존용해장치 전력 (kW)
/// </summary>
[Column("ster_ozone_dissolver_energy")]
public double OzoneDissolverEnergy { get; set; }
/// <summary>
/// 배오존장치 전원 (true: ON, false: OFF)
/// </summary>
[Column("ster_excess_ozone_destroyer_power")]
public bool ExcessOzoneDestroyerPower { get; set; }
/// <summary>
/// 배오존장치 전력 (kW)
/// </summary>
[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;
}
}
}

@ -9,12 +9,12 @@
<Grid Background="#243851">
<Grid.RowDefinitions>
<RowDefinition Height="160"/>
<RowDefinition Height="*"/>
<RowDefinition Height="350"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="650"/>
<ColumnDefinition Width="800"/>
</Grid.ColumnDefinitions>
<Border Grid.ColumnSpan="2" Margin="20" BorderBrush="#3E4C60" BorderThickness="1" CornerRadius="10">
@ -24,9 +24,45 @@
</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"
Background="#384659" BorderBrush="#404F63" BorderThickness="1">

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

@ -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<WaterQualityVO> WaterQualityList { get; set; }
public EnergyViewModel()
{
WaterQualityList = Datas.GetWaterQualityVO();
}
public event PropertyChangedEventHandler? PropertyChanged;
private void OnPropertyChanged([CallerMemberName] string? name = null)

Loading…
Cancel
Save