Xiaomi Gateway 2 no se puede soldar



Hola habr En series anteriores, yo:

  • Compré dispositivos de Xiaomi para una casa inteligente y, a través de un soldador, los hice funcionar de una manera emocionante sin servidores nativos a través del asistente de casa ( enlace a publicación )
  • Envolví la interfaz web del asistente de inicio en electron ( enlace a la publicación ) con soporte para notificaciones, menús, barra de puntos, etc. ( código aquí )

Pero a medida que aparecían más y más dispositivos, comenzó a abrirse algo extraño ...

Por ejemplo, que Aqara Wireless Relay 2ch (LLKZMK11LM) no era compatible con la integración xiaomi_aqara, y cuando se lanzaron los problemas en GitHub, los propietarios del código respondieron que era imposible admitir este relé sin actualizar el firmware del dispositivo. "Algo está mal aquí", pensé, y fui a clasificar el código, cómo sucedió. Así que me dejé llevar por la integración primero para trabajar con el relé a través de xiaomi_miio ( enlace ), y luego implementé el soporte para el cubo y el botón Xiaomi para esta integración ( enlace ), y ahora te diré por qué y cómo.

API de desarrollador


Érase una vez, Xiaomi que lanzó una puerta de enlace (lumi.gateway.v3) estaba equipada con su API de desarrollador e incluso documentación para ello. La API de desarrollador es lo que se comunica a través de UDP en los puertos 4321 y 9898. A la comunidad realmente le gustó este movimiento y respondió con un montón de repositorios que integran el dispositivo en todo lo que es posible. Trabajar con esta API de desarrollador formó la base de la integración de xiaomi_aqara ( enlace ) del asistente para el hogar y hasta ahora todo fue genial ...

Si bien Xiaomi no anuló y no obstaculizó el soporte de la API de desarrollador, los identificadores de nuevos dispositivos dejaron de aparecer en él. El relé deseado está en la lista de dispositivos conectados a través de la puerta de enlace a zigbee, pero allí el relé aparece con un identificador de modelo vacío, sin el cual es imposible hacer nada. Luego, recientemente, Xiaomi lanzó una actualización de firmware de la puerta de enlace después de la instalación, que era imposible encender la API del desarrollador sin un soldador (si no estaba encendido antes de la actualización), enlace .

Una vez en el corazón de esta Santa Bárbara, me eché a llorar y fui a pedir el dongle ZigBee ConBee2 alemán en Amazon para trabajar con dispositivos zigbee sin una puerta de enlace. Pero mientras los alemanes en las condiciones del apocalipsis se preparaban para enviar mi pedido, yo, cansado de esperar, comencé a cavar más profundo ...

Protocolo MIIO más nativo


Miio es un protocolo más nuevo para trabajar con dispositivos Xiaomi conectados a la red a través de wifi. La aplicación nativa Mi Home se comunica a través de este protocolo con enchufes wi-fi, y con IR Remote, y aspiradoras, y con todos los demás, e incluso con mi xiaomi gateway v2. Este también es un protocolo UDP, pero esta vez no está involucrado el puerto 4321, sino el puerto 54321 (considero un excelente método para seleccionar puertos). "Goofy", pensé: "Entonces ella también conoce otro protocolo, pero ¿debería intentar conectar el relé usando este nuevo protocolo?"

El protocolo miio cifra todos los mensajes con un token, pero, afortunadamente, los métodos para extraer el token y el cifrado / descifrado ya se han abierto y el trabajo con ellos se ha implementado en varias bibliotecas (enlace una vez , enlace dos) No soy el primero en integrar el nuevo dispositivo utilizando el protocolo miio, por lo que se conocía el camino y lo seguí.

El camino es este:

  • Obtenemos dispositivos de token de seguridad extrayéndolos de los registros ( enlace ) o de una aplicación modificada ( enlace )
  • Eliminamos el tráfico entre la aplicación móvil y el dispositivo.
  • Desciframos los paquetes UDP con token de seguridad recibido al principio
  • Código de aprendizaje para crear paquetes similares

Tomé el tráfico directamente de mi enrutador wi-fi, afortunadamente hay un firmware asuswrt-merlin personalizado para él, en el que tcpdump se puede instalar usando Entware. La utilidad está bien, pero no comprende los volcados de tcpdump, pero sí entiende el volcado json generado por Wireshark. Para anular el volcado binario de tcpdump a json, utilicé la utilidad tshark. Después de eso vi qué comandos la aplicación mi home controla el relé. Generé PR con la adición de soporte de relé ( enlace ).

