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();