O Xiaomi Kettle é baseado no QN9020 MCU, que utiliza o GATT sobre a baixa energia do Bluetooth para se comunicar com o aplicativo móvel.
O protocolo permite controlar algumas configurações e obter atualizações de status. Está fechado, então eu usei meu cérebro e algumas ferramentas para descompilar e analisar o aplicativo MI Home e a biblioteca nativa que lida com a criptografia.
Não dito nenhuma garantia de que isso funcione para você.
Eu provavelmente deveria começar com más notícias.
No começo, você só precisa se conectar à sua chaleira via BLE.
Você pode usar qualquer linguagem de programação e qualquer biblioteca BLE que suporta características de escrita/leitura e assinando -as.
Eu usei Go e CurrantLabs/BLE, mas não vou publicar meu código agora, pois não é perfeito.
Conectado com sucesso? Vamos autenticar então.
Você precisará de algumas variáveis e funções para começar:
reversedMac é o endereço da sua chaleira, mas revertido, 6 bytes. Por exemplo, revertedMac para aa: bb: cc: dd: ee: ff é 0xff, 0xee, 0xdd, 0xcc, 0xbb, 0xaa.productID é sempre 131, eu acho.token é o ... token usado para autenticar sua chaleira, 12 bytes! Você pode gerar token aleatório todas as autenticações, não importa. Se você também quiser usar o Mi Home, emparelhe com sua chaleira e use o token.cipher , mixA , mixB são funções da Biblioteca Nativa de Xiaomi. Eles são comuns para muitos dispositivos e usados para cifra pacotes de autenticação. Eu tenho uma implementação Go.Vamos começar.
0x90, 0xCA, 0x85, 0xDE bytes para authInitCharacteristic .authCharacteristic .cipher(mixA(reversedMac, productID), token) para authCharacteristic .authCharacteristic . Você deve esperar por esta notificação antes de prosseguir para a próxima etapa. Os dados de notificação podem ser ignorados ou usados para verificar uma integridade, isso é opcional . Se você deseja executar uma verificação, compare cipher(mixB(reversedMac, productID), cipher(mixA(reversedMac, productID), res)) em que res é recebido carga útil com seu token , eles devem ser iguais.0x92, 0xAB, 0x54, 0xFA para authCharacteristic .verCharacteristics . Você pode ignorar os dados de resposta, basta executar uma leitura para concluir o processo de autenticação.Você está autenticado agora, para assinar atualizações de status e/ou enviar comandos.
Se você deseja receber atualizações de status, precisará se inscrever statusCharacteristic . Depois de assiná -lo, você começará a receber notificações com cargas úteis.
Aqui está o esquema de carga útil:
| ÍNDICE DE BYTE | Descrição | Valores |
|---|---|---|
| 0 | Ação | 0 - Idle 1 - aquecimento 2 - resfriamento 3 - Mantendo quente |
| 1 | Modo (correspondente aos LEDs) | 255 - Nenhum 1 - Ferva 2 - Mantenha quente |
| 2-3 | Desconhecido | |
| 4 | Mantenha a temperatura definida quente | 40-95 em ° C. |
| 5 | Temperatura atual | 0-100 em ° C. |
| 6 | Mantenha o tipo quente | 0 - Ferva e esfrie para definir a temperatura 1 - apenas aqueça para definir a temperatura |
| 7-8 | Mantenha o tempo quente | O tempo passou em minutos desde que o Keep Warm foi ativado |
| Descrição | Característica | Carga útil | Legível | Gravável |
|---|---|---|---|---|
| Mantenha o limite de tempo quente | timeCharacteristic | De 0 a 12 horas multiplicadas por 2. 7,5 horas é 15, por exemplo | + | + |
| Mantenha o tipo quente e a temperatura | setupCharacteristic | Primeiro byte: tipo, 0 ou 1 Segundo byte: temperatura, 40-95 | - | + |
| Desligue depois de ferver | boilModeCharacteristic | 0 - Não 1 - Sim | + | + |
| Versão do firmware | mcuVersionCharacteristic | corda | + | - |
| Nome | Uuid |
|---|---|
authInitCharacteristic | 0010 |
authCharacteristic | 0001 |
verCharacteristics | 0004 |
setupCharacteristic | AA01 |
statusCharacteristic | AA02 |
timeCharacteristic | AA04 |
boilModeCharacteristic | AA05 |
mcuVersionCharacteristic | 2A28 |
Usei o protocolo Xiaomi Kettle para desenvolver a Kettle <-> MQTT Bridge in Go, que me permite integrar minha chaleira ao Assistente de casa.
O ícone mais à esquerda mostra a temperatura atual.
Posso "ativar" ou "desativar" minha chaleira, alternando o ícone mais à direita. Na verdade, mantenho manter o modo quente sempre ativado na minha chaleira, então isso significa apenas "definir a temperatura para 85 ° C via setupCharacteristic ", desligado significa "definir a temperatura para 40 ° C", pois 40 ° C é o mínimo.
Meu tipo de mantimento quente é sempre 1 (aqueça para definir a temperatura sem ferver).
Quando deixo minha casa ou vou dormir, o assistente doméstico "desligará" a chaleira automaticamente, para que fique a 40 ° C. Quando chego em casa ou acordo, o assistente doméstico prepara 85 ° C de água para mim!
Eu também posso tocar e segurar o ícone mais à esquerda e ele fará minha chaleira ferver a água (não importa se o modo de 85 ° C estiver "em" ou "off"). É assim que eu faço ferver:
setupCharacteristic .Quando estiver pronto, o assistente de casa também me envia mensagem "A chaleira está fervendo", para que eu possa buscá -la. Não uso meu recurso de fervura com frequência, porque minha configuração de 85 ° C geralmente é suficiente para fazer chá. Eu preciso de água de 100 ° C somente quando quero algumas ervas suaves.
O Home Assistant possui componente HomeKit para que minha chaleira também esteja disponível no Apple Home App e Siri. Eu posso gritar "Hey Siri, ferver", "Hey Siri, ligue/desativado" ou "Hey Siri, temperatura atual da chaleira" no meu HomePod: D.
Obviamente, como explicado em advertências, eu sempre preciso ligar meu modo de manter a quente pressionando o botão físico quando o limite de 12 horas passa ou quando eu reabasteço a chaleira com água fria, para fazer com que todas essas coisas mágicas funcionem.
O trabalho é realizado por Anna Prosvetova.
Agradecemos a Jadx-Gui pelo apk descompilar, Ida Pro para desmontagem da biblioteca nativa e meu querido amigo @Scorpi por apoio moral e muita ajuda.
Você é russo? Você pode assinar meu canal de telegrama <3.