Wielokanałowy czujnik temperatury Zigbee na ESP32 C6 + DS18B20 (do 20 czujników!)
Stabilny, szybki, z wygładzaniem pomiarów i sygnalizacją RGB
Chciałbym się pochwalić moim najnowszym urządzeniem Zigbee, które niedawno ukończyłem - i działa bardzo stabilnie (nawet na chińskich podróbkach DSów).
Oto moje własne multi sensorowe urządzenie Zigbee oparte o ESP32 C6 i DS18B20, pozwalające odczytywać do 20 czujników temperatury na jednej linii 1 Wire, z pełną integracją w Home Assistant, Zigbee2MQTT i ZHA, no i oczywiście Suplą (przez bramkę Z2S od @vajera).
Tym razem trochę inaczej, bez zbędnej teorii, informacji o bezpieczeństwie i marudzenia, ponieważ urządzenie (używane zgodnie z przeznaczeniem) powinno być w pełni bezpieczne.
Poniżej opisuję, jak to działa, jak to zbudowałem i co potrafi.
Co to jest?
Urządzenie to:
• Zigbee End Device
• działające na ESP32 C6 (Zigbee + WiFi)
• obsługujące do 20 czujników DS18B20 na jednej magistrali
• każdy czujnik => osobny endpoint Zigbee (0x0402 Temperature Measurement)
• rozpoznaje automatycznie wszystkie podłączone sondy (czujniki temperatury)
• dynamicznie nadaje nazwę modelu: ESP32C6_T_Sensor_<X>CH (np. dla 6 sond → ESP32C6_T_Sensor_6CH)
• retagowanie po zmianie liczby czujników (z pamięcią NVS)
• sygnalizacja RGB LED (wbudowana w ESP32 C6):
- żółty – łączenie z siecią Zigbee
- zielony – połączono
- fioletowy – błąd odczytu
- czerwone mrugnięcie – factory reset po przytrzymaniu przycisku
• co 60 sekund sprawdza stan magistrali i ostrzega, gdy liczba DS18B20 się zmieni (np. wskutek awarii lub braku sygnału z czujnika) - komunikat na serialu i dioda zmieni kolor przez 5s na fioletowy (uwaga – stan musi się dwa razy, raz po razie, nie zgadzać, aby alarm zadziałał)
• pełne logi na Serial (surowe + filtrowane wartości)
Działa to jako stabilny, pełnoprawny czujnik Zigbee, który w HA/Z2M/Z2S wygląda jak gotowy produkt komercyjny.
Jak widzi to koordynator Zigbee (w tym bramka Z2S)?
Urządzenie zgłasza:
Jeden node Zigbee
• Manufacturer: ZIBI
• Model: ESP32C6_T_Sensor_XCH
• Profil: ZHA (0x0104)
Jeden, kilka lub kilkanaście (do 20) endpointów
Każdy endpoint to osobny czujnik temperatury, z klastrami:
Server Clusters per endpoint:
• 0x0000 Basic
• 0x0003 Identify
• 0x0402 Temperature Measurement
- measuredValue (0,01 °C)
- minMeasuredValue = -55°C
- maxMeasuredValue = 125°C
- tolerance = 1°C (zmniejszyłem w sofcie do 0,1°C)
- raportowanie: delta 0,1°C
Hardware:
• ESP32 C6 (np. DevKit C6 lub moduł z wbudowaną RGB LED, na tych ze zwykłym LED np. Xiao dioda jest wyłączona)
• DS18B20 - w moim przypadku kilka sond zwykłych i kilka w osłonie stalowej (miałem łącznie 15 i dla tylu przetestowałem)
• linia DATA podłączona pod GPIO4 w C6
• rezystor 4.7k między DATA a VCC (wartość rezystora często trzeba dobrać indywidualnie – w zależności od liczby czujników i długości linii)
• przycisk na GPIO9 (domyślnie BOOT na C6)
• zasilanie 3.3V
Software:
• Arduino Core for ESP32 C6
• OneWireNg (zamiast starego OneWire - działa stabilnie na C6, dzięki @Piotr Stolarz)
• DallasTemperature (działa dzięki warstwie zgodności)
• Zigbee library od Espressifa
• FreeRTOS task na pomiary
• automatyczne skanowanie 1 Wire przy starcie
• własna obsługa LED RGB (natywne rgbLedWrite())
Logika przycisku:
• 3 sekundy => LED OFF
• 5 sekund => dwa szybkie czerwone błyski => factory reset Zigbee (urządzenie potem samo się ponownie paruje)
Wygładzanie pomiarów – EMA
Zastanawiałem się, czy nie zostawić „surowych” danych, w końcu zdecydowałem się na prosty filtr. Wbudowałem filtr EMA (Exponential Moving Average), dzięki czemu:
• temperatury są stabilne,
• wykresy są „gładkie”,
• nie ma „szumów” ani sztucznych skoków,
• raporty Zigbee wysyłane są dopiero przy zmianie >=0,1°C (oszczędność baterii w innych projektach, mniejszy ruch w sieci).
Health Check co 60 sekund
Co minutę urządzenie:
• ponownie skanuje magistralę 1 Wire,
• jeśli wykryje zmianę liczby czujników => wpisuje ostrzeżenie do logu (bez resetu).
To przydaje się przy luźnych połączeniach, uszkodzonych sondach lub przy bardzo długich przewodach.
Początkowo chciałem wykorzystać wbudowaną funkcje w Dallas Temperature, ale alarm się nie odpalał, bo DallasTemperature.getDeviceCount() nie zawsze odświeża liczbę urządzeń po starcie (bazuje na wewnętrznej liście stworzonej przy begin()), więc po odłączeniu sondy licznik się nie zmieniał i warunek nie był spełniony.
Wprowadziłem własne, bezpośrednie skanowanie magistrali 1 Wire przez OneWire::search(), z filtrowaniem tylko rodziny DS18B20 (0x28) i weryfikacją CRC. Dzięki temu HealthCheck co skan sprawdza realny stan linii 1 Wire. Dodałem też prostą histerezę (potwierdzenie zmiany w 2 kolejnych skanach), żeby nie reagować na jednorazowy błąd.
LED RGB daje pełną sygnalizację
Wbudowana dioda ESP32 C6 działa z natywną funkcją:
rgbLedWrite(RGB_BUILTIN, R, G, B);
U mnie działa to tak:
- Start & łączenie
żółty urządzenie łączy się z Zigbee
- Połączono
zielony urządzenie w sieci
- Factory reset
2 błyski czerwone przytrzymanie przycisku 5 s
- Błąd odczytu
fioletowy urządzenie w ciągu 2 kolejnych minut, dwa razy wykryło błąd odczytu temperatury
- Po 3 sekundach trzymania przycisku
LED OFF
Po co to zrobiłem?
Chciałem mieć:
• precyzyjny monitoring temperatury w kilku miejscach instalacji CO/CWU/bufor/piec,
• bez plątaniny kabli (tylko te do sond)
• bez Wi Fi (Zigbee ma /zazwyczaj/ mniejsze opóźnienia i mniejsze zużycie energii),
• możliwość dodania nawet 20 czujników bez komplikowania okablowania,
• w pełni stabilne urządzenie na długi czas,
• no i najważniejsze: działające akcje lokalne - nawet bez neta, wszystko dzięki @vajera
I to dokładnie dostałem.
Na dziś - działa wzorowo.
Plany, rozbudowa?
Jeśli macie jakiś pomysł - piszcie śmiało.
Jak będzie zapotrzebowanie, to mogę też przygotować:
• wersję z ekranem OLED,
• wersję z obsługą zwykłej diody LED (np. w Xiao),
• wersję z obsługą anteny zewnętrznej w Xiao,
• port na ESP32 H2.
Chętnie pomogę (w miarę dostępnego czasu i możliwości) każdemu, kto chce zrobić taki sprzęt u siebie.
Ustawienia Zigbee
- Po wgraniu softu (i ewentualnym resecie, jeśli nie wykonał się samoczynnie) urządzenie jest w trybie parowania i czeka na połączenie z bramką.
- Jeśli w bramce włączymy parowanie, to po chwili w cloud i w aplikacji powinniśmy zobaczyć od 1 do 20 termometrów.
- Domyślna nazwa urządzenia w bramce to: ZIBI::ESP32C6_T_Sensor_3CH, gdzie X to liczba kanałów zgodna z liczbą sond (termometrów), które podłączyliśmy.
- Ważne! Reset Zigbee (>5s boot) oraz wyłączenie diody RGB (3s boot) możliwe jest dopiero po sparowaniu urządzenia.
- Do testowania załączam binarkę (plik „merged”). Soft wgrywamy standardowo czymkolwiek, co potrafi wgrać do ESP32-C6. Jeśli jest konieczność podania adresu, to wgrywamy od adresu 0x0.
- Uwaga! Przywrócenie ustawień fabrycznych wykonujemy trzymając dłużej (>5s) przycisk BOOT. Jeśli zmieniliśmy liczbę sond (termometrów) to urządzenie będzie się chciało sparować pod nową nazwą z nową (aktualną liczbą) podłączonych termometrów. Aby to było możliwe należy usunąć poprzednie urządzenie z cloud.
- Czy można podłączyć urządzenie z innymi bramkami? Tak, ale nie z komercyjnymi (Tuya, eWelink). Pod ZHA i Z2M będzie działać. Wystarczy przypisać, bo wykorzystuje standardowe klastry.
- Czy można zrobić podobne urządzenie na WiFi bezpośrednio pod Suplę? Oczywiście! W ramach testów sam nawet takie zrobiłem (z wykorzystaniem dokładnie tych samych elementów) i osuplowałem. Działa. Soft można wygenerować bez problemów w nowym GG (link w moim podpisie). Nie trzeba posiadać umiejętności programowania. Co tracimy? Możliwość pracy w Zigbee, automatyczne skanowanie 1-wire z dodawaniem endpointów i sygnalizację diodą RGB (np. błędów odczytu termometrów). Reszta będzie działać bardzo podobnie. Załączam też tutaj taką wersję (z dopiskiem Supla). Po wgraniu wystarczy wejść na stronę konfiguracji (192.168.4.1) i sobie wszystko poustawiać (przypisać GPIO do 1-wire, przeskanować i sobie poopisywać).
- Czy nie lepiej kupić gotowe urządzenie Zigbee? Pewnie, że tak! Jeśli tylko takie na Zigbee znajdziecie. Nie piszę tutaj o przerabianych Sonoffach, bo po pierwsze one są na WiFi, a po drugie mogą być bardzo niebezpieczne. To projekt dla pasjonatów, którzy chcą zrobić coś samemu.
W załączniku wersja 0.7h z 22.02.2026
Pełna obsługa od wersji bramki Z2S - 1.4.41 (2026-02-22) (obecnie do 10 DSów).

