Brána počítání osob VL53L0X

www
Odpovědět
Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 889
Registrován: 30. září 2020, 20:33
Dal poděkování: 47 poděkování
Dostal poděkování: 88 poděkování

Brána počítání osob VL53L0X

Příspěvek od Pete30 »

Pokud chcete počítat procházející osoby a následně použít v automatizaci pro ovládání světel je tu návod jak to uskutečnit pomocí senzorů VL53L0X.
Pozor je tu ještě jedno vlákno které řeší senzor VL53L1X který není kompatabilní s touto integrací protože se jedná o senzor který není nativně podporován ESPhome a jedná se o externí komponentu.
Teď, ale k původnímu tématu.
Pro instalaci brány potřebujete 2x senzor VL53L0X + esp32 (doporučen)
Tento senzor je podporován ESPhome proto není nic jednodušího než v esp addonu přidat nový uzel a do esp32 poté nahrát konfigurační soubor:

Kód: Vybrat vše

esphome:
  name: kuchyne-brana
  platform: ESP32
  board: nodemcu-32s

# Enable logging
logger:
  level: INFO


# Enable Home Assistant API
api:

ota:
  password: "3c68dbec5ba65c4451f70be6bdb0369d"

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
  manual_ip:
    static_ip: xxxxxxxxx
    gateway: xxxxxxxxx
    subnet: 255.255.255.0

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

captive_portal:

i2c:
  sda: GPIO21
  scl: GPIO22
  scan: True
  id: bus_a

globals:
  - id: seq1
    type: int
    restore_value: no
    initial_value: '0'
  - id: seq2
    type: int
    restore_value: no
    initial_value: '0'
  - id: seq3
    type: int
    restore_value: no
    initial_value: '0'
  - id: seq4
    type: int
    restore_value: no
    initial_value: '0'
    
  - id: count
    type: int
    restore_value: no
    initial_value: '0'
    
  - id: inside_previous_value
    type: bool
    restore_value: no
    initial_value: 'false'
    
  - id: outside_previous_value
    type: bool
    restore_value: no
    initial_value: "false"


binary_sensor:
  - platform: template
    id: lab_inside_door_laser
    name: "Brána do kuchyně"
    lambda: !lambda |-
        if((id(sens_1).state < 0.7f) != id(inside_previous_value)){
          id(inside_previous_value) = (id(sens_1).state < 0.7f);
          if(((id(sens_1).state < 0.7f) == false) && ((id(sens_2).state < 0.7f) == false)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 0;
          }else if(((id(sens_1).state < 0.7f) == false) && ((id(sens_2).state < 0.7f) == true)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 1;
          }else if(((id(sens_1).state < 0.7f) == true) && ((id(sens_2).state < 0.7f) == false)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 2;
          }else if(((id(sens_1).state < 0.7f) == true) && ((id(sens_2).state < 0.7f) == true)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 3;
          }
          if((id(seq1) == 1) && (id(seq2) == 3) && (id(seq3) == 2) && (id(seq4) == 0)){
            id(count) ++;
            id(people_in_lab).publish_state(id(count));
          }else if((id(seq1) == 2) && (id(seq2) == 3) && (id(seq3) == 1) && (id(seq4) == 0)){
            id(count) --;
            if(id(count) < 0){
              id(count) = 0;
            }
            id(people_in_lab).publish_state(id(count));
          }
        }
        return id(sens_1).state < 0.7f;
        
        

  - platform: template
    id: lab_outside_door_laser
    name: "Bráná ven z kuchyně"
    lambda: !lambda |-
        if((id(sens_2).state < 0.7f) != id(outside_previous_value)){
          id(outside_previous_value) = (id(sens_2).state < 0.7f);
          if(((id(sens_1).state < 0.7f) == false) && ((id(sens_2).state < 0.7f) == false)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 0;
          }else if(((id(sens_1).state < 0.7f) == false) && ((id(sens_2).state < 0.7f) == true)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 1;
          }else if(((id(sens_1).state < 0.7f) == true) && ((id(sens_2).state < 0.7f) == false)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 2;
          }else if(((id(sens_1).state < 0.7f) == true) && ((id(sens_2).state < 0.7f) == true)){
            id(seq1) = id(seq2);
            id(seq2) = id(seq3);
            id(seq3) = id(seq4);
            id(seq4) = 3;
          }
          if((id(seq1) == 1) && (id(seq2) == 3) && (id(seq3) == 2) && (id(seq4) == 0)){
            id(count)++;
            id(people_in_lab).publish_state(id(count));
          }else if((id(seq1) == 2) && (id(seq2) == 3) && (id(seq3) == 1) && (id(seq4) == 0)){
            id(count)--;
            if(id(count) < 0){
              id(count) = 0;
            }
            id(people_in_lab).publish_state(id(count));
          }
        }
        return id(sens_2).state < 0.7f;

