Tutoriel détecteur LD2450 esphome

je désactive l’affichage des targets pour voir et je posterais le résultat

merci pour l’info je regarde cela de plus prêt :+1:

@jerome6994
quand tu parles du firmeware, est-ce que tu parles de 1 ou de 2 ?
Sans titre-1

je ne trouve pas le champs Firmware

Je viens de mettre à jour mon github pour corriger le problème qu’ont rencontré @jerome6994 et @iGil
Et merci encore à @WarC0zes pour avoir clarifié l’écriture automatique des IDs

Je ne reposte pas ici le code pour éviter des lourdeurs de lecture

voila j’ai tester en désactivant target enable mais du coup ma lumière met une plombe a s’allumée

Je comprends pas la logique de ce qui t’arrive…

Il te reste à essayer le lien de WarC0zes. Ou de revenir à l’ancienne version.

J’y ai encore réfléchis et je résume :

  • Avec le code « à plat », tu avais déjà des faux positifs
  • Avec le code « à 45° » :
    • Avec l’affichage des cibles actif, tu as plus de faux positifs
    • En rebootant l’esp tu réduis les faux positifs
    • Avec l’affichage des cibles inactif, tu n’as plus de faux positifs mais une détection ralentie

Et si tu essayais avec un (ou deux) autre ESP ? Et si tu peux tester avec un autre LD2450 ?

je n’ai plus de ld2450 pour tester, mais j’ai dégager mon frigo d’une zone peut être que ca venais de la, encore une fois difficile de voir d’où viens la faux positif… ou alors dans les log on sait voir l’endroit exact qui a déclenché le target ( je n’ai pas creusé)

pour le lien de WarC0zes, mon papa planche dessus mais a première vue ce n’est pas pour des esp 32 wroom mais j’attend sont retour.

Je pense que quelque chose sature dans mon esp car mon capteur de luminosité me sort une valeur farfelue toutes les x secondes.

Pour localiser le ou les faux positifs, il faut aller dans l’historique. Mais dans ce cas, il faut activer les cibles.
Ça va ressembler à peu près à ça :


Dans l’exemple ci dessus, mes cibles sont désactivées. Leurs courbes restent donc constantes. Mais chez toi, là où la zone devient active, les valeurs des cibles X et Y vont changer. Tu sauras alors la position à l’origine du faux positif.
Tu recommences cette opération pour chaque faux positif. Si la position est toujours sensiblement la même alors tu trouveras ce qui le déclenche. Ensuite tu mettras une zone d’exclusion à cette endroit et le tour est joué. (Attention les chats et les chiens peuvent êtres détectés)

Essai de le remplacer. Il y a de grande chance que ce soit lui la cause du problème.

2 « J'aime »

yes tu as raison, mon esp était dead :+1: que c’est rapide maintenant :stuck_out_tongue:

2 « J'aime »

Trop content pour toi !

1 « J'aime »

Salut Yannick,
Je déterre le point que tu évoques à l’époque à l’époque car je l’ai aussi chez moi malgré tous mes efforts. As-tu trouvé une solution de ton côté ?

J’ai peut-être une idée… Jusqu’ici le programme de détection de zone fonctionne en regardant l’une après l’autre chacune des zones à tester ; et si il y a une cible à l’intérieur il l’active sinon le minuteur qui lui est associé est alors déclenchée et quand il arrive à sa fin, la zone est alors réellement déclaré vide et il publie ces informations à Home assistant.
Mon idée serait de considérer une zone comme vide que s’il y a de l’activités autour de cette zone.

Mais cette idée à ses limites :
Par exemple il y a dans une même pièce deux personnes qui travaillent sur deux bureaux séparés avec chacun une ampoule connectée sur leur bureau et une zone pour chacun. L’un est plus tôt du style à bouger beaucoup et l’autre à rester immobile.
S’ils avaient été dans deux pièces séparées et mon idée associé à leur configuration, le problème était résolu. Mais dans leurs cas, la personne qui bouge va troubler la détection de la personne qui ne bouge pas et donc on revient au point de départ…

dans la doc, ca parle pas de limitation de board. Ta des options spécifique au esp32 ou esp8266, mais rien ne parle de ESP32 Wroom.

