diff --git a/SmartAquaViewer.sln b/SmartAquaViewer.sln
index 44473df..261bd86 100644
--- a/SmartAquaViewer.sln
+++ b/SmartAquaViewer.sln
@@ -5,6 +5,8 @@ VisualStudioVersion = 17.13.35931.197
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SmartAquaViewer", "SmartAquaViewer\SmartAquaViewer.csproj", "{B1AF5CCA-731E-42E1-8ECD-9B8FC7237A95}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FFMPEGPlayer", "..\FFMPEGPlayer\FFMPEGPlayer\FFMPEGPlayer.csproj", "{1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -21,6 +23,14 @@ Global
{B1AF5CCA-731E-42E1-8ECD-9B8FC7237A95}.Release|Any CPU.Build.0 = Release|Any CPU
{B1AF5CCA-731E-42E1-8ECD-9B8FC7237A95}.Release|x64.ActiveCfg = Release|x64
{B1AF5CCA-731E-42E1-8ECD-9B8FC7237A95}.Release|x64.Build.0 = Release|x64
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Debug|x64.ActiveCfg = Debug|x64
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Debug|x64.Build.0 = Debug|x64
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Release|x64.ActiveCfg = Release|x64
+ {1A33B46E-B95E-491A-B7A1-6D9EDCA40FD4}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/SmartAquaViewer/Classes/Converter.cs b/SmartAquaViewer/Classes/Converter.cs
index a955903..2e504a0 100644
--- a/SmartAquaViewer/Classes/Converter.cs
+++ b/SmartAquaViewer/Classes/Converter.cs
@@ -40,36 +40,4 @@ namespace SmartAquaViewer.Classes
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
=> !(value is bool b && b);
}
-
- public class EnergyToGreenHouseGasConverter : IValueConverter
- {
- // 2024년 배출계수 (kgCO₂/kWh)
- private const double EmissionFactor = 0.4747;
-
- ///
- /// kWh → tCO₂ 변환
- ///
- public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (value is double kWh)
- {
- double tonCO2 = (kWh * EmissionFactor) / 1000.0;
- return tonCO2.ToString("F2"); // 소수점 3자리
- }
- return null;
- }
-
- ///
- /// tCO₂ → kWh 역변환 (Binding TwoWay 대응)
- ///
- public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
- {
- if (double.TryParse(value?.ToString(), out double tonCO2))
- {
- double kWh = (tonCO2 * 1000.0) / EmissionFactor;
- return kWh;
- }
- return null;
- }
- }
}
diff --git a/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs b/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs
index 97c4444..5903099 100644
--- a/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs
+++ b/SmartAquaViewer/DataAnalisys/WaterQualityVO.cs
@@ -37,6 +37,11 @@ namespace SmartAquaViewer.DataAnalysis
///
public double TotalEnergy { get; set; }
+ ///
+ /// 총 온실가스 배출량 (톤, tCO₂)
+ ///
+ public double TotalGreenhouseGas { get; set; }
+
public WaterQualityVO() { }
public WaterQualityVO(DateTime RecordedTime, WaterTank tank, FilteringSystem filtering, SterilizingSystem sterilizing)
@@ -67,6 +72,25 @@ namespace SmartAquaViewer.DataAnalysis
vo.Sterilizing.ExcessOzoneDestroyerEnergy;
}
+ double ConvertEnergyToGHG(double energy)
+ {
+ // 2024년 배출계수 (kgCO₂/kWh)
+ const double EmissionFactor = 0.4747;
+ return (energy * EmissionFactor); // / 1000.0; // tCO₂
+ }
+
+ double CalculateTotalGreenhouseGas(WaterQualityVO vo)
+ {
+ return vo.Filtering.AirBlowerGreenhouseGas +
+ vo.Filtering.CirculationPumpGreenhouseGas +
+ vo.Filtering.HeatPumpGreenhouseGas +
+ vo.Filtering.SandFilterGreenhouseGas +
+ vo.Sterilizing.ExcessOzoneDestroyerGreenhouseGas +
+ vo.Sterilizing.OzoneDissolverGreenhouseGas +
+ vo.Sterilizing.OzoneGeneratorGreenhouseGas +
+ vo.Sterilizing.UVSterilizerGreenhouseGas;
+ }
+
if (totalRowsCount <= 0) return list;
double totalSeconds;
@@ -86,7 +110,7 @@ namespace SmartAquaViewer.DataAnalysis
for (int i = 0; i < totalRowsCount; i++)
{
DateTime ts = start.AddSeconds(stepSeconds * i);
-
+
var vo = new WaterQualityVO
{
@@ -102,6 +126,7 @@ namespace SmartAquaViewer.DataAnalysis
Filtering = new FilteringSystem(
sandFilterPower: rand.Next(0, 2) == 1,
sandFilterEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ sandFilterGreenhouseGas: 0, // 추후 계산
sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2),
sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2),
sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2),
@@ -109,28 +134,44 @@ namespace SmartAquaViewer.DataAnalysis
sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2),
circulationPumpPower: rand.Next(0, 2) == 1,
circulationPumpEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ circulationPumpGreenhouseGas: 0, // 추후 계산
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),
heatPumpEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ heatPumpGreenhouseGas: 0, // 추후 계산
airBlowerPower: rand.Next(0, 2) == 1,
- airBlowerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2)
+ airBlowerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ airBlowerGreenhouseGas: 0 // 추후 계산
),
Sterilizing = new SterilizingSystem(
ozoneGeneratorPower: rand.Next(0, 2) == 1,
ozoneGeneratorEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ ozoneGeneratorGreenhouseGas: 0, // 추후 계산
uvSterilizerId: "UV" + rand.Next(1, 100),
uvSterilizerPower: rand.Next(0, 2) == 1,
uvSterilizerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ uvSterilizerGreenhouseGas: 0, // 추후 계산
ozoneDissolverPower: rand.Next(0, 2) == 1,
ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2),
ozoneDissolverEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ ozoneDissolverGreenhouseGas: 0, // 추후 계산
excessOzoneDestroyerPower: rand.Next(0, 2) == 1,
- excessOzoneDestroyerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2)
+ excessOzoneDestroyerEnergy: Math.Round(rand.NextDouble() * 2 + 0.5, 2),
+ excessOzoneDestroyerGreenhouseGas: 0 // 추후 계산
),
};
vo.TotalEnergy = CalculateTotalEnergy(vo);
+ vo.Filtering.SandFilterGreenhouseGas = ConvertEnergyToGHG(vo.Filtering.SandFilterEnergy);
+ vo.Filtering.CirculationPumpGreenhouseGas = ConvertEnergyToGHG(vo.Filtering.CirculationPumpEnergy);
+ vo.Filtering.HeatPumpGreenhouseGas = ConvertEnergyToGHG(vo.Filtering.HeatPumpEnergy);
+ vo.Filtering.AirBlowerGreenhouseGas = ConvertEnergyToGHG(vo.Filtering.AirBlowerEnergy);
+ vo.Sterilizing.OzoneGeneratorGreenhouseGas = ConvertEnergyToGHG(vo.Sterilizing.OzoneGeneratorEnergy);
+ vo.Sterilizing.UVSterilizerGreenhouseGas = ConvertEnergyToGHG(vo.Sterilizing.UVSterilizerEnergy);
+ vo.Sterilizing.OzoneDissolverGreenhouseGas = ConvertEnergyToGHG(vo.Sterilizing.OzoneDissolverEnergy);
+ vo.Sterilizing.ExcessOzoneDestroyerGreenhouseGas = ConvertEnergyToGHG(vo.Sterilizing.ExcessOzoneDestroyerEnergy);
+ vo.TotalGreenhouseGas = CalculateTotalGreenhouseGas(vo);
list.Add(vo);
}
@@ -202,6 +243,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_sand_filter_energy")]
public double SandFilterEnergy { get; set; }
+ ///
+ /// 모래여과기 온실가스 (tCO₂)
+ ///
+ [Column("filter_sand_filter_greenhouse_gas")]
+ public double SandFilterGreenhouseGas { get; set; }
+
///
/// 섬프탱크 pH (산도)
///
@@ -244,6 +291,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_circulation_pump_energy")]
public double CirculationPumpEnergy { get; set; }
+ ///
+ /// 순환펌프 온실가스 (tCO₂)
+ ///
+ [Column("filter_circulation_pump_greenhouse_gas")]
+ public double CirculationPumpGreenhouseGas { get; set; }
+
///
/// 인버터 제어기 상태
///
@@ -274,6 +327,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_heat_pump_energy")]
public double HeatPumpEnergy { get; set; }
+ ///
+ /// 히트펌프 온실가스 (tCO₂)
+ ///
+ [Column("filter_heat_pump_greenhouse_gas")]
+ public double HeatPumpGreenhouseGas { get; set; }
+
///
/// 에어브로와 전원 (true: ON, false: OFF)
///
@@ -286,16 +345,24 @@ namespace SmartAquaViewer.DataAnalysis
[Column("filter_air_blower_energy")]
public double AirBlowerEnergy { get; set; }
+ ///
+ /// 에어브로와 온실가스 (tCO₂)
+ ///
+ [Column("filter_air_blower_greenhouse_gas")]
+ public double AirBlowerGreenhouseGas { get; set; }
+
public FilteringSystem() { }
public FilteringSystem(
- bool sandFilterPower, double sandFilterEnergy,
+ bool sandFilterPower, double sandFilterEnergy, double sandFilterGreenhouseGas,
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)
+ bool circulationPumpPower, double circulationPumpEnergy, double circulationPumpGreenhouseGas, string? inverterControllerStatus, double flowRate,
+ bool heatPumpPower, double heatPumpTemperature, double heatPumpEnergy, double heatPumpGreenhouseGas,
+ bool airBlowerPower, double airBlowerEnergy, double airBlowerGreenhouseGas)
{
SandFilterPower = sandFilterPower;
SandFilterEnergy = sandFilterEnergy;
+ SandFilterGreenhouseGas = sandFilterGreenhouseGas;
SumpPH = sumpPH;
SumpORP = sumpORP;
SumpWaterLevel = sumpWaterLevel;
@@ -303,13 +370,16 @@ namespace SmartAquaViewer.DataAnalysis
SumpTemperature = sumpTemperature;
CirculationPumpPower = circulationPumpPower;
CirculationPumpEnergy = circulationPumpEnergy;
+ CirculationPumpGreenhouseGas = circulationPumpGreenhouseGas;
InverterControllerStatus = inverterControllerStatus;
FlowRate = flowRate;
HeatPumpPower = heatPumpPower;
HeatPumpTemperature = heatPumpTemperature;
HeatPumpEnergy = heatPumpEnergy;
+ HeatPumpGreenhouseGas = heatPumpGreenhouseGas;
AirBlowerPower = airBlowerPower;
AirBlowerEnergy = airBlowerEnergy;
+ AirBlowerGreenhouseGas = airBlowerGreenhouseGas;
}
}
@@ -328,6 +398,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_ozone_generator_energy")]
public double OzoneGeneratorEnergy { get; set; }
+ ///
+ /// 오존 발생기 온실가스 (tCO₂)
+ ///
+ [Column("ster_ozone_generator_greenhouse_gas")]
+ public double OzoneGeneratorGreenhouseGas { get; set; }
+
///
/// 자외선 살균기 ID
///
@@ -346,6 +422,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_uv_sterilizer_energy")]
public double UVSterilizerEnergy { get; set; }
+ ///
+ /// 자외선 살균기 온실가스 (tCO₂)
+ ///
+ [Column("ster_uv_sterilizer_greenhouse_gas")]
+ public double UVSterilizerGreenhouseGas { get; set; }
+
///
/// 오존용해장치 전원 (true: ON, false: OFF)
///
@@ -364,6 +446,12 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_ozone_dissolver_energy")]
public double OzoneDissolverEnergy { get; set; }
+ ///
+ /// 오존용해장치 온실가스 (tCO₂)
+ ///
+ [Column("ster_ozone_dissolver_greenhouse_gas")]
+ public double OzoneDissolverGreenhouseGas { get; set; }
+
///
/// 배오존장치 전원 (true: ON, false: OFF)
///
@@ -376,24 +464,34 @@ namespace SmartAquaViewer.DataAnalysis
[Column("ster_excess_ozone_destroyer_energy")]
public double ExcessOzoneDestroyerEnergy { get; set; }
+ ///
+ /// 배오존장치 온실가스 (tCO₂)
+ ///
+ [Column("ster_excess_ozone_destroyer_greenhouse_gas")]
+ public double ExcessOzoneDestroyerGreenhouseGas { get; set; }
+
public SterilizingSystem() { }
public SterilizingSystem(
- bool ozoneGeneratorPower, double ozoneGeneratorEnergy,
- string uvSterilizerId, bool uvSterilizerPower, double uvSterilizerEnergy,
- bool ozoneDissolverPower, double ozoneDissolverPressure, double ozoneDissolverEnergy,
- bool excessOzoneDestroyerPower, double excessOzoneDestroyerEnergy)
+ bool ozoneGeneratorPower, double ozoneGeneratorEnergy, double ozoneGeneratorGreenhouseGas,
+ string uvSterilizerId, bool uvSterilizerPower, double uvSterilizerEnergy, double uvSterilizerGreenhouseGas,
+ bool ozoneDissolverPower, double ozoneDissolverPressure, double ozoneDissolverEnergy, double ozoneDissolverGreenhouseGas,
+ bool excessOzoneDestroyerPower, double excessOzoneDestroyerEnergy, double excessOzoneDestroyerGreenhouseGas)
{
OzoneGeneratorPower = ozoneGeneratorPower;
OzoneGeneratorEnergy = ozoneGeneratorEnergy;
+ OzoneGeneratorGreenhouseGas = ozoneGeneratorGreenhouseGas;
UVSterilizerId = uvSterilizerId;
UVSterilizerPower = uvSterilizerPower;
UVSterilizerEnergy = uvSterilizerEnergy;
+ UVSterilizerGreenhouseGas = uvSterilizerGreenhouseGas;
OzoneDissolverPower = ozoneDissolverPower;
OzoneDissolverPressure = ozoneDissolverPressure;
OzoneDissolverEnergy = ozoneDissolverEnergy;
+ OzoneDissolverGreenhouseGas = ozoneDissolverGreenhouseGas;
ExcessOzoneDestroyerPower = excessOzoneDestroyerPower;
ExcessOzoneDestroyerEnergy = excessOzoneDestroyerEnergy;
+ ExcessOzoneDestroyerGreenhouseGas = excessOzoneDestroyerGreenhouseGas;
}
}
}
diff --git a/SmartAquaViewer/Model/Enums.cs b/SmartAquaViewer/Model/Enums.cs
index d55c773..7b25e86 100644
--- a/SmartAquaViewer/Model/Enums.cs
+++ b/SmartAquaViewer/Model/Enums.cs
@@ -35,4 +35,10 @@ namespace SmartAquaViewer.Model
Off,
On
}
+
+ public enum DataType
+ {
+ Energy,
+ GreenhouseGas
+ }
}
diff --git a/SmartAquaViewer/View/GreenHouseView.xaml b/SmartAquaViewer/View/GreenHouseView.xaml
index 150ba6e..dd74d07 100644
--- a/SmartAquaViewer/View/GreenHouseView.xaml
+++ b/SmartAquaViewer/View/GreenHouseView.xaml
@@ -4,13 +4,14 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:SmartAquaViewer.View"
+ xmlns:control="clr-namespace:SmartAquaViewer.Controls"
xmlns:helper="clr-namespace:SmartAquaViewer.Helper"
xmlns:classes="clr-namespace:SmartAquaViewer.Classes"
mc:Ignorable="d"
d:DesignHeight="940" d:DesignWidth="1650">
-
+
@@ -35,17 +36,17 @@
ElementStyle="{StaticResource DataGridElmenetStyle}"/>
+ Binding="{Binding Filtering.SandFilterGreenhouseGas, StringFormat=\{0:F3\}}"/>
+ Binding="{Binding Filtering.CirculationPumpGreenhouseGas, StringFormat=\{0:F3\}}"/>
+ Binding="{Binding Filtering.HeatPumpGreenhouseGas, StringFormat=\{0:F3\}}"/>
+ Binding="{Binding Filtering.AirBlowerGreenhouseGas, StringFormat=\{0:F3\}}"/>
+ Binding="{Binding Sterilizing.OzoneGeneratorGreenhouseGas, StringFormat=\{0:F3\}}"/>
+ Binding="{Binding Sterilizing.UVSterilizerGreenhouseGas, StringFormat=\{0:F3\}}">
@@ -54,11 +55,11 @@
+ Binding="{Binding Sterilizing.OzoneDissolverGreenhouseGas, StringFormat=\{0:F3\}}"/>
-
+ Binding="{Binding Sterilizing.ExcessOzoneDestroyerGreenhouseGas, StringFormat=\{0:F3\}}"/>
+
@@ -86,13 +87,183 @@
helper:ComboBoxHelper.SelectFirstOnItemsChange="True"
IsEditable="False" IsTextSearchEnabled="False"/>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
diff --git a/SmartAquaViewer/ViewModel/EnergyViewModel.cs b/SmartAquaViewer/ViewModel/EnergyViewModel.cs
index 796167f..907798d 100644
--- a/SmartAquaViewer/ViewModel/EnergyViewModel.cs
+++ b/SmartAquaViewer/ViewModel/EnergyViewModel.cs
@@ -277,13 +277,13 @@ namespace SmartAquaViewer.ViewModel
switch (SelectedGraphType)
{
case GraphType.LINE:
- GraphControlVM.SetMultiLineGraph(WaterQualityList, SelectedYFields, ShowMarkers, ShowLegends);
+ GraphControlVM.SetMultiLineGraph(WaterQualityList, SelectedYFields, DataType.Energy, ShowMarkers, ShowLegends);
break;
case GraphType.STACKAREA:
- GraphControlVM.SetStackAreaPlot(WaterQualityList, SelectedYFields, ShowMarkers, ShowLegends);
+ GraphControlVM.SetStackAreaPlot(WaterQualityList, SelectedYFields, DataType.Energy, ShowMarkers, ShowLegends);
break;
case GraphType.PIE:
- GraphControlVM.SetPieChart(WaterQualityList, SelectedYFields, UseAverage, IsDonut);
+ GraphControlVM.SetPieChart(WaterQualityList, SelectedYFields, DataType.Energy, UseAverage, IsDonut);
break;
default:
break;
diff --git a/SmartAquaViewer/ViewModel/GraphControlViewModel.cs b/SmartAquaViewer/ViewModel/GraphControlViewModel.cs
index e4ab0ed..2af40b7 100644
--- a/SmartAquaViewer/ViewModel/GraphControlViewModel.cs
+++ b/SmartAquaViewer/ViewModel/GraphControlViewModel.cs
@@ -93,6 +93,7 @@ namespace SmartAquaViewer.ViewModel
public void SetMultiLineGraph(
List collection,
ObservableCollection yFields,
+ DataType dataType,
bool showMarker, bool showLegend)
{
Model.Series.Clear();
@@ -109,7 +110,7 @@ namespace SmartAquaViewer.ViewModel
var yAxis = new LinearAxis
{
Position = AxisPosition.Left,
- Title = "전력 (kW)",
+ Title = dataType == DataType.Energy ? "전력 (kW)" : "온실가스 (tCO₂)",
MajorGridlineStyle = LineStyle.Solid,
MinorGridlineStyle = LineStyle.Dot
};
@@ -127,7 +128,8 @@ namespace SmartAquaViewer.ViewModel
foreach (var r in collection.OrderBy(r => r.RecordedTime))
{
double? y = null;
- y = ResolveEnergyField(r, field.Name!);
+ double? v = ResolveGreenhouseGas(r, field.Name!);
+ y = dataType == DataType.Energy ? ResolveEnergyField(r, field.Name!) : v;
if (!y.HasValue) continue;
series.Points.Add(new DataPoint(
DateTimeAxis.ToDouble(r.RecordedTime),
@@ -149,7 +151,7 @@ namespace SmartAquaViewer.ViewModel
LegendPlacement = LegendPlacement.Outside,
LegendPosition = LegendPosition.RightTop,
LegendOrientation = LegendOrientation.Vertical,
- LegendTitle = "전력 소비량",
+ LegendTitle = dataType == DataType.Energy ? "전력 소비량" : "온실가스 배출량",
TextColor = OxyColors.Black
});
@@ -474,6 +476,7 @@ namespace SmartAquaViewer.ViewModel
}
public void SetStackAreaPlot(List collection, ObservableCollection yFields,
+ DataType dataType,
bool showMarker, bool showLegends)
{
Model.Series.Clear();
@@ -493,7 +496,7 @@ namespace SmartAquaViewer.ViewModel
var yAxis = new LinearAxis
{
Position = AxisPosition.Left,
- Title = "전력 (kW)",
+ Title = dataType == DataType.Energy ? "전력 (kW)" : "온실가스 (tCO₂)",
MajorGridlineStyle = LineStyle.Solid,
MinorGridlineStyle = LineStyle.Dot
};
@@ -522,7 +525,9 @@ namespace SmartAquaViewer.ViewModel
for (int i = 0; i < n; i++)
{
- double? y = ResolveEnergyField(records[i], field.Name!);
+ double? y = dataType == DataType.Energy ?
+ ResolveEnergyField(records[i], field.Name!) :
+ ResolveGreenhouseGas(records[i], field.Name!);
double value = y ?? 0;
double x = DateTimeAxis.ToDouble(records[i].RecordedTime);
@@ -550,7 +555,7 @@ namespace SmartAquaViewer.ViewModel
LegendPlacement = LegendPlacement.Outside,
LegendPosition = LegendPosition.RightTop,
LegendOrientation = LegendOrientation.Vertical,
- LegendTitle = "전력 소비량",
+ LegendTitle = dataType == DataType.Energy ? "전력 소비량" : "온실가스 배출량",
TextColor = OxyColors.Black
});
@@ -558,6 +563,7 @@ namespace SmartAquaViewer.ViewModel
}
public void SetPieChart(List collection, ObservableCollection fields,
+ DataType dataType,
bool useAverage = false, bool donut = true,
double minLabelPercent = 0.03)
{
@@ -579,8 +585,8 @@ namespace SmartAquaViewer.ViewModel
var agg = new List<(string name, double value)>();
foreach (var f in fields)
{
- var values = collection.Select(r => ResolveEnergyField(r, f.Name!) ?? 0.0);
- double v = useAverage ? (values.Any() ? values.Average() : 0.0) : values.Sum();
+ var values = collection.Select(r => (dataType == DataType.Energy ? ResolveEnergyField(r, f.Name!) : ResolveGreenhouseGas(r, f.Name!)) ?? 0.0);
+ double v = (useAverage ? (values.Any() ? values.Average() : 0.0) : values.Sum());
agg.Add((f.Display ?? f.Name!, v));
}
@@ -701,6 +707,23 @@ namespace SmartAquaViewer.ViewModel
};
}
+ private double? ResolveGreenhouseGas(WaterQualityVO vo, string fieldName)
+ {
+ return fieldName switch
+ {
+ "Filtering.SandFilterGreenhouseGas" => vo.Filtering.SandFilterGreenhouseGas,
+ "Filtering.CirculationPumpGreenhouseGas" => vo.Filtering.CirculationPumpGreenhouseGas,
+ "Filtering.HeatPumpGreenhouseGas" => vo.Filtering.HeatPumpGreenhouseGas,
+ "Filtering.AirBlowerGreenhouseGas" => vo.Filtering.AirBlowerGreenhouseGas,
+ "Sterilizing.OzoneGeneratorGreenhouseGas" => vo.Sterilizing.OzoneGeneratorGreenhouseGas,
+ "Sterilizing.UVSterilizerGreenhouseGas" => vo.Sterilizing.UVSterilizerGreenhouseGas,
+ "Sterilizing.OzoneDissolverGreenhouseGas" => vo.Sterilizing.OzoneDissolverGreenhouseGas,
+ "Sterilizing.ExcessOzoneDestroyerGreenhouseGas" => vo.Sterilizing.ExcessOzoneDestroyerGreenhouseGas,
+ "TotalGreenhouseGas" => vo.TotalGreenhouseGas,
+ _ => null
+ };
+ }
+
private double? ResolveUvPowerPerId(WaterQualityVO r, string fieldName)
{
// 케이스 A
diff --git a/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs b/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs
index ec84244..b306d13 100644
--- a/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs
+++ b/SmartAquaViewer/ViewModel/GreenHouseGasViewModel.cs
@@ -60,20 +60,6 @@ namespace SmartAquaViewer.ViewModel
}
}
- private StepFieldKind _selectedKind = StepFieldKind.Sensor; // 기본값은 센서
- public StepFieldKind SelectedKind
- {
- get => _selectedKind;
- set
- {
- if (_selectedKind != value)
- {
- _selectedKind = value;
- OnPropertyChanged();
- }
- }
- }
-
public bool ShowXSelector => SelectedGraphType == GraphType.SCATTER;
// [필드 후보 목록] 탭/시스템에 따라 달라짐
@@ -118,9 +104,7 @@ namespace SmartAquaViewer.ViewModel
GraphType.LINE,
GraphType.STACKAREA,
GraphType.PIE
- };
-
- SelectedKind = StepFieldKind.Energy; // 기본적으로 에너지 관련 필드만 표시
+ };
DrawGraphCommand = new RelayCommand(DrawGraph);
@@ -133,13 +117,13 @@ namespace SmartAquaViewer.ViewModel
switch (SelectedGraphType)
{
case GraphType.LINE:
- GraphControlVM.SetMultiLineGraph(WaterQualityList, SelectedYFields, ShowMarkers, ShowLegends);
+ GraphControlVM.SetMultiLineGraph(WaterQualityList, SelectedYFields, DataType.GreenhouseGas, ShowMarkers, ShowLegends);
break;
case GraphType.STACKAREA:
- GraphControlVM.SetStackAreaPlot(WaterQualityList, SelectedYFields, ShowMarkers, ShowLegends);
+ GraphControlVM.SetStackAreaPlot(WaterQualityList, SelectedYFields, DataType.GreenhouseGas, ShowMarkers, ShowLegends);
break;
case GraphType.PIE:
- GraphControlVM.SetPieChart(WaterQualityList, SelectedYFields);
+ GraphControlVM.SetPieChart(WaterQualityList, SelectedYFields, DataType.GreenhouseGas);
break;
default:
break;
@@ -153,15 +137,15 @@ namespace SmartAquaViewer.ViewModel
// 공통 시간
AvailableFields.Add(new FieldItem { Name = "RecordedTime", Display = "시간", DataType = typeof(DateTime) });
- AvailableFields.Add(new FieldItem { Name = "TotalEnergy", Display = "총 전력", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Filtering.SandFilterEnergy", Display = "모래여과기", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Filtering.CirculationPumpEnergy", Display = "순환펌프", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Filtering.HeatPumpEnergy", Display = "히트펌프", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Filtering.AirBlowerEnergy", Display = "에어브로와", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Sterilizing.OzoneGeneratorEnergy", Display = "오존발생기", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Sterilizing.UVSterilizerEnergy", Display = "자외선 살균기", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Sterilizing.OzoneDissolverEnergy", Display = "오존용해장치", DataType = typeof(double), Kind = StepFieldKind.Energy });
- AvailableFields.Add(new FieldItem { Name = "Sterilizing.ExcessOzoneDestroyerEnergy", Display = "배오존장치", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "TotalGreenhouseGas", Display = "총 배출량", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Filtering.SandFilterGreenhouseGas", Display = "모래여과기", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Filtering.CirculationPumpGreenhouseGas", Display = "순환펌프", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Filtering.HeatPumpGreenhouseGas", Display = "히트펌프", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Filtering.AirBlowerGreenhouseGas", Display = "에어브로와", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Sterilizing.OzoneGeneratorGreenhouseGas", Display = "오존발생기", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Sterilizing.UVSterilizerGreenhouseGas", Display = "자외선 살균기", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Sterilizing.OzoneDissolverGreenhouseGas", Display = "오존용해장치", DataType = typeof(double), Kind = StepFieldKind.Energy });
+ AvailableFields.Add(new FieldItem { Name = "Sterilizing.ExcessOzoneDestroyerGreenhouseGas", Display = "배오존장치", DataType = typeof(double), Kind = StepFieldKind.Energy });
}
private void RebuildFieldCandidates()
@@ -179,7 +163,7 @@ namespace SmartAquaViewer.ViewModel
SelectedXField = AvailableFields.FirstOrDefault(f => f.DataType == typeof(DateTime))
?? AvailableFields.FirstOrDefault();
- IEnumerable src = AvailableFields.Where(f => f.Kind == SelectedKind);
+ IEnumerable src = AvailableFields;
if (SelectedGraphType is GraphType.LINE or GraphType.STACKAREA or GraphType.PIE)
{