Xiaomi Gateway 2 kann nicht gelötet werden



Hallo Habr! In der vorherigen Serie habe ich:

  • Ich habe Geräte von Xiaomi für ein Smart Home gekauft und sie über einen Lötkolben auf aufregende Weise ohne native Server über den Home Assistant funktionieren lassen ( Link zum Beitrag ).
  • Ich habe das Webinterface des Heimassistenten in Elektron ( Link zum Beitrag ) mit Unterstützung für Benachrichtigungen, Menüs, Punktbalken usw. verpackt ( Code hier ).

Aber als immer mehr Geräte auftauchten, öffnete sich etwas Seltsames ...

Zum Beispiel, dass Aqara Wireless Relay 2ch (LLKZMK11LM) die Integration von xiaomi_aqara nicht unterstützte, und als die Probleme auf GitHub gestartet wurden, antworteten die Codebesitzer, dass es unmöglich sei, dieses Relay zu unterstützen, ohne die Gerätefirmware zu aktualisieren. „Hier stimmt etwas nicht“, dachte ich und sortierte den Code, wie es passiert ist. Und so wurde ich mitgerissen, dass ich die Integration zuerst heruntergespült habe, um mit dem Relais über xiaomi_miio ( Link ) zu arbeiten, und dann die Unterstützung für den Cube und die Xiaomi-Schaltfläche für diese Integration ( Link ) implementiert habe , und jetzt werde ich Ihnen sagen, warum und wie.

Entwickler-API


Es war einmal, als Xiaomi ein Gateway (lumi.gateway.v3) veröffentlichte, das mit seiner Entwickler-API und sogar Dokumentation dafür ausgestattet war. Die Entwickler-API kommuniziert über UDP an den Ports 4321 und 9898. Die Community mochte diesen Schritt sehr und reagierte mit einer Reihe von Repositorys, die das Gerät in alles Mögliche integrieren. Die Zusammenarbeit mit dieser Entwickler-API bildete die Grundlage für die Integration des Heimassistenten xiaomi_aqara ( Link ) und alles war bisher großartig ...

Während Xiaomi nicht überschrieb und die Entwickler-API-Unterstützung nicht ausarbeitete, wurden keine Kennungen für neue Geräte mehr angezeigt. Das gewünschte Relais befindet sich in der Liste der Geräte, die über das Gateway mit ZigBee verbunden sind. Dort wird das Relais jedoch mit einer leeren Modellkennung angezeigt, ohne die nichts möglich ist. Dann erst vor kurzem, Xiaomi rollte ein Gateway - Firmware - Update nach der Installation aus , die es unmöglich war , ohne Lötkolben auf Entwickler api zu aktivieren (falls es nicht vor dem Update gedreht wurde), Link .

Im Herzen dieser Santa Barbara angekommen, brach ich in Tränen aus und bestellte den deutschen ZigBee ConBee2-Dongle bei Amazon, um mit ZigBee-Geräten ohne Gateway zu arbeiten. Aber während sich die Deutschen unter den Bedingungen der Apokalypse darauf vorbereiteten, meinen Befehl zu senden, begann ich, müde vom Warten, tiefer zu graben ...

Mehr natives MIIO-Protokoll


Miio ist ein neueres Protokoll für die Arbeit mit Xiaomi-Geräten, die über WLAN mit dem Netzwerk verbunden sind. Die native Mi Home-Anwendung kommuniziert über dieses Protokoll mit Wi-Fi-Buchsen, IR-Fernbedienungen, Staubsaugern, allen anderen und sogar mit meinem Xiaomi Gateway v2. Dies ist auch ein UDP-Protokoll, aber diesmal ist nicht Port 4321 beteiligt, sondern Port 54321 (ich halte eine großartige Methode für die Auswahl von Ports). "Goofy", dachte ich, "also kennt sie auch ein anderes Protokoll, aber sollte ich versuchen, das Relais mit diesem neuen Protokoll anzuschließen?"

Das miio-Protokoll verschlüsselt alle Nachrichten mit einem Token. Glücklicherweise wurden die Methoden zum Extrahieren des Tokens und zur Verschlüsselung / Entschlüsselung bereits geöffnet und die Arbeit mit ihnen wurde in mehreren Bibliotheken implementiert (Link einmal , Link zwei)) Ich bin nicht der erste, der das neue Gerät mithilfe des miio-Protokolls integriert, daher war der Pfad bekannt und ich folgte ihm.

Der Weg ist folgender:

  • Wir erhalten Sicherheitstoken-Geräte, indem wir sie aus den Protokollen ( Link ) oder aus einer geänderten Anwendung ( Link ) extrahieren.
  • Wir entfernen den Datenverkehr zwischen der mobilen Anwendung und dem Gerät
  • Wir entschlüsseln UDP-Pakete mit dem zu Beginn empfangenen Sicherheitstoken
  • Code lernen, um ähnliche Pakete zu erstellen

Ich habe den Datenverkehr direkt von meinem WLAN-Router übernommen. Glücklicherweise gibt es dafür eine benutzerdefinierte asuswrt-merlin-Firmware, in der tcpdump mit Entware installiert werden kann. Das Dienstprogramm ist in Ordnung, versteht aber keine Dumps von tcpdump, aber es versteht den von Wireshark generierten json-dump. Um den binären Speicherauszug von tcpdump zu json zu überschreiben, habe ich das Dienstprogramm tshark verwendet. Danach habe ich gesehen, welche Befehle die mi home-Anwendung das Relais steuert. Ich habe PR mit zusätzlicher Relaisunterstützung ( Link ) generiert .

