Como fazer root a um aspirador Xiaomi (V1 ou V2)
Este tutorial pretende explicar os passos necessários para fazer root num aspirador da Xiaomi, tanto a V1 como a V2. Depois de feito o root ao aspirador é possivel expor os mapas que o mesmo gera enquanto está a trabalhar para o Home Assistant.
Antes demais quero deixar o aviso do costume. Estre procedimento implica trocar o firmware de origem do aspirador. Pelo que a garantia do aspirador provavelmente vai á vida.
Ora bem, mãos á obra.
Para fazer o root do aspirador vamos usar as ferramentas fornecidas pelo projecto Dustcloud (https://github.com/dgiese/dustcloud). Numa primeira fase vamos compilar um firmware customizado para o aspirador. Em seguida temos de “enganar” o aspirador a instalar este firmware customizado.
O firmware que vamos compilar não é muito diferente do firmware original da Xiaomi. Apenas acrescenta a nossa chave SSH para que possamos mais tarde entrar no aspirador com acesso root.
No site do Dustcloud tem lá os passos todos de forma mais explicita e detalhada. Na wiki encontram passos para compilar o firmware em macOS, contudo foram reportados alguns problemas pelo que se aconselha a compilar o firmware em Linux. Eu criei uma VM com Ubuntu Server para compilar o firmware.
Compilar o Firmware
Ficam aqui os passos que segui em Linux para compilar o firmware:
- Instalar os pacotes necessários para compilar o firmware:
sudo apt-get install ccrypt git wget
- Criem uma pasta para colocarem os ficheiros necessários
mkdir dustcloud && cd dustcloud
- Façam clone do repositório do duscloud para dentro da pasta
git clone https://github.com/dgiese/dustcloud.git
-
Façam download do firmare mais recente para o vosso aspirador
4a. Para a V1:
https://dustcloud.seemoo.de/public/xiaomi.vacuum.gen1/original/encrypted/
4b. Para a V2:
https://dustcloud.seemoo.de/public/xiaomi.vacuum.gen2/original/
-
Saquem o pacote da lingua inglesa:
wget https://github.com/dgiese/dustcloud/raw/master/devices/xiaomivacuum/original-soundpackages/encrypted/english.pkg
-
Coloquem também na pasta a vossa chave SSH, p.ex:
cp ~/.ssh/id_rsa.pub .
. (Se estão a usar uma VM, podem ter que copiar a vossa chave SSH do vosso host.) -
Corram o script para compilar o firmware:
sudo ./dustcloud/devices/xiaomi.vacuum/firmwarebuilder/imagebuilder.sh -f v11_00xxxx.pkg -k id_rsa.pub -s english.pkg
Uns minutos depois deve aparecer uma pasta output
com o firmware que vamos utilizar.
Actualizar o Aspirador
Depois de compilado o firmware customizado temos de actualizar o aspirador com o mesmo.
Ficam aqui as instruções:
-
Instalem os pacotes necessários para comunicar com o aspirador
1a. Instalem um ambiente python:
sudo apt-get install python3 python3-pip python3-venv python3-dev
1b. Iniciem um ambiente virtual:
python3 -m venv .venv
. .venv/bin/activate
1c. Instalem os pacotes necessários de python.
pip install wheel
pip install python-miio
-
Ponham o aspirador em modo de configuração (Premir Home + Power durante uns segundos)
-
Liguem-se á rede que o aspirador cria, qqer coisa como
roborock-vacuum-XPTO
-
Usem o script do dustcloud para enviar o firmware para o aspirador.
python dustcloud/devices/xiaomi.vacuum/firmwarebuilder/flasher.py -f output/v11_00xxxx.pkg
Este processo pode demorar alguns minutos. Mantenham o PC perto do aspirador para evitarque perca o sinal do mesmo.
Terminado todo este calvário terão acesso root ao aspirador por ssh. Se ainda estiverem ligados á rede do aspiradore basta fazerem ssh root@192.168.8.1
.
Configurar o Aspirador
Tendo acesso SSH ao aspirador podem configura-la para se ligar á vossa rede. Como fariam com a app da Xiaomi.
Liguem a vossa máquina á rede do aspirador e corram o seguinte comando para obter o token de configuração do aspirador:
mirobo --debug discover --handshake true
Com o token digam ao aspirador para se ligar á vossa rede:
mirobo --ip=192.168.8.1 --token=token configure_wifi <Nome da Rede> <Password da Rede>
Quando o aspirador se ligar á vossa rede ele vai mudar de token. Para obter o novo token façam SSH para o aspirador ssh root@192.168.x.y
e corram o seguinte comando:
printf $(cat /mnt/data/miio/device.token) | xxd -p
Devem usar este novo token para configurar o aspirador no Home Assistant.
Instalar o Valetudo
Para extrair os mapas do Aspirador vamos utilizar o Valetudo (https://github.com/Hypfer/Valetudo).
O vale tudo é uma espécia de mini web server que corre no aspirador e expõe uma API sobre agumas funcões do aspirador.
Ficam aqui os passos para instalr o Valetudo no vosso aspirador.
-
Fazer download do binário do Valetudo que está na releases do projecto no GitHub.
-
Copiem o binário para o aspitador, para a pasta
/usr/local/bin/
.
$ scp valetudo root@<IP.ASPIRADOR>:/usr/local/bin/
- Saquem o ficheiro de configuração do Valetudo que está na pasta
deployment
. O ficheirovaletudo.conf
. O ficheiro deve conter o seguinte:
#!upstart
description "Valetudo"
start on filesystem
stop on runlevel [06]
oom score 1000
exec /usr/local/bin/valetudo
respawn
respawn limit 10 90
- Copiem o ficheiro
valetudo.conf
para a pasta/etc/init/valetudo.conf
$ scp valetudo root@<IP.ASPIRADOR>:/etc/init/valetudo.conf
- Arranquem os processos todos. Liguem-se ao aspirador por SSH. Deiam permissões de execução ao binário e arranquem o valetudo como um serviço.
# ssh root@<IP.ASPIRADOR>
# chmod +x /usr/local/bin/valetudo
# service start valetudo
- Num browser tentem abrir o url
http://<IP.ASPIRADOR>
. Se tudo tiver corrido bem, devem ver um interface web com algumas funções do aspirador.
Extrair os Mapas do Aspirador para o Home Assistant
Para além de um interface web o Valetudo expõe uma API REST que podemos usar no Home Assistant para mostrar os mapas.
Eu usei um sensor REST e o componente de camera genérico.
sensor:
- platform: rest
resource: http://<IP.ASPIRADOR>/api/remote/map
name: Vacuum Map
value_template: '{{ value_json.mapsrc }}'
camera:
- platform: generic
name: Vacuum Map
limit_refetch_to_url_change: true
still_image_url: http://<IP.ASPIRADOR>{{ states.sensor.vacuum_map.state | string }}
content_type: image/png
Basta adicionar o componente de camera ao vosso UI e tá feito