Merge "hhsun_work" to prototype

hhsung_work
HyungJune Kim 10 months ago
commit b61a0024fc

@ -1,4 +1,5 @@
using Microsoft.EntityFrameworkCore;
using SmartAquaViewer.DataAnalysis;
using System.Collections.Generic;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory;

@ -1,4 +1,5 @@
using System;
using SmartAquaViewer.DataAnalysis;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
@ -64,7 +65,7 @@ namespace SmartAquaViewer.DataAnalisys
// TODO: 라인 파싱 로직
WaterQualityVO vo = new();
//vo.PH = 10.5;
vo.Timestamp = DateTime.Now;
vo.RecordedTime = DateTime.Now;
iwaterQuality.OnParsed(vo);
db.Add(vo);

@ -1,4 +1,5 @@
using System;
using SmartAquaViewer.DataAnalysis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

@ -1,88 +1,47 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using Microsoft.EntityFrameworkCore;
namespace SmartAquaViewer.DataAnalisys
namespace SmartAquaViewer.DataAnalysis
{
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Security.Policy;
[Table("WaterQuality")]
[Table("water_quality")]
public class WaterQualityVO
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 자동 증가
public int Id { get; set; } // PK, Auto Increment
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; }
/// <summary>
/// 저수조
/// 측정 시각
/// </summary>
public WaterTank WaterTank { get; set; }
[Column("recorded_time")]
public DateTime RecordedTime { get; set; }
/// <summary>
/// 여과 시스템
/// 저수조
/// </summary>
public FilteringSystem FilteringSystem { get; set; }
public WaterTank Tank { get; set; } = new();
/// <summary>
/// 살균 시스템
/// 여과 시스템
/// </summary>
public SterilizingSystem SterilizingSystem { get; set; }
public FilteringSystem Filtering { get; set; } = new();
/// <summary>
/// 측정 시각
/// 살균 시스템
/// </summary>
public DateTime Timestamp { get; set; }
public SterilizingSystem Sterilizing { get; set; } = new();
public WaterQualityVO() { }
public WaterQualityVO(
int waterTankNum, double waterTankDOValue, double waterTankPh, double waterTankORP, double waterTankTemperature, double waterTankFlowRate,
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 ozoneGeneratorPower,
string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure,
bool excessOzoneDestroyerPower,
DateTime timestamp)
public WaterQualityVO(DateTime RecordedTime, WaterTank tank, FilteringSystem filtering, SterilizingSystem sterilizing)
{
WaterTank = new WaterTank(waterTankNum, waterTankDOValue, waterTankPh, waterTankORP, waterTankTemperature, waterTankFlowRate);
FilteringSystem = new FilteringSystem(sandFilterPower, sumpPH, sumpORP, sumpWaterLevel, sumpFlowRate, sumpTemperature,
circulationPumpPower, inverterControllerStatus, flowRate,
heatPumpPower, heatPumpTemperature, airBlowerPower);
SterilizingSystem = new SterilizingSystem(ozoneGeneratorPower, uvSterilizerId, uvSterilizerPower,
ozoneDissolverPower, ozoneDissolverPressure, excessOzoneDestroyerPower);
}
public override string ToString()
{
//return $"Tank#{WaterTankNum} [{Timestamp}] DO: {DO} mg/L, pH: {PH}, Temp: {Temperature}°C, " +
// $"Level: {WaterLevel} m, Flow: {FlowRate} m³/s, EC: {ElectricalConductivity} µS/cm, " +
// $"Turbidity: {Turbidity} NTU, Salinity: {Salinity} ppt, ORP: {ORP} mV, " +
// $"TSS: {TSS} mg/L, TN: {TotalNitrogen} mg/L, TP: {TotalPhosphorus} mg/L";
return $"[{Timestamp}] " +
$"[Tank#{WaterTank.WaterTankNum}, DO: {WaterTank.DO} mg/L, pH: {WaterTank.PH}, ORP: {WaterTank.ORP} mV, Temp: {WaterTank.Temperature}°C, FlowRate: {WaterTank.FlowRate} m³/s]" +
$"[SandFilter: {(FilteringSystem.SandFilterPower ? "ON" : "OFF")}, " +
$"(SumpTank) pH: {FilteringSystem.SumpPH}, ORP: {FilteringSystem.SumpORP} mV, WaterLevel: {FilteringSystem.SumpWaterLevel} m, FlowRate: {FilteringSystem.SumpFlowRate} m³/s, Temperature: {FilteringSystem.SumpTemperature}°C," +
$"HeatPump: {(FilteringSystem.HeatPumpPower ? "ON" : "OFF")}, HeatPumpTemperature: {FilteringSystem.HeatPumpTemperature}°C, AirBlower: {(FilteringSystem.AirBlowerPower ? "ON" : "OFF")}]" +
$"[OzoneGenerator: {(SterilizingSystem.OzoneGeneratorPower ? "ON" : "OFF")}," +
$"UVSterilizerId: {SterilizingSystem.UVSterilizerId}, UVSterilizer: {(SterilizingSystem.UVSterilizerPower ? "ON" : "OFF")}," +
$"OzoneDissolver: {SterilizingSystem.OzoneDissolverPower}, OzoneDissolverPressure: {SterilizingSystem.OzoneDissolverPressure} kPa," +
$"ExcessOzoneDestroyer: {(SterilizingSystem.ExcessOzoneDestroyerPower ? "ON" : "OFF")}]";
this.RecordedTime = RecordedTime;
Tank = tank;
Filtering = filtering;
Sterilizing = sterilizing;
}
/// <summary>
/// 지정 기간 동안 임의의 수질 데이터를 생성합니다.
/// 샘플 데이터 리스트 생성
/// </summary>
public static List<WaterQualityVO> GetSampleData(DateTime start, DateTime end, int totalRowsCount)
{
@ -95,8 +54,7 @@ namespace SmartAquaViewer.DataAnalisys
if (start == end)
{
// 같은 날짜면 하루(24시간) 기준으로 균등 분할
totalSeconds = 24 * 60 * 60; // 86,400초
totalSeconds = 24 * 60 * 60;
}
else
{
@ -110,101 +68,89 @@ namespace SmartAquaViewer.DataAnalisys
{
DateTime ts = start.AddSeconds(stepSeconds * i);
//var vo = new WaterQualityVO
//{
// WaterTankNum = rand.Next(1, 6), // 1~5번 탱크
// DO = Math.Round(rand.NextDouble() * 5 + 5, 2), // 5~10 mg/L
// PH = Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
// Temperature = Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
// WaterLevel = Math.Round(rand.NextDouble() * 2 + 1, 2), // 1~3 m
// FlowRate = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
// ElectricalConductivity = Math.Round(rand.NextDouble() * 500 + 200, 2), // 200~700 µS/cm
// Turbidity = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 NTU
// Salinity = Math.Round(rand.NextDouble() * 5, 2), // 0~5 ppt
// ORP = Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
// TSS = Math.Round(rand.NextDouble() * 20 + 5, 2), // 5~25 mg/L
// TotalNitrogen = Math.Round(rand.NextDouble() * 2 + 0.5, 2), // 0.5~2.5 mg/L
// TotalPhosphorus = Math.Round(rand.NextDouble() * 0.5 + 0.05, 3), // 0.05~0.55 mg/L
// Timestamp = ts
//};
var vo = new WaterQualityVO
{
WaterTank = new WaterTank(
waterTankNum: rand.Next(1, 6), // 1~5번 탱크
doValue: Math.Round(rand.NextDouble() * 5 + 5, 2), // 5~10 mg/L
ph: Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
orp: Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
temperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2) // 1~6 m³/s
RecordedTime = ts,
Tank = new WaterTank(
number: rand.Next(1, 6),
doValue: Math.Round(rand.NextDouble() * 5 + 5, 2),
ph: Math.Round(rand.NextDouble() * 2 + 6, 2),
orp: Math.Round(rand.NextDouble() * 200 + 100, 2),
temperature: Math.Round(rand.NextDouble() * 10 + 15, 2),
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2)
),
FilteringSystem = new FilteringSystem(
sandFilterPower: rand.Next(0, 2) == 1, // true or false
sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2), // 1~3 m
sumpFlowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
circulationPumpPower: rand.Next(0, 2) == 1, // true or false
inverterControllerStatus: rand.Next(0, 2) == 1 ? "Normal" : "Error", // "Normal" or "Error"
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
heatPumpPower: rand.Next(0, 2) == 1, // true or false
heatPumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
airBlowerPower: rand.Next(0, 2) == 1 // true or false
Filtering = new FilteringSystem(
sandFilterPower: rand.Next(0, 2) == 1,
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,
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
),
SterilizingSystem = new SterilizingSystem(
ozoneGeneratorPower: rand.Next(0, 2) == 1, // true or false
uvSterilizerId: "UV" + rand.Next(1, 100), // UV1, UV2, ...
uvSterilizerPower: rand.Next(0, 2) == 1, // true or false
ozoneDissolverPower: rand.Next(0, 2) == 1, // true or false
ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2), // 50~150 kPa
excessOzoneDestroyerPower: rand.Next(0, 2) == 1 // true or false
Sterilizing = new SterilizingSystem(
ozoneGeneratorPower: rand.Next(0, 2) == 1,
uvSterilizerId: "UV" + rand.Next(1, 100),
uvSterilizerPower: rand.Next(0, 2) == 1,
ozoneDissolverPower: rand.Next(0, 2) == 1,
ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2),
excessOzoneDestroyerPower: rand.Next(0, 2) == 1
)
};
list.Add(vo);
}
return list;
}
}
[Owned]
public class WaterTank
{
/// <summary>
/// 저수조 번호
/// </summary>
public int WaterTankNum { get; set; }
[Column("tank_number")]
public int Number { get; set; }
/// <summary>
/// Dissolved Oxygen (mg/L)
/// </summary>
public double DO { get; set; }
[Column("tank_do_value")]
public double DOValue { get; set; }
/// <summary>
/// pH (산도)
/// </summary>
[Column("tank_ph")]
public double PH { get; set; }
/// <summary>
/// 산화환원전위 (mV)
/// </summary>
[Column("tank_orp")]
public double ORP { get; set; }
/// <summary>
/// 수온 (°C)
/// </summary>
[Column("tank_temperature")]
public double Temperature { get; set; }
/// <summary>
/// 유량 (m³/s)
/// </summary>
[Column("tank_flow_rate")]
public double FlowRate { get; set; }
public WaterTank(int waterTankNum, double doValue, double ph, double orp, double temperature, double flowRate)
public WaterTank() { }
public WaterTank(int number, double doValue, double ph, double orp, double temperature, double flowRate)
{
WaterTankNum = waterTankNum;
DO = doValue;
Number = number;
DOValue = doValue;
PH = ph;
ORP = orp;
Temperature = temperature;
@ -212,71 +158,85 @@ namespace SmartAquaViewer.DataAnalisys
}
}
[Owned]
public class FilteringSystem
{
/// <summary>
/// 모래여과기 전원 (true: ON, false: OFF)
/// </summary>
[Column("filter_sand_filter_power")]
public bool SandFilterPower { get; set; }
/// <summary>
/// 섬프탱크 pH (산도)
/// </summary>
[Column("filter_sump_ph")]
public double SumpPH { get; set; }
/// <summary>
/// 섬프탱크 산화환원전위 (mV)
/// </summary>
[Column("filter_sump_orp")]
public double SumpORP { get; set; }
/// <summary>
/// 섬프탱크 수위 (m)
/// </summary>
[Column("filter_sump_water_level")]
public double SumpWaterLevel { get; set; }
/// <summary>
/// 섬프탱크 유량 (m³/s)
/// </summary>
[Column("filter_sump_flow_rate")]
public double SumpFlowRate { get; set; }
/// <summary>
/// 섬프탱크 수온 (°C)
/// </summary>
[Column("filter_sump_temperature")]
public double SumpTemperature { get; set; }
/// <summary>
/// 순환펌프 전원 (true: ON, false: OFF)
/// </summary>
[Column("filter_circulation_pump_power")]
public bool CirculationPumpPower { get; set; }
/// <summary>
/// 인버터 제어기 상태
/// </summary>
[Column("filter_inverter_controller_status")]
public string? InverterControllerStatus { get; set; }
/// <summary>
/// 순환펌프 유량 (m³/s)
/// </summary>
[Column("filter_flow_rate")]
public double FlowRate { get; set; }
/// <summary>
/// 히트펌프 전원 (true: ON, false: OFF)
/// </summary>
[Column("filter_heat_pump_power")]
public bool HeatPumpPower { get; set; }
/// <summary>
/// 히트펌프 온도 (°C)
/// </summary>
[Column("filter_heat_pump_temperature")]
public double HeatPumpTemperature { get; set; }
/// <summary>
/// 에어브로와 전원 (true: ON, false: OFF)
/// </summary>
[Column("filter_air_blower_power")]
public bool AirBlowerPower { get; set; }
public FilteringSystem(bool sandFilterPower,
double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature,
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)
{
@ -295,42 +255,50 @@ namespace SmartAquaViewer.DataAnalisys
}
}
[Owned]
public class SterilizingSystem
{
/// <summary>
/// 오존 발생기 전원 (true: ON, false: OFF)
/// </summary>
[Column("ster_ozone_generator_power")]
public bool OzoneGeneratorPower { get; set; }
/// <summary>
/// 자외선 살균기 ID
/// </summary>
[Column("ster_uv_sterilizer_id")]
public string UVSterilizerId { get; set; }
/// <summary>
/// 자외선 살균기 전원 (true: ON, false: OFF)
/// </summary>
[Column("ster_uv_sterilizer_power")]
public bool UVSterilizerPower { get; set; }
/// <summary>
/// 오존용해장치 전원 (true: ON, false: OFF)
/// </summary>
[Column("ster_ozone_dissolver_power")]
public bool OzoneDissolverPower { get; set; }
/// <summary>
/// 오존용해장치 압력 (kPa)
/// </summary>
[Column("ster_ozone_dissolver_pressure")]
public double OzoneDissolverPressure { get; set; }
/// <summary>
/// 배오존장치 전원 (true: ON, false: OFF)
/// </summary>
[Column("ster_excess_ozone_destroyer_power")]
public bool ExcessOzoneDestroyerPower { get; set; }
public SterilizingSystem(bool ozoneGeneratorPower,
string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure,
bool excessOzoneDestroyerPower)
public SterilizingSystem() { }
public SterilizingSystem(
bool ozoneGeneratorPower, string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure, bool excessOzoneDestroyerPower)
{
OzoneGeneratorPower = ozoneGeneratorPower;
UVSterilizerId = uvSterilizerId;

@ -0,0 +1,190 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SmartAquaViewer.DataAnalisys;
#nullable disable
namespace SmartAquaViewer.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20250812043735_AddWaterQualityTable")]
partial class AddWaterQualityTable
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
b.Property<DateTime>("RecordedTime")
.HasColumnType("datetime(6)")
.HasColumnName("recorded_time");
b.HasKey("Id");
b.ToTable("water_quality");
});
modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
{
b.OwnsOne("SmartAquaViewer.DataAnalysis.FilteringSystem", "Filtering", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<bool>("AirBlowerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_air_blower_power");
b1.Property<bool>("CirculationPumpPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_circulation_pump_power");
b1.Property<double>("FlowRate")
.HasColumnType("double")
.HasColumnName("filter_flow_rate");
b1.Property<bool>("HeatPumpPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_heat_pump_power");
b1.Property<double>("HeatPumpTemperature")
.HasColumnType("double")
.HasColumnName("filter_heat_pump_temperature");
b1.Property<string>("InverterControllerStatus")
.HasColumnType("longtext")
.HasColumnName("filter_inverter_status");
b1.Property<bool>("SandFilterPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_sand_filter_power");
b1.Property<double>("SumpFlowRate")
.HasColumnType("double")
.HasColumnName("filter_sump_flow_rate");
b1.Property<double>("SumpORP")
.HasColumnType("double")
.HasColumnName("filter_sump_orp");
b1.Property<double>("SumpPH")
.HasColumnType("double")
.HasColumnName("filter_sump_ph");
b1.Property<double>("SumpTemperature")
.HasColumnType("double")
.HasColumnName("filter_sump_temperature");
b1.Property<double>("SumpWaterLevel")
.HasColumnType("double")
.HasColumnName("filter_sump_water_level");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.SterilizingSystem", "Sterilizing", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<bool>("ExcessOzoneDestroyerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_excess_ozone_destroyer_power");
b1.Property<bool>("OzoneDissolverPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_dissolver_power");
b1.Property<double>("OzoneDissolverPressure")
.HasColumnType("double")
.HasColumnName("ster_ozone_dissolver_pressure");
b1.Property<bool>("OzoneGeneratorPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_generator_power");
b1.Property<string>("UVSterilizerId")
.IsRequired()
.HasColumnType("longtext")
.HasColumnName("ster_uv_sterilizer_id");
b1.Property<bool>("UVSterilizerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_uv_sterilizer_power");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.WaterTank", "Tank", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<double>("DOValue")
.HasColumnType("double")
.HasColumnName("tank_do_value");
b1.Property<double>("FlowRate")
.HasColumnType("double")
.HasColumnName("tank_flow_rate");
b1.Property<int>("Number")
.HasColumnType("int")
.HasColumnName("tank_number");
b1.Property<double>("ORP")
.HasColumnType("double")
.HasColumnName("tank_orp");
b1.Property<double>("PH")
.HasColumnType("double")
.HasColumnName("tank_ph");
b1.Property<double>("Temperature")
.HasColumnType("double")
.HasColumnName("tank_temperature");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.Navigation("Filtering")
.IsRequired();
b.Navigation("Sterilizing")
.IsRequired();
b.Navigation("Tank")
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

@ -0,0 +1,93 @@
using System;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace SmartAquaViewer.Migrations
{
/// <inheritdoc />
public partial class AddWaterQualityTable : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "WaterQuality");
migrationBuilder.CreateTable(
name: "water_quality",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
recorded_time = table.Column<DateTime>(type: "datetime(6)", nullable: false),
tank_number = table.Column<int>(type: "int", nullable: false),
tank_do_value = table.Column<double>(type: "double", nullable: false),
tank_ph = table.Column<double>(type: "double", nullable: false),
tank_orp = table.Column<double>(type: "double", nullable: false),
tank_temperature = table.Column<double>(type: "double", nullable: false),
tank_flow_rate = table.Column<double>(type: "double", nullable: false),
filter_sand_filter_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
filter_sump_ph = table.Column<double>(type: "double", nullable: false),
filter_sump_orp = table.Column<double>(type: "double", nullable: false),
filter_sump_water_level = table.Column<double>(type: "double", nullable: false),
filter_sump_flow_rate = table.Column<double>(type: "double", nullable: false),
filter_sump_temperature = table.Column<double>(type: "double", nullable: false),
filter_circulation_pump_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
filter_inverter_status = table.Column<string>(type: "longtext", nullable: true)
.Annotation("MySql:CharSet", "utf8mb4"),
filter_flow_rate = table.Column<double>(type: "double", nullable: false),
filter_heat_pump_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
filter_heat_pump_temperature = table.Column<double>(type: "double", nullable: false),
filter_air_blower_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_ozone_generator_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_uv_sterilizer_id = table.Column<string>(type: "longtext", nullable: false)
.Annotation("MySql:CharSet", "utf8mb4"),
ster_uv_sterilizer_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_ozone_dissolver_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_ozone_dissolver_pressure = table.Column<double>(type: "double", nullable: false),
ster_excess_ozone_destroyer_power = table.Column<bool>(type: "tinyint(1)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_water_quality", x => x.Id);
})
.Annotation("MySql:CharSet", "utf8mb4");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "water_quality");
migrationBuilder.CreateTable(
name: "WaterQuality",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
DO = table.Column<double>(type: "double", nullable: false),
ElectricalConductivity = table.Column<double>(type: "double", nullable: false),
FlowRate = table.Column<double>(type: "double", nullable: false),
ORP = table.Column<double>(type: "double", nullable: false),
PH = table.Column<double>(type: "double", nullable: false),
Salinity = table.Column<double>(type: "double", nullable: false),
TSS = table.Column<double>(type: "double", nullable: false),
Temperature = table.Column<double>(type: "double", nullable: false),
Timestamp = table.Column<DateTime>(type: "datetime(6)", nullable: false),
TotalNitrogen = table.Column<double>(type: "double", nullable: false),
TotalPhosphorus = table.Column<double>(type: "double", nullable: false),
Turbidity = table.Column<double>(type: "double", nullable: false),
WaterLevel = table.Column<double>(type: "double", nullable: false),
WaterTankNum = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WaterQuality", x => x.Id);
})
.Annotation("MySql:CharSet", "utf8mb4");
}
}
}