Ich habe die Bestellung für ConBee2 storniert, weil die Softwaremethode sowohl schneller ist als auch mehr Spaß macht ...

Warum brauchen wir einen Schmied?


Das bedeutet, dass ich mich mit einem Strich nackt in einer Situation befinde, in der alles zu funktionieren scheint, aber jetzt in meinem Heimassistenten wird mein Xiamo Gateway 2 durch zwei Entitäten dargestellt, eine mit dem Entwickler-API-Protokoll (xiaomi_aqara-Integration) und eine durch miio puncture ( xiaomi_miio- Integration ). . Und ich löte nicht gern, ich wollte mein Leben und mich selbst vereinfachen. Es war notwendig, den fehlenden Teil der Geräte in xiaomi_miio zu implementieren.

Nach dem Erstellen der Software-Umreifung ist dies größtenteils eine mechanische Aufgabe:

  1. tcpdump aktiviert
  2. hat in der Mi Home-Anwendung eine Automatisierungsaktion erstellt, die ich verfolgen möchte
  3. initiierte diese Automatisierung
  4. entschlüsselt den Dump
  5. Kopieren und Einfügen von der Entschlüsselung in den Code
  6. Befehle von der Konsole senden
  7. Feilende zum Leuchten

Aber Hände jucken und Abenteuer ruft ...

Gefälschtes Miio-Gerät


Eine Autopsie ergab, dass das miio-Protokoll keinen Rückrufmechanismus enthält. Sensoren können alle 20 Sekunden gezogen werden, aber für die korrekte Bedienung von Tasten und Würfeln war es eine schlechte Idee, das Gerät 10 Mal pro Sekunde abzufragen. In diesem Paradoxon sah ich eine interessante Aktivität, aber ich wollte mich nicht wirklich mit der mechanischen Codierung der erfassten Pakete befassen.

Eine Studie einer anderen Bibliothek, die mit dem miio-Protokoll ( Link ) arbeitet, hat mich bis ins Mark überrascht. Die Autoren haben einen Harvester zusammengestellt, der über das miio-Protokoll mit dem Gerät kommuniziert, aber mithilfe der Entwickler-API Ereignisse von Cubes und Schaltflächen abfängt. Dieser Ansatz hat mich sehr belastet, er führt dazu, dass ein Teil der Funktionalität sofort funktioniert, aber zum Teil muss das Gerät gelötet werden ...

Wieder mit tcpdump bewaffnet und nachdem ich den Decoder mit der Entschlüsselungsfunktion aller Geräte in einem Durchgang modifiziert hatte, begann ich, alles zu hören, was über das Netzwerk zum UDP-Port 54321 fliegt. Und ich sehe ein ziemlich interessantes Bild. Wenn ich eine Automatisierung wie "Wenn Sie den ZigBee-Cube aktiviert haben, schalten Sie den WLAN-Socket ein" erstelle, wird JSON von der Anwendung mithilfe des Miio-Protokolls im Datenfeld, dessen JSON in einer Zeichenfolge codiert ist, an das Gateway gesendet. "DSL" - dachte Stirlitz, aus irgendeinem Grund haben seit jeher alle auf diese Weise gepackt ... Details sind hier .

Das Betrachten des Inhalts dieser Zeile zeigte, dass die Reaktion auf die Aktion nicht irgendwo in die Cloud übertragen wird. Direkt in diesem JSON-Programm erschien die IP-Adresse und das Verschlüsselungs-Token des Wi-Fi-Sockets (dieser Absatz widerspricht dem Absatz aus der ersten Serie, ich habe mich dort geirrt; (Gate) Er kommuniziert selbst mit freundlichen Geräten - ohne die Hilfe von Clouds.) Ja, und das Skript selbst ähnelt der Automatisierung des Heimassistenten. Es gibt Triggerparameter. Es gibt eine IP-Adresse, an die eine Reaktion gesendet werden kann. Das heißt, in den Dumps konnte kein Pub / Sub-Protokoll gefunden werden.

Aber die Idee wurde aus allem geboren um alle notwendigen Ereignisse von Knöpfen und Würfeln zu erfassen:

  1. Wir emulieren ein miio-Gerät in der Anwendung, antworten auf PING-Anwendungen und Anfragen vom Gateway
  2. Wir schreiben einen Skriptgenerator für das Gateway, um einen pro Paar zu generieren ~ (Gerät, Ereignis)
  3. Wir senden Skripte, damit beim Eintreten eines Ereignisses eine Miio-Anfrage an den Emulator geht

Es dauerte ein paar Tage, um dies zu erkennen und in eine göttliche Form zu bringen.

Im Moment kann die Python-Miio-Bibliothek mit Relais und mit einem Würfel und mit einem Button- Link arbeiten .

Es bleibt, dieses Update an den Heimassistenten zu binden, und es wird möglich sein, mit Xiaomi Gateway 2 ohne Löten und Entwickler-API zu arbeiten.

Wenn jemand bereit ist, auf seinen Geräten zu testen und / oder Unterstützung für neue hinzuzufügen - treten Sie bei :)

Noch im Verkauf gibt es hier den herrlichen Xiaomi 1C-Staubsauger und einen solchen Mangel ( Link ) für seine Integration in den Heimassistenten. Ich denke zu nehmen ... Brauchst du es?

All Articles