Xiaomi Mi Robot Vacuum - Mop 2 Ultra
Na internet jsem se inspiroval některýma knihovnama, které ukazují, že lze můj robotický vysavač ovládat skrze příkazy v Pythonu. Tak jsem se pustil, co je na tom pravdu s vidinou, že bych nepotřeboval oficiální aplikaci, ale mohl využívat scénáře v Node Red.
Nejprve k samotnému binárnímu protokolu Xiaomi. Dle příspěvku Xiaomi's MiHome Binary protocol to vypadá, že komunikace probíhá skrz protokol UDP na portu 54321. Tady je popsána struktura packetu: Xiaomi Mi Home Binary Protocol
získání šifrovacího tokenu
Pro instalaci robotického vysavače jsem si musel vytvořit účet v aplikaci od Xiaomi. A přihlašovací údaje do aplikace jsou cestou, jak získat šiforvací token. Tady jsou popsány cesty, jak token získat: Obtain Mi Home device token. Cesty jsou sice komplikované, nicméně článek jsem dal pro úplnost, protože může sloužit jako návod, jak protokol odposlouchávat a vyhledat konkrétní příkazy.
Nicméně pak jsem našel jednodušší cestu pro získání tokenu. A byl to projekt python-miio.
Zde je popis instalace:
pip3 install python-miio
Později jsem potřeboval i aktuální verzi z repozitáře, kterou jsem rozběhal ve virtuálním stroji takto:
git clone https://github.com/rytilahti/python-miio.git cd python-miio/ pip3 install poetry poetry install poetry run miiocli --help
K získání tokenu mi pak stačil tento příkaz:
miiocli cloud list
Zadal jsem přihlašovací jméno do účtu Mi Home a heslo a měl jsem jako výstup token a IP adresu, na které mi robot naslouchá.
posílání příkazů na robota
Je hodně typů robotů a potřeboval jsem vědět, jak volat svůj model. Chvíli jsem tápal a zkoušel, jestli je podporovaný, než jsem v kódu našel tohle: https://github.com/rytilahti/python-miio/blob/master/miio/integrations/vacuum/dreame/dreamevacuum_miot.py
Pochopil jsem, že můj model patří do dreamevacuum.
Pro vypsání možných příkazů k použití, které jsou implementovány v modulu dreamevacuum zavolám:
miiocli --output json_pretty dreamevacuum --ip 192.168.1.108 --token sifrovacitoken --help
Pro zjištění přesného modelu robota, který budu potřebovat pro další volání použiju příkaz:
miiocli --output json_pretty dreamevacuum --ip 192.168.1.108 --token sifrovacitoken info
Pro zjištění stavu mého robota poslouží příkaz:
miiocli --output json_pretty dreamevacuum --ip 192.168.1.108 --token sifrovacitoken --model dreame.vacuum.p2150a status
Pro můj model je omezená možnost příkazů, skrze miiocli. Našel jsem ovšem nějaké záhadný příkazy, o kterých jsem dlouho bádal, jak zavolat. V dokumentaci miiocli jsem dohladal v části Controlling MIoT devices příkazy, který by mi mohly vysvětlit fungování.
Podařilo se mi spustit pouze tento:
poetry run miiocli genericmiot --ip 192.168.1.108 --token sifrovacitoken actions
Ale z výstupu jsem nebyl moc moudrý. Očekával jsem, že kromě actions se mi podaří jesště zavolat status, set a call, ale to se mi nepodařilo.
příkazy: raw_command, get_property_by, call_action_by
U těchto funkcí jsem pořád nemohl přijít na funkčnost, až po několika hodinách jsem zkoušením a hledáním ve zdrojovém kódu přišel na odpověď.
Ze zdrojového kódu jsem vyčetl v úvodu že například parametr locate má hodnotu: {„siid“: 7, „aiid“: 1}.
Později jsem vyčetl, že čísla siid a aiiid + vysvětlení jaké funkce volají jsou dokumentaci mého mopu: https://home.miot-spec.com/spec/dreame.vacuum.p2150a
A jak tedy zavolat příkaz?:
miiocli dreamevacuum --ip 192.168.1.108 --token sifrovanytoken --model dreame.vacuum.p2150a raw_command action '{"siid": 7, "aiid": 1}'
To byla akce. Pro čtení zase tento příkaz - vrací mi hodnotu baterie:
miiocli dreamevacuum --ip 192.168.1.108 --token sifrovanytoken --model dreame.vacuum.p2150a raw_command get_properties '[{"siid": 3, "aiid": 1}]'
Ještě by mělo fungovat set_properties na konci a vrátit pole s objektem json, kde bude siid, aiid a typoval bych, že hodnota bude value. To jsem ale nezkoušel.
A pak mě napadlo vyzkoušet i funkce call_action_by a get_property_by a fungovalo to:
miiocli dreamevacuum --ip 192.168.1.108 --token sifrovacitoken --model dreame.vacuum.p2150a call_action_by 7 1 miiocli dreamevacuum --ip 192.168.1.108 --token sifrovacitoken --model dreame.vacuum.p2150a get_property_by 2 1
shrnutí
K dokonalosti mi bohužel schází implementace výběru konkrétní místnosti, kterou chci vysávat. To se mi zatím nepodařilo. Při hledání jsem narazil na projekt, kdy už někdo vytvářel kobminaci Home Assistenta, Noderedu a Xiaomi vysavače: Home API to Control Home Appliance with Hassio, Motion. Pak jsem ale narazil ještě na zajímavější projekt Dreame vacuum integration for Home Assistant u kterého to vypadá, že Home Assistant má kompletní implementaci i pro můj model. Ke zkoušení Home Assistant jsem se ale ještěš nedostal.