sensor:
  - platform: template
    id: people_in_lab
    name: "Počítání osob kuchyně"
    lambda: !lambda |-
      return id(count);
        

  - platform: vl53l0x
    name: "Sensor 1"
    id: sens_1
    i2c_id: bus_a
    address: 0x41
    update_interval: 50ms
    enable_pin: GPIO25
    timeout: 500us
    internal: true
    
    
  - platform: vl53l0x
    name: "Sensor 2"
    id: sens_2
    i2c_id: bus_a
    address: 0x42
    update_interval: 50ms
    enable_pin: GPIO32
    timeout: 500us
    internal: true
Pozor na jednu věc a to je I2C připojení.
Senzor má adresu 0x29, ale potřebujeme připojit dva na tuto jednu sběrnici a pokud nebude mít každý senzor jinou adresu nebudou na společné sběrnici fungovat.
Jak to udělat ?, docela jednoduše.
Na senzoru je pin označen písmenem X (XSHUNT) a právě toho využijeme a připojíme k pinům esp32 (definováno v kódu).
Tímto připojením a konfigurací esp32 docílíme toho že esp32 vnutíme svoji vlastní adresu a senzory přepínáme mezi sebou a tím je můžeme připojit na jednu sběrnici I2C bez konfliktu.
Esp32 vytvoří 3 entity v HA které dále použijete v automatizaci (hlavně počítání osob) čítač běží v esp32 proto již v HA nemusíte nic vytvářet.

Je dobré si pohrát se vzdáleností mezi senzory.
Původně jsem zkoušel 6cm až 15cm, ale pro stabilní funkci se mi osvědčila vzdálenost 10 cm.
Mám je umístěny z boku dveří do kuchyně a vzdálenost k boku skříňky, která je umístěna na druhé straně dveří cca 1,3m a fungují spolehlivě.
Pokud nejsem přítomen tak jsem na rybách ;)

Jezinka
Začínající autor
Začínající autor
Příspěvky: 35
Registrován: 06. leden 2022, 09:34
Dal poděkování: 2 poděkování
Dostal poděkování: 1 poděkování

Re: Brána počítání osob VL53L0X

Příspěvek od Jezinka »

Tak už studuji tento kod. Není někde diagram funkčnosti? není mi zcela jasné jak funguje princip na interní úrovni. Používám ve svém úplně jinou logiku. Takže bych toto chtěl očíhnout a pak zkusit zda by fungovala lépe jak moje.

Uživatelský avatar
Pete30
Moderátor
Moderátor
Příspěvky: 889
Registrován: 30. září 2020, 20:33
Dal poděkování: 47 poděkování
Dostal poděkování: 88 poděkování

Re: Brána počítání osob VL53L0X

Příspěvek od Pete30 »

Bohužel není. Když se na to podíváš tak ty sekvence jsou tam 2x, jedná se vlastně o porovnání hodnot jednoho a druhého senzoru return ti vrací hodnotu čítače a state 0.7f zajišťuje pokud je menší než 0.7m f fload.
Ono to není tak úplně na interní úrovni protože binar senzor ti to vystaví jako entitu do HA a senzor počítání se vlastně vezme z hodnot šablony lambda a výslednou hodnotu to taky dá jako entitu do HA
Ale podrobně jsem to nestudoval to se přiznám ;)
Pokud nejsem přítomen tak jsem na rybách ;)

Odpovědět