W ESPHome pojawił się wbudowany komponent hdmi_cec. Zmianę #9189 autorstwa Josa van Eijndhovena scalono z gałęzią rozwojową 15 października 2026. Ta gałąź ma już numer 2026.11.0-dev, a w wersjach beta 2026.10 komponentu nie ma, więc najwcześniej trafi do wydania 2026.11. Urządzenie z ESPHome podłączone do linii CEC w złączu HDMI odbiera komunikaty, które telewizor wymienia z podłączonym sprzętem, może na nie reagować w automatyzacjach i wysyłać własne: przejście w stan czuwania, włączenie, zmianę głośności czy wybór wejścia.
Kod rozwija zewnętrzny komponent esphome-native-hdmi-cec autorstwa Palakisa, który z kolei powstał na bazie wcześniejszej pracy johnboilesa.
Podłączenie i konfiguracja
CEC to jeden przewód w każdym kablu HDMI, styk 13 złącza. Korzystają z niego wszystkie urządzenia na łączu, także te podpięte przez amplituner albo przełącznik HDMI. Projekt dokumentacji (zmiana #7733 w esphome.io, jeszcze nie scalona) łączy jeden pin GPIO ze stykiem 13, a masę ze stykiem 17. Doprowadzenie 5 V z płytki do styku 18 nie jest konieczne, ale dokumentacja je zaleca, bo po tym telewizor poznaje, że coś jest podłączone. Pin pracuje jako wyjście z otwartym drenem i słabym rezystorem podciągającym, więc do pierwszej próby nie trzeba żadnych dodatkowych elementów.
hdmi_cec:
id: cec
pin: GPIO9
address: 0x5
on_message:
- opcode: 0x8F # Give Device Power Status
then:
- hdmi_cec.send:
destination: !lambda return source;
data: [0x90, 0x00] # Report Power Status: on
Klucz address to adres logiczny, na który odpowiada urządzenie (0x5 oznacza system audio, 0x4 odtwarzacz). W on_message można wybierać komunikaty według nadawcy, odbiorcy, kodu operacji albo pierwszych bajtów danych. Opcja promiscuous_mode przepuszcza też komunikaty adresowane do innych urządzeń, a monitor_mode włącza sam nasłuch: urządzenie niczego wtedy nie potwierdza i nic nie wysyła. Akcja hdmi_cec.send przyjmuje adres odbiorcy (0xF oznacza wszystkie urządzenia) i do 15 bajtów, zaczynając od kodu operacji. To samo da się zrobić w wyrażeniu lambda przez id(cec).send(...), a dzięki akcji API dowolny komunikat może wysłać Home Assistant.
Czego jeszcze brakuje
Scalony kod to pierwsza część, czyli sama obsługa magistrali: odbiór w przerwaniu GPIO, programowe nadawanie z ponawianiem prób i wykrywanie kolizji. Urządzenie nie odpowiada samo na pytania telewizora. Telewizor pyta nowe urządzenie o adres fizyczny, nazwę wyświetlaną na ekranie, identyfikator producenta i stan zasilania, a jeśli nie dostanie odpowiedzi, uznaje, że urządzenia nie ma. Odpowiedzi, których potrzebuje konkretny telewizor, trzeba więc przygotować samemu w automatyzacjach on_message. Wbudowane odpowiedzi, nadawanie przez UART i dekoder komunikatów przeniesiono do drugiej części (#20797). Jeden z opiekunów ESPHome (bdraco) napisał, że nie zamierza jej kończyć i zostawia gałąź dla kogoś, kto zechce ją przejąć.
Dokumentacja podaje dwie praktyczne uwagi. Nadawanie odbywa się bit po bicie w pętli głównej, około 25 ms na bajt, więc pętla może stanąć nawet na 400 ms przy jednym komunikacie, a ostrzeżenie o zbyt długiej operacji w dzienniku jest wtedy normalne. Poza tym na linii CEC jest 3,3 V przez cały czas, gdy telewizor jest włączony, także wtedy, gdy płytka z ESPHome nie ma zasilania. Na taką sytuację dokumentacja zaleca mały przekaźnik albo konwerter poziomów logicznych I²C, na przykład TXS0102 lub TCA9517, który odłączy GPIO od linii.
Komponent przetestowano na ESP32-S3, ESP32-C3 (Arduino i ESP-IDF) oraz ESP8266, a kompiluje się też dla RP2040 i BK72xx. Na ESP8266 korzysta ze sprzętowego licznika 1, którego używają również wyjścia PWM i serwomechanizmy. Zmiana #20794, scalona tego samego dnia, sprawia, że ESPHome odrzuci konfigurację, w której dwa komponenty chcą korzystać z tego licznika. Dopisanie do tej kontroli komponentu hdmi_cec zostawiono na kolejną zmianę.