From 7c11671ff16d6a02d175f66317fce7f3f276cce3 Mon Sep 17 00:00:00 2001 From: DTTerastar Date: Sun, 29 Dec 2024 18:19:51 -0500 Subject: [PATCH] Fix warnings --- src/Controllers/HistoryController.cs | 4 ++-- src/Events/DeviceMessageEventArgs.cs | 6 +++--- src/Events/DeviceSettingsEventArgs.cs | 4 ++-- src/Events/NodeStatusReceivedEventArgs.cs | 2 +- src/Events/NodeTelemetryReceivedEventArgs.cs | 6 +++--- src/Locators/NadarayaWatsonMultilateralizer.cs | 2 +- src/Models/OptimizationSnapshot.cs | 6 +++--- src/Models/Scenario.cs | 11 +++++++---- src/Models/State.cs | 2 +- src/Optimizers/AbsorptionAvgOptimizer.cs | 7 ++++--- src/Optimizers/AbsorptionErrOptimizer.cs | 4 +++- src/Optimizers/AbsorptionLineFitOptimizer.cs | 5 +++-- src/Optimizers/RxAdjRssiOptimizer.cs | 4 ++-- src/Services/DeviceTracker.cs | 10 +++++----- src/Services/MqttCoordinator.cs | 10 ++++++---- 15 files changed, 46 insertions(+), 37 deletions(-) diff --git a/src/Controllers/HistoryController.cs b/src/Controllers/HistoryController.cs index 6799716e..6237950b 100644 --- a/src/Controllers/HistoryController.cs +++ b/src/Controllers/HistoryController.cs @@ -1,4 +1,4 @@ -using ESPresense.Models; +using ESPresense.Models; using ESPresense.Services; using Microsoft.AspNetCore.Mvc; @@ -25,7 +25,7 @@ public HistoryController(ILogger logger, DeviceSettingsStore d public async Task Get(string id) { var dh = await _databaseFactory.GetDeviceHistory(); - var history = await dh.List(id); + var history = await dh.List(id) ?? new List(); return new DeviceHistoryResponse(history); } } diff --git a/src/Events/DeviceMessageEventArgs.cs b/src/Events/DeviceMessageEventArgs.cs index 01abe3bf..8d42e620 100644 --- a/src/Events/DeviceMessageEventArgs.cs +++ b/src/Events/DeviceMessageEventArgs.cs @@ -4,7 +4,7 @@ namespace ESPresense.Events; public class DeviceMessageEventArgs { - public string DeviceId { get; set; } - public string NodeId { get; set; } - public DeviceMessage Payload { get; set; } + public string? DeviceId { get; set; } + public string? NodeId { get; set; } + public DeviceMessage? Payload { get; set; } } \ No newline at end of file diff --git a/src/Events/DeviceSettingsEventArgs.cs b/src/Events/DeviceSettingsEventArgs.cs index 42028129..9be81fa5 100644 --- a/src/Events/DeviceSettingsEventArgs.cs +++ b/src/Events/DeviceSettingsEventArgs.cs @@ -4,6 +4,6 @@ namespace ESPresense.Events; public class DeviceSettingsEventArgs { - public DeviceSettings Payload { get; set; } - public string DeviceId { get; set; } + public DeviceSettings? Payload { get; set; } + public string? DeviceId { get; set; } } \ No newline at end of file diff --git a/src/Events/NodeStatusReceivedEventArgs.cs b/src/Events/NodeStatusReceivedEventArgs.cs index 786b0749..a919069f 100644 --- a/src/Events/NodeStatusReceivedEventArgs.cs +++ b/src/Events/NodeStatusReceivedEventArgs.cs @@ -2,6 +2,6 @@ public class NodeStatusReceivedEventArgs { - public string NodeId { get; set; } + public string? NodeId { get; set; } public bool Online { get; set; } } \ No newline at end of file diff --git a/src/Events/NodeTelemetryReceivedEventArgs.cs b/src/Events/NodeTelemetryReceivedEventArgs.cs index 3d8290d3..f06f0570 100644 --- a/src/Events/NodeTelemetryReceivedEventArgs.cs +++ b/src/Events/NodeTelemetryReceivedEventArgs.cs @@ -1,9 +1,9 @@ -using ESPresense.Models; +using ESPresense.Models; namespace ESPresense.Events; public class NodeTelemetryReceivedEventArgs { - public string NodeId { get; set; } - public NodeTelemetry Payload { get; set; } + public string? NodeId { get; set; } + public NodeTelemetry? Payload { get; set; } } \ No newline at end of file diff --git a/src/Locators/NadarayaWatsonMultilateralizer.cs b/src/Locators/NadarayaWatsonMultilateralizer.cs index 1b0e80ff..250f775d 100644 --- a/src/Locators/NadarayaWatsonMultilateralizer.cs +++ b/src/Locators/NadarayaWatsonMultilateralizer.cs @@ -5,7 +5,7 @@ namespace ESPresense.Locators; -public class NadarayaWatsonMultilateralizer(Device device, Floor floor, State state) : ILocate +public class NadarayaWatsonMultilateralizer(Device device, Floor floor) : ILocate { public bool Locate(Scenario scenario) { diff --git a/src/Models/OptimizationSnapshot.cs b/src/Models/OptimizationSnapshot.cs index 3d4995ca..dfbf5040 100644 --- a/src/Models/OptimizationSnapshot.cs +++ b/src/Models/OptimizationSnapshot.cs @@ -25,7 +25,7 @@ public ILookup ByTx() public class OptNode { - public string Id { get; set; } + public string? Id { get; set; } public string? Name { get; set; } public Point3D Location { get; set; } } @@ -33,8 +33,8 @@ public class OptNode public class Measure { public bool Current { get; set; } - public OptNode Rx { get; set; } - public OptNode Tx { get; set; } + public OptNode Rx { get; set; } = new(); + public OptNode Tx { get; set; } = new(); public double RefRssi { get; set; } public double Rssi { get; set; } public double Distance { get; set; } diff --git a/src/Models/Scenario.cs b/src/Models/Scenario.cs index c88d6fb5..be267bf0 100644 --- a/src/Models/Scenario.cs +++ b/src/Models/Scenario.cs @@ -55,15 +55,18 @@ public void UpdateLocation(Point3D newLocation) UpdateStateTransitionMatrix(dt); // Predict - _kalmanStateEstimate = _F! * _kalmanStateEstimate!; - _kalmanErrorCovariance = _F * _kalmanErrorCovariance! * _F.Transpose() + _Q!; + if (_F == null || _kalmanStateEstimate == null || _kalmanErrorCovariance == null || _H == null || _Q == null || _R == null) + return; + + _kalmanStateEstimate = _F * _kalmanStateEstimate; + _kalmanErrorCovariance = _F * _kalmanErrorCovariance * _F.Transpose() + _Q; // Update var y = Matrix.Build.DenseOfArray(new double[,] { { newLocation.X }, { newLocation.Y }, { newLocation.Z } - }) - _H! * _kalmanStateEstimate; + }) - _H * _kalmanStateEstimate; - var S = _H * _kalmanErrorCovariance * _H.Transpose() + _R!; + var S = _H * _kalmanErrorCovariance * _H.Transpose() + _R; var K = _kalmanErrorCovariance * _H.Transpose() * S.Inverse(); _kalmanStateEstimate += K * y; diff --git a/src/Models/State.cs b/src/Models/State.cs index 849bed80..2cf51ccc 100644 --- a/src/Models/State.cs +++ b/src/Models/State.cs @@ -128,7 +128,7 @@ public IEnumerable GetScenarios(Device device) if (nadarayaWatson?.Enabled ?? false) foreach (var floor in GetFloorsByIds(nadarayaWatson?.Floors)) - yield return new Scenario(Config, new NadarayaWatsonMultilateralizer(device, floor, this), floor.Name); + yield return new Scenario(Config, new NadarayaWatsonMultilateralizer(device, floor), floor.Name); if (nearestNode?.Enabled ?? false) yield return new Scenario(Config, new NearestNode(device), "NearestNode"); diff --git a/src/Optimizers/AbsorptionAvgOptimizer.cs b/src/Optimizers/AbsorptionAvgOptimizer.cs index faf58116..f5194699 100644 --- a/src/Optimizers/AbsorptionAvgOptimizer.cs +++ b/src/Optimizers/AbsorptionAvgOptimizer.cs @@ -1,4 +1,4 @@ -using ESPresense.Models; +using ESPresense.Models; namespace ESPresense.Optimizers; @@ -32,8 +32,9 @@ public OptimizationResults Optimize(OptimizationSnapshot os) if (pathLossExponents.Count > 0) { var absorption = pathLossExponents.Average(); - if (absorption < _state.Config?.Optimization.AbsorptionMin) continue; - if (absorption > _state.Config?.Optimization.AbsorptionMax) continue; + var optimization = _state.Config?.Optimization; + if (absorption < (optimization?.AbsorptionMin ?? 2.0)) continue; + if (absorption > (optimization?.AbsorptionMax ?? 4.0)) continue; results.RxNodes.Add(g.Key.Id, new ProposedValues { Absorption = absorption }); } } diff --git a/src/Optimizers/AbsorptionErrOptimizer.cs b/src/Optimizers/AbsorptionErrOptimizer.cs index 56595a72..ad93fb69 100644 --- a/src/Optimizers/AbsorptionErrOptimizer.cs +++ b/src/Optimizers/AbsorptionErrOptimizer.cs @@ -43,7 +43,9 @@ public OptimizationResults Optimize(OptimizationSnapshot os) return error; }); - var initialGuess = Vector.Build.DenseOfArray(new[] { (optimization?.AbsorptionMax - optimization?.AbsorptionMin) / 2 + optimization?.AbsorptionMin ?? 3d }); + var initialGuess = Vector.Build.DenseOfArray(new[] { + ((optimization?.AbsorptionMax ?? 4.0) - (optimization?.AbsorptionMin ?? 2.0)) / 2 + (optimization?.AbsorptionMin ?? 2.0) + }); var solver = new NelderMeadSimplex(1e-4, 10000); var result = solver.FindMinimum(obj, initialGuess); diff --git a/src/Optimizers/AbsorptionLineFitOptimizer.cs b/src/Optimizers/AbsorptionLineFitOptimizer.cs index ad522432..c912d865 100644 --- a/src/Optimizers/AbsorptionLineFitOptimizer.cs +++ b/src/Optimizers/AbsorptionLineFitOptimizer.cs @@ -38,8 +38,9 @@ public OptimizationResults Optimize(OptimizationSnapshot os) var linearModel = Fit.Line(distances.ToArray(), rssiDiffs.ToArray()); double absorption = linearModel.Item2 / 10; - if (absorption < _state.Config?.Optimization.AbsorptionMin) continue; - if (absorption > _state.Config?.Optimization.AbsorptionMax) continue; + var optimization = _state.Config?.Optimization; + if (absorption < (optimization?.AbsorptionMin ?? 2.0)) continue; + if (absorption > (optimization?.AbsorptionMax ?? 4.0)) continue; or.RxNodes.Add(g.Key.Id, new ProposedValues { Absorption = absorption }); } diff --git a/src/Optimizers/RxAdjRssiOptimizer.cs b/src/Optimizers/RxAdjRssiOptimizer.cs index 4de9f130..3865d58a 100644 --- a/src/Optimizers/RxAdjRssiOptimizer.cs +++ b/src/Optimizers/RxAdjRssiOptimizer.cs @@ -1,4 +1,4 @@ -using ESPresense.Models; +using ESPresense.Models; using MathNet.Numerics.LinearAlgebra; using MathNet.Numerics.Optimization; using Serilog; @@ -22,7 +22,7 @@ public OptimizationResults Optimize(OptimizationSnapshot os) OptimizationResults or = new(); var optimization = _state.Config?.Optimization; - var absorption = ((optimization?.AbsorptionMax - optimization?.AbsorptionMin) / 2d) + optimization?.AbsorptionMin ?? 3d; + var absorption = ((optimization?.AbsorptionMax ?? 4.0) - (optimization?.AbsorptionMin ?? 2.0)) / 2d + (optimization?.AbsorptionMin ?? 2.0); foreach (var g in os.ByRx()) { diff --git a/src/Services/DeviceTracker.cs b/src/Services/DeviceTracker.cs index 1ec2b071..debe81cf 100644 --- a/src/Services/DeviceTracker.cs +++ b/src/Services/DeviceTracker.cs @@ -1,4 +1,4 @@ -using System.Threading.Channels; +using System.Threading.Channels; using ESPresense.Controllers; using ESPresense.Models; using Serilog; @@ -36,8 +36,8 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) Log.Debug("Ignoring, component isn't device_tracker (" + arg.AutoDiscover.Component + ")"); return; } - var deviceId = arg.AutoDiscover.Message.StateTopic.Split("/").Last(); - bool isNode = deviceId.StartsWith("node:"); + var deviceId = arg.AutoDiscover.Message?.StateTopic?.Split("/").Last() ?? string.Empty; + bool isNode = deviceId?.StartsWith("node:") ?? false; if (isNode) return; var device = state.Devices.GetOrAdd(deviceId, id => @@ -51,9 +51,9 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) mqtt.DeviceMessageReceivedAsync += async arg => { - bool isNode = arg.DeviceId.StartsWith("node:"); + bool isNode = !string.IsNullOrEmpty(arg.DeviceId) && arg.DeviceId.StartsWith("node:"); - if (!state.Nodes.TryGetValue(arg.NodeId, out var rx)) + if (string.IsNullOrEmpty(arg.NodeId) || !state.Nodes.TryGetValue(arg.NodeId, out var rx)) { state.Nodes[arg.NodeId] = rx = new Node(arg.NodeId); if (tele.AddUnknownNode(arg.NodeId)) diff --git a/src/Services/MqttCoordinator.cs b/src/Services/MqttCoordinator.cs index 5538a913..c9ff7b7d 100644 --- a/src/Services/MqttCoordinator.cs +++ b/src/Services/MqttCoordinator.cs @@ -114,16 +114,16 @@ private async Task GetClient() await mqttClient.SubscribeAsync("homeassistant/device_tracker/+/config"); }; - mqttClient.DisconnectedAsync += s => + mqttClient.DisconnectedAsync += async s => { Log.Information("MQTT disconnected"); - return Task.CompletedTask; + await Task.CompletedTask; }; - mqttClient.ConnectingFailedAsync += s => + mqttClient.ConnectingFailedAsync += async s => { Log.Error("MQTT connection failed {@error}: {@inner}", new { primary = true }, s.Exception.Message, s.Exception?.InnerException?.Message); - return Task.CompletedTask; + await Task.CompletedTask; }; mqttClient.ApplicationMessageReceivedAsync += OnMqttMessageReceived; @@ -142,6 +142,8 @@ private async Task GetClient() private async Task OnMqttMessageReceived(MqttApplicationMessageReceivedEventArgs arg) { + if (arg.ApplicationMessage?.Topic == null) return; + var parts = arg.ApplicationMessage.Topic.Split('/'); var payload = arg.ApplicationMessage.ConvertPayloadToString();