Xiaomi Gateway 2 ne peut pas être soudé



Salut Habr! Dans les séries précédentes, j'ai:

  • J'ai acheté des appareils de Xiaomi pour une maison intelligente et grâce à un fer à souder, je les ai fait fonctionner de manière passionnante sans serveurs natifs via l'assistant domestique ( lien vers l'article )
  • J'ai enveloppé l'interface Web de l'assistant à domicile dans électron ( lien vers le message ) avec le support pour les notifications, les menus, la barre de points, etc. ( code ici )

Mais comme de plus en plus d'appareils sont apparus, une chose étrange a commencé à s'ouvrir ...

Par exemple, le relais sans fil Aqara 2ch (LLKZMK11LM) ne prend pas en charge l'intégration xiaomi_aqara, et lorsque les problèmes ont été ouverts sur GitHub, les propriétaires du code ont répondu qu'il était impossible de prendre en charge ce relais sans mettre à jour le micrologiciel de l'appareil. «Quelque chose ne va pas ici», ai-je pensé, et je suis allé comprendre le code, comment il s'est produit. Et donc je me suis laissé emporter par le fait que j'ai d'abord échoué l'intégration pour travailler avec le relais via xiaomi_miio ( lien ), puis j'ai implémenté la prise en charge du cube et du bouton Xiaomi pour cette intégration ( lien ), et maintenant je vais vous dire pourquoi et comment.

API développeur


Il était une fois, Xiaomi publiant une passerelle (lumi.gateway.v3) était équipée de son API de développeur et même de sa documentation. L'API Developer est la chose qui communique via UDP sur les ports 4321 et 9898. La communauté a vraiment aimé ce mouvement et elle a répondu avec un tas de référentiels qui intègrent l'appareil dans tout ce qui est possible. Travailler avec cette API développeur a constitué la base de l'intégration de l'assistant à domicile xiaomi_aqara ( lien ) et tout était super jusqu'à présent ...

Bien que Xiaomi n'ait pas remplacé et qu'ils n'aient pas mis en place la prise en charge de l'API du développeur, les identifiants des nouveaux appareils ont cessé d'y apparaître. Le relais souhaité est dans la liste des appareils connectés via la passerelle à zigbee, mais là le relais apparaît avec un identifiant de modèle vide, sans lequel il est impossible de faire quoi que ce soit. Puis, tout récemment, Xiaomi a déployé une mise à jour du firmware de la passerelle après l'installation, il était impossible d'activer l'api du développeur sans fer à souder (s'il n'était pas activé avant la mise à jour), lien .

Une fois au centre de cette Santa Barbara, j'ai fondu en larmes et suis allé commander le dongle allemand ZigBee ConBee2 sur Amazon pour travailler avec des appareils en zigbee sans passerelle. Mais alors que les Allemands dans les conditions de l'apocalypse s'apprêtaient à envoyer ma commande, moi, fatigué d'attendre, j'ai commencé à creuser plus profondément ...

Protocole MIIO plus natif


Miio est un protocole plus récent pour travailler avec des appareils Xiaomi connectés au réseau via Wi-Fi. L'application native Mi Home communique via ce protocole avec des prises wi-fi, et avec IR Remote, des aspirateurs, et avec tout le monde, et même avec ma passerelle xiaomi v2. Il s'agit également d'un protocole UDP, mais cette fois ce n'est pas le port 4321 qui est impliqué, mais le port 54321 (je considère une excellente méthode pour sélectionner les ports). "Dingo", je pensais: "Donc, elle connaît aussi un autre protocole, mais dois-je essayer de connecter le relais en utilisant ce nouveau protocole?"

Le protocole miio crypte tous les messages avec un token, mais, heureusement, les méthodes d'extraction du token et de cryptage / décryptage ont déjà été ouvertes et leur travail a été implémenté dans plusieurs bibliothèques (lien une fois , lien deux) Je ne suis pas le premier à intégrer le nouvel appareil en utilisant le protocole miio, donc le chemin était connu et je l'ai suivi.

Le chemin est le suivant:

  • Nous obtenons des dispositifs de jetons de sécurité en les extrayant des journaux ( lien ) ou d'une application modifiée ( lien )
  • Nous supprimons le trafic entre l'application mobile et l'appareil
  • Nous déchiffrons les paquets UDP avec un jeton de sécurité reçu au début
  • Apprentissage du code pour créer des packages similaires

J'ai pris le trafic directement depuis mon routeur wi-fi, heureusement il y a un firmware asuswrt-merlin personnalisé pour lui, dans lequel tcpdump peut être installé en utilisant Entware. L'utilitaire est très bien, mais il ne comprend pas les vidages de tcpdump, mais il comprend le json-dump généré par Wireshark. Pour remplacer le vidage binaire de tcpdump vers json, j'ai utilisé l'utilitaire tshark. Après cela, j'ai vu quelles commandes l'application mi home contrôle le relais.J'ai généré PR avec l'ajout du support de relais ( lien ).

J'ai annulé la commande de ConBee2, car la méthode logicielle est à la fois plus rapide et plus ludique ...

Pourquoi avons-nous besoin d'un forgeron?


Cela signifie donc que, avec un tiret nu, je me retrouve dans une situation où tout semble fonctionner, mais maintenant dans mon assistant à domicile, mon Xiamo Gateway 2 est représenté par deux entités, l'une utilisant le protocole API développeur (intégration xiaomi_aqara) et l'autre par miio ponction (intégration xiaomi_miio ) . Et je n'aime pas souder, je voulais simplifier ma vie et moi-même. Il était nécessaire d'implémenter la partie manquante des appareils dans xiaomi_miio.

Pour la plupart, après avoir créé le logiciel de cerclage, c'est un travail mécanique:

  1. activé tcpdump
  2. créé une action d'automatisation dans l'application Mi Home que je veux suivre
  3. initié cette automatisation
  4. déchiffré la décharge
  5. copier-coller du déchiffrement au code
  6. envoyer des commandes depuis la console
  7. finition de fichier pour briller

Mais les mains me démangent et l'aventure appelle ...

Faux appareil miio


Une autopsie a montré qu'il n'y a pas de mécanisme de rappel dans le protocole miio. Les capteurs peuvent être retirés une fois toutes les 20 secondes, mais pour le bon fonctionnement des boutons et des cubes, c'était une mauvaise idée d'interroger l'appareil 10 fois par seconde. Dans ce paradoxe, j'ai vu une activité intéressante, mais je ne voulais pas vraiment m'occuper du codage mécanique des paquets capturés.

Une étude d'une autre bibliothèque fonctionnant avec le protocole miio ( lien ) m'a surpris au fond . Les auteurs ont assemblé une récolteuse qui communique avec l'appareil via le protocole miio, mais utilise l'api du développeur pour intercepter les événements des cubes et des boutons. Une telle approche m'a mis à rude épreuve, cela conduit au fait qu'une partie de la fonctionnalité commence à fonctionner immédiatement, mais pour une partie, il est nécessaire de souder l'appareil ...

Armé à nouveau avec tcpdump et, après avoir modifié le décodeur avec la fonction de décryptage de tous les appareils en une seule fois, j'ai commencé à écouter tout ce qui vole sur le réseau vers le port UDP 54321. Et je vois une image assez intéressante. Lorsque je crée une automatisation comme «Si vous avez tourné le cube zigbee, allumez la prise wi-fi», json est envoyé de l'application à la passerelle en utilisant le protocole miio à l'intérieur du champ de données dont json est encodé dans une chaîne; «DSL» - pensait Stirlitz, pour une raison quelconque, depuis des temps immémoriaux, tout le monde a fait ses bagages de cette façon ... Détails ici .

La visualisation du contenu de cette ligne a montré que la réaction à l'action n'est pas transmise quelque part aux nuages, directement dans ce programme json est apparue l'adresse IP et le jeton de cryptage de la prise wi-fi (ce paragraphe contredit le paragraphe de la première série, j'avais tort là-bas; (gate il communique avec des appareils respectueux de lui - même -. sans l'aide de nuages) Oui, et le script lui - même ressemble à l' automatisation de l'assistant d'accueil, il y a des paramètres de déclenchement, il y a ip où envoyer une réaction qui est, aucun protocole pub / sous n'a pu être trouvée dans les dépotoirs..

Mais l'idée est née de tout pour capturer tous les événements nécessaires à partir des boutons et des cubes:

  1. Nous émulons un appareil miio dans l'application, répondons aux applications PING et aux demandes de la passerelle
  2. Nous écrivons un générateur de script pour la passerelle pour en générer un par paire ~ (appareil, événement)
  3. Nous envoyons des scripts pour que lorsqu'un événement se produit, une demande miio arrive à l'émulateur

Il a fallu quelques jours pour réaliser cela et le mettre sous une forme divine.

À l'heure actuelle, la bibliothèque python-miio peut fonctionner avec des relais et avec un cube et avec un bouton, un lien .

Il reste à attacher cette mise à jour à l'assistant domestique et il sera possible de travailler avec la passerelle Xiaomi 2 sans soudure ni api développeur.

Si quelqu'un est prêt à tester sur ses appareils et / ou à ajouter de la prise en charge de nouveaux appareils - rejoignez :)

Toujours en vente est le glorieux aspirateur Xiaomi 1C ici et une telle lacune ( lien ) pour son intégration dans l'assistant domestique. Je pense prendre ... En avez-vous besoin?

All Articles