Felicity-Inverter-Monitor/src/Server/Persistance/Database.cs
2025-03-12 14:28:58 +05:30

102 lines
3.3 KiB
C#

using InverterMon.Server.InverterService;
using InverterMon.Server.Persistence.PVGen;
using InverterMon.Server.Persistence.Settings;
using LiteDB;
namespace InverterMon.Server.Persistence;
public class Database
{
readonly LiteDatabase _db;
readonly CurrentStatus _currentStatus;
readonly UserSettings _settings;
readonly ILiteCollection<PVGeneration> _pvGenCollection;
readonly ILiteCollection<UserSettings> _usrSettingsCollection;
PVGeneration? _today;
public Database(IHostApplicationLifetime lifetime, CurrentStatus status, UserSettings settings)
{
_currentStatus = status;
_settings = settings;
_db = new("InverterMon.db") { CheckpointSize = 0 };
lifetime.ApplicationStopping.Register(() => _db?.Dispose());
_pvGenCollection = _db.GetCollection<PVGeneration>();
_usrSettingsCollection = _db.GetCollection<UserSettings>();
RestoreTodaysPvWattHours();
RestoreUserSettings();
}
public void RestoreTodaysPvWattHours()
{
var todayDayNumber = DateOnly.FromDateTime(DateTime.Now).DayNumber;
_today = _pvGenCollection
.Query()
.Where(pg => pg.Id == todayDayNumber)
.SingleOrDefault();
if (_today is not null)
_currentStatus.Result.RestorePVWattHours(_today.TotalWattHours);
else
{
_today = new() { Id = todayDayNumber };
_today.SetTotalWattHours(0);
_currentStatus.Result.RestorePVWattHours(0);
_pvGenCollection.Insert(_today);
_db.Checkpoint();
}
}
public async Task UpdateTodaysPvGeneration(CurrentStatus cmd, CancellationToken c)
{
var hourNow = DateTime.Now.Hour;
if (hourNow < _settings.SunlightStartHour || hourNow >= _settings.SunlightEndHour)
return;
var todayDayNumber = DateOnly.FromDateTime(DateTime.Now).DayNumber;
if (_today?.Id == todayDayNumber)
{
_today.SetWattPeaks(cmd.Result.PVInputWatt);
_today.SetTotalWattHours(cmd.Result.PVInputWattHour);
_pvGenCollection.Update(_today);
}
else
{
cmd.Result.ResetPVWattHourAccumulation(); //it's a new day. start accumulation from scratch.
_today = new() { Id = todayDayNumber };
_today.SetTotalWattHours(0);
_pvGenCollection.Insert(_today);
}
_db.Checkpoint();
}
public PVGeneration? GetPvGenForDay(int dayNumber)
=> _pvGenCollection.FindOne(p => p.Id == dayNumber);
public void RestoreUserSettings()
{
var settings = _usrSettingsCollection.FindById(1);
if (settings is not null)
{
_settings.PV_MaxCapacity = settings.PV_MaxCapacity;
_settings.BatteryCapacity = settings.BatteryCapacity;
_settings.BatteryNominalVoltage = settings.BatteryNominalVoltage;
_settings.SunlightStartHour = settings.SunlightStartHour;
_settings.SunlightEndHour = settings.SunlightEndHour;
}
else
{
_usrSettingsCollection.Insert(_settings);
_db.Checkpoint();
}
}
public void UpdateUserSettings(UserSettings settings)
{
_usrSettingsCollection.Update(settings);
_db.Checkpoint();
}
}