Znowu wpis o smarthome, ale lubię tę tematykę. Tym razem na warsztat trafiła bramka zigbee z Lidla – model Silvercrest/Livarnolux, dostępny w zestawie z trzema żarówkami i pilotem w cenie około 150zł.
Do odblokowania bramki i odpięcia jej od chmury Tuya potrzebujemy:
– komputera z windowsem/linuksem (ja musiałem użyć obu, ale o tym później), z zainstalowanym pythonem 3.x oraz terminalem umożliwiającym połączenia ssh/serialport (ja używałem putty oraz screen(
– konwertera USB-TTL (użyłem CP2102)
– lutownicy, goldpinów (dla estetyki 6×1, ale wystarczą 3), podstawowych umiejętności lutowania
– podstawowej znajomości linuksa, braku lęku przed terminalem (o tym też później)
Odblokowując bramkę, kierowałem się wiedzą zapisaną we wpisie na paulbanks.org i często będę się do niego odnosił. Sam wpis streszcza moją dwudniową, zakończoną sukcesem walkę z odblokowaniem tej bramki 🙂
Zestaw zawiera trzy 'zarówki’, pilot i bramkę. Obecnie interesowała nas będzie jedynie bramka.
Bramkę wpierw należy rozebrać. Obudowa jest spięta na ośmiu zatrzaskach
W końcu udało się otworzyć, jak widać – dość brutalnie. Po otwarciu w miejscu do tego przeznaczonym musimy przylutować goldpiny
Po przylutowaniu goldpinów, podpinamy trzy przewody konwertera usb-ttl do urządzenia – GND do GND, TX do RX i RX do TX. Nie podpinamy VCC (nie weryfikowałem, czemu – autor oryginalnego wpisu tak rozkazał 😉 )
Przystępujemy do uzyskiwania uprawnień roota na urządzeniu.
Pierwszym etapem będzie odczytanie hasła roota z pamięci urządzenia.
Po podpięciu konwertera łączymy się z naszym serialportem w naszym ulubionym terminalu (baud 38400, 8N1), restartujemy szybko urządzenie i przerywamy ładowanie bootloadera wciskając ESC. Jeśli nam się uda, wpierw pojawi się komunikat ---Escape booting by user
a następnie terminal z napisem <RealTek>
W tym miejscu zaczyna się ta kłopotliwa część mojej przygody, ta – która dostarczyła mi sporo frustracji. W pierwszej chwili myślałem, że problem jest spowodowany uszkodzeniem mojego konwertera USB-TTL (CP2102), więc kupiłem drugi (PL2303), ale na nim problem pojawiał się jeszcze bardziej, mianowicie z poziomu windowsowego putty nie byłem w stanie zatrzymać bootloadera, natomiast z poziomu linuksa bootloader wprawdzie się zatrzymywał, natomiast próba wpisywania poleceń kończyła się wyświetlaniem 'krzaków’
Nie miałem czasu ni chęci, by dochodzić przyczyny problemu, znalazłem natomiast obejście – bootloadera zatrzymałem na linuksie, przepiąłem szybko konwerter i wywoływałem polecenia z poziomu putty na windowsie. Grunt to nie zrestartować urządzenia w trakcie przepinania. Z perspektywy czasu przypuszczam, że przyczyną problemu mogły być moje dyskusyjnej jakości luty, które powodowały błędy w połączeniu.
Dalej było z górki – wywołujemy następujące polecenie
FLR 80000000 401802 16
Następnie zatwierdzamy wciskając y i wywołujemy kolejne:
DW 80000000 4
Pierwsze z poleceń odczytuje zawartość określonego obszaru pamięci flash, drugie ten odczyt pokazuje – w postaci następującej:
Zapisujemy sobie te wartości – będą nam potrzebne w późniejszym etapie działań. Jest to key-encryption-key (w skrócie KEK)
Następnie wywołujemy dwa kolejne polecenia:
FLR 80000000 402002 32
DW 80000000 8
Tym razem pojawią się nam dwie linijki, wartości te to AUSKEY, również je zapisujemy
Następnie z githuba Paula pobieramy skrypt lidl_auskey_decode.py, uruchamiamy go i wpisujemy uprzednio odczytane wartości. U mnie program wymagał doinstalowania biblioteki Crypto, którą pobrałem poleceniem
pip install pyCrypto
Tak, tu wskoczyłem ponownie na komputer z linuksem. Po 'przemieleniu’ otrzymanych danych, skrypt zwróci nam hasło do użytkownika root, możemy przejść do kolejnego etapu – odpinania urządzenia od chmury Tuya
Zmiana konfiguracji bramki
W tej części operacje są przeprowadzane na komputerze z linuksem.
Wpierw ze strony autora procedury pobieramy odblokowaną aplikację do bramki. Sprawdzamy adres IP naszej bramki (w poniższym przykładzie jest to 192.168.1.254)
następnie (podmieniając adres w poniższym przykładzie na nasz) w terminalu wykonujemy następujące komendy
cat serialgateway.bin | ssh -p2333 root@192.168.1.254 "cat >/tuya/serialgateway"
Polecenie cat wyśwetla zawartość pliku binarnego, ssh z parametrem -p łączy się po ssh na porcie 2333 (domyślny w bramce lidla) z użytkownikiem root i wykonuje polecenie z „” – w tym wypadku nadpisanie danymi wejściowymi programu /tuya/serialgateway. Po wywołaniu tego polecenia prawdopodobnie zostaniemy poproszeni o podanie hasła użytkownika root (które było wynikiem poprzedniego etapu prac)
W ten dość niecodzienny sposób przesyłamy nasz plik binarny do urządzenia poprzez protokół ssh
Po zalogowaniu się na urządzenie możemy zmienić hasło użytkownika root na przystępniejsze korzystając z polecenia
passwd
Następnie wyłączymy aplikacje tuya z autostartu, w tym celu wywołujemy następujące polecenia:
if [ ! -f /tuya/tuya_start.original.sh ]; then cp /tuya/tuya_start.sh /tuya/tuya_start.original.sh; fi
cat >/tuya/tuya_start.sh <<EOF
#!/bin/sh
/tuya/serialgateway &
EOF
chmod 755 /tuya/serialgateway
Pierwsze blok poleceń zrobi kopię zapasową oryginalnego skryptu startującego aplikacje (na wypadek, gdybyśmy chcieli przywrócić urządzeniu oryginalną funkcjonalność), drugi nadpisze plik autostartu prostym autostartem nowego programu* od bramki a trzecie polecenie zmieni uprawnienia dostępu do programu
[*]u mnie ten autostart nie zadziałał, ale o tym później
Opcjonalnym krokiem jest zmiana portu nasłuchu usługi ssh z dość nietypowego 2333 na standardowy 22. W tym celu wywołujemy następujące polecenie:
if [ ! -f /tuya/ssh_monitor.original.sh ]; then cp /tuya/ssh_monitor.sh /tuya/ssh_monitor.original.sh; fi
echo "#!/bin/sh" >/tuya/ssh_monitor.sh
Pierwsze polecenie tradycyjnie zrobi kopię oryginalnego pliku, drugie nadpisze zmiany wprowadzane przez skrypt ssh_monitor.sh
Integracja z Home Assistantem
Włączamy naszego Home Assistanta, wybieramy zakładkę Configuration > Integrations, klikamy przycisk + i wyszukujemy zha
W następnym menu wybieramy Enter Manually
Z opcji wyboru wybieramy EZSP
I w kolejnym punkcie podajemy adres ip w formie socket://ip.address:8888
Nie zadziałało? Spokojnie, u mnie również. W tym miejscu kończyła się oryginalna instrukcja, więc odpowiedzi na pytanie 'czemu nie chce ruszyć’ szukałem na własną rękę.
Przyczyna problemów z dodaniem integracji okazała się banalna – program serialgateway, pomimo nadpisania tuya_start.sh, nie startował automatycznie. Po przetrząśnięciu urządzenia nie znalazłem jednoznacznej odpowiedzi na pytanie 'czemu tak się dzieje?’ Znalazłem jednak metodę obejścia – dodanie startu programu do innego skryptu, który wykonuje się w autostarcie bez problemów.
Padło na /tuya/tuya_net_start.sh… tylko czym to zedytować? nie ma nano, nie ma mcedit, o graficznych edytorach tekstu nawet nie wspominając… ale jest ukochane vi.
Szybki kurs korzystania z vi:
wpierw otwieramy plik poleceniem
vi /tuya/tuya_net_start.sh
przechodzimy kursorem do linijki którą chcemy zedytować (w moim przypadku postanowiłem umieścić moją linijkę nad linijką ssh_monitor.sh
Następnie wciskamy przycisk i, by włączyć tryb edycji i dopisujemy linijkę /tuya/serialgateway &
Wciskamy Esc, by opuścić tryb edycji a następnie wpisujemy :wq, by zapisać zmiany i zamknąć plik
Restartujemy urządzenie. Działanie programu możemy sprawdzić poleceniem:
ps -aux | grep serial
Jeśli wszystko dobrze poszło, program powinien startować wraz ze startem urządzenia oraz nasłuchiwać na porcie 8888, więc ostatni krok instalacji integracji powinien się zakończyć pomyślnie.