Zapraszam na analizę miernika prądu/napięcia/mocy współpracującego normalnie z ekosystemem Tuya. Tutaj przetestuję go z aplikacją producenta, dokonam analizy jego protokołu komunikacji MCU z modułem WiFi, a potem spróbuję zmienić mu wsad na OpenBeken, którego odpowiednio w tym celu skonfiguruję.
Ale najpierw...
Powiązane tematy
To urządzenie opiera się o TuyaMCU, tj. w środku jest osobno moduł WiFi (tutaj na BK7231N) oraz osobno MCU, który komunikuje się z nim przez UART. Nie będę tu omawiać podstaw TuyaMCU, gdyż przytaczałem je już w tych tematach:
Protokół TuyaMCU - komunikacja pomiędzy mikrokontrolerem a modułem WiFi
Analizator TuyaMCU - dekoder pakietów UART dla urządzeń Tuya - dpID detektor
Przewodnik flashowania, instalacji i konfiguracji TuyaMCU - skonfiguruj dpID dla Home Assistant
Polecam zapoznać się z nimi przed lekturą treści poniżej.
Zakup, zawartość zestawu, pierwsze wrażenie
Całość kosztuje około 120 zł, zależy gdzie kupujemy:
Wymiary:
Montaż:
Specyfikacja:
W praktyce otrzymujemy takie pudełeczko:
Zawartość:
Tym razem nie wgrywam od razu firmware, lecz i tak zacznę od zaglądnięcia do środka...
Wnętrze PJ-MGW1103
Zdejmujemy pokrywę:
W środku widać BL0942 służący do pomiaru energii, ale on jest podłączony nie do modułu WiFi, lecz do pobliskiego MCU - tutaj STC 381-TSSOP20 8G1K17.
Oznaczenie PCB:
20221109
PJ-CS01
[] 1203
[] 1103
Rzut oku z wierzchu:
Widać wolne miejsce po przekaźniku, ten produkt nie ma przekaźnika, on tylko wykonuje pomiar.
Moduł WiFi tutaj to CB2S, opiera się on na BK7231N:
Widać tu też wlutowany poprzecznie w główne PCB moduł KP3210SG.
Czyli mamy tutaj przetwornicę nieizolowaną:
Test z aplikacją Tuya
Przechwytywanie komunikacji TuyaMCU jest omówione we wspomnianym na początku osobnym temacie. Cały proces wymaga zachowania dużego stopnia ostrożności, gdyż nie można po prostu podłączyć UART z tego urządzenia do naszego komputera, jest wtedy ryzyko zwarcia. Można natomiast zastosować izolacje galwaniczną dla UART, są do tego dostępne do kupienia różne moduły w sieci.
Proces wymaga dwóch konwerterów USB na UART, gdyż podsłuchujemy i TX->RX i RX->TX (dwie linie), całość polega na wykonywaniu operacji w aplikacji Tuya i podglądaniu co się dzieje.
A więc zaczynamy od parowania:
Dzięki Bluetooth nie trzeba nawet ręcznie parować tak jak w czasach ESP, telefon sam wykrywa nowe urządzenie.
Podajemy dane naszego WiFi, itd:
Parowanie:
Po całości wita nas dość nietypowy i skromny panel. Aż dziwnie tak bez przekaźnika:
Na panelu pokazuje się pomiar mocy, prądu i napięcia:
Ale komunikacji nie muszę tutaj umieszczać, gdyż została ona już przechwycona w powiązanym temacie:
https://www.elektroda.com/rtvforum/topic3946128.html
Wgrywanie OpenBeken
Port UART1 służy i do programowania i do komunikacji z MCU, więc trzeba wylutować moduł WiFi:
Lutujemy zasilanie, RX i TX, zgodnie z instrukcjami naszego flashera:
https://github.com/openshwprojects/BK7231GUIFlashTool
Flasher nie odkryje konfiguracji tego urządzenia, gdyż opiera się ono o TuyaMCU. Musimy napisać autoexec.bat, gdzie zmapujemy dpID z TuyaMCU na kanały OBK. O poszukiwaniu dpID jest mowa w powiązanych tematach, chociaż ja tutaj użyłem tuyaMcu_sendQueryState, a dokładniej to ręcznie wysłałem ten sam pakiet (uartSendHex 55AA0008000007):
Info:MAIN:Time 152, idle 193677/s, free 73136, MQTT 0(9), bWifi 1, secondsWithNoPing 1, socks 2/38
Info:CMD:[WebApp Cmd 'uartSendHex 55AA0008000007' Result] OK
Info:TuyaMCU:TUYAMCU received: 55 AA 03 07 00 08 12 02 00 04 00 00 00 4D 76
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 7 (State) with 15 bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: processing dpId 18, dataType 2-DP_TYPE_VALUE and 4 data bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: raw data 4 int: 77
Info:TuyaMCU:TUYAMCU received: 55 AA 03 07 00 08 13 02 00 04 00 00 00 B1 DB
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 7 (State) with 15 bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: processing dpId 19, dataType 2-DP_TYPE_VALUE and 4 data bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: raw data 4 int: 177
Info:TuyaMCU:TUYAMCU received: 55 AA 03 07 00 08 14 02 00 04 00 00 09 63 97
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 7 (State) with 15 bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: processing dpId 20, dataType 2-DP_TYPE_VALUE and 4 data bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: raw data 4 int: 2403
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Z powyższego logu można wyczytać jakie dpID (identyfikatory danych) wraz z typami i wartościami zostały wysłane do nas przez MCU. Stąd wiem, że dpID 18 ma wartość 77 (pewnie to prąd), dpID 19 177 (moc?) a dpID 20 to 2403 (tu z góry wiadomo, że napięcie). Tylko trzeba dobrać mnożniki i zmapować to na kanały w OBK...
Zatem napisałem skrypt:
startDriver TuyaMCU
tuyaMCU_setBaudRate 115200
tuyaMcu_defWiFiState 4
// request full state from time to time (every 10 seconds, -1 repeats - forever)
addRepeatingEvent 10 -1 uartSendHex 55AA0008000007
// dpID 20 is voltage * 0.1
setChannelType 1 Voltage_div10
linkTuyaMCUOutputToChannel 20 val 1
// dpID 18 is current * 0.001
setChannelType 2 Current_Div1000
linkTuyaMCUOutputToChannel 18 val 2
// dpID 19 is power * 0.1
setChannelType 3 Power_Div10
linkTuyaMCUOutputToChannel 19 val 3
Powyższy skrypt tworzy trzy kanały (moc, prąd i napięcie), mapuje dpID z TuyaMCU na te kanały, dodatkowo wymusza stan WiFi 0x04 (symulujemy podłączenie do chmury) oraz dodatkowo okresowo wysyła zapytanie o odświeżenie stanu aby zapewnić nam najświeższe pomiary.
Rezultat:
UWAGA - bez default WiFi state 0x04 najpierw dioda znajdująca się na urządzeniu była na czerwono, a potem migała, ale urządzenie nie chciało dawać pomiarów. Po ustawieniu default WiFi state na 0x04 ta dioda zgasła i pojawiły się pomiary.
Oto przykładowy log z Web App OpenBeken, pokazuje on też odbierane dpID:
bT obk1FFC6D06/+/set
Info:MQTT:MQTT_RegisterCallback called for bT bekens/ subT bekens/+/set
Info:MQTT:MQTT_RegisterCallback called for bT cmnd/obk1FFC6D06/ subT cmnd/obk1FFC6D06/+
Info:MQTT:MQTT_RegisterCallback called for bT cmnd/bekens/ subT cmnd/bekens/+
Info:MQTT:MQTT_RegisterCallback called for bT obk1FFC6D06/ subT obk1FFC6D06/+/get
Info:CMD:CMD_StartScript: started autoexec.bat at the beginning
Info:MAIN:Main_Init_After_Delay done
Info:MAIN:Started TuyaMCU.
Info:MAIN:Time 1, idle 276756/s, free 78120, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Info:MAIN:Time 2, idle 466680/s, free 78120, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 01 00 2A 7B 22 70 22 3A 22 64 6A 66 65 70 39 73 36 73 33 62 32 71 6B 38 39 22 2C 22 76 22 3A 22 31 2E 30 2E 30 22 2C 22 6D 22 3A 32 7D 63
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 1 (QueryProductInformation) with 49 bytes
Info:TuyaMCU:TuyaMCU_ParseQueryProductInformation: received {"p":"djfep9s6s3b2qk89","v":"1.0.0","m":2}
Info:MAIN:Time 3, idle 186861/s, free 78120, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 02 00 00 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 2 (MCUconf) with 7 bytes
Info:TuyaMCU:TuyaMCU_ProcessIncoming: TUYA_CMD_MCU_CONF, TODO!
Info:MAIN:Time 4, idle 181710/s, free 78120, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 07 00 08 12 02 00 04 00 00 00 4B 74
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 7 (State) with 15 bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: processing dpId 18, dataType 2-DP_TYPE_VALUE and 4 data bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: raw data 4 int: 75
Info:TuyaMCU:TUYAMCU received: 55 AA 03 07 00 08 13 02 00 04 00 00 00 AF D9
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 7 (State) with 15 bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: processing dpId 19, dataType 2-DP_TYPE_VALUE and 4 data bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: raw data 4 int: 175
Info:TuyaMCU:TUYAMCU received: 55 AA 03 07 00 08 14 02 00 04 00 00 09 55 89
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 7 (State) with 15 bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: processing dpId 20, dataType 2-DP_TYPE_VALUE and 4 data bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: raw data 4 int: 2389
Info:MAIN:Time 5, idle 187156/s, free 78120, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:MAIN:ssid:ELEKTRODA_WIFI key:REDACTED
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Info:MAIN:Time 6, idle 161327/s, free 72656, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:MAIN:Boot complete time reached (5 seconds)
Info:CFG:####### Set Boot Complete #######
Info:TuyaMCU:TUYAMCU received: 55 AA 03 03 00 00 05
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 3 (WiFiState) with 7 bytes
Info:MAIN:Time 7, idle 174407/s, free 72656, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 8, idle 87090/s, free 72760, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 9, idle 0/s, free 72760, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Info:MAIN:Time 10, idle 0/s, free 72760, MQTT 0(0), bWifi 0, secondsWithNoPing -1, socks 2/38
Info:GEN:dhcp=0 ip=0.0.0.0 gate=0.0.0.0 mask=0.0.0.0 mac=fc:67:1f:fc:6d:06
Info:GEN:sta: 0, softap: 0, b/g/n
Info:MAIN:Main_OnWiFiStatusChange - WIFI_STA_CONNECTING - 1
Info:MAIN:Main_OnWiFiStatusChange - WIFI_STA_CONNECTED - 4
Info:MAIN:Main_OnWiFiStatusChange - WIFI_STA_CONNECTED - 4
Info:MAIN:Time 11, idle 88454/s, free 73088, MQTT 0(0), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 12, idle 183454/s, free 72912, MQTT 0(0), bWifi 1, secondsWithNoPing -1, socks 3/38
Info:MQTT:mqtt_host empty, not starting mqtt
Info:MAIN:Time 13, idle 192457/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Info:TuyaMCU:TUYAMCU received: 55 AA 03 07 00 08 13 02 00 04 00 00 00 B4 DE
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 7 (State) with 15 bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: processing dpId 19, dataType 2-DP_TYPE_VALUE and 4 data bytes
Info:TuyaMCU:TuyaMCU_ParseStateMessage: raw data 4 int: 180
Info:MAIN:Time 14, idle 190254/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 15, idle 181946/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 16, idle 189477/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 17, idle 189969/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Info:MAIN:Time 18, idle 185606/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 19, idle 187869/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 20, idle 188410/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:GEN:dhcp=0 ip=192.168.0.161 gate=192.168.0.1 mask=255.255.255.0 mac=fc:67:1f:fc:6d:06
Info:GEN:sta: 1, softap: 0, b/g/n
Info:GEN:sta:rssi=-46,ssid=ELEKTRODA_WIFI,bssid=28:87:ba:a0:f5:6d ,channel=3,cipher_type:CCMP
Info:MAIN:Time 21, idle 194897/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Info:MAIN:Time 22, idle 197878/s, free 72912, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 3/38
Info:MAIN:Time 23, idle 188471/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 24, idle 186461/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:MAIN:Time 25, idle 189066/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Info:TuyaMCU:TUYAMCU received: 55 AA 03 00 00 01 01 04
Info:TuyaMCU:TuyaMCU_ProcessIncoming[ver=3]: processing command 0 (Hearbeat) with 8 bytes
Info:MAIN:Time 26, idle 190211/s, free 73128, MQTT 0(1), bWifi 1, secondsWithNoPing -1, socks 2/38
Dodatkowo warto we flagach uruchomić TuyaMCU queue oraz dopisać do autoexec.bat powersave 1.
Podsumowanie
Po zmianie firmware i wgraniu mojego autoexec.bat można już parować te urządzenie z Home Assistant poprzez automatyczne Discovery w OBK. Całość działa już lokalnie, bez chmury.
Urządzenie działa zadowalająco, ale mogłoby chociaż nieco więcej danych pokazywać. Nie znalazłem więcej ciekawych dpID, urządzenie nic więcej nie raportuje.
Można by rozważyć próbę przepięcia BL0942 bezpośrednio do modułu WiFi, MCU w takiej sytuacji trzeba by usunąć. Pozwoliłoby to również dokonać samodzielnej kalibracji już w samym OBK, ale trudno mi nawet określić czy to plus czy minus - fabryczna kalibracja nie jest aż taka zła, chociaż nie wykonywałem w tym konkretnym przypadku żadnych pomiarów porównawczych.
Fajne? Ranking DIY Pomogłem? Kup mi kawę.