Le lien que j’ai mis d’un post de @Bob , il utiliser un esp32 wroom.

1 « J'aime »

Salut à toi, alors pour l’instant pour contourner le probleme, j’ai ajouter un LD1125H sur le meuble tv qui pointe vers le canapé :slight_smile:

Je me langui de prendre 5 min pour installer ton programme ESP Home :wink:

l’idée dont je t’ai parlé n’est encore qu’une réflexion. Je l’ai testé dans un proto mais ça ne marche pas.

Pour le LD1125H, peux-tu partagé le lien du code que tu as utilisé ?
Je fais une compilation des capteur à onde millimétrique de HLK ainsi que leurs codes sources

ld1125h
voici le code que j’utilise, j’ai pas paufiné les reglages :slight_smile:

substitutions:
  devicename: "ld1125htv" #Rename the device what you want.
  upper_devicename: ld1125h tv #Rename the device what you want.
esphome:
  name: $devicename
  on_boot:    #LD1125H Initial Setting
    priority: -200
    then:
      - uart.write:
          id: LD1125H_UART_BUS
          data: !lambda |-
            std::string th1st = "mth1=" + str_sprintf("%.0f",id(LD1125H_mth1).state) +"\r\n";
            return std::vector<uint8_t>(th1st.begin(), th1st.end());
      - uart.write:
          id: LD1125H_UART_BUS
          data: !lambda |-
            std::string th2st = "mth2=" + str_sprintf("%.0f",id(LD1125H_mth2).state) +"\r\n";
            return std::vector<uint8_t>(th2st.begin(), th2st.end());
      - uart.write:
          id: LD1125H_UART_BUS
          data: !lambda |-
            std::string th3st = "mth3=" + str_sprintf("%.0f",id(LD1125H_mth3).state) +"\r\n";
            return std::vector<uint8_t>(th3st.begin(), th3st.end());
      - uart.write:
          id: LD1125H_UART_BUS
          data: !lambda |-
            std::string rmaxst = "rmax=" + str_sprintf("%.1f",id(LD1125H_rmax).state) +"\r\n";
            return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
esp32:
  board: esp32dev
  framework:
    type: arduino  #Suggest Use ESP-IDF Framework, or Plug Out the UART Cable Might Cause ESP32 Hang. 
    version: recommended
external_components:
  - source:
      type: git
      url: https://github.com/ssieb/custom_components #Thanks for @ssieb components.
    components: [ serial ]
logger:
  level: DEBUG  #You Can Use "INFO" Level
  baud_rate: 0
api:
ota:
  password: !secret ota_password
i2c:
  sda: 21
  scl: 22
  id: bus_a
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  power_save_mode: LIGHT
  manual_ip:
    # Set this to the IP of the ESP
    static_ip: 10.20.1.53
    # Set this to the IP address of the router. Often ends with .1
    gateway: 10.20.1.1
    # The subnet of the network. 255.255.255.0 works for most home networks.
    subnet: 255.255.255.0
captive_portal:

web_server:
  port: 80

uart:
  id: LD1125H_UART_BUS
  rx_pin: GPIO16  #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
  tx_pin: GPIO17  #For ESP32, you can use any pin, Recommend Use UART_2, Don't use UART_0, It might Cause Boot Fail or System Hang
  baud_rate: 115200
  data_bits: 8
  stop_bits: 1
  parity: NONE
#  debug:
#    direction: BOTH
#    dummy_receiver: false
#    after:
#      delimiter: "\n"
#    sequence:
#      - lambda: UARTDebug::log_string(direction, bytes);
globals:
  - id: LD1125H_Last_Time
    type: time_t
    restore_value: no
    initial_value: time(NULL)
  - id: LD1125H_Last_Mov_Time
    type: time_t
    restore_value: no
    initial_value: time(NULL)
  - id: LD1125H_Clearence_Status
    type: bool
    restore_value: no
    initial_value: "false"
status_led:
  pin:
    number: GPIO2 #ESP32 OnBroad LED
    inverted: false
