Dzisiaj zapraszam na krótką analizę wnętrza dość drogiego produktu -pokojowego termostatu z przyciskami dotykowymi i wyświetlaczem LED temperatury, oferującego również sterowanie przez WiFi. Produkt ten występuje w sklepach pod nazwą modelu KHY609 bądź HY609-WE, dostępny jest w dwóch kolorach (biały i czarny) oraz w sprzedaży jest również wariant z komunikacją Zigbee. Tutaj jednak skupię się na jego wersji z WiFi, krótko przetestuję go w aplikacji Tuya a potem przeanalizuję jego wnętrze, z uwzględnieniem szczegółów użytego w środku protokołu TuyaMCU. Pokażę tu przykładowe pakiety które wymienia on po UART oraz określę role użytych dpID, czyli zmiennych TuyaMCU.
Zakup HY609-WE i zawartość zestawu
Termostaty z tej serii montował u siebie w domu jeden z moich znajomych, a ja dostałem tymczasowo jedną sztukę tylko na kilka dni do testów i zabawy. Sam termostat można kupić w różnych miejscach w sieci, zarówno w naszym kraju, jak i bezpośrednio z Chin:
Produkt jest dość drogi, 160 zł za wersję WiFi, a wersje Zigbee widziałem nawet o sto złotych droższe. Zobaczmy, co napisał o nich sam sprzedawca:
Nie zachwalałbym tak chmury Tuya, jeśli uda się zmienić firmware to zyskamy jeszcze więcej możliwości, ale to w innym temacie.
Możliwość podłączenia zewnętrznego NTC10K to zawsze dobra opcja.
Oferowane możliwości, czyli to, co można ustawić w aplikacji Tuya:
No i specyfikacja:
Tyle teorii, zobaczmy teraz jak to wygląda w praktyce. Oznaczenia na opakowaniu:
Zawartość (termostat, śruby montażowe, instrukcja):
Instrukcja (nie będę jej przepisywać do tematu, w razie czego proszę powiększyć zdjęcie):
Tryb ręczny, tryb automatyczny... opcje zaawansowane, tryb wakacyjny... trochę tych możliwości jest. Chyba trzeba tą instrukcje zachować w widocznym miejscu w mieszkaniu.
No i sam termostat:
Aplikacja Tuya
Z reguły nie opisuję już aplikacji Tuya, bo i tak zamierzam odcinać te urządzenia od chmury i zmieniać im firmware, ale tu urządzenie było na tyle nietypowy, że jednak się zdecydowałem na krótki test z tym, co zaoferował nam producent.
Wprowadzamy urządzenie w stan parowania i podajemy namiary na nasze WiFi, wszystko bez problemów, szczegóły w instrukcji:
Główny panel urządzenia pozwala nam podejrzeć bieżącą temperaturę (tutaj z czujnika wbudowanego), tą nastawioną, oraz jego stan pracy:
Można wybrać jeden z trzech trybów pracy, była już o nich mowa w manualu:
- automatyczny (wedle ustalonych przez nas harmonogramów)
- ręczny
- holiday (wakacyjny, termostat całkiem wyłączony)
Dopiero w ustawieniach robi się bardziej skomplikowanie:
Tu operacje trzeba zatwierdzać tym hasłem, które podał też sprzedawca. Przy każdej zmianie trzeba wpisywać hasło. To bardzo niewygodne...
Tak wygląda przykładowo kalibracja temperatury:
Tak wybór programu (te 5+2, 6+1, 7 days, itd. odnosi się do dni tygodnia, jak ktoś pracuje np. w dni robocze, to można inaczej dla nich zaprogramować termostat):
Dalsza część ustawień - są nawet powiadomienia o tym, że dane urządzenie staje się offline:
Wersje firmware, które zdradzają nam fakt, że w środku jest osobno moduł WiFi i TuyaMCU:
Wnętrze termostatu
Zdejmijmy przednią pokrywę by zobaczyć jak zbudowany jest termostat.
W środku jest moduł WBR3, mój OpenBeken jeszcze go oficjalnie nie wspiera, ale trwają nad tym prace.
Oznaczenie PCB: CAT-HY609MB_WE2_V12_NTWIT V4.0_20220808
2022 08 08 to chyba data projektu, a produkcja to (wg. naklejki obok) 2023 02 18:
W bloku zasilania 3.3V dla modułu WiFi i MCU widzę, że jest zarówno przetwornica step down, jak i AMS1117-3.3V:
Widzę też coś, co wygląda mi na superkondensator do podtrzymania czasu:
Pojemność 0.33F, napięcie 5.5V:
Widoczny też HT1381A to zegar RTC:
Główny MCU, drugi oscylator zegarkowy:
Czujnik temperatury (ten wbudowany):
Pod kątem zmiany firmware to mniej ważne, ale obejrzyjmy też płytkę od zasilania:
Oznaczenie PCB zasilania: HY08PW-WE-V220-1R 20200722 V1.3
Tu raczej standardowo. Jest widoczny bezpiecznik i warystor. Nie widzę dodatkowych filtrów.
Czytelność wyświetlacza
Wyświetlacz jest nieco czytelniejszy, niż mogłoby się to wydawać ale i tak zostało tu trochę pole do popisu. Poniżej fotki ode mnie ze stołu, może na ścianie to lepiej wygląda:
Szczegóły użytego protokołu TuyaMCU
Jak już wspominałem, to urządzenie składa się z modułu WiFi i z mikrokontrolera, moduł WiFi zajmuje się komunikacją z chmurą a MCU przejmuje pozostałe obowiązki.
Samą ideę tego protokołu opisywałem w tym temacie:
Protokół TuyaMCU - komunikacja pomiędzy mikrokontrolerem a modułem WiFi
Sam protokół na różnych urządzeniach jest taki sam, ale różni się zawartość i role zmiennych, tzw. dpID.
Aby je poznać, dokonałem przechwytywania UART moim analizatorem:
https://github.com/openshwprojects/TuyaMCUAnalyzer
Analizator TuyaMCU - dekoder pakietów UART dla urządzeń Tuya - dpID detektor
Oto kilka ciekawszych przechwyconych pakietów wraz z ich intepretacjami.
Moment parowania:
Received packet:
55 AA 03 00 00 01 01 04
HEADER VER=03 Heartbeat LEN 01 CHK
Received packet:
55 AA 03 07 00 05 01 01 00 01 00 11
HEADER VER=03 State LEN fnId=1 Bool V=0 CHK
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000096 AF
HEADER VER=03 State LEN fnId=2 Val V=150 CHK
Received packet:
55 AA 03 07 00 08 03 02 00 04 000000F5 0F
HEADER VER=03 State LEN fnId=3 Val V=245 CHK
Received packet:
55 AA 03 07 00 05 04 04 00 01 01 18
HEADER VER=03 State LEN fnId=4 Enum V=1 CHK
Received packet:
55 AA 03 07 00 05 06 01 00 01 00 16
HEADER VER=03 State LEN fnId=6 Bool V=0 CHK
Received packet:
55 AA 03 07 00 05 0C 05 00 01 00 20
HEADER VER=03 State LEN fnId=12 Bitmap V=0 CHK
Received packet:
55 AA 03 07 00 05 65 01 00 01 00 75
HEADER VER=03 State LEN fnId=101 Bool V=0 CHK
Received packet:
55 AA 03 07 00 05 66 01 00 01 00 76
HEADER VER=03 State LEN fnId=102 Bool V=0 CHK
Received packet:
55 AA 03 07 00 08 67 02 00 04 00000000 7E
HEADER VER=03 State LEN fnId=103 Val V=0 CHK
Received packet:
55 AA 03 07 00 08 68 02 00 04 00000001 80
HEADER VER=03 State LEN fnId=104 Val V=1 CHK
Received packet:
55 AA 03 07 00 08 69 02 00 04 0000000F 8F
HEADER VER=03 State LEN fnId=105 Val V=15 CHK
Received packet:
55 AA 03 07 00 05 6A 01 00 01 01 7B
HEADER VER=03 State LEN fnId=106 Bool V=1 CHK
Received packet:
55 AA 03 07 00 05 6B 01 00 01 01 7C
HEADER VER=03 State LEN fnId=107 Bool V=1 CHK
Received packet:
55 AA 03 07 00 05 6C 01 00 01 00 7C
HEADER VER=03 State LEN fnId=108 Bool V=0 CHK
Received packet:
55 AA 03 07 00 08 6D 02 00 04 FFFFFFF6 77
HEADER VER=03 State LEN fnId=109 Val V=-10 CHK
Received packet:
55 AA 03 07 00 08 6E 02 00 04 0000000A 8F
HEADER VER=03 State LEN fnId=110 Val V=10 CHK
Received packet:
55 AA 03 07 00 08 6F 02 00 04 00000002 88
HEADER VER=03 State LEN fnId=111 Val V=2 CHK
Received packet:
55 AA 03 07 00 08 70 02 00 04 0000002D B4
HEADER VER=03 State LEN fnId=112 Val V=45 CHK
Received packet:
55 AA 03 07 00 08 71 02 00 04 00000005 8D
HEADER VER=03 State LEN fnId=113 Val V=5 CHK
Received packet:
55 AA 03 07 00 08 72 02 00 04 00000023 AC
HEADER VER=03 State LEN fnId=114 Val V=35 CHK
Received packet:
55 AA 03 07 00 08 73 02 00 04 00000005 8F
HEADER VER=03 State LEN fnId=115 Val V=5 CHK
Received packet:
55 AA 03 07 00 05 74 04 00 01 00 87
HEADER VER=03 State LEN fnId=116 Enum V=0 CHK
Received packet:
55 AA 03 07 00 05 75 04 00 01 00 88
HEADER VER=03 State LEN fnId=117 Enum V=0 CHK
Received packet:
55 AA 03 07 00 05 76 04 00 01 00 89
HEADER VER=03 State LEN fnId=118 Enum V=0 CHK
Received packet:
55 AA 03 07 00 0D 77 00 00 09 06001408000F0B1E0F FF
HEADER VER=03 State LEN fnId=119 Raw V=06 00 14 08 00 0F 0B 1E 0F CHK
Received packet:
55 AA 03 07 00 0D 78 00 00 09 0D1E0F91000F16000F 96
HEADER VER=03 State LEN fnId=120 Raw V=0D 1E 0F 91 00 0F 16 00 0F CHK
Received packet:
55 AA 03 07 00 0D 79 00 00 09 06001408000F0B1E0F 01
HEADER VER=03 State LEN fnId=121 Raw V=06 00 14 08 00 0F 0B 1E 0F CHK
Received packet:
55 AA 03 07 00 0D 7A 00 00 09 0D1E0F11000F16000F 18
HEADER VER=03 State LEN fnId=122 Raw V=0D 1E 0F 11 00 0F 16 00 0F CHK
Received packet:
55 AA 03 00 00 01 01 04
HEADER VER=03 Heartbeat LEN 01 CHK Zmiana temp calibration na 2:
Received packet:
55 AA 03 07 00 08 03 02 00 04 00000113 2E
HEADER VER=03 State LEN fnId=3 Val V=275 CHK
Received packet:
55 AA 03 07 00 08 67 02 00 04 00000000 7E
HEADER VER=03 State LEN fnId=103 Val V=0 CHK
Received packet:
55 AA 03 07 00 08 6D 02 00 04 00000014 98
HEADER VER=03 State LEN fnId=109 Val V=20 CHK
Zmiana temp calibration na 3:
Received packet:
55 AA 03 07 00 08 03 02 00 04 0000011D 38
HEADER VER=03 State LEN fnId=3 Val V=285 CHK
Received packet:
55 AA 03 07 00 08 67 02 00 04 00000000 7E
HEADER VER=03 State LEN fnId=103 Val V=0 CHK
Received packet:
55 AA 03 07 00 08 6D 02 00 04 0000001E A2
HEADER VER=03 State LEN fnId=109 Val V=30 CHK Na głównym menu - ustawianie 14.5 temp:
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000091 AA
HEADER VER=03 State LEN fnId=2 Val V=145 CHK
Received packet:
55 AA 03 07 00 05 04 04 00 01 03 1A
HEADER VER=03 State LEN fnId=4 Enum V=3 CHK
Received packet:
55 AA 03 00 00 01 01 04
HEADER VER=03 Heartbeat LEN 01 CHK Na głównym menu - ustawianie 30.5 temp:
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000131 4B
HEADER VER=03 State LEN fnId=2 Val V=305 CHK
Received packet:
55 AA 03 07 00 05 04 04 00 01 03 1A
HEADER VER=03 State LEN fnId=4 Enum V=3 CHK Po chwili pojawia sie ikonka ognia - włącza się grzanie:
Received packet:
55 AA 03 07 00 05 66 01 00 01 01 77
HEADER VER=03 State LEN fnId=102 Bool V=1 CHK
Zmiana power na aplikacji (on off):
Received packet:
55 AA 03 07 00 05 01 01 00 01 00 11
HEADER VER=03 State LEN fnId=1 Bool V=0 CHK
Received packet:
55 AA 03 07 00 05 01 01 00 01 01 12
HEADER VER=03 State LEN fnId=1 Bool V=1 CHK
Received packet:
55 AA 03 07 00 05 01 01 00 01 00 11
HEADER VER=03 State LEN fnId=1 Bool V=0 CHK
Received packet:
55 AA 03 07 00 05 01 01 00 01 01 12
HEADER VER=03 State LEN fnId=1 Bool V=1 CHKZmiana HighTem Protection na 44:
Received packet:
55 AA 03 07 00 08 70 02 00 04 0000002C B3
HEADER VER=03 State LEN fnId=112 Val V=44 CHK
Zmiana LowTemp protection na 6:
55 AA 03 07 00 08 71 02 00 04 00000006 8E
HEADER VER=03 State LEN fnId=113 Val V=6 CHK Zmiana device power on state na Keep previous state:
55 AA 03 07 00 05 75 04 00 01 00 88
HEADER VER=03 State LEN fnId=117 Enum V=0 CHK
Zmiana program type na 6+1:
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000032 4B
HEADER VER=03 State LEN fnId=2 Val V=50 CHK
Received packet:
55 AA 03 07 00 05 76 04 00 01 01 8A
HEADER VER=03 State LEN fnId=118 Enum V=1 CHK Zmiana program type na 5+2
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000032 4B
HEADER VER=03 State LEN fnId=2 Val V=50 CHK
Received packet:
55 AA 03 07 00 05 76 04 00 01 00 89
HEADER VER=03 State LEN fnId=118 Enum V=0 CHK Zmiana program type na 7:
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000032 4B
HEADER VER=03 State LEN fnId=2 Val V=50 CHK
Received packet:
55 AA 03 07 00 05 76 04 00 01 02 8B
HEADER VER=03 State LEN fnId=118 Enum V=2 CHK Zmiana indoor temperature difference na 1.5:
Received packet:
55 AA 03 07 00 08 6E 02 00 04 0000000F 94
HEADER VER=03 State LEN fnId=110 Val V=15 CHK Zmiana mode na manual:
55 AA 03 07 00 08 02 02 00 04 000000FA 13
HEADER VER=03 State LEN fnId=2 Val V=250 CHK
Received packet:
55 AA 03 07 00 05 04 04 00 01 00 17
HEADER VER=03 State LEN fnId=4 Enum V=0 CHK Zmiana mode na Program:
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000096 AF
HEADER VER=03 State LEN fnId=2 Val V=150 CHK
Received packet:
55 AA 03 07 00 05 04 04 00 01 01 18
HEADER VER=03 State LEN fnId=4 Enum V=1 CHK Zmiana mode na Holiday:
Received packet:
55 AA 03 07 00 08 02 02 00 04 00000096 AF
HEADER VER=03 State LEN fnId=2 Val V=150 CHK
Received packet:
55 AA 03 07 00 05 04 04 00 01 02 19
HEADER VER=03 State LEN fnId=4 Enum V=2 CHK
Na bazie tego można określić jakie dpID ma jaka zmienna oraz w jakim formacie jest zapisana (np. temperatura jest zapisywana jako liczba całkowita którą trzeba przemnożyć przez 0.1 by otrzymać wynik, czyli np. 255 to 25.5°C.
Samą zmianą firmware zajmę się dopiero w przyszłości.
Podsumowanie
Bardzo ciekawy produkt, chociaż kilka rzeczy nie przypadło mi do gustu. Te wpisywanie hasła z każdą zmianą konfiguracji nie jest wygodne. Wyświetlacz mógłby być czytelniejszy, troszkę mi brakuje kontrastu, chyba kolor zielony lub czerwony bardziej by pasował. No i to urządzenie w takiej formie jest połączone z chmurą, dopiero potem zajmiemy się potencjalną zmianą wsadu, chociaż grunt pod to już przygotowałem poprzez przechwycenie pakietów TuyaMCU.
Mimo wszystko, można tu pochwalić producenta za kilka rzeczy. Superkondensator 0.55F 5.5V w środku to z pewnością plus, bo w razie zaniku zasilania godzina na pewno się nie zgubi. Ciekawe, czy też ten termostat będzie pamiętać o swoim programie gdy tymczasowo nie będzie dostępu do internetu. Innym plusem może być możliwość podłączenia zewnętrznego czujnika, co też jest całkiem opcjonalne, bo wbudowany czujnik temperatury też jest dostępny. Też spodobało mi się to, że w zasadzie troszkę tych opcji jest. Chociażby ta ręczna kalibracja to miły dodatek.
Nie testowałem natomiast tego termostatu w ujęciu długoterminowym, dlatego zapytam - czy ktoś ma tego typu produkty zamontowane w domu? Jak się one sprawdzają, czy działają bezawaryjnie?
Fajne? Ranking DIY Pomogłem? Kup mi kawę.
