Esphome Face Recognition HLK-FM22X

J’ai oublié de préciser : qu’entendiez-vous par la limitation due à la longueur du câble ?
En quoi cela influence-t-il son fonctionnement ?

Juste que pour lancer le scan je clique avec ma souris sur un bouton… et le fil de ma souris ne vas pas à 2m de mon capteur :laughing:
Bob

2 « J'aime »

Je ne vois pas le HLK-FRM1213 dans ESPHome, donc il faudra trouver une autre solution de programmation je pense.

Bob

Oui, il n’y est pas.

Mais d’après ce que dit Gemini, ils ont l’air assez similaires, donc en théorie, plus ou moins le même code pourrait fonctionner avec ce module aussi.

Mais est-ce vraiment le cas… :thinking:
Je le saurai quand je le commanderai, que je le recevrai et que je commencerai à tester :grinning_face_with_smiling_eyes:

Ok, tu feras un petit retour stp :wink:
Bob

1 « J'aime »

Cher @Bob, j’ai vraiment besoin de votre aide. J’ai reçu le module HLK-FRM1213. Cependant, le vendeur n’a pas pu me fournir d’informations. Il existe un manuel pour ce module, mais les indications de connexion qui y figurent ne correspondent pas à ce que je vois sur les fils avec le connecteur fourni par le vendeur.

Pourriez-vous s’il vous plaît me confirmer si votre module correspond à ce que j’ai montré sur la photo concernant le branchement de l’alimentation ?



Pour mon module, cela se présente ainsi, mais les fils de connexion ont un aspect différent, comme ceci. Comme vous pouvez le voir, le fil rouge (+) et le fil noir (-) sont situés côte à côte.




De plus, à en juger par la photo de ma carte et les inscriptions « GND » et « PWR », ainsi que par les données des manuels, celles-ci correspondent à ce que vous avez de votre côté. Cela me laisse penser que le branchement devrait être identique.

De plus, pourriez-vous s’il vous plaît me dire si votre vendeur vous a fourni un logiciel pour tester le fonctionnement du module et le configurer via un PC, notamment le programme « PC DEMO » ?

Sur Internet, il existe des vidéos de présentation où l’on voit ce logiciel utilisé pour la connexion et la configuration, mais personne ne partage le lien pour télécharger ce logiciel. Mes recherches sur Internet ne donnent aucun résultat.

Je vous en serais très reconnaissant par avance.

Bonjour @zheka_gal

Je pourrais te répondre précisément que lundi soir, à priori le branchement est le même que pour le FM225 et FM223.
Je te fournirai le code Yaml ESPhome que j’utilise.
Bob

1 « J'aime »

Bonsoir @zheka_gal
il faut tenir compte des infos de câblage, les couleurs des fils ne sont pas représentatives, pour moi le fil rouge c’est le GND !.
C’est un peu capricieux comme système, il faut une bonne alimentation.

Mon YAML ESPHome si ça peut t’aider:

esphome:
  name: esp32-fm225-facial
  friendly_name: ESP32 FM225 Facial

    
esp32:
  board: esp32dev
  framework:
    type: esp-idf

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "9/l1y5MYpK6kAq1TDwYkGBzE3uCYh06CG0qDunAAWcg="

  actions:
  - action: enroll
    variables:
      name: string
      direction: int
    then:
      - hlk_fm22x.enroll:
          name: !lambda 'return name;'
          direction: !lambda 'return direction;'
  - action: scan
    then:
      - hlk_fm22x.scan:
  - action: delete
    variables:
      face_id: int
    then:
      - hlk_fm22x.delete:
          face_id: !lambda 'return face_id;'
  - action: delete_all
    then:
      - hlk_fm22x.delete_all:
  - action: reset
    then:
      - hlk_fm22x.reset:

ota:
  - platform: esphome
    password: "c33c9f59541cd0855926f96647d24248"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: 192.168.1.35
    gateway: 192.168.1.254
    subnet: 255.255.255.0
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esp32-Fm225-Facial"
    password: "v9vXuNCaHYqS"

captive_portal:

# -----------------------------
# UART CONNECTION TO HLK-FM225
# -----------------------------
uart:
  id: uart_face
  rx_pin: GPIO16    # FM225 TX  -> ESP32 RX
  tx_pin: GPIO17    # FM225 RX  -> ESP32 TX
  baud_rate: 115200

