Tutoriel détecteur LD2450 esphome

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)

1 « 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.

Sans titre-1

l’autre face est dos au mur
le capteur n’est pas censé être placé au plafond
le fabricant recommande de le placer à 1 mètre 50m jusqu’à 2 mètres sur un mur

Merci et bonne soirée.

1 « J'aime »

l’idée est excellente, mais je me pose une question.
Imaginons une pièce qui ne comporte qu’une sortie, au niveau de la sortie on met une zone (x). Si dans la zone principale on n’est plus détecté, tant que la zone x n’a pas été détectée la lumière ne s’éteindra pas ?

Et pour une pièce qui comporte 2 sorties, on sait lui mettre 2 zones devant chaque sortie ?

Si une deuxième personne franchit la zone x et qu’on est plus détecté que se passe t’il ?

du coup pour éviter les faux positifs, on pourrait imaginer que la lumière ne s’allume que si et seulement si la zone x a été franchie suivie de la zone principale ?
merci

Je parlais du 3 :slight_smile:

Dans les entités j’ai la valeur qui monte toute seule enfin devrait !

Du coup j’ai fait une série de valeurs diagnostic

Merci pour toutes ces questions. J’ai bien compris ce que tu voulais dire mais je ne peux donner de réponse à aucune d’elle.
Je crois comprendre que tu as imaginé que les zones dépendaient les unes des autres alors ce n’est pas le cas.

Tout d’abord je rappelle que le capteur le LD2450 ne comprend pas la notion de zone. C’est une surcouche qui est ajoutée par le programme dans ESP home. Le LD2450 ne fournit d’informations que pour trois cibles.

Dans la version que je développe il y a trois zones d’exclusion et 6 zones de détection. Avant de travailler avec les zones je dois savoir si le capteur a détecté des cibles. Je lis donc les informations concernant ces trois cibles.
Ensuite je teste si une ou plusieurs cibles sont entrées dans les zones d’exclusion. Si c’est le cas, toute cible qui est entré dans l’une d’elles est alors disqualifié pour les calculs suivants.
Toutes les cibles qualifiées vont ensuite être testé pour chaque zone de détection. Si l’une d’elles est détectée à l’intérieur alors la zone est activée. Pour toutes zones qui a une cible à l’extérieur ou qui ne voit aucune cible, on déclenche alors à un compte à rebours qui a pour valeur le Time Out. A la fin du compte à rebours la zone est désactivée.
Il y a juste une exception pour la zone 1 et 2 qui peuvent n’être désactivés que si une cible est détectée hors de la zone.

Tu es sur ? car j’ai l’impression que c’est l’inverse sur mes cartes !!

soit je n’ai pas compris soit on dit tout les 2 la meme chose.

sur ton exemple, des qu’une cible est dans la zone orange, si a un moment elle n’est plus détectée et que la zone verte n’a pas été activée alors la zone orange reste activée ?

C’est ça ou j’ai tout faux

Oui je suis sûr mais ce n’est pas très grave.

En réalité tout est dans la façon dont on imagine le retour d’information :

  • Moi j’imagine être à la place du capteur et donc dos au mur et observant à la zone de détection. Dans ce cas-là il faut respecter le haut et le bas.
  • Si par contre on préfère visualiser la zone de détection en étant à l’intérieur et en regardant le capteur contre le mur, alors il vaut mieux inverser le haut et le bas.