blog.vyoralek.cz

Hackujeme WiFi zásuvky – vlastní firmware bez rozebrání

Dnešní článek bude poněkud více softwarový a ukážeme si jak přeflešovat WiFi zásuvky běžící na tuya cloudu bez nutnosti fyzického rozebrání. Ukážeme si navíc hned dva firmware – Sonoff-Tasmota a ESPHome.

🇬🇧 This article is also available in English on my second blog lovetechstuff.com

Co je tuya-convert?

Michael Steigerwald, zakladatel německého startupu VTRUST díky reverznímu inženýrství vypátral, jak čínská firma tuya provádí vzdálenou aktualizaci firmware na jednotlivých zařízeních – tuya je aktuálně jedním z největších hráčů na poli IoT a dodává své řešení pro více jak 10tisíc výrobců.

Michaela to přivedlo k myšlence použít tento způsob vzdálené aktualizace pro nahrání vlastního firmware mimo cloud – v principu jde o nahrání firmware bez nutnosti zařízení rozebírat.

Tuya-convert je sada python skriptů, jejichž cílem je nasimulovat tuya cloud.

💡Je vhodné upozornit, že tuya-convert není rozhodně uživatelsky vymazlená aplikace a v případě problémů se můžete hodně zapotit 😀. Nicméně výsledek bez nutnosti fyzického rozebrání zařízení stojí za to.

Nyní už tak víme co bude naším cílem a pojďme se podívat na celý postup, který si můžeme rozdělit na části:

  1. Příprava a instalace tuya-convert
  2. Příprava alternativního firmware
  3. Podstrčení alternativního firmware pomocí tuya-convert
  4. Finální ladění

🥁 Mějte na paměti, že při nahrávání může dojít k nečekaným problémům, které může způsobit nefukčnost zařízení kam firmware nahráváte – tzv. zcihlení a bude nutné zařízení fyzicky rozebrat.

🥁V současné chvíli není možné přefleshovat zařízení, které obsahuje originální firmware verze 1.0.5. Před tím než začnete s fleshováním proto neprovádějte spojení s aplikací výrobce – je dost možné, že se v tomto případě aktualizace v pozadí provede.

1. Příprava a instalace tuya-convert

Pro instalaci tuya-convert budeme potřebovat počítač s operačním systémem Linux a ideálně kombinací ethernetu + WiFi popř dvou WiFi zařízení.

Jako ideální se jeví jeden z nejrozšířenějších minipočítačů Raspberry Pi 3B+ (pokud nemáte pak na Alza nebo AliExpress), popř. i starší verze bez plus.

My si návod dnes ozvláštníme a podíváme se na drobně složitější postup v případě použití Armbian OS se základní deskou NanoPi M4 (nedávno jsem sepsal recenzi, k dostání na AliExpressu).

💡Můžete použít minipočítač co už máte např. na HomeAssistant, ale doporučuju v tomhle případě si připravit separátní SD kartu a nainstalovat čistý nový systém jen pro účely tuya-convert.

Instalace operačního systému – Armbian OS

Instalace bude poměrně přímočará a rychlá, jelikož můžeme použít předpřipravených image (obrazů) pro NanoPi M4.


🕹Vsuvka: Použití Ubuntu

Pokud už z jakéhokoliv důvodu potřebujete nebo chcete použít Ubuntu dostanete při spuštění tuya-convert nejspíše následující chybu:

dnsmasq: failed to create listening socket for port 53: Address already in use

Ještě před spuštěním tuya-convert je potřeba zavolat zastavení služby běžící na stejném portu jako potřebný dnsmasq:

sudo systemctl stop systemd-resolved

Já nejprve zkoušel instalaci s Ubuntu, ale doporučuji zvolit tentokráte raději Debian. Vyhnete se tak výše popsanému problému s dnsmasq.

Diskové image jsou k dispozici na webu Armbianu a stáhněte si tedy verzi Armbian Stretch (obsahuje Debian).

Pro nahrání image na SD kartu použijeme jako obvykle aplikaci Etcher.

Po nastartování z SD karty použijeme přihlášení root / 1234 a následně budeme muset heslo změnit dle naší libosti.

Provedeme aktualizaci všech balíčků (apt update && apt upgrade) a zapneme si ssh v utilitě armbian-config.

Instalace tuya-convert repositáře

Tím máme základní systém připravený a můžeme se vrhnout do naklonování tuya-convert repozitáře a spuštění instalace potřebných balíčků:

git clone https://github.com/ct-Open-Source/tuya-convert
cd tuya-convert
./install_prereq.sh

