Bramka zigbee Silvercrest/Livarnolux z Lidla – odblokowanie, integracja z Home Assistantem

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 🙂

Zawartość zestawu

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

nad umiejętnościami lutowania muszę mocno popracować
oznaczenia pinów

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.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *