Skip to content

Commit

Permalink
Changes
Browse files Browse the repository at this point in the history
  • Loading branch information
valentintintin committed Mar 27, 2024
1 parent 62afd65 commit fb3a7bd
Show file tree
Hide file tree
Showing 42 changed files with 541 additions and 194 deletions.
83 changes: 83 additions & 0 deletions Monitor/Monitor/Components/Stat.razor
@@ -0,0 +1,83 @@
@using Monitor.Models
@using System.Globalization

<Card Title="@Title">
<Body>
<GridRow Align="center">
@if (ShowMin)
{
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Min aujourd'hui" Value="@GetValue(Data.TotalToday.Min)" Suffix="@Suffix" />
</GridCol>
}
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Moyenne aujourd'hui" Value="@GetValue(Data.TotalToday.Average)" Suffix="@Suffix" />
</GridCol>
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Max aujourd'hui" Value="@GetValue(Data.TotalToday.Max)" Suffix="@Suffix" />
</GridCol>
</GridRow>
<GridRow>
@if (ShowMin)
{
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Min hier" Value="@GetValue(Data.TotalYesterday.Min)" Suffix="@Suffix" />
</GridCol>
}
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Moyenne hier" Value="@GetValue(Data.TotalYesterday.Average)" Suffix="@Suffix" />
</GridCol>
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Max hier" Value="@GetValue(Data.TotalYesterday.Max)" Suffix="@Suffix" />
</GridCol>
</GridRow>
<GridRow>
@if (ShowMin)
{
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Min" Value="@GetValue(Data.Total.Min)" Suffix="@Suffix" />
</GridCol>
}
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Moyenne" Value="@GetValue(Data.Total.Average)" Suffix="@Suffix" />
</GridCol>
<GridCol Xs="24" Sm="@SizeMd">
<Statistic Title="Max" Value="@GetValue(Data.Total.Max)" Suffix="@Suffix" />
</GridCol>
</GridRow>
</Body>
</Card>

@code {
[Parameter]
public required StatsView Data { get; set; }

[Parameter]
public required string Title { get; set; }

[Parameter]
public string? Suffix { get; set; }

[Parameter]
public bool ShowMin { get; set; } = true;

[Parameter]
public Type Type { get; set; } = typeof(double);

private int SizeMd => ShowMin ? 8 : 12;

private string GetValue(double value)
{
if (Type == typeof(DateTime))
{
return DateTimeOffset.FromUnixTimeSeconds((long)value).ToString("dd/MM HH:mm:ss", CultureInfo.CurrentCulture);
}

if (Type == typeof(TimeSpan))
{
return TimeSpan.FromSeconds(value).ToString();
}

return value.ToString(CultureInfo.CurrentCulture);
}
}
6 changes: 4 additions & 2 deletions Monitor/Monitor/Controllers/DevController.cs
@@ -1,7 +1,9 @@
using System.Globalization;
using AprsSharp.AprsParser;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Monitor.Context;
using Monitor.Extensions;
using Monitor.Services;

namespace Monitor.Controllers;
Expand All @@ -17,9 +19,9 @@ public class DevController(
private readonly DataContext _context = contextFactory.CreateDbContext();

[HttpGet("test")]
public object? Test()
public void Test()
{
return default;
Console.WriteLine("F4HVV-15>F4HVV,WIDE1-1:!/7V,.Ot#4I!!G Solar NPR+Lora digi+Cam |!!!i!\"!>!W!!|".ToAprsPacket().Sender);
}

[HttpGet("reset_database")]
Expand Down
7 changes: 6 additions & 1 deletion Monitor/Monitor/Extensions/DateTimeExtensions.cs
Expand Up @@ -6,5 +6,10 @@ public static DateTime ToFrench(this DateTime dateTime)
{
var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Europe/Paris");
return TimeZoneInfo.ConvertTimeFromUtc(dateTime, timeZone);
}
}

public static long ToUnixTimestamp(this DateTime dateTime)
{
return (long)dateTime.ToUniversalTime().Subtract(new DateTime(1970, 1, 1)).TotalSeconds;
}
}
14 changes: 14 additions & 0 deletions Monitor/Monitor/Extensions/StringExtensions.cs
@@ -1,3 +1,5 @@
using AprsSharp.AprsParser;

namespace Monitor.Extensions;

public static class StringExtensions
Expand Down Expand Up @@ -51,4 +53,16 @@ public static long ToLong(this string? value, long? defaultValue = null)

return valueLong;
}

public static Packet ToAprsPacket(this string value)
{
try
{
return new Packet(value);
}
catch (Exception)
{
return new Packet($"{value.Split(":")[0]}: ");
}
}
}
76 changes: 65 additions & 11 deletions Monitor/Monitor/MainLayout.razor
@@ -1,20 +1,29 @@
@inherits Microsoft.AspNetCore.Components.LayoutComponentBase
@using Microsoft.AspNetCore.WebUtilities
@using Monitor.Extensions
@using Monitor.Services
@using System.Reactive.Linq
@inherits Microsoft.AspNetCore.Components.LayoutComponentBase
@inject NavigationManager NavManager
@inject INotificationService NotificationService