Instalace by měla skončit s následujícími řádky:

Successfully built paho-mqtt pyaes tornado
Installing collected packages: paho-mqtt, pyaes, tornado
Successfully installed paho-mqtt-1.4.0 pyaes-1.6.1 tornado-6.0.2
Ready to start upgrade

🕹Možný problém – ImportError: No module named Crypto.Cipher

Pokud jsem po těchto krocích tuya-convert spustil, tak vše vypadalo vpořádku, ale proces nahrávání nefungoval. Podíval jsem se proto do logů a v nich našel hlášku o chybějící knihovně Crypto.Cipher. Netuším tedy, zda je to potřeba instalovat jen v Armbianu, nicméně pokud byste se s hláškou setkali tak je to možné vyřešit pomocí:

apt-get install python3-dev
pip install pycrypto

Nyní máme tuya-convert připravený a můžeme se vrhnout na přípravu firmware.

2.Příprava alternativního firmware

Možnosti máme už v dnešní době povícero, ale jak už zřejmě pravidelní čtenáři blogu tuší, já se zaměřím na dvě – Sonoff-Tasmota a ESPHome.

Jako produkt pro přeflešování jsem si vybral Blitzwolf BW-SHP2 (k dostání na AliExpress, Banggood), což je tentýž produkt jako Koogeek KLSP1 (AliExpress) a nebo Gosund SP1 .. a zřejmě nějaké další.

Produkty jsou fyzicky vyrobeny v číně firmou tyua a liší se jen drobně na základě požadavků prodejců, kteří je pak dále distribují pod svými značkami.

Velkou výhodou produktu je cena – cca. $13 (300Kč). Zásadní nevýhodou, ale může být německý konektor do zásuvky – rozdíly mezi německou a francouzskou verzí jsem sepsal v článku.

Nicméně postup přípravy firmware i nahrávání přes tyua-convert by měl být velice podobný.

Sonoff-Tasmota

Pro Sonoff-Tasmota není potřeba dělat nějaké speciální přípravy. Výhodou může být, že aktuálně je základní Sonoff-Basic varianta obsažena v tuya-convert a není potřeba tedy nic stahovat. Samotné nastavení pro zmiňované zásuvky si ukážeme v poslední části.

ESPHome

ESPHome má poněkud odlišnou filozofii. Namísto poměrně obecného image je potřeba zkompilovat image specifickou pro náš produkt. Je potřeba se tedy už nyní podívat na konfiguraci.

Na postup instalace ESPHome a základní práci se prosím koukněte do staršího článku.

Nazačátek doporučuji udělat něco podobného jako Sonoff-Basic, tedy úplně základní firmware ještě bez dalších funkcionalit.

Pro zmiňované zásuvky by nám měla stačit následující konfigurace:

esphome:
  name: blitzwolf01
  platform: ESP8266
  board: esp8285

wifi:
  ssid: '<wifi_nazev>'
  password: '<wifi_heslo>'

logger:

web_server:
  port: 80

api:

ota:

Konfiguraci v dashboardu ESPHome zkontrolujeme a pomocí ikonky tří teček dáme kompilaci. Výsledný soubor si pak přeneseme na minipočítač do adresáře files v tuya-convert.

Další funkcionality si přidáme v poslední kapitole.

3. Podstrčení alternativního firmware pomocí tuya-convert

Konečně tady máme kapitolu, kde využijeme tyua-convert naplno.

Aplikaci spustíme pomocí ./start_flash.sh a objeví se nám obrazovka s požadavkem na napsání slova yes a potvrzení Enterem. Jakmile to uděláme tuya-convert nastartuje hned několik služeb:

  • WiFi access point s názvem vtrust-flash
  • Webový server pro HTTP komunikaci
  • MQTT server Mosqutto pro MQTT komunikaci
======================================================
TUYA-CONVERT

https://github.com/ct-Open-Source/tuya-convert
... 
... CAN NOT be held accountable for ANY DAMAGE or LOSS OF FUNCTIONALITY by typing yes + Enter 

yes
======================================================
  Starting AP in a screen
  Stopping any apache web server
  Starting web server in a screen
  Starting Mosquitto in a screen

Nyní je potřeba udělat dva další kroky:

  1. připojit se z jakéhokoliv zařízení podporující WiFi na nově vytvořený AP point s názvem vtrush-flash – ideální je použít mobilní telefon. Heslo do sítě je flashmeifyoucan.
  2. zapojit zařízení, které chcete přefleshovat do zásuvky a inicializovat párovací mód – jelikož zařízení nebylo ještě použito mělo by naskočit v tomto režimu automaticky. Poznáte to to podle rychle blikající modré diody.

