ESPHome LD2410C aktualisiert die Werte nicht

Hallo alle zusammen,

ich möchte für mein Home Assistant einen Präsenzmelder und hatte mein Glück mit den AQARA FP2 versucht, doch das hat so ganz und gar nicht funktioniert.
Der hat nur ‘Geister’ erkannt und es waren zu jeder Zeit 1-2 Personen (zusätzlich) im Raum, auch wenn er leer war. Ai Erkennung usw. hat alles nichts gebracht. Auch nicht dieses Zurücksetzen/kalibrieren, also Raum leer lassen und dann soll das Gerät lernen, dass niemand im Raum ist. Kaum geht jemand in den Raum, kommen wieder die zusätzlichen Geister.
Also muss eine andere Lösung her und möchte es mit den LD2410C Sensoren und ESPHome (mit einem ESP32) versuchen - einen LD2450 habe ich auch noch bestellt, der braucht aber noch eine Weile, bis der hier ankommt.

Erstmal vorweg, das hier sind meine ersten Berührungspunkte mit ESPHome, ich kenne mich damit also noch so gar nicht aus - darum versuche ich meine Schritte möglichst genau zu beschreiben.
Ich hatte mir damals für WLED ein paar ESP32 NodeMCU (ESP32-D0WD-V3 (revision 3) mit CP2102) gekauft und da ich noch paar übrig habe, wollte ich einen für dieses Projekt abstellen.

Zuerst wollte ich in der ESPHome Integration in Home Assistant ein neues Gerät (+ New Device) erstellen doch irgendwas scheint mit den Serielle Schnittstellen in Vivaldi (mein Browser, basiert auf Chrome) verbuggt zu sein, das Problem haben momentan wohl mehrere.
Also hab ich dafür mal Microsofts Edge gestartet und auch da wollte das in Home Assistant nicht so recht, aber auf der Seite https://web.esphome.io hat es dann geklappt. Als ich damit fertig war, konnte ich den ESP32 in Home Assistant übernehmen (oder wie auch immer sich das nannte).

Dann ging es ans Verdrahten.
LD2410C Datenblatt

ESP32 Pinout

Ich habe VCC des LD2410C mit dem 5V Pin (siehe Pinout unten links) am ESP32 verbunden, GND des Sensors und des ESP verbunden, TX des Sensors mit RXD am ESP32 und RX des Sensors mit TXD am ESP32 verbunden (RXD/TXD sind im Pinout oben rechts dargestellt).
Das sollte es mit dem Verdrahten ja schon gewesen sein.

Da ich selbst kein Programmierprofi bin (ich habe nur rudimentäre Kenntnisse im Bereich Programmieren), habe ich nach bereits existierenden Projekten gesucht und habe den YAML code größtenteils abkopiert.
Ich habe einige existierende Projekte ausprobiert und Grundsätzlich machen die auch irgendwas, doch ich habe immer das Problem, dass sich die Werte nie aktualisieren.
Wenn ich immer wieder die Leitung zwischen LD2410C TX und RXD am ESP32 herausziehe und wieder einstecke, dann aktualisiert sich der Wert, das aber nur einmalig und ich muss dafür mehrmals die Leitung trennen und neu verbinden.

Dann dachte ich erst, dass vielleicht der Sensor einen defekt hat und wollte mich direkt mit dem Sensor via Bluetooth verbinden (es gibt vom Sensorhersteller dafür eine eigene Android App). Da Bluetooth scheinbar deaktiviert wird, wenn der Sensor Daten via dem Datenpins überträgt musste ich den dafür erst resetten (5 mal VCC in 2-3 sec. trennen und wieder verbinden laut Datenblatt). Getrennt von den Datenleitungen und verbunden mit der App überträgt er sehr flott alle Werte und aktualisiert die ca. sekündlich (vielleicht sogar etwas öfter).
Auch in Home Assistant auf meinem Raspberry Pi 4 wird er dann via Bluetooth erkannt und aktualisiert dort die Werte, allerdings ein klein wenig langsamer).
Leider ist die BT Reichweite des Sensors nicht zu gebrauchen und bin deswegen auch auf Lösungen wie ESPHome angewiesen, um die Reichweite zu erhöhen.
Also Gundlegend funktioniert der Senor, doch warum bekomme ich in Verbindung ESPHome keine Aktualisierungen hin?