#web_server:   #Avoid Using Web Server To Prevent Hang
#  port: 80
interval:
  - interval: 1s #Clearance Scan Time
    setup_priority: -200
    then:
      lambda: |-
        if ((time(NULL)-id(LD1125H_Last_Time))>id(LD1125H_Clear_Time).state) {
          if ((id(LD1125H_Clearence_Status) == false) || (id(LD1125H_Occupancy).state != "Clearance")) {
            id(LD1125H_Occupancy).publish_state("Clearance");
            id(LD1125H_Clearence_Status) = true;
          }
          if (id(LD1125H_MovOcc_Binary).state == true) {
            id(LD1125H_MovOcc_Binary).publish_state(false);
          }
          if (id(LD1125H_Mov_Binary).state == true) {
            id(LD1125H_Mov_Binary).publish_state(false);
          }
        }
number:
  - platform: template
    name: ${upper_devicename} LD1125H mth1 #mth1 is 0~2.8m Sensitivity.
    id: LD1125H_mth1
    icon: "mdi:cogs"
    optimistic: true
    restore_value: true #If you don't want to store the setting at ESP, set it to false.
    initial_value: "60.0" #Default mth1 Setting
    min_value: 10.0
    max_value: 600.0
    step: 5.0
    set_action:
      then:
        - uart.write:
            id: LD1125H_UART_BUS
            data: !lambda |-
              std::string th1st = "mth1=" + str_sprintf("%.0f",x) +"\r\n";
              return std::vector<uint8_t>(th1st.begin(), th1st.end());
  - platform: template
    name: ${upper_devicename} LD1125H mth2 #mth2 is 2.8~8m Sensitivity.
    id: LD1125H_mth2
    icon: "mdi:cogs"
    optimistic: true
    restore_value: true #If you don't want to store the setting at ESP, set it to false.
    initial_value: "30" #Default mth2 Setting
    min_value: 5
    max_value: 300
    step: 5
    set_action:
      then:
        - uart.write:
            id: LD1125H_UART_BUS
            data: !lambda |-
              std::string th2st = "mth2=" + str_sprintf("%.0f",x) +"\r\n";
              return std::vector<uint8_t>(th2st.begin(), th2st.end());
  - platform: template
    name: ${upper_devicename} LD1125H mth3 #mth3 is above 8m Sensitivity.
    id: LD1125H_mth3
    icon: "mdi:cogs"
    optimistic: true
    restore_value: true #If you don't want to store the setting at ESP, set it to false.
    initial_value: "20" #Default mth3 Setting
    min_value: 5
    max_value: 200
    step: 5
    set_action:
      then:
        - uart.write:
            id: LD1125H_UART_BUS
            data: !lambda |-
              std::string th3st = "mth3=" + str_sprintf("%.0f",x) +"\r\n";
              return std::vector<uint8_t>(th3st.begin(), th3st.end());
  - platform: template
    name: ${upper_devicename} LD1125H rmax #rmax is max detection distance.
    id: LD1125H_rmax
    icon: "mdi:cogs"
    optimistic: true
    restore_value: true #If you don't want to store the setting at ESP, set it to false.
    initial_value: "8" #Default rmax Setting
    min_value: 0.4
    max_value: 12
    step: 0.2
    set_action:
      then:
        - uart.write:
            id: LD1125H_UART_BUS
            data: !lambda |-
              std::string rmaxst = "rmax=" + str_sprintf("%.1f",x) +"\r\n";
              return std::vector<uint8_t>(rmaxst.begin(), rmaxst.end());
  - platform: template
    name: ${upper_devicename} LD1125H Clearence Time
    id: LD1125H_Clear_Time
    icon: "mdi:cogs"
    optimistic: true
    restore_value: true #If you don't want to store the setting at ESP, set it to false.
    initial_value: "5" #LD1125H Mov/Occ > Clearence Time Here
    min_value: 0.5
    max_value: 20
    step: 0.5
  - platform: template
    name: ${upper_devicename} LD1125H Movement Time
    id: LD1125H_Mov_Time
    icon: "mdi:cogs"
    optimistic: true
    restore_value: true #If you don't want to store the setting at ESP, set it to false.
    initial_value: "1" #LD1125H Mov > Occ Time Here
    min_value: 0.5
    max_value: 10
    step: 0.5
