Wiele tanich inteligentnych gniazdek mierzy pobór mocy układem HLW8012 albo BL0937. Taki układ podaje waty, wolty i ampery jako ciągi impulsów, które ESPHome zlicza programowym licznikiem impulsów. W gniazdkach z układami Beken albo Realtek, działających pod LibreTiny, to liczenie od dawna było zawodne. Zmiana #21271, scalona z gałęzią rozwojową ESPHome 22 października 2026, zmienia sposób, w jaki licznik nasłuchuje na pinie.
Co było nie tak
Programowy licznik impulsów działa na ESP8266, RP2040, LibreTiny, nRF52, a na ESP32 wtedy, gdy ustawisz use_pcnt: false. Zawsze podpinał przerwanie pod oba zbocza sygnału, a dopiero w procedurze obsługi przerwania odczytywał stan pinu, żeby ustalić, czy zbocze było narastające, czy opadające. Robił tak nawet w ustawieniach domyślnych, w których liczą się tylko zbocza narastające, a opadające są pomijane.
Słabym punktem jest właśnie ten odczyt. Na platformach, na których przerwanie długo dociera do procedury obsługi, stan pinu często zdąży się już zmienić z powrotem. Szybkie ciągi impulsów, takie jak na wyjściach CF i CF1 układu HLW8012, są wtedy liczone na złym zboczu albo wcale. Zgłoszenie, od którego zaczęła się poprawka, otwarte 21 października, wskazuje, że najbardziej cierpią układy z LibreTiny, bo pakiety SDK ich producentów reagują na przerwania GPIO wolniej niż te od Espressifa. Autor podlinkował około dziesięciu starszych zgłoszeń i zmian w ESPHome i LibreTiny z obejściami tego samego problemu.
Co się zmienia
Rodzaj przerwania zależy teraz od ustawienia internal_filter, bo filtr musi widzieć oba zbocza, żeby zmierzyć impuls:
- Gdy
internal_filterjest ustawiony (czujnikpulse_counterma domyślnie 13 µs), wszystko zostaje po staremu: przerwanie na obu zboczach i odczyt pinu, więc impulsy krótsze od okna filtra nadal są odrzucane. - Przy
internal_filter: 0usESPHome podpina przerwanie tylko pod te zbocza, które się liczą. W ustawieniach domyślnych (zbocze narastające zwiększa licznik, opadające jest wyłączone) oznacza to przerwanie na jednym zboczu, a procedura obsługi w ogóle nie czyta już pinu. - Gdy oba zbocza są wyłączone, przerwanie nie jest podpinane.
Komponenty hlw8012 i bl0937 korzystają z licznika bezpośrednio i bez filtra, więc same przechodzą na przerwanie z jednego zbocza. To dokładnie przypadek z pierwotnego zgłoszenia. Zwykły czujnik pulse_counter na LibreTiny może dostać to samo zachowanie po ustawieniu internal_filter: 0us.
Jeden skutek uboczny
Rodzaj przerwania jest teraz wybierany przy starcie. Jeśli lambda zmieni później tryby zboczy, ESPHome zapisze błąd w dzienniku i zignoruje zmianę. Autor zmiany zaznacza, że to nieudokumentowana zmiana w API C++, więc dotyczy tylko tych, którzy sterują licznikiem z własnego kodu.
Poprawka jest w gałęzi rozwojowej, więc powinna trafić do użytkowników razem z ESPHome 2026.11, chyba że zostanie też przeniesiona do wydania poprawkowego 2026.10. Po aktualizacji warto sprawdzić przede wszystkim gniazdka z układami Beken albo Realtek, które pokazywały zaniżony pobór mocy.