Cancelé el pedido de ConBee2, porque el método del software es más rápido y más divertido ...

¿Por qué necesitamos un herrero?


Y eso significa que yo, con un guión desnudo, me encuentro en una situación en la que todo parece funcionar, pero ahora en mi asistente de casa mi Xiamo Gateway 2 está representado por dos entidades, una que usa el protocolo api de desarrollador (integración xiaomi_aqara) y otra por miio pinchazo (integración xiaomi_miio ) . Y no me gusta soldar, quería simplificar mi vida y a mí mismo. Era necesario implementar la parte faltante de los dispositivos en xiaomi_miio.

En su mayor parte, después de crear el software de flejado, este es un trabajo mecánico:

  1. tcpdump habilitado
  2. Creé una acción de automatización en la aplicación Mi Home que quiero rastrear
  3. inició esta automatización
  4. descifrado el basurero
  5. copiar y pegar desde el descifrado al código
  6. enviar comandos desde la consola
  7. archivo acabado para brillar

Pero las manos pican, y la aventura llama ...

Dispositivo falso de miio


Una autopsia mostró que no hay un mecanismo de devolución de llamada en el protocolo miio. Los sensores se pueden extraer una vez cada 20 segundos, pero para el correcto funcionamiento de los botones y cubos fue una mala idea interrogar al dispositivo 10 veces por segundo. En esta paradoja, vi una actividad interesante, pero realmente no quería lidiar con la codificación mecánica de los paquetes capturados.

Un estudio de otra biblioteca que trabaja con el protocolo miio ( enlace ) me sorprendió hasta la médula. Los autores han reunido una cosechadora que se comunica con el dispositivo a través del protocolo miio, pero utiliza una API de desarrollador para interceptar eventos de cubos y botones. Este enfoque me estresó por completo, conduce al hecho de que parte de la funcionalidad comienza a funcionar de inmediato, pero en parte es necesario soldar el dispositivo ...

Armado nuevamente con tcpdump y, después de haber modificado el decodificador con la función de descifrado de todos los dispositivos en una sola ejecución, comencé a escuchar todo lo que pasa por la red al puerto UDP 54321. Y veo una imagen bastante interesante. Cuando creo automatización como "Si giró el cubo zigbee, encienda el zócalo wi-fi", se envía json desde la aplicación a la puerta de enlace utilizando el protocolo miio dentro del campo de datos cuyo json está codificado en una cadena; "DSL" - pensó Stirlitz, por alguna razón, desde tiempos inmemoriales, todos han estado empacando de esta manera ... Los detalles están aquí .

Ver el contenido de esta línea mostró que la reacción a la acción no se transmite en algún lugar a las nubes, directamente en este programa json apareció la dirección IP y el token de cifrado del zócalo wi-fi (este párrafo contradice el párrafo de la primera serie, me equivoqué allí; (gate él mismo se comunica con dispositivos amigables, sin la ayuda de las nubes. Sí, y el script en sí se asemeja a la automatización del asistente doméstico, hay parámetros de activación, hay ip a dónde enviar una reacción. Es decir, no se pudo encontrar ningún protocolo de pub / sub en los vertederos.

Pero la idea nació de todo para capturar todos los eventos necesarios de botones y cubos:

  1. Emulamos un dispositivo miio en la aplicación, respondemos a aplicaciones PING y solicitudes de la puerta de enlace
  2. Escribimos un generador de scripts para que la puerta de enlace genere uno por par ~ (dispositivo, evento)
  3. Enviamos guiones para que cuando ocurra un evento, una solicitud de miio llegue al emulador

Tomó un par de días darse cuenta de esto y llevarlo a una forma divina.

Por el momento, la biblioteca python-miio puede funcionar con relés y con un cubo y con un botón, enlace .

Queda por adjuntar esta actualización al asistente de inicio y será posible trabajar con la puerta de enlace 2 de Xiaomi sin la API de soldadura y desarrollador.

Si alguien está listo para probar en sus dispositivos y / o agregar soporte para otros nuevos, únase :)

Todavía está a la venta la gloriosa aspiradora Xiaomi 1C aquí y una deficiencia ( enlace ) para su integración en el asistente doméstico. Creo que tomar ... ¿Lo necesitas?

All Articles