@ -19,57 +19,167 @@ namespace SmartAquaViewer.Migrations
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("SmartAquaViewer.DataAnalisys.WaterQualityVO", b =>
modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
b.Property<double>("DO")
.HasColumnType("double");
b.Property<DateTime>("RecordedTime")
.HasColumnType("datetime(6)")
.HasColumnName("recorded_time");
b.Property<double>("ElectricalConductivity")
.HasColumnType("double");
b.HasKey("Id");
b.ToTable("water_quality");
});
modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
{
b.OwnsOne("SmartAquaViewer.DataAnalysis.FilteringSystem", "Filtering", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<bool>("AirBlowerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_air_blower_power");
b1.Property<bool>("CirculationPumpPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_circulation_pump_power");
b1.Property<double>("FlowRate")
.HasColumnType("double")
.HasColumnName("filter_flow_rate");
b.Property<double>("FlowRate")
.HasColumnType("double");
b1.Property<bool>("HeatPumpPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_heat_pump_power");
b.Property<double>("ORP")
.HasColumnType("double");
b1.Property<double>("HeatPumpTemperature")
.HasColumnType("double")
.HasColumnName("filter_heat_pump_temperature");
b.Property<double>("PH")
.HasColumnType("double");
b1.Property<string>("InverterControllerStatus")
.HasColumnType("longtext")
.HasColumnName("filter_inverter_status");
b.Property<double>("Salinity")
.HasColumnType("double");
b1.Property<bool>("SandFilterPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_sand_filter_power");
b.Property<double>("TSS")
.HasColumnType("double");
b1.Property<double>("SumpFlowRate")
.HasColumnType("double")
.HasColumnName("filter_sump_flow_rate");
b.Property<double>("Temperature")
.HasColumnType("double");
b1.Property<double>("SumpORP")
.HasColumnType("double")
.HasColumnName("filter_sump_orp");
b.Property<DateTime>("Timestamp")
.HasColumnType("datetime(6)");
b1.Property<double>("SumpPH")
.HasColumnType("double")
.HasColumnName("filter_sump_ph");
b.Property<double>("TotalNitrogen")
.HasColumnType("double");
b1.Property<double>("SumpTemperature")
.HasColumnType("double")
.HasColumnName("filter_sump_temperature");
b.Property<double>("TotalPhosphorus")
.HasColumnType("double");
b1.Property<double>("SumpWaterLevel")
.HasColumnType("double")
.HasColumnName("filter_sump_water_level");
b.Property<double>("Turbidity")
.HasColumnType("double");
b1.HasKey("WaterQualityVOId");
b.Property<double>("WaterLevel")
.HasColumnType("double");
b1.ToTable("water_quality");
b.Property<int>("WaterTankNum")
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.SterilizingSystem", "Sterilizing", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b.HasKey("Id");
b1.Property<bool>("ExcessOzoneDestroyerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_excess_ozone_destroyer_power");
b1.Property<bool>("OzoneDissolverPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_dissolver_power");
b1.Property<double>("OzoneDissolverPressure")
.HasColumnType("double")
.HasColumnName("ster_ozone_dissolver_pressure");
b1.Property<bool>("OzoneGeneratorPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_generator_power");
b1.Property<string>("UVSterilizerId")
.IsRequired()
.HasColumnType("longtext")
.HasColumnName("ster_uv_sterilizer_id");
b1.Property<bool>("UVSterilizerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_uv_sterilizer_power");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.WaterTank", "Tank", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<double>("DOValue")
.HasColumnType("double")
.HasColumnName("tank_do_value");
b1.Property<double>("FlowRate")
.HasColumnType("double")
.HasColumnName("tank_flow_rate");
b1.Property<int>("Number")
.HasColumnType("int")
.HasColumnName("tank_number");
b1.Property<double>("ORP")
.HasColumnType("double")
.HasColumnName("tank_orp");
b1.Property<double>("PH")
.HasColumnType("double")
.HasColumnName("tank_ph");
b1.Property<double>("Temperature")
.HasColumnType("double")
.HasColumnName("tank_temperature");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.Navigation("Filtering")
.IsRequired();
b.Navigation("Sterilizing")
.IsRequired();
b.ToTable("WaterQuality");
b.Navigation("Tank")
.IsRequired();
});
#pragma warning restore 612, 618
}

Loading…
Cancel
Save