<Layout Class="layout">
<Header Style="height: auto; min-height: 64px; display: flex; flex-wrap: wrap; align-items: center; color: white;">
<span style="margin-right: 60px">Station F4HVV</span>
<Menu Theme="MenuTheme.Dark" Mode="MenuMode.Horizontal">
<MenuItem RouterLink="/" RouterMatch="NavLinkMatch.All">Tableau de bord</MenuItem>
<MenuItem RouterLink="/history" RouterMatch="NavLinkMatch.All">Historique</MenuItem>
<SubMenu Title="Outils">
<MenuItemGroup Title="">
<MenuItem RouterLink="/settings" RouterMatch="NavLinkMatch.All">Paramètres</MenuItem>
</MenuItemGroup>
<MenuItemGroup Title="Dev">
<MenuItem RouterLink="/states">État JSON</MenuItem>
<MenuItem RouterLink="/camera/current.jpg">Caméras</MenuItem>
</MenuItemGroup>
</SubMenu>
@if (_isAdmin)
{
<SubMenu Title="Outils">
<MenuItemGroup Title="">
<MenuItem RouterLink="/settings" RouterMatch="NavLinkMatch.All">Paramètres</MenuItem>
</MenuItemGroup>
<MenuItemGroup Title="Dev">
<MenuItem RouterLink="/states"tat JSON</MenuItem>
<MenuItem RouterLink="/camera/current.jpg">Caméras</MenuItem>
</MenuItemGroup>
</SubMenu>
}
</Menu>
</Header>

Expand All @@ -25,4 +34,49 @@
<Footer Style="text-align: center; ">
<a href="https://f4hvv.valentin-saugnier.fr" target="_blank">Valentin Saugnier - F4HVV</a> - <a href="mailto:valentin.s.10@gmail.com">valentin.s.10@gmail.com</a>
</Footer>
</Layout>
</Layout>

@code
{
private bool _isAdmin;

protected override void OnInitialized()
{
base.OnInitialized();

var uri = NavManager.ToAbsoluteUri(NavManager.Uri);
_isAdmin = QueryHelpers.ParseQuery(uri.Query).ContainsKey("admin");

EntitiesManagerService.Entities.GpioWifi.ValueChanges()
.Merge(EntitiesManagerService.Entities.GpioNpr.ValueChanges())
.Merge(EntitiesManagerService.Entities.StatusBoxOpened.ValueChanges())
.Merge(EntitiesManagerService.Entities.FeatureSleepEnabled.ValueChanges())
.Merge(EntitiesManagerService.Entities.MpptPowerEnabled.ValueChanges())
.Merge(EntitiesManagerService.Entities.FeatureAprsDigipeaterEnabled.ValueChanges())
.Merge(EntitiesManagerService.Entities.FeatureSleepEnabled.ValueChanges())
.Merge(EntitiesManagerService.Entities.FeatureAprsPositionEnabled.ValueChanges())
.Merge(EntitiesManagerService.Entities.FeatureAprsTelemetryEnabled.ValueChanges())
.Merge(EntitiesManagerService.Entities.FeatureWatchdogSafetyEnabled.ValueChanges())
.Merge(EntitiesManagerService.Entities.WatchdogEnabled.ValueChanges())
.SubscribeAsync(Notify);

EntitiesManagerService.Entities.McuStatus.ValueChanges()
.Merge(EntitiesManagerService.Entities.MpptStatus.ValueChanges())
.SubscribeAsync(Notify);

EntitiesManagerService.Entities.WatchdogPowerOffTime.ValueChanges()
.Merge(EntitiesManagerService.Entities.WatchdogCounter.ValueChanges()
.Where(v => v.value - v.old >= TimeSpan.FromSeconds(15))
).SubscribeAsync(Notify);
}

private async Task Notify<T>((T? old, T? value, string id) val)
{
await NotificationService.Info(new NotificationConfig
{
Key = val.id,
Message = $"Changement d'état pour {val.id.ToUpper().Replace("/", " ")}",
Description = $"Passage de {(val.old != null ? val.old : "-")} à {val.value}.",
});
}
}
2 changes: 1 addition & 1 deletion Monitor/Monitor/Models/ImageMagickParameters.cs
Expand Up @@ -2,7 +2,7 @@ namespace Monitor.Models;

public class ImageMagickParameters
{
private readonly List<string> _commands = new();
private readonly List<string> _commands = [];

private int? _translateX = 0;
private int? _translateY = 0;
Expand Down
5 changes: 0 additions & 5 deletions Monitor/Monitor/Models/MonitorState.cs
Expand Up @@ -14,11 +14,6 @@ public class MonitorState
Type = "weather"
};

