Xiaomi Gateway 2 não pode ser soldado



Oi Habr! Nas séries anteriores, eu:

  • Comprei dispositivos da Xiaomi para uma casa inteligente e, através de um ferro de solda, os fizeram funcionar de uma maneira empolgante sem servidores nativos por meio do assistente de casa ( link para postar )
  • Embrulhei a interface da web do assistente de casa em elétron ( link para o post ) com suporte para notificações, menus, barra de pontos etc. ( código aqui )

Mas, à medida que mais e mais dispositivos apareciam, algo estranho começou a se abrir ...

Por exemplo, o Aqara Wireless Relay 2ch (LLKZMK11LM) não suportava a integração xiaomi_aqara e, quando os problemas foram abertos no GitHub, os proprietários do código responderam que era impossível dar suporte a esse relé sem atualizar o firmware do dispositivo. "Algo está errado aqui", pensei, e fui examinar o código, como aconteceu. E então me empolguei que reduzi a integração primeiro para trabalhar com o relé via xiaomi_miio ( link ) e, em seguida, implementei o suporte para o cubo e o botão Xiaomi para essa integração ( link ), e agora vou explicar por que e como.

API do desenvolvedor


Era uma vez, a Xiaomi que liberava um gateway (lumi.gateway.v3) era equipada com sua API do desenvolvedor e até documentação para ele. A API do desenvolvedor é a única coisa que se comunica pelo UDP nas portas 4321 e 9898. A comunidade realmente gostou dessa mudança e respondeu com vários repositórios que integram o dispositivo em tudo o que é possível. Trabalhar com este desenvolvedor api formou a base da integração xiaomi_aqara do assistente de casa ( link ) e tudo estava ótimo até agora ...

Enquanto a Xiaomi não substituiu e não forneceu suporte à API do desenvolvedor, identificadores de novos dispositivos pararam de aparecer nele. O relé desejado está na lista de dispositivos conectados via gateway ao zigbee, mas o relé aparece com um identificador de modelo vazio, sem o qual é impossível fazer nada. Em seguida, mais recentemente, a Xiaomi lançou uma atualização de firmware do gateway após a instalação, que era impossível ativar a API do desenvolvedor sem um ferro de soldar (se não estivesse ligado antes da atualização), link .

Uma vez no centro desta Santa Bárbara, caí em prantos e fui pedir o dongle alemão ZigBee ConBee2 na Amazon para trabalhar com dispositivos zigbee sem gateway. Mas enquanto os alemães nas condições do apocalipse estavam se preparando para enviar meu pedido, eu, cansado de esperar, comecei a cavar mais fundo ...

Protocolo MIIO mais nativo


O Miio é um protocolo mais recente para trabalhar com dispositivos Xiaomi conectados à rede via wi-fi. O aplicativo Mi Home nativo se comunica por esse protocolo com tomadas wi-fi e com o IR Remote e aspiradores de pó e com todos os outros e até com o meu xiaomi gateway v2. Este também é um protocolo UDP, mas desta vez não é a porta 4321 que está envolvida, mas a porta 54321 (considero um ótimo método para selecionar portas). “Pateta”, pensei: “Então ela também conhece outro protocolo, mas devo tentar conectar o relé usando esse novo protocolo?”

O protocolo miio criptografa todas as mensagens com um token, mas, felizmente, os métodos para extrair o token e a criptografia / descriptografia já foram descobertos e o trabalho com eles foi implementado em várias bibliotecas (link uma vez , link dois) Não sou o primeiro a integrar o novo dispositivo usando o protocolo miio, por isso o caminho era conhecido e eu o segui.

O caminho é o seguinte:

  • Obtemos dispositivos de token de segurança extraindo-os dos logs ( link ) ou de um aplicativo modificado ( link )
  • Removemos o tráfego entre o aplicativo móvel e o dispositivo
  • Descriptografamos pacotes UDP com token de segurança recebido no início
  • Aprendendo código para criar pacotes semelhantes

Peguei o tráfego diretamente do meu roteador wi-fi, felizmente existe um firmware asuswrt-merlin personalizado, no qual o tcpdump pode ser instalado usando o Entware. O utilitário é bom, mas não entende os dumps do tcpdump, mas entende o json-dump gerado pelo Wireshark. Para substituir o dump binário de tcpdump para json, usei o utilitário tshark. Depois disso, vi quais comandos o aplicativo mi home controla o relé.Eu gerei PR com a adição de suporte a relés ( link ).