Jakmile máte tyto dva body hotové můžete zmáčknout enter a proces se posune do dalšího kroku:

======================================================
Starting pairing procedure in screen
RTNETLINK answers: File exists
~/tuya-convert
Waiting for the upgraded device to appear
If this does not work have a look at the '*.log'-files in the 'scripts' subfolder!

Nyní jste se dostali do nejproblematičtějšího bodu – alespoň u mě to tak bylo. Pro lepší přehled jestli proces pokračuje doporučuju se připojit ještě přes jednu konzoli na minipočítač a spustit si výpis logu:

cd tuya-convert/scripts
tail -f smarthack-wifi.log

Najdete zde veškeré informace o činnosti nově vytvořeného WiFi AP a jakmile se fleshované zařízení objeví v tomto logu máte napůl vyhráno.

Na začátku bude v logu pouze inicializace:

root@nanopim4:tuya-convert/scripts ‹master›# tail -f smarthack-wifi.log
Creating new /etc/dnsmasq.conf...
Writing hostapd config file...
Configuring AP interface...
Applying iptables rules...
Starting DNSMASQ server...
Starting AP on wlan0 in screen terminal...
Configuration file: /etc/hostapd/hostapd.conf
Using interface wlan0 with hwaddr b0:f1:ec:65:xx:xx and ssid "vtrust-flash"
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED

Jakmile se připojíte mobilní telefonem pak by se v logu o tom měla objevit informace:

wlan0: STA f4:31:c3:2b:xx:xx IEEE 802.11: associated
wlan0: AP-STA-CONNECTED f4:31:c3:2b:xx:xx
wlan0: STA f4:31:c3:2b:xx:xx RADIUS: starting accounting session 20CEAEEFCA602DA5
wlan0: STA f4:31:c3:2b:xx:xx WPA: pairwise key handshake completed (RSN)

… a konečně nakonec pokud se připojí i flashované zařízení:

wlan0: STA dc:4f:22:fe:xx:xx IEEE 802.11: associated
wlan0: AP-STA-CONNECTED dc:4f:22:fe:xx:xx

💡Pokud zařízení v logu nevídíte pak se mi osvědčilo vypínat tuya-convert a zapnout znovu. Bohužel kromě Blitzwolf to nebylo vždy napoprvé a moc nerozumím proč.

Po navázání spojení se začne automaticky provádět záloha stávajícího firmware flashovaného zařízení – můžete se tak teoreticky vrátit později zpět na původní firmware. Soubor je uložen do kořenového adresáře tuya-convert.

IoT-device is online with ip 10.42.42.42
Fetching firmware backup
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 1024k  100 1024k    0     0  26642      0  0:00:39  0:00:39 --:--:-- 24706
curl: Saved to filename 'firmware-c49c5e.bin'
======================================================
Getting Info from IoT-device
VTRUST-FLASH 1.1
(c) VTRUST GMBH https://www.vtrust.de/35c3/
READ FLASH: http://10.42.42.42/backup
ChipID: c49c5e
MAC: 60:01:94:C4:xx:xx
BootVersion: 4
BootMode: normal
FlashMode: 1M DOUT @ 40MHz
FlashChipId: 144051
FlashChipRealSize: 1024K
Active Userspace: user2 0x81000

======================================================
Please make sure to note the correct SPI flash mode!
Installing an alternative firmware with the wrong flash mode will leave the ESP unable to boot!

Next steps:
1. To go back to the orginal software
   # curl http://10.42.42.42/undo

2. Be sure the conversion software runs in user2
   # curl http://10.42.42.42/flash2

3. Flash a third party firmware to the device
BE SURE THE FIRMWARE FITS THE DEVICE AND USES THE CORRECT FLASH MODE!
MAXIMUM SIZE IS 512KB
put or link it to ./files/thirdparty.bin
A basic build of Sonoff-Tasmota v6.5.0 is already included in this repository.
   # curl http://10.42.42.42/flash3
Alternatively let the device download and flash a file via HTTP:
   # curl http://10.42.42.42/flashURL?url=http://10.42.42.1/files/thirdparty.bin

Pokud jste se dostali až sem, tak zbývá poslední krok. Tím je nahrání alternativního firmware.

V případě Sonoff-Tasmota v základní konfiguraci Sonoff-Basic zadáme příkaz:

curl http://10.42.42.42/flash3

Pokud chceme rovnou nahrát připravený ESPHome firmware pak změníme symbolický link thirdparty.bin, aby neukazoval na sonoff-basic.bin, ale náš firmware