public TimeData Time { get; set; } = new()
{
Type = "time"
};

public McuSystemData McuSystem { get; set; } = new()
{
State = "no data",
Expand Down
6 changes: 4 additions & 2 deletions Monitor/Monitor/Models/MqttEntity.cs
Expand Up @@ -44,9 +44,11 @@ public ConfigEntity(string id, bool retain = false, T? initialValue = default, b
SetValue(initialValue);
}

public IObservable<(T? old, T? value)> ValueChanges(bool onlyIfDifferent = true)
public IObservable<(T? old, T? value, string id)> ValueChanges(bool onlyIfDifferent = true)
{
return _valueSubject.AsObservable().Where(v => !onlyIfDifferent || v.old?.Equals(v.value) != true);
return _valueSubject.AsObservable()
.Where(v => !onlyIfDifferent || v.old?.Equals(v.value) != true)
.Select(v => (v.old, v.value, Id));
}

public IObservable<string> ValueStringAsync()
Expand Down
11 changes: 11 additions & 0 deletions Monitor/Monitor/Models/SerialMessages/McuSystemData.cs
Expand Up @@ -9,6 +9,12 @@ public class McuSystemData : Message

[JsonPropertyName("boxOpened")]
public bool BoxOpened { get; set; }

[JsonPropertyName("time")]
public long Timestamp { get; set; }

[JsonPropertyName("uptime")]
public long Uptime { get; set; }

[JsonPropertyName("watchdogSafety")]
public bool WatchdogSafetyEnabled { get; set; }
Expand All @@ -30,4 +36,9 @@ public class McuSystemData : Message

[JsonIgnore]
public bool IsAlert => State == "alert";

[JsonIgnore]
public DateTimeOffset DateTime => DateTimeOffset.FromUnixTimeSeconds(Timestamp);
[JsonIgnore]
public TimeSpan UptimeTimeSpan => TimeSpan.FromSeconds(Uptime);
}
1 change: 0 additions & 1 deletion Monitor/Monitor/Models/SerialMessages/Message.cs
Expand Up @@ -7,7 +7,6 @@ namespace Monitor.Models.SerialMessages;
[JsonDerivedType(typeof(LoraData))]
[JsonDerivedType(typeof(McuSystemData))]
[JsonDerivedType(typeof(MpptData))]
[JsonDerivedType(typeof(TimeData))]
[JsonDerivedType(typeof(WeatherData))]
public class Message
{
Expand Down
17 changes: 0 additions & 17 deletions Monitor/Monitor/Models/SerialMessages/TimeData.cs

This file was deleted.

43 changes: 43 additions & 0 deletions Monitor/Monitor/Models/StatsView.cs
@@ -0,0 +1,43 @@
namespace Monitor.Models;

public class StatsView
{
public class UnitData
{
public DateTime DateTime { get; set; }

public double Value { get; set; }
}

public class Data
{
public double Average { get; set; }
public double Min { get; set; }
public double Max { get; set; }

public void FromData(IQueryable<UnitData> data)
{
if (data.Any())
{
Average = Math.Round(data.Average(d => d.Value), 2);
Min = Math.Round(data.Min(d => d.Value), 2);
Max = Math.Round(data.Max(d => d.Value), 2);
}
}
}

public Data Total { get; set; } = new();
public Data TotalToday { get; set; } = new();
public Data TotalYesterday { get; set; } = new();

public void FromData(IQueryable<UnitData> data)
{
Total.FromData(data);

var today = DateTime.Today;
var yesterday = DateTime.Today.AddDays(-1);

TotalToday.FromData(data.Where(d => d.DateTime.Date == today));
TotalYesterday.FromData(data.Where(d => d.DateTime.Date == yesterday));
}
}
6 changes: 3 additions & 3 deletions Monitor/Monitor/Monitor.csproj
Expand Up @@ -41,15 +41,15 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="AntDesign" Version="0.17.4" />
<PackageReference Include="AntDesign" Version="0.18.1" />
<PackageReference Include="AntDesign.Charts" Version="0.5.1" />
<PackageReference Include="AprsSharp.AprsIsClient" Version="0.3.1" />
<PackageReference Include="JoySoftware.NetDaemon.Extensions.Scheduling" Version="23.44.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.2">
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.2" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="8.0.3" />
<PackageReference Include="MQTTnet" Version="4.3.3.952" />
<PackageReference Include="Seq.Extensions.Logging" Version="8.0.0" />
<PackageReference Include="SunCalcNet" Version="1.2.2" />
Expand Down
11 changes: 11 additions & 0 deletions Monitor/Monitor/MqttConnect.cs
@@ -0,0 +1,11 @@
using Monitor.Services;

namespace Monitor;

public class MqttConnect(EntitiesManagerService entitiesManagerService) : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
await entitiesManagerService.ConnectMqtt();
}
}

0 comments on commit fb3a7bd

Please sign in to comment.