Poranki, takie jak np. 1 stycznia to dobra okazja, by korzystając z tego, że sporo osób dłużej śpi, wykonać na spokojnie prace serwisowe, aktualizacje… Tak więc wczoraj zapuściłem rutynowe aktualizacje serwerów i usług na nich, w tym domowe Raspberry Pi, na którym działa m.in. Home Assistant i ESPHome. Wszystko przeszło sprawnie, przynajmniej do momentu, gdy zacząłem aktualizować urządzenia z ESPHome, po aktualizacji ESPHome na serwerze. Przy próbie aktualizacji jednej z testowych płytek ESP32 pojawił się błąd. Było to o tyle dziwne, że w kodzie nic nie zmieniałem, więc jak nic, zmiana musiała nastąpić w samym ESPHome…

Pin is used in multiple places, czyli zmiana w ESPHome

Wspomniana płytka ESP32 to akurat taki model testowy, na którym obecnie trwają m.in. testy czujników LD2410 i BME680. Nic nadzwyczajnego, prosty kod (YAML), a mimo to po aktualizacji ESPHome i próbie aktualizacji oprogramowania na ESP32 pojawił się błąd:

Pin 27 is used in multiple places.

Zdublowany PIN nie był zaskoczeniem, bo faktycznie w testowym kodzie występuje on zarówno jako przycisk (button), jak i jako przełącznik (switch):

output:
  - platform: gpio
    pin: GPIO27
    id: output_led_red

button:
  - platform: output
    name: "${friendly_name} LED Red Button"
    id: ${device_id}_led_red_button
    output: output_led_red
    duration: 500ms

switch:
  - platform: gpio
    name: "${friendly_name} LED Red Switch"
    id: ${device_id}_led_red_switch
    pin: GPIO27

A to dlatego, bym każde z 3 światełek „sygnalizacji świetlnej” mógł zapalić na chwilę (przycisk), jak i na dłużej (przełącznik). I do tej pory to sobie działało, aż przyszła wersja 2023.12.0 z 20 grudnia 2023, w której pojawiła się m.in. taka zmiana:

Pin Reuse validation

There is a new validation performed on configurations to ensure that pins are not reused unintentionally. This is a common source of issues and generally a pin does not need to be reused across multiple components in a single configuration. Pins should only be reused in a very limited set of circumstances and seeing the error will generally mean that you need to reorganise your configuration to not reuse the pins. The error can be bypassed by specifically adding another config item to all of the duplicate pin definitions. See the Pin Schema for details.

Czyli podczas kompilacji oprogramowania jest teraz sprawdzane, czy dany pin (GPIO) nie występuje w więcej niż jednym miejscu. A jak występuje, to pojawia się wspomniany wyżej błąd. Nie ma sensu oceniać sensu tego, bo jest, jak jest.

Ważne, że w razie potrzeby można to obejść, za pomocą odpowiedniego parametru przy definicji GPIO:

allow_other_uses (Optional, boolean): If the pin is also specified elsewhere in the configuration. By default multiple uses of the same pin will be flagged as an error. This option will suppress the error and is intended for rare cases where a pin is shared between multiple components. Defaults to false.

Tak więc idąc to najmniejszej linii oporu, przerobiłem mój testowy kod w testowym ESP32, by ESPHome nie zgłaszało błędu, gdy wybrane GPIO jest zdefiniowane w więcej niż jednym elemencie:

switch:
  - platform: gpio
    name: "${friendly_name} LED Red Switch"
    id: ${device_id}_led_red_switch
    pin: 
      number: GPIO27
      allow_other_uses: true

button:
  - platform: output
    name: "${friendly_name} LED Red Button"
    id: ${device_id}_led_red_button
    output: output_led_red
    duration: 500ms

output:
  - platform: gpio
    pin: 
      number: GPIO27
      allow_other_uses: true
    id: output_led_red

Oczywiście to tylko mały wycinek całego kodu, ale pokazuje to, co się zmieniło i co trzeba zmienić, by nic się nie zmieniło… ;-)

(!) Zgłoś błąd na stronie
Pomogłem? To może postawisz mi wirtualną kawę?
LUTy dla D-Cinelike (DJI Mini 3 Pro, DJI Avata, OSMO Pocket) od MiniFly
Wdrożenie Omnibusa w sklepie na WooCommerce
Jak (legalnie) latać dronem w Kategorii Otwartej