W sieci można tanio kupić różnego rodzaju wtyki, moduły i gniazdka oferujące pomiar energii i normalnie współpracujące z chmurą producenta. Tutaj pokażę, jak można takie gniazdko uwolnić od chmury i samodzielnie skonfigurować, w tym również jak można wywoływać zdarzenia w momencie np. przekroczenia danej wartości napięcia oraz jak można wizualizować pomiary w postaci wykresów trzymanych na tym samym urządzeniu. Temat ten nie będzie dotyczyć konkretnego urządzenia, lecz raczej ogólniej, grupy urządzeń produkowanej w Chinach i możliwych do taniego zakupu z portali z nazwami często zaczynającymi się na "A"...
Po co zmieniać firmware?
Użytkownicy podają różne powody chęci do zmiany firmware urządzenia, ale zazwyczaj wynikają one z chęci uwolnienia produktu od chmury (od serwerów producenta), uniknięcia potencjalnej inwigilacji i problemów gdy np. chmura producenta przestanie działać oraz również z potrzeby łączenia urządzeń z różnych ekosystemów. Po zmianie firmware na rozwiązanie open source można znacznie łatwiej poszerzyć funkcjonalność danego produktu, można do niego dodać dodatkowe czujniki, można go dowolnie programować, połączyć z Home Assistant, itd.
Zmiana firmware
W przypadku układów z serii ESP8266 i ESP32 polecam wgranie Tasmoty zgodnie z opisywanymi wcześniej metodami:
Jak łatwo zainstalować Tasmotę - instalator online tasmota.github.io/install przez przeglądarkę WWW
SmartLife switch - test, wnętrze i programowanie włącznika światła na WiFi
ESP8266 i Tasmota - sterowanie przekaźnikiem WiFi krok po kroku
Tu jednak skupię się na układach które również można spotkać w tanich produktach, a mianowicie na:
- BK7231T (WB3S, WB2S, WB2L, itd)
- BK7231N (CB2S, CB2L, WB2L_M1, itd)
- BK7231M, to jest BK7231N z kluczami 00000000, czasem oznaczany jako BL2028
- T34 (T34 bazuje na BK7231N)
- BL2028N (BL2028N to BK7231N produkcji Belon)
- BL602 (SM-028_V1.3 itd), see also BL602 flash OBK via OTA tutorial (Magic Home devices only)
- LF686 (to wersja BL602)
- W800 (W800-C400, WinnerMicro WiFi & Bluetooth), W801
- W600 (WinnerMicro chip), W601 (WIS600, ESP-01W, TW-02, TW-03, itd)
- LN882H od Lightning Semi
- XR809 (XR3, etc)
Wgram na nie wieloplatformy OpenBeken, szczegóły tutaj:
https://github.com/openshwprojects/OpenBK7231T_App
Dokumentacja:
https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/README.md
Przykłady skryptów:
https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/autoexecExamples.md
Lista komend:
https://github.com/openshwprojects/OpenBK7231T_App/blob/main/docs/commands.md
Procedura zmiany firmware w każdym przypadku wymaga konwertera USB na UART:
Korzystam z wersji CH340. Do tego trzeba będzie mieć zewnętrzny zasilacz z LDO 3.3V. Zasilanie z CH340 nie starcza, nie ma takiej wydajności prądowej.
Procedurę flashowania danego układu znajdujemy na jeden z trzech sposobów:
1. przez readme projektu:
https://github.com/openshwprojects/OpenBK7231T_App
Dla BK7231 mamy flasher tutaj:
https://github.com/openshwprojects/BK7231GUIFlashTool
2. przez nasz kanał Youtube, są tam instrukcje dla BK7231, BL602, WX00:
https://www.youtube.com/@elektrodacom
3. przez listę urządzeń (warto zaznaczyć, że chcemy tylko "Detailed entries", czyli szczegółowe opisy)
https://openbekeniot.github.io/webapp/devicesList.html
Podstawowy pomiar energii
Na bazie ponad 650 opisów
urządzeń z naszej listy IoT mogę stwierdzić, że najczęściej spotykane w tego typu produktach są układy BL0942 i BL0937. Zasadnicza różnica między nimi jest taka, że:
- BL0942 korzysta z UART (ten sam port UART co do programowania modułu WiFi), ew. sporadycznie z SPI
- BL0937 korzysta z pinów CF, CF1 i SEL (częstotliwość impulsów wystawiana na dany pin określa moc, napięcie lub prąd)
Dla nas oznacza to tylko jedno:
- w przypadku BL0942 nie trzeba nawet określać pinów, bo wiadomo w 99% przypadków że używany jest UART1
- w przypadku BL0937 trzeba określić, na które piny układu WiFi podłączone jest CF1, CF oraz SEL.
W przypadku urządzeń opartych na BK7231 nasz flasher sam wykryje role pinów:
W przeciwnym razie musimy analizować PCB z multimetrem lub szukać podobnego urządzenia na naszej liście.
W przypadku BL0942, w samym firmware, wpisujemy komendę:
startDriver BL0942
np. w autoexec.bat, a w przypadku BL0937 wystarczy ustawić odpowiednie role pinów. W obu przypadkach warto wykonać reboot. O tym, że dany sterownik się uruchomił przekonamy się z panelu WWW:
Kalibracja pomiaru energii
Kalibracja odbywa się podobnie jak w Tasmocie. Bierzemy miernik energii wyższej klasy, podłączamy obciążenie rezystancyjne w postaci żarówki 60W, mierzymy na niej napięcie, prąd i moc, a potem wpisujemy te wartości w nasz produkt (mając do niego cały czas podłączoną i zapaloną tę żarówkę).
Do wpisania służą komendy:
- VoltageSet 230
- PowerSet 60
- CurrentSet 0.236
Kiedyś trzeba było ręcznie zapisać rezultaty, ale teraz firmware sam już to będzie pamiętać.
Jak nie chcemy pisać komend, to w Web App w zakładce Tools mamy na to formularzyk:
Tak wygląda panel urządzenia po skalibrowaniu:
Sumaryczny pomiar energii oraz jej zużycie z danego dnia (i nie tylko) jest również dostępne.
Wydarzenia i automatyzacje
Sam język skryptowy wspiera również proste automatyzacje. Wszystkie są wykonywane programowo, więc nie zrealizujemy na tym ultraszybkiego bezpiecznika bądź ochrony przed przepięciami, ale możemy np. limitować pobraną moc z urządzenia:
addChangeHandler Power > 50 POWER OFF
Rezultat:
Po kilku sekundach przekaźnik się wyłączył.
Możemy również zrobić sprytniejszy limiter mocy, np. do piwnicy, który załącza z powrotem przekaźnik po krótkim czasie:
addChangeHandler Power > 50 backlog POWER OFF; addRepeatingEvent 2 1 POWER ON
Rezultat:
Wysyłanie pomiarów na serwer HTTP
Firmware jest w stanie też wysłać żądanie GET z zawartymi pomiarami, które możemy skierować na nasz dostępny publicznie bądź lokalnie serwer. Takie argumenty GET można np. przetwarzać w PHP i zapisywać do bazy lub pliku.
Przykładowy skrypt, który zapisuje do data.csv z bieżącym czasem wartości argumentów v, c i p z GET:
Kod: PHP
Można testować to z poziomu przeglądarki:
http://192.168.0.213:8003/meas.php?v=233&c=0.44&p=75
W ramach sprawdzenia można to wywołać też z linii komend OBK. Docelowo ze skryptu:
addRepeatingEvent 60 -1 SendGET http://192.168.0.213:8003/meas.php?v=$voltage&c=$current&p=$power
Przykładowa zawartość pliku:
"2024-12-01 11:00:23",237.288681,0,0
"2024-12-01 11:00:24",238.197128,0,0
"2024-12-01 11:00:25",237.246231,0,0
"2024-12-01 11:00:26",237.433013,0,0
"2024-12-01 11:00:27",237.433013,0,0
"2024-12-01 11:00:28",237.577346,0,0
"2024-12-01 11:00:29",237.577346,0,0
"2024-12-01 11:00:30",237.144348,0,0
"2024-12-01 11:00:31",237.144348,0,0
"2024-12-01 11:00:32",237.144348,0,0
Integracja z Tasmota Control
OpenBeken zapewnia podstawową kompatybilność z formatem JSON Tasmoty, więc aplikacje takie jak Tasmota Control też zadziałają w przypadku takich urządzeń. Wszystko po sieci lokalnej:
Integracja z SSDP
Wieloplatformy sterownik SSDP sprawia, że urządzenia z OpenBeken są widoczne przez przykładowo komputery z systemem Windows:
Tutorial:
Wykresy
Zgodnie z dokumentacją wykresów:
Wykresy w OpenBeken - konfigurowalna historia pomiarów hostowana na urządzeniu IoT
Utworzyłem skrypt autoexec.bat:
startDriver charts
startDriver NTP
waitFor NTPState 1
// chart with max 100 samples, 3 variables and 3 separate vertical axes
// TODO: tune samples count
chart_create 100 3 3
// set variables along with their axes
chart_setVar 0 "Voltage" "axvolt"
chart_setVar 1 "Current" "axcurr"
chart_setVar 2 "Power" "axpower"
// setup axes
// axis_index, name, flags, label
chart_setAxis 0 "axvolt" 0 "Voltage (V)"
chart_setAxis 1 "axcurr" 1 "Current (A)"
chart_setAxis 2 "axpower" 2 "Power (W)"
// every 30 seconds, -1 means infinite repeats
// TODO: tune time here
addRepeatingEvent 30 -1 chart_addNow $voltage $current $power
Przykładowy wykres, widać wahania napięcia oraz moment włączenia żarówki 75 W:
A tu ciekawostka - zgadnijcie w którym momencie włączyłem model Stable Diffusion do generowania obrazów na moim laptopie?
Grupowanie z innymi produktami po LANie bez servera
OpenBeken wspiera Tasmota Device Groups, więc tak zaprogramowane gniazdka można grupować, dzięki czemu włączenie jednego sprawi, że pozostałe włączą się razem z nim, itd. Dla świateł analogicznie, nawet kontrola RGB może być synchronizowana:
Tasmota Device Groups - połączenie OpenBeken (BK7231T/BK7231N) z Tasmotą
Włącznik dopuszkowy kontrolujący inne urządzenia z domu - Tasmota Device Groups
Integracja z Home Assistant
Tak zaprogramowane gniazdko można połączyć łatwo z Home Assistant, a wtedy też wszystkie automatyzacje z HA zyskują nad nim kontrolę. Można wtedy je zintegrować z różnymi innymi ekosystemami.
Możliwość modyfikacji
Po zmianie firmware można łatwo wykorzystać wolne GPIO układu od WiFi - można podłączyć np. czujnik temperatury lub odbiornik IR:
A co z bardziej złożonymi urządzeniami?
Bardziej złożone urządzenia do pomiaru energii, często oferujące też wyświetlacz LCD bądź pomiar kilku faz jednocześnie, zazwyczaj opierają się o TuyaMCU:
Protokół TuyaMCU - komunikacja pomiędzy mikrokontrolerem a modułem WiFi
Przewodnik flashowania:
Przewodnik flashowania, instalacji i konfiguracji TuyaMCU - skonfiguruj dpID dla Home Assistant
Jeden z przykładowych opisów konwersji takiego urządzenia:
Zaawansowany miernik energii/termostat z LCD Atorch S1TW-FR - działanie bez chmury
Podsumowanie
W pokazany tu sposób można przeprogramować większość dostępnych na rynku budżetowych mierników energii opartych o komunikację WiFi. Jeśli szukacie jakiegoś konkretnego modelu (do zakupu bądź informacji o nim) to zapraszam na naszą listę szablonów urządzeń:
https://openbekeniot.github.io/webapp/devicesList.html
Jeśli macie jakiś produkt który jeszcze na tej liście się nie znajduje, to zapraszam do napisania na forum - pomożemy z przeróbką, krok po kroku.
Czy macie jakieś urządzenia IoT którym zmieniliście bądź zamierzacie zmienić firmware?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.