sensor:
  - platform: template
    name: ${upper_devicename} LD1125H Distance
    id: LD1125H_Distance
    icon: "mdi:signal-distance-variant"
    unit_of_measurement: "m"
    accuracy_decimals: 2
    filters:    # Use Fliter To Debounce
    - sliding_window_moving_average:
        window_size: 8
        send_every: 2
    - heartbeat: 0.2s
  - platform: bh1750
    name: "Light Sensor"
    address: 0x23
    update_interval: 5s
text_sensor:
  - platform: serial
    uart_id: LD1125H_UART_BUS
    name: ${upper_devicename} LD1125H UART Text
    id: LD1125H_UART_Text
    icon: "mdi:format-text"
    internal: False #If Don't Want to See UART Receive Data, Set To True
    on_value:
      lambda: |-
        if (id(LD1125H_UART_Text).state.substr(0,3) == "occ") {
          id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
          if ((time(NULL)-id(LD1125H_Last_Mov_Time))>id(LD1125H_Mov_Time).state) {
            id(LD1125H_Occupancy).publish_state("Occupancy");
            if (id(LD1125H_MovOcc_Binary).state == false) {
              id(LD1125H_MovOcc_Binary).publish_state(true);
            }
            if (id(LD1125H_Mov_Binary).state == true) {
              id(LD1125H_Mov_Binary).publish_state(false);
            }
          }
          if (id(LD1125H_MovOcc_Binary).state == false) {
            id(LD1125H_MovOcc_Binary).publish_state(true);
          }
          id(LD1125H_Last_Time) = time(NULL);
          if (id(LD1125H_Clearence_Status) == true) {
            id(LD1125H_Clearence_Status) = false;
          }
        }
        else if (id(LD1125H_UART_Text).state.substr(0,3) == "mov") {
          id(LD1125H_Distance).publish_state(atof(id(LD1125H_UART_Text).state.substr(9).c_str()));
          id(LD1125H_Occupancy).publish_state("Movement");
          if (id(LD1125H_MovOcc_Binary).state == false) {
            id(LD1125H_MovOcc_Binary).publish_state(true);
          }
          if (id(LD1125H_Mov_Binary).state == false) {
            id(LD1125H_Mov_Binary).publish_state(true);
          }
          id(LD1125H_Last_Mov_Time) = time(NULL);
          id(LD1125H_Last_Time) = time(NULL);
          if (id(LD1125H_Clearence_Status) == true) {
            id(LD1125H_Clearence_Status) = false;
          }
        }
  - platform: template
    name: ${upper_devicename} LD1125H Occupancy Status
    id: LD1125H_Occupancy
    icon: "mdi:motion-sensor"
binary_sensor:
  - platform: template
    name: ${upper_devicename} LD1125H Occupancy or Movement
    id: LD1125H_MovOcc_Binary
    device_class: occupancy
  - platform: template
    name: ${upper_devicename} LD1125H Movement
    id: LD1125H_Mov_Binary
    device_class: motion

J’ai le plaisir de vous présenter une nouvelle version pour améliorer le comportement du ld2450 !
C’est la fonctionnalité dont nous parlions avec @Yannickinlive26

J’ai ajouté une options pour la zone 1 et 2. On l’active grâce à un interrupteur nommé Target must leave ZoneX. Une fois activée, cette option change le comportement de la zone. Il faudra que la cible sorte de la zone pour qu’elle soit désactivée. Mais si la cible reste dans la zone sans bouger au point de ne plus être détecté, la zone restera active.

Voici un exemple de son utilisation la zone 1 n’a pas l’option activée, contrairement à la zone 2. J’ai réglé le Time Out à 5 secondes.


On voit bien sur la période affichée que la zone 1 se désactive beaucoup plus que la zone 2.
newplot-(1)

3 « J'aime »

Bonjour et super travaille,
j’ai fait de copier/coller des code et au moment de compiler j’ai une erreur.

En effet, j’ai oublié de mettre à jour le fichier zone.h
L’erreur est maintenant corrigée. Remplace le fichier zone.h et le problème sera résolu.

Merci de ton retour

En effet, ça fonctionne mieux.
Par contre faut le mettre dans quel sens le détecteur.