====== 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 [[https://github.com/OpenMiHome/mihome-binary-protocol|Xiaomi's MiHome Binary protocol]] to vypadá, že komunikace probíhá skrz protokol **UDP** na portu **54321**. Tady je popsána struktura packetu: [[https://github.com/OpenMiHome/mihome-binary-protocol/blob/master/doc/PROTOCOL.md|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: [[https://github.com/Maxmudjon/com.xiaomi-miio/blob/master/docs/obtain_token.md|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 [[https://github.com/rytilahti/python-miio|python-miio]]. Zde je [[https://python-miio.readthedocs.io/en/latest/discovery.html#installation|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 [[https://github.com/rytilahti/python-miio|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 [[https://github.com/rytilahti/python-miio/blob/master/miio/integrations/vacuum/dreame/dreamevacuum_miot.py|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: [[https://github.com/victorwads/mi-home-api|Home API to Control Home Appliance with Hassio, Motion]]. Pak jsem ale narazil ještě na zajímavější projekt [[https://github.com/Tasshack/dreame-vacuum|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.