Merge branch 'master' into web-display

This commit is contained in:
2024-03-06 21:25:25 -05:00
8 changed files with 102 additions and 7 deletions

View File

@@ -1,4 +1,5 @@
using ChrisKaczor.HomeMonitor.Environment.Service.Data; using ChrisKaczor.HomeMonitor.Environment.Service.Data;
using ChrisKaczor.HomeMonitor.Environment.Service.Models;
using ChrisKaczor.HomeMonitor.Environment.Service.Models.Indoor; using ChrisKaczor.HomeMonitor.Environment.Service.Models.Indoor;
using Microsoft.AspNetCore.SignalR.Client; using Microsoft.AspNetCore.SignalR.Client;
using MQTTnet; using MQTTnet;
@@ -41,8 +42,12 @@ public class MessageHandler : IHostedService
public async Task StartAsync(CancellationToken cancellationToken) public async Task StartAsync(CancellationToken cancellationToken)
{ {
if (_hubConnection != null) if (_hubConnection != null)
{
await _hubConnection.StartAsync(cancellationToken); await _hubConnection.StartAsync(cancellationToken);
_hubConnection.On("RequestLatest", SendStoredMessage);
}
var mqttClientOptions = new MqttClientOptionsBuilder().WithTcpServer(_configuration["Mqtt:Server"]).Build(); var mqttClientOptions = new MqttClientOptionsBuilder().WithTcpServer(_configuration["Mqtt:Server"]).Build();
await _mqttClient.ConnectAsync(mqttClientOptions, cancellationToken); await _mqttClient.ConnectAsync(mqttClientOptions, cancellationToken);
@@ -85,9 +90,36 @@ public class MessageHandler : IHostedService
if (_hubConnection.State == HubConnectionState.Disconnected) if (_hubConnection.State == HubConnectionState.Disconnected)
await _hubConnection.StartAsync(); await _hubConnection.StartAsync();
var json = JsonSerializer.Serialize(message); var deviceReadings = new Readings(message);
await _hubConnection.InvokeAsync("SendMessage", json); var json = JsonSerializer.Serialize(deviceReadings);
await _hubConnection.InvokeAsync("SendLatest", json);
}
catch (Exception exception)
{
WriteLog($"Hub exception: {exception}");
}
}
private async Task SendStoredMessage()
{
try
{
if (_hubConnection == null)
return;
if (_hubConnection.State == HubConnectionState.Disconnected)
await _hubConnection.StartAsync();
var recentReadings = await _database.GetRecentReadings();
foreach (var recentReading in recentReadings)
{
var json = JsonSerializer.Serialize(recentReading);
await _hubConnection.InvokeAsync("SendLatest", json);
}
} }
catch (Exception exception) catch (Exception exception)
{ {

View File

@@ -16,17 +16,24 @@ public class DeviceMessage
[JsonPropertyName("timestamp")] [JsonPropertyName("timestamp")]
public required DateTimeOffset Timestamp { get; set; } public required DateTimeOffset Timestamp { get; set; }
[JsonPropertyName("air_quality_index")]
public decimal AirQualityIndex => Readings.AirQualityIndex; public decimal AirQualityIndex => Readings.AirQualityIndex;
[JsonPropertyName("color_temperature")]
public decimal ColorTemperature => Readings.ColorTemperature; public decimal ColorTemperature => Readings.ColorTemperature;
[JsonPropertyName("gas_resistance")]
public decimal GasResistance => Readings.GasResistance; public decimal GasResistance => Readings.GasResistance;
[JsonPropertyName("humidity")]
public decimal Humidity => Readings.Humidity; public decimal Humidity => Readings.Humidity;
[JsonPropertyName("luminance")]
public decimal Luminance => Readings.Luminance; public decimal Luminance => Readings.Luminance;
[JsonPropertyName("pressure")]
public decimal Pressure => Readings.Pressure; public decimal Pressure => Readings.Pressure;
[JsonPropertyName("temperature")]
public decimal Temperature => Readings.Temperature; public decimal Temperature => Readings.Temperature;
} }

View File

@@ -1,24 +1,55 @@
namespace ChrisKaczor.HomeMonitor.Environment.Service.Models; using ChrisKaczor.HomeMonitor.Environment.Service.Models.Indoor;
using System.Text.Json.Serialization;
namespace ChrisKaczor.HomeMonitor.Environment.Service.Models;
public class Readings public class Readings
{ {
public Readings()
{
}
public Readings(DeviceMessage message)
{
Time = message.Timestamp;
Name = message.Name;
Model = message.Model;
AirQualityIndex = message.AirQualityIndex;
ColorTemperature = message.ColorTemperature;
GasResistance = message.GasResistance;
Humidity = message.Humidity;
Luminance = message.Luminance;
Pressure = message.Pressure;
Temperature = message.Temperature;
}
[JsonPropertyName("time")]
public DateTimeOffset Time { get; set; } public DateTimeOffset Time { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; } public string? Name { get; set; }
[JsonPropertyName("model")]
public string? Model { get; set; } public string? Model { get; set; }
[JsonPropertyName("airQualityIndex")]
public decimal AirQualityIndex { get; set; } public decimal AirQualityIndex { get; set; }
[JsonPropertyName("colorTemperature")]
public decimal ColorTemperature { get; set; } public decimal ColorTemperature { get; set; }
[JsonPropertyName("gasResistance")]
public decimal GasResistance { get; set; } public decimal GasResistance { get; set; }
[JsonPropertyName("humidity")]
public decimal Humidity { get; set; } public decimal Humidity { get; set; }
[JsonPropertyName("luminance")]
public decimal Luminance { get; set; } public decimal Luminance { get; set; }
[JsonPropertyName("pressure")]
public decimal Pressure { get; set; } public decimal Pressure { get; set; }
[JsonPropertyName("temperature")]
public decimal Temperature { get; set; } public decimal Temperature { get; set; }
} }