Cancelei o pedido do ConBee2, porque o método do software é mais rápido e mais divertido ...

Por que precisamos de um ferreiro?


E assim, significa que eu, com um traço nu, me encontro em uma situação em que tudo parece funcionar, mas agora no meu assistente doméstico meu Xiamo Gateway 2 é representado por duas entidades, uma usando o protocolo api do desenvolvedor (integração xiaomi_aqara) e outra pelo miio puncture (integração xiaomi_miio ) . E eu não gosto de soldar, queria simplificar minha vida e a mim mesmo. Era necessário implementar a parte que faltava dos dispositivos no xiaomi_miio.

Na maioria das vezes, depois de criar a cintagem do software, este é um trabalho mecânico:

  1. ativado tcpdump
  2. criei uma ação de automação no aplicativo Mi Home que desejo rastrear
  3. iniciou essa automação
  4. descriptografou o despejo
  5. copiar e colar da descriptografia para código
  6. enviar comandos do console
  7. acabamento de arquivo para brilhar

Mas as mãos coçam e a aventura chama ...

Dispositivo miio falso


Uma autópsia mostrou que não há mecanismo de retorno de chamada no protocolo miio. Os sensores podem ser puxados uma vez a cada 20 segundos, mas para a operação correta de botões e cubos, era uma má idéia interrogar o dispositivo 10 vezes por segundo. Nesse paradoxo, vi uma atividade interessante, mas realmente não queria lidar com a codificação mecânica dos pacotes capturados.

Um estudo de outra biblioteca que trabalha com o protocolo miio ( link ) me surpreendeu profundamente . Os autores montaram um harvester que se comunica com o dispositivo através do protocolo miio, mas usa a API do desenvolvedor para interceptar eventos de cubos e botões. Essa abordagem me sobrecarregou completamente, pois leva ao fato de que parte da funcionalidade começa a funcionar imediatamente, mas por parte é necessário soldar o dispositivo ...

Armado novamente com tcpdump e, tendo modificado o decodificador com a função de descriptografia de todos os dispositivos em uma corrida, comecei a ouvir tudo o que voa pela rede até a porta UDP 54321. E vejo uma imagem bastante interessante. Quando eu crio uma automação como “Se você girou o cubo zigbee, ligue o soquete wi-fi”, o json é enviado do aplicativo para o gateway usando o protocolo miio dentro do campo de dados cujo json é codificado em uma string; "DSL" - pensou Stirlitz, por algum motivo, desde tempos imemoriais, todo mundo está fazendo as malas dessa maneira ... Detalhes estão aqui .

A visualização do conteúdo desta linha mostrou que a reação à ação não é transmitida em algum lugar para as nuvens, diretamente neste programa json apareceu o endereço IP e o token de criptografia do soquete wi-fi (este parágrafo contradiz o parágrafo da primeira série, eu estava errado lá; (gate ele mesmo se comunica com dispositivos amigáveis ​​- sem a ajuda de nuvens.) Sim, e o próprio script se assemelha à automação do assistente de casa, existem parâmetros de gatilho, há ip para onde enviar uma reação. Ou seja, nenhum protocolo pub / sub foi encontrado nos lixões.

Mas a idéia nasceu de tudo para capturar todos os eventos necessários de botões e cubos:

  1. Emulamos um dispositivo miio no aplicativo, respondemos aos aplicativos e solicitações PING do gateway
  2. Escrevemos um gerador de scripts para o gateway para gerar um por par ~ (dispositivo, evento)
  3. Enviamos scripts para que, quando um evento ocorrer, uma solicitação miio chegue ao emulador

Demorou alguns dias para perceber isso e trazê-lo para uma forma divina.

No momento, a biblioteca python-miio pode trabalhar com relés e com um cubo e com um botão, link .

Resta anexar esta atualização ao assistente de casa e será possível trabalhar com o Xiaomi gateway 2 sem a solda e a API do desenvolvedor.

Se alguém estiver pronto para testar em seus dispositivos e / ou adicionar suporte para novos - participe :)

Ainda à venda, há o glorioso aspirador Xiaomi 1C aqui e uma lacuna ( link ) para sua integração no assistente de casa. Eu acho que levar ... Você precisa disso?

All Articles