Hier ist mal einer der YAML Codes den ich getestet hatte.
api encryption key und ota password habe ich für euch mal raus gelöscht.

esphome:
  name: ld2410c
  friendly_name: LD2410C

esp32:
  board: esp32dev
  framework:
    type: arduino

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: "[KEY]"

ota:
  - platform: esphome
    password: "[pswd]"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Ld2410-Esp32 Fallback Hotspot"
    password: ""

captive_portal:
 
uart:
  id: ld2410_uart
  tx_pin: GPIO1
  rx_pin: GPIO3
  baud_rate: 256000
  parity: NONE
  stop_bits: 1
  rx_buffer_size: 256
 
ld2410:
  uart_id: ld2410_uart
  throttle: 1500ms
  id: ld2410_comp
 
select:
  - platform: ld2410
    distance_resolution:
      name: distance resolution
    baud_rate:
      name: baud rate
    light_function:
      name: light function
    out_pin_level:
      name: out pin level
 
button:
  - platform: ld2410
    factory_reset:
      name: "factory reset"
    restart:
      name: "restart"
    query_params:
      name: query params
 
number:
  - platform: ld2410
    timeout:
      name: timeout
    max_move_distance_gate:
      name: max move distance gate
    max_still_distance_gate:
      name: max still distance gate
    g0:
      move_threshold:
        name: g0 move threshold
      still_threshold:
        name: g0 still threshold
    g1:
      move_threshold:
        name: g1 move threshold
      still_threshold:
        name: g1 still threshold
    g2:
      move_threshold:
        name: g2 move threshold
      still_threshold:
        name: g2 still threshold
    g3:
      move_threshold:
        name: g3 move threshold
      still_threshold:
        name: g3 still threshold
    g4:
      move_threshold:
        name: g4 move threshold
      still_threshold:
        name: g4 still threshold
    g5:
      move_threshold:
        name: g5 move threshold
      still_threshold:
        name: g5 still threshold
    g6:
      move_threshold:
        name: g6 move threshold
      still_threshold:
        name: g6 still threshold
    g7:
      move_threshold:
        name: g7 move threshold
      still_threshold:
        name: g7 still threshold
    g8:
      move_threshold:
        name: g8 move threshold
      still_threshold:
        name: g8 still threshold
    light_threshold:
      name: light threshold
 
text_sensor:
  - platform: ld2410
    version:
      name: "presenece sensor version"
    mac_address:
      name: "presenece sensor mac address"
 
switch:
  - platform: ld2410
    engineering_mode:
      name: "engineering mode"
    bluetooth:
      name: control Bluetooth
 
sensor:
  - platform: ld2410
    moving_distance:
      name: "Moving distance (cm)"
    still_distance:
      name: "Still Distance (cm)"
    moving_energy:
      name: "Move Energy (%)"
    still_energy:
      name: "Still Energy (%)"
    detection_distance:
      name: "Distance Detection (cm)"
    g0:
      move_energy:
        name: g0 move energy
      still_energy:
        name: g0 still energy
    g1:
      move_energy:
        name: g1 move energy
      still_energy:
        name: g1 still energy
    g2:
      move_energy:
        name: g2 move energy
      still_energy:
        name: g2 still energy
    g3:
      move_energy:
        name: g3 move energy
      still_energy:
        name: g3 still energy
    g4:
      move_energy:
        name: g4 move energy
      still_energy:
        name: g4 still energy
    g5:
      move_energy:
        name: g5 move energy
      still_energy:
        name: g5 still energy
    g6:
      move_energy:
        name: g6 move energy
      still_energy:
        name: g6 still energy
    g7:
      move_energy:
        name: g7 move energy
      still_energy:
        name: g7 still energy
    g8:
      move_energy:
        name: g8 move energy
      still_energy:
        name: g8 still energy
    light:
      name: light
 
binary_sensor:
 
  - platform: ld2410
    has_target:
      name: Presence
    has_moving_target:
      name: Moving Target
    has_still_target:
      name: Still Target

Das

throttle: 1500ms

gibt es bei zumindest nicht. Keine Ahnung ob das gravierende Auswirkungen hat…

Wird auf jeden Fall bei esphome.io gelistet:

  • throttle (Optional, int): Time in milliseconds to control the rate of data updates. Defaults to 1000ms.

Hab es zum Testen jetzt trotzdem mal raus gelöscht und ist nach wie vor unverändert.
Werte werden weiterhin nicht aktualisiert.

Wenn ich den restlichen Code rausschneide, dann war das der letzte LD2410 Code, der bei mir funktioniert hat:

esphome:
  name: bwm_terrasse
  friendly_name: BWM_Terrasse
          
esp8266:
  board: d1_mini_pro

# Enable logging
#logger:

# Disable logger to run UART on D7 D8
logger:
  baud_rate: 0
  level: DEBUG

# Enable Home Assistant API
api:
  encryption:
    key: !secret TERRASSE_API_KEY

ota:
  - platform: esphome
    password: !secret TERRASSE_WIFI_AOT_PW

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "BWM-T"
    password: !secret TERRASSE_WIFI_FALLBACK_PW


captive_portal:


uart:
  id: uart_terasse1
  tx_pin: TX  # TX tx_pin: GPIO1 - Alternativ: GPIO15  #D8  
  rx_pin: RX  # RX rx_pin: GPIO3 Alternativ: GPIO13  #D7
  baud_rate: 256000   # 2400, 9600, 38400, 57600, 115200, 256000, 512000, 921600
  parity: NONE
  stop_bits: 1

ld2410:
  uart_id: uart_terasse1
  id: ld2410_1

#Configuration entities
number:
  - platform: ld2410
    timeout:
      name: Radar Timeout
    light_threshold:
      name: light threshold
    max_move_distance_gate:
      name: Radar Max Move Distance
    max_still_distance_gate:
      name: Radar Max Still Distance
    g0:
      move_threshold:
        name: g0 move threshold
      still_threshold:
        name: g0 still threshold
    g1:
      move_threshold:
        name: g1 move threshold
      still_threshold:
        name: g1 still threshold
    g2:
      move_threshold:
        name: g2 move threshold
      still_threshold:
        name: g2 still threshold
    g3:
      move_threshold:
        name: g3 move threshold
      still_threshold:
        name: g3 still threshold
    g4:
      move_threshold:
        name: g4 move threshold
      still_threshold:
        name: g4 still threshold
    g5:
      move_threshold:
        name: g5 move threshold
      still_threshold:
        name: g5 still threshold
    g6:
      move_threshold:
        name: g6 move threshold
      still_threshold:
        name: g6 still threshold
    g7:
      move_threshold:
        name: g7 move threshold
      still_threshold:
        name: g7 still threshold
    g8:
      move_threshold:
        name: g8 move threshold
      still_threshold:
        name: g8 still threshold
  # Setting ending of zone 1 occupancy
  - platform: template
    name: "Radar End Zone 1"
    id: radar_z1_end
    device_class: distance
    min_value: 0
    max_value: 600
    step: 1
    mode: box
    update_interval: never
    optimistic: true
    restore_value: true
    initial_value: 10
    icon: "mdi:arrow-collapse-right"
    entity_category: CONFIG

  # Setting ending of zone 2 occupancy
  - platform: template
    name: "Radar End Zone 2"
    id: radar_z2_end
    device_class: distance
    min_value: 0
    max_value: 600
    step: 1
    mode: box
    update_interval: never
    optimistic: true
    restore_value: true
    initial_value: 36
    icon: "mdi:arrow-collapse-right"
    entity_category: CONFIG

  # Setting ending of zone 3 occupancy
  - platform: template
    name: "Radar End Zone 3"
    id: radar_z3_end
    device_class: distance
    min_value: 0
    max_value: 600
    step: 1
    mode: box
    update_interval: never
    optimistic: true
    restore_value: true
    initial_value: 100
    icon: "mdi:arrow-collapse-right"
    entity_category: CONFIG

binary_sensor:
  - platform: gpio
    name: gpio out pin presence
    device_class: presence
    pin: GPIO14 #D5
    id: radar_d5_presence

  - platform: ld2410
    has_target:
      name: Radar Target
      id: radar_has_target
    has_moving_target:
      name: Radar Moving Target
    has_still_target:
      name: Radar Still Target
    out_pin_presence_status:
      name: Radar out pin presence status

  ## Set Up Radar Zones Based On Distance
  - platform: template
    name: "Radar Zone 1 Occupancy"
    device_class: occupancy
    icon: mdi:motion-sensor
    lambda: |-
      if ((id(radar_has_target).state) && (id(radar_detection_distance).state < id(radar_z1_end).state)) {
        return true;
      } else {
        return false;
      }
  - platform: template
    name: "Radar Zone 2 Occupancy"
    device_class: occupancy
    icon: mdi:motion-sensor
    lambda: |-
      if ((id(radar_has_target).state) && ((id(radar_z1_end).state < id(radar_detection_distance).state) && (id(radar_detection_distance).state < id(radar_z2_end).state))) {
        return true;
      } else {
        return false;
      }
  - platform: template
    name: "Radar Zone 3 Occupancy"
    device_class: occupancy
    icon: mdi:motion-sensor
    lambda: |-
      if ((id(radar_has_target).state) && ((id(radar_z2_end).state < id(radar_detection_distance).state) && (id(radar_detection_distance).state < id(radar_z3_end).state))) {
        return true;
      } else {
        return false;
      }



#Exposes configuration and status sensors
sensor:
  - platform: ld2410
    light:
      name: light
    moving_distance:
      name: Radar Moving Distance
      id: moving_distance
    still_distance:
      name: Radar Still Distance
      id: still_distance
    moving_energy:
      name: Radar Move Energy
    still_energy:
      name: Radar Still Energy
    detection_distance:
      name: Radar Detection Distance
      id: radar_detection_distance
    g0:
      move_energy:
        name: g0 move energy
      still_energy:
        name: g0 still energy
    g1:
      move_energy:
        name: g1 move energy
      still_energy:
        name: g1 still energy
    g2:
      move_energy:
        name: g2 move energy
      still_energy:
        name: g2 still energy
    g3:
      move_energy:
        name: g3 move energy
      still_energy:
        name: g3 still energy
    g4:
      move_energy:
        name: g4 move energy
      still_energy:
        name: g4 still energy
    g5:
      move_energy:
        name: g5 move energy
      still_energy:
        name: g5 still energy
    g6:
      move_energy:
        name: g6 move energy
      still_energy:
        name: g6 still energy
    g7:
      move_energy:
        name: g7 move energy
      still_energy:
        name: g7 still energy
    g8:
      move_energy:
        name: g8 move energy
      still_energy:
        name: g8 still energy

#Exposes control buttons
button:
  - platform: restart
    icon: mdi:power-cycle
    name: "ESP Reboot"

  - platform: factory_reset
    disabled_by_default: True
    name: "Factory Reset ESP"
    id: factory_reset_all

  - platform: ld2410
    factory_reset:
      name: "Factory Reset Radar"
    restart:
      name: "Restart Radar"
    query_params:
      name: query params

#Exposes control switches
switch:
  - platform: ld2410
    bluetooth:
      name: "Radar Control Bluetooth"
      id: radar_bluetooth
    engineering_mode:
      name: "Radar Engineering Mode"


#Radar firmware version
text_sensor:
  - platform: ld2410
    version:
      name: "Radar Firmware Version"

#Set distance resolution - 0.75m or 0.2m
select:
  - platform: ld2410
    distance_resolution:
      name: "Radar Distance Resolution"
    baud_rate:
      name: "baud rate"
    light_function:
      name: light function
    out_pin_level:
      name: out pin level