Lidlin Zigbee-gatewayn vapauttaminen

Lidlin Smart Home tuoteperheen gateway kytkeytyy ainoastaan ja vain Lidlin omaan pilvipalveluun ja Lidl Home -sovellukseen. Siellä voi toki hyvin tehdä kaikennäköistä perusautomaatioita kodin Zigbee-laitteille.

Mutta minulle tämä ei riitä. Ensinnäkin tämäkin ilmainen pilvipalvelu tulee aivan varmasti jonain päivänä ilmoitusasiana poistumaan, ja kaikki sinne rakennettu häviää. Toisekseen en halua, että kodin automaatio on yhtään riippuvainen ulkopuolisesta pilvipalvelusta. Sen on toimittava, kun ulkopuolinen internetyhteys katkaistaan. Kolmanneksi haluan WiFi:llä toimivat Shellyt ja Zigbee-laitteet samaan pilveen. Neljänneksi Lildl-brändi apissa ärsyttää, ja luo mielestäni heti tietyn mielikuvan koko hommasta.

Internetistä löytyy hyvät ohjeet gatewayn hakkerointiin siten, että se saadaan liitettyä Home Assistanttiin, jota ajetaan paikallisesti kotona esimerkiksi Raspberry Pi:ssä tai levypalvelimessa. En siis tässä kirjoituksessa esitä mitään uutta, dokumentoin vain lähinnä itselleni oman kokemukseni suljetun järjestelmän gatewayn muuttamisesta avoimeen järjestelmään.

HW

Kotelo aukeaa ehjänä esimerkiksi terävällä ruuvitaltalla saumaa varovaisesti mutta päättäväisesti raottamalla. Piirilevy on klipseillä kiinni ja lähtee pois kotelosta hellästi ruuvimeisselin avulla.

Tarkoitus on aluksi päästä kiinni laitteen sisäiseen sarjaväylään. Paikka löytyy helposti piirilevyn merkintöjen avulla. Siihen juotetaan piikkirima, johon saadaan sitten kytkettyä sarjaväylä PC:stä USB-serial -sovittimen avulla. Piikkiriman juottamista helpottaa sen teippaaminen kiinni juotoksen ajaksi. Piikkirima juotetaan pinneihin 2-4: 2-GND, 3-TX, 4-RX.

Jotta saadaan yhteys PC:lle, tarvitaan 3.3V USB-serial sovitin. Tehtävään käy esimerkiksi Olimex USB-serial-cable-f. Sovittimen sininen johto on sen GND, vihreä RX ja punainen TX.

Sarjaliikennesovitin laitetaan kiinni PC:n USB-porttiin. Linux-PC:ssä käytän sarjaliikenneohjelmana PuTTYä. Sarjaliikenteen asetukset näkyvät kuvassa. Jos laitteen sarjalinjasta käyttöjärjestelmän puolella on epäselvyyttä (/dev/tty?), löytää sen heti sovittimen kytkemisen jälkeen PC:n USB-porttiin lokista kirjoittamalla dmesg.

Ennen kytkeytymistä gatewayn liittimiin on hyvä testata sarjaliikenteen toimivuus kytkemällä sovittimen TX (punainen johto) ja RX (vihreä johto) yhteen piikkirimalla. Sen mitä näppäimistöltä nyt kirjoitetaan, pitäsi heti saman tien näkyä ikkunassa.

Kuten normaalistikin käyttöjännite gatewaylle kytketään sen omalta teholähteeltään. Sarjaliikennesovittimen GND (sininen) kytketään gatewayn GND:lle (pinni 2). Gatewayn ja sarjaliikennesovittimen sarjaliikenteen RX ja TX kytketään ristiin. Eli vihreä (RX) pinniin 3 (TX) ja punainen (TX) pinniin 4 (RX).

SW

Gatewayn bootin aikana PC:n ESC-nappulaa painelemalla päästään laitteen bootloaderiin. Seuraava tavoite on rootin salasanan selvittäminen.

Tässä kohtaa mennään aivan suoraan Paul Banksin tutkimusten tulosten perusteella tehdyillä ohjeilla eteenpäin. (Salasanan alkuperäisen selvittämisen tarina on kuitenkin suositeltavaa, mielenkiintoista ja opettavaista luettavaa.) Luetaan bootloaderia käskyttämällä flash-muistista ensin KEK ja sitten AUSKEY. Lukusarjat otetaan talteen sarjaliikenneikkunasta kopioimalla.

FLR 80000000 401802 16
DW 80000000 4

FLR 80000000 402002 32
DW 80000000 8

Seuraavaksi ajetaan PC:ssä Paul Banksin python-koodia ja syötetään edellä kerätyt lukusarjat. Koodi antaa rootin salasanan. Tämä salasana ymmärtääkseni palautuu laitteelle aina bootin jälkeen vaikka sen vaihtaisi, joten se nyt vaan pitää laittaa hyvään talteen.