hlk_fm22x:
  id: face_scanner # L'ID de votre composant
  uart_id: uart_face # Fait référence à l'ID de l'UART ci-dessus

  on_face_scan_invalid:
    - homeassistant.event:
        event: esphome.test_node_face_scan_invalid
        data:
          error: !lambda 'return error;'
    - text_sensor.template.publish:
        id: face_log
        state: !lambda 'return "Scan invalide ";'


  on_face_scan_matched:
    - homeassistant.event:
        event: esphome.test_node_face_scan_matched
        data:
          face_id: !lambda 'return face_id;'
          name: !lambda 'return name;'

    - if:
        condition:
          lambda: |
            return (face_id == 1) || (name == "Bruno");
        then:
          - homeassistant.service:
              service: light.toggle
              data:
                entity_id: light.lampe_marine
          - homeassistant.service:
              service: light.toggle
              data:
                entity_id: light.salon_plante_10               

    - switch.turn_on:
        id: ledbleu225

    #- text_sensor.template.publish:
    #    id: face_log
    #    state: !lambda 'return "Scan OK " + to_string(face_id) +" : "+ name;'
    - text_sensor.template.publish:
        id: face_log
        state: !lambda |-
          // 1. Convertir le std::string 'name' en pointeur C (const char*)
          const char* name_c_str = name.c_str();
          // 2. Utiliser strlen() sur le pointeur C pour trouver la longueur réelle
          size_t name_length = strlen(name_c_str);
          // 3. Crée un std::string propre en utilisant la longueur trouvée.
          std::string person_name(name_c_str, name_length);
          return "Scan OK ID: " + to_string(face_id) + " : " + person_name;


    - homeassistant.service:
        service: tts.speak
        data:
          media_player_entity_id: media_player.respeaker_satellite_3
          #pour ajouter ID + to_string(face_id) + le code permet de lire en TTS le name qui sinon ne passe pas
          message: !lambda |-
            const char* name_c_str = name.c_str();
            size_t name_length = strlen(name_c_str);
            std::string person_name(name_c_str, name_length);
            return "Bonjour " + person_name + ", je t'ai reconnu, bienvenu à la maison.";
          entity_id: tts.piper

    - delay: 5s

    - switch.turn_off:
        id: ledbleu225

  on_face_scan_unmatched:
    - homeassistant.event:
        event: esphome.test_node_face_scan_unmatched
    - text_sensor.template.publish:
        id: face_log
        state: !lambda 'return "Personne non reconnue ";'

  on_face_info:
    - homeassistant.event:
        event: esphome.test_node_face_info
        data:
          status: !lambda 'return status;'
          left: !lambda 'return left;'
          top: !lambda 'return top;'
          right: !lambda 'return right;'
          bottom: !lambda 'return bottom;'
          yaw: !lambda 'return yaw;'
          pitch: !lambda 'return pitch;'
          roll: !lambda 'return roll;'

  on_enrollment_done:
    - homeassistant.event:
        event: esphome.test_node_enrollment_done
        data:
          face_id: !lambda 'return face_id;'
          direction: !lambda 'return direction;'
    - logger.log: "Enrôlement du visage terminé avec succès."
    
    - text_sensor.template.publish:
        id: face_log
        state: !lambda 'return "Enrolled into slot " + to_string(face_id);'
    - switch.turn_on:
        id: ledbleu225
    - delay: 2s
    - switch.turn_off:
        id: ledbleu225

  on_enrollment_failed:
    - homeassistant.event:
        event: esphome.test_node_enrollment_failed
        data:
          error: !lambda 'return error;'
    - text_sensor.template.publish:
        id: face_log
        state: !lambda 'return "Failed to enroll face. Error: " + to_string(error);'
# -----------------------------
# Sensors and Entities
# -----------------------------
sensor:
  - platform: hlk_fm22x
    face_count:
      name: "FM225 - Number of enrolled faces"

text_sensor:
  - platform: hlk_fm22x
    last_face_name:
      name: "FM225 - Last recognized name"
    version:
      name: "FM225 - Firmware version"
  - platform: template
    name: "Résultat capteur"
    id: face_log
    on_value:
          then:
            - if:
                condition:
                  # On vérifie si le texte contient "Bruno"
                  lambda: 'return x.find("Bruno") != std::string::npos;'
                then:
                  - binary_sensor.template.publish:
                      id: bruno_reconnu
                      state: ON
                  - delay: 5s
                  - binary_sensor.template.publish:
                      id: bruno_reconnu
                      state: OFF    
  - platform: wifi_info
    ip_address:
      name: device/ip
    mac_address:
      name: device/mac    


binary_sensor:
  - platform: homeassistant
    id: lampe_marine
    entity_id: light.lampe_marine
    internal: true

  - platform: homeassistant
    id: lampe_plante
    entity_id: light.salon_plante_10
    internal: true

  - platform: template
    name: "Bruno Reconnu"
    id: bruno_reconnu
    device_class: presence
    filters:
      - delayed_off: 5s   

  - platform: gpio
    pin: 
      number: GPIO21 
      mode: INPUT_PULLUP # Utilise la résistance interne pour maintenir l'état HAUT (HIGH)
      inverted: true     # Étant donné que le bouton tire le signal à GND (LOW), on inverse la logique pour que l'état "ON" corresponde à la pression.
    name: "Bouton Lancement Scan"
    
    # ⬇️ Les actions se déclenchent lors du relâchement du bouton (le press.duration permet d'éviter le 'bouncing')
    on_release:
      # Lancement du service de scan
      then:
        - homeassistant.service:
            service: esphome.esp32_fm225_facial_scan

button:
  - platform: restart
    id: reboot
    name: "Reboot 225"
  - platform: template
    name: "Bouton Appel Scan"
    on_press:
      then:
        - homeassistant.service:
            service: esphome.esp32_fm225_facial_scan

switch:
  - platform: gpio
    id: ledbleu225
    name: "LedBleu 225 Face"
    pin: 2


web_server:
  port: 80

Bob

1 « J'aime »

@Bob Merci pour les informations que vous avez fournies. Je vais les examiner.