ESP32 bluetooth i brak możliwości korzystania z GPIO

Witam.
Od dłuższego czasu sczytuję czujniki temp/wilg xiaomi mija za pomocą dwóch ESP32 (parter/piętro). Kod jaki mam wpisany został mi “podarowany” przez jakąś przyjazną duszę, a wygląda on tak:

substitutions:
  device_name: ESP32 - parter
  friendly_name: ESP32 - parter
  device_name_lower: "esp32-parter"

esphome:
  name: ${device_name_lower}
  friendly_name: ESP32 - parter

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

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

logger:

# Enable Home Assistant API
api:
  encryption:
    key: "xxx"

ota:

improv_serial:

esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms
    window: 1100ms
    active: true

bluetooth_proxy:
  active: true

time:
  - platform: homeassistant
    id: homeassistant_time

Gdy zechcę dodać jakikolwiek binary sensor kod się nie kompiluje i zwraca następujący bład:

collect2: error: ld returned 1 exit status
*** [/data/esp32-parter/.pioenvs/esp32-pietro/firmware.elf] Error 1

Gdy skasuję sensor, wszystko wraca do normy.
NA esphome.io nie znalazłem ograniczeń dla ESP bluetooth tracker czy proxy (choć przyznam, że nieświadomie mam umieszczone oba wpisy i nie jestem pewien czy oba są niezbędne do moich celów), co do wykorzystywania tych funkcji jednocześnie z GPIO.

Czy wiecie, dlaczego kod się nie kompiluje i nie mogę korzystać z GPIO?

To są płytki z przewodowym Ethernetem?
Jeśli nie, to ten kod jest do poprawki od wielu miesięcy.
Więcej info tu:

Wzorcowy kod dla płytek używających WiFi równolegle z BT (do wywalenia interval i window)


Wracając do tematu innych GPIO, to generalnie jest błąd linkera, więc prawdopodobnie masz jakieś błędy już wcześniej, ale do diagnozy to by się przydały

  1. pełny YAML po twoich modyfikacjach
  2. pełny log kompilatora, a nie tylko ostatni błąd (może gdzieś wcześniej jest informacja o pierwotnym błędzie, pewnie jest)

W sumie skoro to błąd linkera, to przyczyny mogą być zewnętrzne (np. uszkodzony plik) możesz zrobić Clean Build Files przed ponowną kompilacją.

Chodzi o tą linijkę:

name_add_mac_suffix: true

? Bo reszta wg mnie jest taka sama (nie licząc “substitution”, ale to chyba nie jest obowiązkowe).

esphome:
  name: "esp32-pietro"
  friendly_name: ESP32 - pietro

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

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "GEbuqVhF+sO9SNKW1BD2SbpLrPL4H/9UphkrkBnJjvM="

ota:


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

  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Esphome-Web-A0Fe1C"
    password: "Y2V5Spr8HU1H"

captive_portal:

esp32_ble_tracker:
  scan_parameters:
    interval: 1100ms
    window: 1100ms
    active: true

bluetooth_proxy:
  active: true

time:
  - platform: homeassistant
    id: homeassistant_time    

binary_sensor:
  - platform: gpio
    pin:
      number: 32
      mode: 
        input: True
      inverted: True
    name: "Sypialnia"
    on_press:
      - switch.toggle: przekaznik_sypialnia
    device_class: light
    filters:
      - delayed_on: 10ms
  - platform: gpio
    pin:
      number: 33
      mode: 
        input: True
      inverted: True
    name: "Łazienka"
    on_press:
      - switch.toggle: przekaznik_lazienka_gora
    device_class: light
    filters:
      - delayed_on: 10ms
  - platform: gpio
    pin:
      number: 25
      mode: 
        input: True
      inverted: True
    name: "Korytarz góra"
    on_press:
      - switch.toggle: przekaznik_korytarz_gora
    device_class: light
    filters:
      - delayed_on: 10ms
  - platform: gpio
    pin:
      number: 26
      mode: 
        input: True
      inverted: True
    name: "Julka"
    on_press:
      - switch.toggle: przekaznik_julka
    device_class: light
    filters:
      - delayed_on: 10ms
  - platform: gpio
    pin:
      number: 27
      mode: 
        input: True
      inverted: True
    name: "Tosia"
    on_press:
      - switch.toggle: przekaznik_tosia
    device_class: light
    filters:
      - delayed_on: 10ms

switch:
  - platform: restart
    name: "ESP piętro Restart"
  - platform: gpio
    pin: 21
    inverted: true
    id: przekaznik_sypialnia
    name: "Sypialnia"
    icon: "mdi:light"
  - platform: gpio
    pin: 19
    inverted: true
    id: przekaznik_lazienka_gora
    name: "Łazienka góra"
    icon: "mdi:light"
  - platform: gpio
    pin: 18
    inverted: true
    id: przekaznik_korytarz_gora
    name: "Korytarz góra"
    icon: "mdi:light"
  - platform: gpio
    pin: 5
    inverted: true
    id: przekaznik_julka
    name: "Julka"
    icon: "mdi:light"
  - platform: gpio
    pin: 17
    inverted: true
    id: przekaznik_tosia
    name: "Tosia"
    icon: "mdi:light"

