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… ;-)
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01