Seuraava tavoite on laittaa gatewayn sshd vastailemaan sen tavanomaiseen porttiin 22 ja poistaa väärällä salasanalla aikaansaatava pitkä viive ennen seuraavaa yritystä.

Laite boottaillaan (reboot). Ethernet-piuhankin voi laittaa kiinni.

Sarjalinjalta mennään vielä kuitenkin sisälle. Nyt ei painella ESC-näppäintä vaan odotellaan. Gateway promptaa ja loggaillaan sisälle roottina käyttäen edellä ratkaistua salasanaa. Jee, tämähän on Linux! Gatewayn MAC-osoite ja lähiverkon dhcpd:n laitteelle antama satunnainen ip-osoite selviävät tietysti käskyllä ifconfig. Lähiverkon dhcp-palvelussa kannattaa konfiguroida tälle kiinteä osoite MAC:in perusteella. Hetken voi tässä vaiheessa uteliaana kuljeskella katsomassa ympäriinsä filesysteemin siältöä ja ajella harmittomia apuohjelmia (käskyjä), mutta sitten pitää palata missioon.

Tiedosto /tuya/ssh_monitor.sh pitää muuttaa. Alkuperäinen otetaan talteen ja mitään tekemätön laitetaan tilalle:

cp /tuya/ssh_monitor.sh /tuya/ssh_monitor.original.sh
echo "#!/bin/sh" >/tuya/ssh_monitor.sh

Bootin jälkeen laitteeseen pitäisi nyt tämän jälkeen päästä sisään ssh:lla sen oletusportista. Jouduin tosin ensin Linux-PC:ssä lisäämään /etc/ssh/ssh_config -tiedoston loppuun rivin “HostKeyAlgorithms +ssh-rsa,ssh-dss”.

Tässä kohdassa laitteen voi tietysti sammuttaa ja pakata koteloonsa. Sarjalinjaa ei enää tarvita seuraavissa toimenpiteissä, nyt gatewaytä voidaan käskytää ssh:lla ethernetin kautta.

Seuraavaksi lopetetaan laitteen yhteys “kotiinsa” ja ladataan sinne tilalle ohjelma, joka yhdistää TCP-portin laitteen radiomodeemin sarjaliikenneporttiin. Aluksi haetaan Linux-PC:lle serialgateway-ohjelma (binary, source). Se ladataan sitten ssh:lla gatewaylle PC:ltä (tarkista IP-osoite):

cat serialgateway.bin | ssh root@192.168.201.15 "cat >/tuya/serialgateway"

Tämän jälkeen käskytellään laite ajelemaan aina käynnistyttyään serialgatewaytä:

cp /tuya/tuya_start.sh /tuya/tuya_start.original.sh
cat >/tuya/tuya_start.sh <<EOF
#!/bin/sh
/tuya/serialgateway &
EOF
chmod 755 /tuya/serialgateway

Ja sitten bootataan (reboot).

Koska Lidlin laitteessa on sisällä kovin vanha ohjelmisto, päivitetään EZSP-firmware versioon 6.7.8.0. Skripti firmware_upgrade.sh ja latausohjelma sx tarvitaan myös. Linux-PC:ssä käskytellään ja annetaan rootin salasana aina skriptin sitä kysyessä (tarkista IP-osoite):

chmod +x ./firmware_upgrade.sh
./firmware_upgrade.sh 192.168.201.15 22 V7 NCP_UHW_MG1B232_678_PA0-PA1-PB11_PA5-PA4.gbl

HA

Home Assistantissa mennään ZHA-integraatioon ja lisätään tämä gateway numeerisella IP-osoitteellaan EZSP-radiolla. Polkuna on tässä tapauksessa socket://192.168.201.15:8888.

Tämän jälkeen gatewaylle voi lisätä Zigbee-laitteita, ja ne näkyvät HA:ssa.

Visits: 2320

2 thoughts on “Lidlin Zigbee-gatewayn vapauttaminen

  1. Saman operaation oon tehnyt omalle Lidl purkille. En tosin ole vielä sitä ottanut käyttöön.

  2. Oli hieman haasteita saada tuo Python-koodi ajettua kun vaati uudemman version cryptography -kirjastosta ja sen asentaminen taasen tuntui olevan mahdotonta. Sain tuon koodin kuitenkin päivitettyä siten että toimii myös vanhemmalla versiolla joka vaatii ‘backend’ argumentin. Vinkit löytyivät täältä: https://stackoverflow.com/a/66492117/11196745
    Eli ensin importoidaan tuo default_backend:

    # get the default backend
    from cryptography.hazmat.backends import default_backend

    Jota sitten käytetään tuolla Cipherin määrittelyssä:

    cipher = Cipher(algorithms.AES(kek), modes.ECB(), default_backend())

Comments are closed.