diff --git a/DeviceStatus/Service/MessageHandler.cs b/DeviceStatus/Service/MessageHandler.cs index 9192d68..a028793 100644 --- a/DeviceStatus/Service/MessageHandler.cs +++ b/DeviceStatus/Service/MessageHandler.cs @@ -28,7 +28,10 @@ public class MessageHandler : IHostedService public async Task StartAsync(CancellationToken cancellationToken) { if (!string.IsNullOrEmpty(_configuration["Hub:DeviceStatus"])) + { _hubConnection = new HubConnectionBuilder().WithUrl(_configuration["Hub:DeviceStatus"]).Build(); + _hubConnection.On("RequestLatestStatus", async () => await RequestLatestStatus()); + } var mqttFactory = new MqttFactory(); @@ -40,6 +43,12 @@ public class MessageHandler : IHostedService await _mqttServer.StartAsync(); } + private async Task RequestLatestStatus() + { + foreach (var device in _deviceRepository.Values) + await SendDeviceStatus(device); + } + private async Task OnInterceptingPublishAsync(InterceptingPublishEventArgs arg) { var topic = arg.ApplicationMessage.Topic; @@ -91,6 +100,11 @@ public class MessageHandler : IHostedService await _laundryMonitor.HandleDeviceMessage(newDevice); + await SendDeviceStatus(newDevice); + } + + private async Task SendDeviceStatus(Device device) + { if (_hubConnection == null) return; @@ -99,7 +113,7 @@ public class MessageHandler : IHostedService if (_hubConnection.State == HubConnectionState.Disconnected) await _hubConnection.StartAsync(); - var json = JsonSerializer.Serialize(newDevice); + var json = JsonSerializer.Serialize(device); await _hubConnection.InvokeAsync("SendLatestStatus", json); } diff --git a/Hub/Service/Hubs/DeviceStatusHub.cs b/Hub/Service/Hubs/DeviceStatusHub.cs index 5ba3791..5dfef3d 100644 --- a/Hub/Service/Hubs/DeviceStatusHub.cs +++ b/Hub/Service/Hubs/DeviceStatusHub.cs @@ -8,6 +8,12 @@ namespace ChrisKaczor.HomeMonitor.Hub.Service.Hubs [UsedImplicitly] public class DeviceStatusHub : Microsoft.AspNetCore.SignalR.Hub { + [UsedImplicitly] + public async Task RequestLatestStatus() + { + await Clients.Others.SendAsync("RequestLatestStatus"); + } + [UsedImplicitly] public async Task SendLatestStatus(string message) {