View File

@@ -1,25 +1,35 @@
using JetBrains.Annotations; using JetBrains.Annotations;
using System.Text.Json.Serialization;
namespace ChrisKaczor.HomeMonitor.Environment.Service.Models; namespace ChrisKaczor.HomeMonitor.Environment.Service.Models;
[PublicAPI] [PublicAPI]
public class ReadingsGrouped public class ReadingsGrouped
{ {
[JsonPropertyName("bucket")]
public DateTimeOffset Bucket { get; set; } public DateTimeOffset Bucket { get; set; }
[JsonPropertyName("name")]
public string? Name { get; set; } public string? Name { get; set; }
[JsonPropertyName("averageTemperature")]
public decimal AverageTemperature { get; set; } public decimal AverageTemperature { get; set; }
[JsonPropertyName("averagePressure")]
public decimal AveragePressure { get; set; } public decimal AveragePressure { get; set; }
[JsonPropertyName("averageHumidity")]
public decimal AverageHumidity { get; set; } public decimal AverageHumidity { get; set; }
[JsonPropertyName("averageLuminance")]
public decimal AverageLuminance { get; set; } public decimal AverageLuminance { get; set; }
[JsonPropertyName("averageGasResistance")]
public decimal AverageGasResistance { get; set; } public decimal AverageGasResistance { get; set; }
[JsonPropertyName("averageColorTemperature")]
public decimal AverageColorTemperature { get; set; } public decimal AverageColorTemperature { get; set; }
[JsonPropertyName("averageAirQualityIndex")]
public decimal AverageAirQualityIndex { get; set; } public decimal AverageAirQualityIndex { get; set; }
} }

View File

@@ -10,6 +10,8 @@ public static class Program
{ {
var builder = WebApplication.CreateBuilder(args); var builder = WebApplication.CreateBuilder(args);
builder.Services.AddCors(o => o.AddPolicy("CorsPolicy", corsPolicyBuilder => corsPolicyBuilder.AllowAnyMethod().AllowAnyHeader().AllowCredentials().WithOrigins("http://localhost:4200")));
builder.Configuration.AddEnvironmentVariables(); builder.Configuration.AddEnvironmentVariables();
builder.Services.AddCommonOpenTelemetry(Assembly.GetExecutingAssembly().GetName().Name, builder.Configuration["Telemetry:Endpoint"], nameof(MessageHandler)); builder.Services.AddCommonOpenTelemetry(Assembly.GetExecutingAssembly().GetName().Name, builder.Configuration["Telemetry:Endpoint"], nameof(MessageHandler));
@@ -19,8 +21,12 @@ public static class Program
builder.Services.AddTransient<Database>(); builder.Services.AddTransient<Database>();
builder.Services.AddHostedService<MessageHandler>(); builder.Services.AddHostedService<MessageHandler>();
// -- --
var app = builder.Build(); var app = builder.Build();
app.UseCors("CorsPolicy");
app.UseAuthorization(); app.UseAuthorization();
app.MapControllers(); app.MapControllers();

View File

@@ -4,7 +4,8 @@
"commandName": "Project", "commandName": "Project",
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development" "ASPNETCORE_ENVIRONMENT": "Development"
} },
"applicationUrl": "http://localhost:5050"
} }
} }
} }

View File

@@ -9,7 +9,7 @@
"type": "coreclr", "type": "coreclr",
"request": "launch", "request": "launch",
"preLaunchTask": "build", "preLaunchTask": "build",
"program": "${workspaceFolder}/bin/Debug/net5.0/ChrisKaczor.HomeMonitor.Hub.Service.dll", "program": "${workspaceFolder}/bin/Debug/net8.0/ChrisKaczor.HomeMonitor.Hub.Service.dll",
"args": [], "args": [],
"cwd": "${workspaceFolder}", "cwd": "${workspaceFolder}",
"stopAtEntry": false, "stopAtEntry": false,

View File

@@ -9,11 +9,19 @@ namespace ChrisKaczor.HomeMonitor.Hub.Service.Hubs
public class EnvironmentHub(ILogger<EnvironmentHub> logger) : Microsoft.AspNetCore.SignalR.Hub public class EnvironmentHub(ILogger<EnvironmentHub> logger) : Microsoft.AspNetCore.SignalR.Hub
{ {
[UsedImplicitly] [UsedImplicitly]
public async Task SendMessage(string message) public async Task SendLatest(string message)
{ {
logger.LogInformation(message); logger.LogInformation(message);
await Clients.Others.SendAsync("Message", message); await Clients.Others.SendAsync("Latest", message);
}
[UsedImplicitly]
public async Task RequestLatest()
{
logger.LogInformation("RequestLatest");
await Clients.Others.SendAsync("RequestLatest");
} }
} }
} }