INFO ESPHome 2023.8.3
INFO Reading configuration /config/esphome/esp32-pietro.yaml...
INFO Detected timezone 'Europe/Warsaw'
INFO Generating C++ source...
INFO Compiling app...
Processing esp32-pietro (board: esp32dev; framework: espidf; platform: platformio/espressif32@5.4.0)
--------------------------------------------------------------------------------
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
 - framework-espidf @ 3.40405.230623 (4.4.5) 
 - tool-cmake @ 3.16.4 
 - tool-ninja @ 1.7.1 
 - toolchain-esp32ulp @ 2.35.0-20220830 
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
Reading CMake configuration...
Dependency Graph
|-- noise-c @ 0.1.4
Linking /data/esp32-pietro/.pioenvs/esp32-pietro/firmware.elf
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._ZN7esphome4gpio16GPIOBinarySensorC5Ev[esphome::gpio::GPIOBinarySensor::GPIOBinarySensor()]+0x0): undefined reference to `vtable for esphome::gpio::GPIOBinarySensor'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._ZN7esphome4gpio16GPIOBinarySensorC5Ev[esphome::gpio::GPIOBinarySensor::GPIOBinarySensor()]+0x4): undefined reference to `vtable for esphome::gpio::GPIOBinarySensor'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._ZN7esphome4gpio16GPIOBinarySensorC5Ev[esphome::gpio::GPIOBinarySensor::GPIOBinarySensor()]+0x8): undefined reference to `esphome::binary_sensor::BinarySensor::BinarySensor()'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._ZN7esphome13binary_sensor15DelayedOnFilterC5Ev[esphome::binary_sensor::DelayedOnFilter::DelayedOnFilter()]+0x0): undefined reference to `vtable for esphome::binary_sensor::DelayedOnFilter'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._ZN7esphome13binary_sensor15DelayedOnFilterC5Ev[esphome::binary_sensor::DelayedOnFilter::DelayedOnFilter()]+0x4): undefined reference to `vtable for esphome::binary_sensor::DelayedOnFilter'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._ZN7esphome4gpio10GPIOSwitchC5Ev[esphome::gpio::GPIOSwitch::GPIOSwitch()]+0x0): undefined reference to `vtable for esphome::gpio::GPIOSwitch'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._ZN7esphome4gpio10GPIOSwitchC5Ev[esphome::gpio::GPIOSwitch::GPIOSwitch()]+0x4): undefined reference to `vtable for esphome::gpio::GPIOSwitch'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o:(.literal._Z5setupv+0x1f4): undefined reference to `esphome::binary_sensor::BinarySensor::add_filters(std::vector<esphome::binary_sensor::Filter*, std::allocator<esphome::binary_sensor::Filter*> > const&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o: in function `esphome::binary_sensor::PressTrigger::PressTrigger(esphome::binary_sensor::BinarySensor*)':
/config/esphome/.esphome/build/esp32-pietro/src/esphome/components/binary_sensor/automation.h:23: undefined reference to `esphome::binary_sensor::BinarySensor::add_on_state_callback(std::function<void (bool)>&&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o: in function `esphome::gpio::GPIOBinarySensor::GPIOBinarySensor()':
/config/esphome/.esphome/build/esp32-pietro/src/esphome/components/gpio/binary_sensor/gpio_binary_sensor.h:10: undefined reference to `esphome::binary_sensor::BinarySensor::BinarySensor()'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/main.o: in function `setup()':
/config/esphome/.esphome/build/esp32-pietro/src/main.cpp:255: undefined reference to `esphome::binary_sensor::BinarySensor::add_filters(std::vector<esphome::binary_sensor::Filter*, std::allocator<esphome::binary_sensor::Filter*> > const&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /config/esphome/.esphome/build/esp32-pietro/src/main.cpp:295: undefined reference to `esphome::binary_sensor::BinarySensor::add_filters(std::vector<esphome::binary_sensor::Filter*, std::allocator<esphome::binary_sensor::Filter*> > const&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /config/esphome/.esphome/build/esp32-pietro/src/main.cpp:334: undefined reference to `esphome::binary_sensor::BinarySensor::add_filters(std::vector<esphome::binary_sensor::Filter*, std::allocator<esphome::binary_sensor::Filter*> > const&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /config/esphome/.esphome/build/esp32-pietro/src/main.cpp:371: undefined reference to `esphome::binary_sensor::BinarySensor::add_filters(std::vector<esphome::binary_sensor::Filter*, std::allocator<esphome::binary_sensor::Filter*> > const&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /config/esphome/.esphome/build/esp32-pietro/src/main.cpp:410: undefined reference to `esphome::binary_sensor::BinarySensor::add_filters(std::vector<esphome::binary_sensor::Filter*, std::allocator<esphome::binary_sensor::Filter*> > const&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/esphome/core/controller.o:(.literal._ZN7esphome10Controller16setup_controllerEb+0x10): undefined reference to `esphome::binary_sensor::BinarySensor::add_on_state_callback(std::function<void (bool)>&&)'
/data/cache/platformio/packages/toolchain-xtensa-esp32@8.4.0+2021r2-patch5/bin/../lib/gcc/xtensa-esp32-elf/8.4.0/../../../../xtensa-esp32-elf/bin/ld: /data/esp32-pietro/.pioenvs/esp32-pietro/src/esphome/core/controller.o: in function `esphome::Controller::setup_controller(bool)':
/config/esphome/.esphome/build/esp32-pietro/src/esphome/core/controller.cpp:11: undefined reference to `esphome::binary_sensor::BinarySensor::add_on_state_callback(std::function<void (bool)>&&)'
collect2: error: ld returned 1 exit status
*** [/data/esp32-pietro/.pioenvs/esp32-pietro/firmware.elf] Error 1
========================= [FAILED] Took 173.43 seconds =========================

Dodam, że na dwóch różnych ESP32 i na dwóch różnych plikach jest to samo.

Nie ta jest w porządku (swoją drogą jest kluczowa dla wygenerowania nazwy z MAC-adressu, gdyby np. wykorzystać publikowanie kodu na githubie), chodzi o timingi dla Bluetooth - wymieniłem wcześniej, które 2 linijki usunąć (jeśli jest wykorzystywane WiFi, to timingi muszą być domyślne - tam oba radia pracują na tej samej antenie).

Pomogło clean build files. Timingi skasowałem. Mam nadzieję, że chodziło o te linijki:

    interval: 1100ms
    window: 1100ms

Znowu mi pomogłeś. Jak szybko nie założysz patronite’a to później, na kumulację, nie będzie mnie stać :wink:

Miałem właśnie pisać, że u mnie się kompiluje

Linking /data/esp32-pietro/.pioenvs/esp32-pietro/firmware.elf
RAM:   [==        ]  16.1% (used 52692 bytes from 327680 bytes)
Flash: [=======   ]  71.8% (used 1318173 bytes from 1835008 bytes)
Building /data/esp32-pietro/.pioenvs/esp32-pietro/firmware.bin
Creating esp32 image...
Successfully created esp32 image.
esp32_create_combined_bin(["/data/esp32-pietro/.pioenvs/esp32-pietro/firmware.bin"], ["/data/esp32-pietro/.pioenvs/esp32-pietro/firmware.elf"])
Wrote 0x153390 bytes to file /data/esp32-pietro/.pioenvs/esp32-pietro/firmware-factory.bin, ready to flash to offset 0x0
======================== [SUCCESS] Took 296.27 seconds ========================
INFO Successfully compiled program.

Wprawdzie za pierwszym razem nie bez szopek (wywrócił mi się HA w momencie linkowania - co za zbieg okoliczności? jakkolwiek trudno oceniać, bo eksperymentuję właśnie z wrześniowym wydaniem ESPHome i coś się mogło u mnie “pogryźć”).

tak, o te.


Jakkolwiek w kwestii twoich logów z kompilacji, to takie jak wrzuciłeś pochodzą z prekompilowanego projektu, gdy już masz setki plików w cache (właściwie to praktycznie nie kompilacja od zera tylko samo linkowanie), czyli są za krótkie bo nie wiadomo co się działo przy pierwotnej kompilacji - wtedy logi są “kilometrowej” długości i takie są potrzebne do jakiejś diagnostyki.
Tutaj linker próbuje zlinkować już istniejące pliki z cache, więc nie wiemy w jakich okolicznościach one powstały.
Natomiast Clean Build Files powoduje wyczyszczenie środowiska i kompilację (wręcz z pobieraniem składników online) wszystkiego od nowa.


Na wstępie YAMLa puściłem przez lintera (Validate) i nie zawiera ostrzeżeń, tak samo przy kompilacji nie ma ostrzeżeń, więc zakładam, że zarówno składniowo jest poprawny, jak i nie przegiąłeś sprzętowo z wykorzystaniem GPIO (ale czy nie masz konfliktów sprzętowych to wyjdzie w praniu, chyba, że projektowałeś to mając choćby bryk z dokumentacji EP32 przed oczami).

W kwestii dopieszczania kodu to zapewne można zmienić ogólną definicję płytki

  board: esp32dev

na jakąś pasującą do sprzętu (wtedy wszelkie ulepszenia w Platformio dedykowane dla tej konkretnej płytki będą uwzględniane, np. aliasy zgodne z nadrukiem na soldermasce).

Wczoraj próbowałem znaleźć najbardziej pasującą do mojej (ESP32 devkit V1) i nie znalazłem identycznej tu. Widzę, że kod wklejony nie zawiera definicji tej, którą wybrałem esp32doit-devkit-v1 a nie mam pewności czy słusznie kminię i tą powinienem wpisać.

Zrób zdjęcia obu stron, to może ktoś pozna co to za płytka, prawdopodobnie podpasuje definicja
esp32doit-devkit-v1
ta ma kontrolkę LED podpiętą do GPIO2
ale jeśli nie wiesz jaką masz płytkę to bezpieczniej jest nie zmieniać.