From 77498b05a9b699fab7d5af801bddc805c1c2e8fa Mon Sep 17 00:00:00 2001 From: bharvey88 <33046971+bharvey88@users.noreply.github.com> Date: Thu, 30 Apr 2026 12:37:00 -0500 Subject: [PATCH 1/2] Filter LD2450 NaN to 0 when no target detected Restores pre-2026.3 behavior so the LD2450 per-target numeric sensors report 0 instead of unknown when a target slot is empty. Upstream ESPHome PR esphome/esphome#13602 changed the ld2450 component to publish NaN for x, y, speed, angle, distance, and resolution when no target is present. Home Assistant renders NaN as unknown, which breaks numeric_state triggers, history graphs, and statistics built around these entities. Adds an isnan(x) ? 0.0 : x lambda filter to all 18 per-target numeric sensors (target_1/2/3 x x/y/speed/angle/distance/resolution). Closes #89 --- Integrations/ESPHome/Core.yaml | 36 ++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/Integrations/ESPHome/Core.yaml b/Integrations/ESPHome/Core.yaml index 27b9789..3dec289 100644 --- a/Integrations/ESPHome/Core.yaml +++ b/Integrations/ESPHome/Core.yaml @@ -323,42 +323,78 @@ sensor: target_1: x: name: Target-1 X + filters: + - lambda: return isnan(x) ? 0.0 : x; y: name: Target-1 Y + filters: + - lambda: return isnan(x) ? 0.0 : x; speed: name: Target-1 Speed + filters: + - lambda: return isnan(x) ? 0.0 : x; angle: name: Target-1 Angle + filters: + - lambda: return isnan(x) ? 0.0 : x; distance: name: Target-1 Distance + filters: + - lambda: return isnan(x) ? 0.0 : x; resolution: name: Target-1 Resolution + filters: + - lambda: return isnan(x) ? 0.0 : x; target_2: x: name: Target-2 X + filters: + - lambda: return isnan(x) ? 0.0 : x; y: name: Target-2 Y + filters: + - lambda: return isnan(x) ? 0.0 : x; speed: name: Target-2 Speed + filters: + - lambda: return isnan(x) ? 0.0 : x; angle: name: Target-2 Angle + filters: + - lambda: return isnan(x) ? 0.0 : x; distance: name: Target-2 Distance + filters: + - lambda: return isnan(x) ? 0.0 : x; resolution: name: Target-2 Resolution + filters: + - lambda: return isnan(x) ? 0.0 : x; target_3: x: name: Target-3 X + filters: + - lambda: return isnan(x) ? 0.0 : x; y: name: Target-3 Y + filters: + - lambda: return isnan(x) ? 0.0 : x; speed: name: Target-3 Speed + filters: + - lambda: return isnan(x) ? 0.0 : x; angle: name: Target-3 Angle + filters: + - lambda: return isnan(x) ? 0.0 : x; distance: name: Target-3 Distance + filters: + - lambda: return isnan(x) ? 0.0 : x; resolution: name: Target-3 Resolution + filters: + - lambda: return isnan(x) ? 0.0 : x; zone_1: target_count: name: Zone-1 All Target Count From 12736fc8b7b57bf7abeb02c7bdff23a8ffbf7117 Mon Sep 17 00:00:00 2001 From: bharvey88 <33046971+bharvey88@users.noreply.github.com> Date: Thu, 30 Apr 2026 12:44:25 -0500 Subject: [PATCH 2/2] Use block scalar for LD2450 isnan filter lambdas YAML plain scalars cannot contain ': ' (colon followed by whitespace), so the inline form 'return isnan(x) ? 0.0 : x;' fails to parse on the second colon in the ternary. Switch all 18 per-target filters to the block-scalar form (- lambda: |- ... ) which preserves the colon and parses correctly. --- Integrations/ESPHome/Core.yaml | 54 ++++++++++++++++++++++------------ 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/Integrations/ESPHome/Core.yaml b/Integrations/ESPHome/Core.yaml index 3dec289..92e5b68 100644 --- a/Integrations/ESPHome/Core.yaml +++ b/Integrations/ESPHome/Core.yaml @@ -324,77 +324,95 @@ sensor: x: name: Target-1 X filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; y: name: Target-1 Y filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; speed: name: Target-1 Speed filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; angle: name: Target-1 Angle filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; distance: name: Target-1 Distance filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; resolution: name: Target-1 Resolution filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; target_2: x: name: Target-2 X filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; y: name: Target-2 Y filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; speed: name: Target-2 Speed filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; angle: name: Target-2 Angle filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; distance: name: Target-2 Distance filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; resolution: name: Target-2 Resolution filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; target_3: x: name: Target-3 X filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; y: name: Target-3 Y filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; speed: name: Target-3 Speed filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; angle: name: Target-3 Angle filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; distance: name: Target-3 Distance filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; resolution: name: Target-3 Resolution filters: - - lambda: return isnan(x) ? 0.0 : x; + - lambda: |- + return isnan(x) ? 0.0 : x; zone_1: target_count: name: Zone-1 All Target Count