Xiaomi -Kessel basiert auf QN9020 MCU, das GATT über Bluetooth niedriger Energie verwendet, um mit mobiler App zu kommunizieren.
Das Protokoll ermöglicht es, einige Einstellungen zu steuern und Statusaktualisierungen zu erhalten. Es ist geschlossen, also habe ich mein Gehirn und einige Werkzeuge verwendet, um die MI Home -App und die native Bibliothek zu dekompilieren und zu analysieren, die die Verschlüsselung behandelt.
Ich gebe keine Garantien, dass dies für Sie funktioniert.
Ich sollte wahrscheinlich mit schlechten Nachrichten beginnen.
Zuerst müssen Sie sich nur über Ble an Ihren Wasserkocher verbinden.
Sie können jede Programmiersprache und jede BLE -Bibliothek verwenden, die das Schreiben/Lesemerkmalen unterstützt und abonniert.
Ich habe Go und CurrantLabs/Ble verwendet, aber ich werde meinen Code jetzt nicht veröffentlichen, da er nicht perfekt ist.
Erfolgreich verbunden? Lassen Sie uns dann authentifizieren.
Sie benötigen einige Variablen und Funktionen, um zu beginnen:
reversedMac ist die Adresse Ihres Kessels, aber umgekehrt, 6 Bytes. Zum Beispiel ReversedMac für AA: BB: CC: DD: EE: FF ist 0xff, 0xee, 0xdd, 0xcc, 0xBB, 0xaa.productID ist immer 131, denke ich.token ist das ... Token, das verwendet wird, um Ihren Wasserkocher zu authentifizieren, 12 Bytes! Sie können jeden Auth zufälliges Token generieren, egal. Wenn Sie auch Mi Home benutzen möchten, kombinieren Sie MI Home mit Ihrem Wasserkocher und benutzen Sie das Token davon.cipher , mixA , mixB sind Funktionen aus der Xiaomi Native Library. Sie sind für viele Geräte üblich und werden verwendet, um Auth -Pakete zu verschneiden. Ich habe eine GO -Implementierung.Fangen wir an.
0x90, 0xCA, 0x85, 0xDE Bytes an authInitCharacteristic .authCharacteristic abonnieren.cipher(mixA(reversedMac, productID), token) an authCharacteristic .authCharacteristic . Sie müssen auf diese Benachrichtigung warten, bevor Sie mit dem nächsten Schritt fortfahren. Die Benachrichtigungsdaten können ignoriert oder verwendet werden, um eine Integrität zu überprüfen. Dies ist optional . Wenn Sie eine Prüfung durchführen möchten, vergleichen Sie cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) wobei res mit Ihrem token Nutzlast erhalten wird, müssen sie gleich sind.0x92, 0xAB, 0x54, 0xFA an authCharacteristic .verCharacteristics . Sie können die Antwortdaten ignorieren, Sie müssen nur eine Lektüre durchführen, um den Authentifizierungsprozess abzuschließen.Sie sind jetzt authentifiziert, sodass Sie Statusaktualisierungen abonnieren und/oder Befehle senden können.
Wenn Sie Statusaktualisierungen erhalten möchten, müssen Sie statusCharacteristic abonnieren. Nachdem Sie es abonniert haben, erhalten Sie Benachrichtigungen mit Nutzlasten.
Hier ist das Nutzlastschema:
| Byte -Index | Beschreibung | Werte |
|---|---|---|
| 0 | Aktion | 0 - Leerlauf 1 - Heizung 2 - Kühlung 3 - warm bleiben |
| 1 | Modus (entsprechend LEDs) | 255 - keine 1 - Kochen 2 - Warm halten |
| 2-3 | Unbekannt | |
| 4 | Warme feste Temperatur halten | 40-95 in ° C. |
| 5 | Stromtemperatur | 0-100 in ° C. |
| 6 | Warmen Typ halten | 0 - Kochen und abkühlen, um die Temperatur festzulegen 1 - Heizen Sie sich einfach auf die Temperatur ein |
| 7-8 | Warme Zeit halten | Die Zeit in Minuten, da Halten warm aktiviert war |
| Beschreibung | Merkmal | Nutzlast | Lesbar | Beschreibbar |
|---|---|---|---|---|
| Warme Zeitlimit halten | timeCharacteristic | Von 0 bis 12 Stunden multipliziert mit 2. 7,5 Stunden sind 15, z. B. | + | + |
| Halten Sie warme Typ und Temperatur | setupCharacteristic | Erstes Byte: Typ, 0 oder 1 Zweites Byte: Temperatur, 40-95 | - - | + |
| Nach dem Kochen ausschalten | boilModeCharacteristic | 0 - nein 1 - Ja | + | + |
| Firmware -Version | mcuVersionCharacteristic | Saite | + | - - |
| Name | Uuid |
|---|---|
authInitCharacteristic | 0010 |
authCharacteristic | 0001 |
verCharacteristics | 0004 |
setupCharacteristic | AA01 |
statusCharacteristic | AA02 |
timeCharacteristic | AA04 |
boilModeCharacteristic | AA05 |
mcuVersionCharacteristic | 2a28 |
Ich habe das Xiaomi-Kesselprotokoll verwendet, um Kessel <--> MQTT Bridge in Go zu entwickeln, mit dem ich meinen Wasserkocher in den Heimatassistenten integrieren kann.
Links das Symbol zeigt die Stromtemperatur.
Ich kann meinen Wasserkocher "aktivieren" oder "deaktivieren", indem ich das rechts durchgeschaltete Symbol umschaltet. Tatsächlich halte ich den warmen Modus immer aktiviert, sodass dies auf nur "Temperatur auf 85 ° C über setupCharacteristic " bedeutet, bedeutet "Temperatur auf 40 ° C eingestellt", da 40 ° C das Minimum sind.
Mein Warmentyp beträgt immer 1 (Wärme nach oben, um die Temperatur ohne Kochen einzustellen).
Wenn ich mein Zuhause verlasse oder schlafen gehe, schaltet der Hausassistent automatisch "aus", so dass es bei 40 ° C ruht. Wenn ich nach Hause komme oder aufwache, bereitet Home Assistant 85 ° C Wasser für mich vor!
Ich kann auch das Symbol links tippen und halten, und es lässt mein Wasserkocher das Wasser kochen (unabhängig davon, ob der 85 ° C -Modus "eingeschaltet" oder "aus" ist). So lasse ich es kochen:
setupCharacteristic auf 0 auf 0.Wenn es fertig ist, sendet mir auch "Der Wasserkocher kocht" Telegrammnachricht, damit ich sie abholen kann. Ich benutze meine Kochfunktion nicht häufig, da meine Einstellung von 85 ° C normalerweise ausreicht, um Tee zuzubereiten. Ich brauche nur 100 ° C Wasser, wenn ich einige beruhigende Kräuter möchte.
Home Assistant hat eine HomeKit -Komponente, daher ist mein Wasserkocher auch mit Apple Home App und Siri erhältlich. Ich kann "Hey Siri, Kochen", "Hey Siri, Kessel ein-/ausschalten" oder "Hey Siri, aktuelle Kesseltemperatur" in meinem HomePod: D.
Wie in Vorbehalte erklärt, muss ich natürlich meinen Keep Warm -Modus einschalten, indem ich den physischen Knopf drückte, wenn 12 Stunden Limit vergangen sind oder wenn ich den Wasserkocher mit kaltem Wasser wieder auffülle, damit all diese magischen Dinge funktionieren.
Die Arbeit erledigt Anna Prosvetova.
Vielen Dank an Jadx-Gui für die Dekompetenz von APK, IDA Pro für einheimische Bibliotheksdämmerung und mein lieber Freund @scorpi für moralische Unterstützung und viel Hilfe.
Bist du Russisch? Sie können meinen Telegrammkanal <3 abonnieren.