Proces nahrání pak spustíme příkazem:

curl http://10.42.42.42/flashURL?url=http://10.42.42.1/files/thirdparty.bin

Na obrazovce se zobrazí informace, že firmware bude nahrát a poté bude zařízení automaticky restartováno.

4. Finální ladění

Ukážeme si opět dvě možnosti. První pro Sonoff-Tasmota a druhou pro ESPHome.

Sonoff-Tasmota

Po přeflešování bychom ve webovém rozhraní Tasmoty měli vidět cca. následující úvodní obrazovku:

Pro zapnutí všech funkcionalit, které nám WiFi zásuvka nabízí je potřeba změnit konfiguraci a pro naše zmíněné zásuvky to bude typ Gosund SP1 v23.

Po restartu bychom nově měli vidět i všechny informace týkající se aktuální a denní spotřeby.

ESPHome

U ESPHome bychom po úspěšném přefleshování měli v dashboardu vidět zařízení jako Online.

Zároveň si můžeme ověřit webového rozhraní přímo na zařízení:

Pro přidání podpory funkcionalit zásuvek je potřeba ještě zeditovat konfiguraci a přidat následující řádky:

binary_sensor:
  - platform: gpio
    id: button
    pin:
      number: GPIO3
      inverted: True
    on_press:
      - switch.toggle: fakebutton

switch:
  - platform: template
    name: "Blitzwolf SHP2 Přepínač"
    optimistic: true
    id: fakebutton
    turn_on_action:
    - switch.turn_on: relay
    - light.turn_on: led
    turn_off_action:
    - switch.turn_off: relay
    - light.turn_off: led
  - platform: gpio
    id: relay
    pin: GPIO14

output:
  - platform: esp8266_pwm
    id: pow_blue_led
    pin:
      number: GPIO1
      inverted: True

light:
  - platform: monochromatic
    output: pow_blue_led
    id: led

sensor:
  - platform: wifi_signal
    name: "Blitzwolf SHP2 WiFi Signál"
    update_interval: 60s
  - platform: uptime
    name: "Blitzwolf SHP2 Doba běhu"
  - platform: hlw8012
    sel_pin:
      number: GPIO12
      inverted: True
    cf_pin: GPIO04
    cf1_pin: GPIO05
    current_resistor: "0.0028"
    voltage_divider: "960"
    current:
      name: "Blitzwolf SHP2 Proud"
      unit_of_measurement: A
    voltage:
      name: "Blitzwolf SHP2 Napětí"
      unit_of_measurement: V
    power:
      name: "Blitzwolf SHP2 Příkon"
      unit_of_measurement: W
      id: power
    change_mode_every: 8
    update_interval: 10s
  - platform: total_daily_energy
    name: "Blitzwolf SHP2 Denní spotřeba"
    power_id: power
    unit_of_measurement: W

text_sensor:
  - platform: version
    name: "Blitzwolf SHP2 Verze firmware"

status_led:
  pin: GPIO13

time:
  - platform: sntp
    id: my_time

V logu pak po restartu můžeme vidět jednotlivé parametry:

[16:14:58][C][ota:128]:   Address: blitzwolf01.local:8266
[16:15:02][D][time.sntp:077]: Synchronized time: Wed Mar 27 16:15:30 2019
[16:15:13][D][sensor.hlw8012:084]: Got power=19.6W, voltage=240.4V
[16:15:15][D][api:546]: Client 'Home Assistant 0.90.1 (10.2.1.158)' connected successfully!
[16:15:23][D][sensor.hlw8012:084]: Got power=19.8W, voltage=240.2V

Musím přiznat, že tento článek byl jedním z nejnáročnějších, jelikož nebylo úplně přímočaré najít kombinace, které by fungovaly vzhledem k tomu co jsem měl k dispozici.

Nicméně i přesto a za pomocí tohoto článku byste mohli ušetřit nutnost rozebírat fyzicky zásuvky i vzhledem k tomu, že zrovna tyto zmíně používají poněkud netradiční šroubky s trojúhleníkovým tvarem.

Z nějakého důvodu se mě zajím nepodařilo přefleshovat ani jeden produkt Lonsonho, i přesto že by také měli používat tyua. Doporučuji se jim tedy zatím raději vyhnout.

Pokud máte jakékoliv zkušenosti s tyua-convert budu rád, když se s nimi podělíte v komentářích. Užitečné informace opět jako obvykle přidám rovnou do článku.

2 komentáře

Napsat komentář

Tato stránka používá Akismet k omezení spamu. Podívejte se, jak vaše data z komentářů zpracováváme..

%d blogerům se to líbí: