Configureer ESP functie voor LD2410

Voorbereiding: ESPHome Integratie

Om de LD2410 sensor te kunnen gebruiken in ESPHome is een extra bestand nodig dat hier gedownload kan worden:

https://github.com/NicoOosterwijk/ESPHome-LD2410/blob/main/ld2410_uart.h

Kopieer dit bestand naar Home Assistant in de directory /config/esphome, bijvoorbeeld met scp:

scp ./ld2410_uart.h homeassistant.local:/config/esphome/ld2410_uart.h

Indien de docker-versie van HA gebruikt wordt staat de configuratie wellicht in een docker volume. Deze vindt je terug in /var/lib/docker/volumes op de docker host.


Als ESP-module gebruik ik hier de Wemos D1 mini v3 . Installeer deze in ESPHome met default instellingen.

Als presence sensor gebruik ik de LD2410C:

Er zijn verschillende modellen van deze module en de LD2410C heeft ‘normale’ pin aansluitingen, de LD2410 en LD2410B zijn voorzien van mini-pins en dat is minder handig om aan te sluiten. Daarnaast zijn de modellen B en C tevens voorzien van bluetooth.

Wijzig nu de configuratie zodat de LD2410 opties er ook in staan, bijvoorbeeld:

esphome:
  name: wemos-01

  includes:
    - ld2410_uart.h
  on_boot:
    priority: 600
    #
    then:
      - lambda: |-
          auto uart_component = static_cast<LD2410 *>(ld2410);
          uart_component->setNumbers(maxMovingDistanceRange, maxStillDistanceRange, noneDuration);
            
esp8266:
  board: esp01_1m

# Enable logging
logger:
  baud_rate: 0

# Enable Home Assistant API
api:
  encryption:
    key: !secret api-password

ota:
  password: !secret ota-password

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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Wemos-01 Fallback Hotspot"
    password: !secret ap-password

captive_portal:
    
uart:
  id: uart_0
  tx_pin: TX
  rx_pin: RX
  baud_rate: 256000 # Change this according to your setting
  parity: NONE
  stop_bits: 1
  debug:
    direction: BOTH
    dummy_receiver: false
    after:
      delimiter: [0xF8,0xF7,0xF6,0xF5]
      
custom_component:
  - lambda: |-
      return {new LD2410(id(uart_0))};
    components:
      - id: ld2410
      
binary_sensor:
  - platform: custom
    lambda: |-
      auto uart_component = static_cast<LD2410 *>(ld2410);
      return {uart_component->hasTarget,uart_component->hasMovingTarget,uart_component->hasStillTarget,uart_component->lastCommandSuccess};
    binary_sensors:
      - name: "Has Target"
      - name: "Has Moving Target"
      - name: "Has Still Target"
      - name: "Last Command Success"
  
sensor:
  - platform: custom
    lambda: |-
      auto uart_component = static_cast<LD2410 *>(ld2410);
      return {uart_component->movingTargetDistance,uart_component->movingTargetEnergy,uart_component->stillTargetDistance,uart_component->stillTargetEnergy,uart_component->detectDistance};
    sensors:
      - name: "Moving Target Distance"
        unit_of_measurement: "cm"
        accuracy_decimals: 0
      - name: "Moving Target Energy"
        unit_of_measurement: "%"
        accuracy_decimals: 0
      - name: "Still Target Distance"
        unit_of_measurement: "cm"
        accuracy_decimals: 0
      - name: "Still Target Energy"
        unit_of_measurement: "%"
        accuracy_decimals: 0
      - name: "Detect Distance"
        unit_of_measurement: "cm"
        accuracy_decimals: 0

number:        
  - platform: template
    name: "Max Moving Distance Range"
    id: maxMovingDistanceRange
    min_value: 1
    max_value: 8
    step: 1
    update_interval: never
    optimistic: true
    set_action:
      - lambda: |-
          auto uart_component = static_cast<LD2410 *>(ld2410);
          uart_component->setMaxDistancesAndNoneDuration(x,id(maxStillDistanceRange).state,id(noneDuration).state);
  - platform: template
    name: "Max Still Distance Range"
    id: maxStillDistanceRange
    min_value: 1
    max_value: 8
    step: 1
    update_interval: never
    optimistic: true
    set_action:
      - lambda: |-
          auto uart_component = static_cast<LD2410 *>(ld2410);
          uart_component->setMaxDistancesAndNoneDuration(id(maxMovingDistanceRange).state,x,id(noneDuration).state);
  - platform: template
    name: "None Duration"
    id: noneDuration
    min_value: 0
    max_value: 32767
    step: 1
    mode: box
    update_interval: never
    optimistic: true
    set_action:
      - lambda: |-
          auto uart_component = static_cast<LD2410 *>(ld2410);
          uart_component->setMaxDistancesAndNoneDuration(id(maxMovingDistanceRange).state,id(maxStillDistanceRange).state,x);
      

button:
  - platform: template
    name: "Reboot LD2410"
    on_press:
      lambda: 'static_cast<LD2410 *>(ld2410)->reboot();'
  - platform: template
    name: "Turn on config mode"
    on_press:
      - lambda: 'static_cast<LD2410 *>(ld2410)->setConfigMode(true);'
  - platform: template
    name: "Turn off config mode"
    on_press:
      - lambda: 'static_cast<LD2410 *>(ld2410)->setConfigMode(false);'
  - platform: template
    name: "Get config"
    on_press:
      - lambda: 'static_cast<LD2410 *>(ld2410)->queryParameters();'
  - platform: template
    name: "Set baud rate to 256000"
    on_press:
      - lambda: 'static_cast<LD2410 *>(ld2410)->setBaudrate(7);'
  - platform: template
    name: "Set baud rate to 115200"
    on_press:
      - lambda: 'static_cast<LD2410 *>(ld2410)->setBaudrate(5);'
  - platform: template
    name: "Set baud rate to 9600"
    on_press:
      - lambda: 'static_cast<LD2410 *>(ld2410)->setBaudrate(1);'

De wachtwoorden en keys staan in de ESPHome secrets (rechtsboven)

Kies voor INSTALL om de configuratie in de ESP te schrijven, dit kan ‘Wirelessly‘.

Hierna kan de LD2410C gekoppeld worden aan de ESP-module, let op dat de Rx aan Tx op de ESP en Tx aan Rx op de ESP moet worden aangesloten!

ESP8266 <-> LD2410
5V <-> VCC
GND <-> GND
TX <-> RX
RX <-> TX

Voorzie de ESP32 van spanning middels een usb-kabel en Home Assistant komt dan met een melding dat er een nieuw device is gevonden:

Met CONFIGUREREN worden de sensors aangemaakt en deze kunnen dan in een Dashboard gebruikt worden of in Automatiseringen, Scènes of Scripts.