Innovenergy_trunk/csharp/App/VrmGrabber/Database/Db.cs

67 lines
2.5 KiB
C#
Raw Normal View History

2023-04-27 14:59:45 +00:00
using System.Diagnostics.CodeAnalysis;
using System.Reactive.Concurrency;
using System.Reactive.Linq;
using System.Reactive.Threading.Tasks;
using InnovEnergy.Lib.Utils;
using InnovEnergy.Lib.Victron.VictronVRM;
using SQLite;
2023-05-04 15:22:58 +00:00
using static System.Text.Json.JsonSerializer;
using Installation = InnovEnergy.App.VrmGrabber.DataTypes.Installation;
2023-04-27 14:59:45 +00:00
2023-05-04 15:22:58 +00:00
namespace InnovEnergy.App.VrmGrabber.Database;
2023-04-27 14:59:45 +00:00
public static partial class Db
{
public static Dictionary<Lib.Victron.VictronVRM.Installation, IReadOnlyList<Detail>> InstallationsAndDetails;
internal const String DbPath = "./db.sqlite";
private static SQLiteConnection Connection { get; } = new SQLiteConnection(DbPath);
public static TableQuery<Installation> Installations => Connection.Table<Installation>();
public static void Init()
{
// used to force static constructor
}
static Db()
{
// on startup create/migrate tables
Connection.RunInTransaction(() =>
{
// Connection.CreateTable<Installation>();
});
InstallationsAndDetails = new Dictionary<Lib.Victron.VictronVRM.Installation, IReadOnlyList<Detail>>();
Observable.Interval(TimeSpan.FromMinutes(5))
.ObserveOn(TaskPoolScheduler.Default)
.SubscribeOn(TaskPoolScheduler.Default)
.StartWith(0) // Do it right away (on startup)
.Select(UpdateInstallationsAndDetailsFromVrm)
.Select(t => t.ToObservable())
.Concat()
.Subscribe(d => InstallationsAndDetails = d, exception => exception.WriteLine());
}
[UnconditionalSuppressMessage("Trimming", "IL2026:Members annotated with 'RequiresUnreferencedCodeAttribute' require dynamic access otherwise can break functionality when trimming application code", Justification = "<Pending>")]
private static async Task<Dictionary<Lib.Victron.VictronVRM.Installation, IReadOnlyList<Detail>>> UpdateInstallationsAndDetailsFromVrm(Int64 _)
{
var fileContent = await File.ReadAllTextAsync("./token.json");
2023-04-27 14:59:45 +00:00
var acc = Deserialize<AccToken>(fileContent);
var user = VrmAccount.Token(acc.idUser, acc.token);
2023-04-27 14:59:45 +00:00
var installations = await user.GetInstallations();
return installations
.Do(i=>i.Name.WriteLine())
.ToDictionary(i => i, i => i.GetDetails().Result);
}
}
public class AccToken
{
public UInt64 idUser { get; init;}
public String token { get; init;}
2023-04-27 14:59:45 +00:00
}