it:iot:xiaomi-mi-robot-vacuum-mop-2-ultra

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

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á.

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.

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

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.

  • it/iot/xiaomi-mi-robot-vacuum-mop-2-ultra.txt
  • Poslední úprava: 2023/01/17 23:47
  • autor: Petr Nosek