Hackear un divisor con conductos LG para la automatización del hogar: 8 pasos (con imágenes)
Hackear un divisor con conductos LG para la automatización del hogar: 8 pasos (con imágenes)
Anonim
Hackear una división con conductos de LG para la automatización del hogar
Hackear una división con conductos de LG para la automatización del hogar

En primer lugar, este no es otro truco de emulación de control remoto por infrarrojos. Mi CA en particular no tiene una interfaz utilizable diseñada para ningún tipo de control que no sean los controles inteligentes montados en la pared incluidos.

Tengo un sistema de división inversa LG Ducted en mi casa. Desafortunadamente, se hizo en un momento en el que IoT no ocupaba un lugar destacado en ninguna lista de fabricantes. Descubrí que tenía algunas opciones para el control 'maestro', pero a pesar de que la unidad tenía solo 2 años en el momento en que intenté esto por primera vez, las placas de expansión eran unobtanium y los precios eran astronómicos de todos modos. Al igual que el complemento 'Wireless RF Remote', que habría hecho las cosas mucho más fáciles pero imposibles de comprar.

Si hubiera sido mi elección, no sería un LG, pero como estaba instalado en la casa cuando lo compré (y su costo de reemplazo probablemente supere los $ 10k), es con lo que tuve que lidiar.

Objetivo: poder controlar el aire acondicionado a través de MQTT para fines de automatización a través de OpenHAB e IFTTT / Google Assistant

Paso 1: decodificación del formato de datos

Decodificación del formato de datos
Decodificación del formato de datos
Decodificación del formato de datos
Decodificación del formato de datos

Comencé este proceso hace 4 años, pero no llegué muy lejos y no quería arriesgarme a dañar la unidad, especialmente porque las piezas parecen casi imposibles de encontrar.

Arrancando el controlador de la pared encontré 3 cables que determiné que eran tierra, 12v y 'señal'

El voltaje de señalización en la línea de datos era de 12 V, pero noté que parecía fluctuar en el multímetro (una especie de pulsos en la línea).

Abordé un circuito básico para manejar un optoaislador a través del pin de datos y conecté el otro lado del optoaislador como entrada en la tarjeta de sonido de mi PC y obtuve una versión pobre de una salida de osciloscopio (Imagen 1).

Esto es lo más lejos que llegué en ese momento: pude ver que había algo allí, pero realmente no sabía cómo 'decodificarlo'.

Desde que habilité mi máquina de café IoT, tuve un renovado interés en intentar esto nuevamente con un poco más de determinación esta vez.

Publiqué mis hallazgos en los foros de EEVBlog para ver si alguien podría arrojar algo de luz y un gran tipo llamado Ian vino a mi rescate: lo expuso de una manera que tenía completamente sentido (Foto 2)

Básicamente, el flujo de datos es de 13 bytes de 'serie estándar': 8 bits de datos, un bit de inicio y un bit de parada (sin paridad) pero a una velocidad MUY baja de 104 bps.

Paso 2: Mirando más a fondo

Mirando más profundo
Mirando más profundo

Entonces, ahora que tenía una idea de cómo se formateaban los datos, necesitaba una forma de poder leer los datos de una manera más dinámica.

Saqué uno de mis controladores de la pared y lo conecté a través de un cambiador de nivel lógico a un Arduino con un boceto simple para leer 13 bytes de datos a través del puerto serie de software configurado a 104bps e imprimirlo:

168, 18, 0, 8, 0, 192, 6, 22, 0, 0, 0, 0, 168, 18, 0, 8, 0, 192, 6, 22, 0, 0, 0, 0, 40, 19, 0, 8, 0, 200, 6, 31, 0, 0, 0, 0, 40, 19, 0, 8, 0, 200, 6, 31, 0, 0, 0, 0, 200, 18, 0, 8, 64, 0, 6, 25, 0, 0, 0, 0, 200, 18, 0, 8, 64, 0, 6, 25, 0, 0, 0, 0, 168, 18, 0, 8, 0, 200, 6, 22, 0, 0, 0, 0, 168, 18, 0, 8, 0, 200, 6, 22, 0, 0, 0, 0, 168, 18, 0, 8, 0, 200, 6, 22, 0, 0, 0, 0, ** En realidad 12 bytes aquí

¡Tuvimos acción!

Luego de cambiar las distintas configuraciones en el controlador, pude calcular los bytes que cambian:

168, 3, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Ventilador BAJO 168, 35, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Ventilador MED 168, 67, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 152, Ventilador ALTO

168, 67, 0, 0, 0, 248, 3, 33, 0, 0, 0, 0, 82, Z1234 168, 67, 0, 0, 0, 192, 3, 34, 0, 0, 0, 0, 133, Z1 168, 67, 0, 0, 0, 160, 3, 34, 0, 0, 0, 0, 229, Z2 168, 67, 0, 0, 0, 144, 3, 34, 0, 0, 0, 0, 245, Z3 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, Z4

168, 75, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 244, Modo FAN 168, 79, 0, 0, 0, 136, 10, 35, 0, 0, 0, 0, 249, Modo AUTO 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, Modo COOL 168, 83, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 225, Modo CALOR 168, 7, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 61, Modo DH

168, 15, 0, 0, 0, 136, 3, 34, 0, 0, 0, 0, 49, Temp 18168, 15, 0, 0, 0, 136, 4, 34, 0, 0, 0, 0, 48, Temp. 19168, 15, 0, 0, 0, 136, 5, 34, 0, 0, 0, 0, 51, Temp. 20168, 15, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 37, Temp 30

Los números tienen mucho más sentido cuando los miras en binario, pero ¿qué pasa con el byte 13? Está por todos lados …

Paso 3: mapearlo

Mapeándolo
Mapeándolo

Mediante prueba y error, pude determinar los bits relevantes en los 13 bytes de datos que necesitaría para poder transmitir.

Paso 4: ¡Pared de ladrillos por delante

¡Pared de ladrillo por delante!
¡Pared de ladrillo por delante!
¡Pared de ladrillo por delante!
¡Pared de ladrillo por delante!
¡Pared de ladrillo por delante!
¡Pared de ladrillo por delante!

Aquí es donde se complicó. Tenía dos obstáculos que superar

a) El byte 13 parecía ser una suma de comprobación de los datos que necesitaba para resolver de alguna manera. b) ¿Cómo puedo transmitir los datos entonces? Es solo un cable.

El problema 'a' resultó ser REALMENTE fácil, pero fue por pura coincidencia que logré superarlo.

En mis pruebas, estaba mirando datos como: A802000000040F61000000004B A81200004004169A00000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A852000840007149C0000000087 A852000840007149C0000000087 A852000840007149

Estos son los 13 bytes de datos, incluida la suma de comprobación (aquí en HEX en lugar de DEC).

Cuando estaba buscando en el oráculo que es Google sobre 'cómo realizar ingeniería inversa en una suma de verificación', encontré esta página en el intercambio de pila con alguien más que se llamaba Nick preguntando prácticamente lo mismo que yo, pero no solo eso, hablaron sobre un acondicionador de aire y sus datos tenían un formato casi idéntico al mío - ¿Podría ser ??? En toda mi búsqueda (en 4 años más o menos), ninguna persona había publicado información sobre cómo piratear el protocolo en estos acondicionadores de aire y me topé con alguien que estaba haciendo lo mismo al buscar algo que casi no tenía nada que ver. Fue una bendición. Incluso publicó que lo resolvió y la solución fue: sumar todos los bytes de datos y luego XOR con "U".

Con eso en la mano, lo agregué a mi código para calcular lo que pensé que debería ser la suma de comprobación frente a lo que realmente era, ¡pero todo estaba INCORRECTO!

Resulta que estaba algo mal. Cuando comencé a mirar los números en binario, tenía mucho sentido.

La respuesta del 'XOR con U' siempre devolvía 9 bits de datos (el noveno bit siempre uno) pero los otros bits eran correctos. ¡Simplemente eliminé el noveno bit tomando 256 del número resultante y luego coincidió!

Si no hubiera sido por este individuo, todavía podría estar rascándome la cabeza. Me quito el sombrero ante él también, pero no puedo contactarlo. Esa fue básicamente su única publicación en el foro de stackexchange. Bueno, gracias extraño:)

El siguiente desafío fue hacer un circuito que me permitiera simular el controlador existente. Hice un mapa del esquema para el circuito de la unidad (Pic1 y Pic 2) pero parecía demasiado complicado para mí tener que reproducirlo para obtener lo que quería. Después de todo, ya estaba leyendo la señal. Opté por un método mucho más simple: usar el arduino para conducir un optoaislador para bajar la línea de señal de 12v según sea necesario.

También diseñé un circuito más simple para el Rx pero esto no está probado, terminé quedándome con el convertidor de nivel por simplicidad.

Paso 5: hacer que funcione …

Una vez que tuve la placa de circuito de transmisión, y con el corazón acelerado, destrocé una cadena (estática) de 12 bytes, calculé la suma de comprobación e hice que el arduino enviara el comando. ¡Sorprendentemente, la pantalla se actualizó! ¡Ganar!

La prueba final real fue agregar mi arduino al BUS con los otros 2 controladores para una prueba real en vivo y, efectivamente, funcionó.

Así que ahora podía leer y escribir en el autobús, pero simplemente carecía de la capacidad para hacerlo de forma sencilla.

Dado que utilizo MQTT casi exclusivamente para toda la automatización de mi hogar, era natural que esto fuera lo mismo. Escribí el código durante varios días para controlar los 4 elementos principales del AC, también leyendo el estado existente (de los otros módulos en el BUS)

La intención era que el código se ejecutara en un módulo ESP8266, sin embargo, parece que el ESP8266 no puede producir una velocidad en baudios tan baja como 104bps. Tuve que volver a un Arduino Uno genérico con Wiznet ethernet, pero eso no fue difícil ya que mi rack de comunicaciones estaba literalmente al otro lado de la pared de uno de los controladores de CA.

El código está un poco extendido, pero debería ser legible. Tuve muchos problemas para evitar que el controlador leyera su propia salida, pero también repitiera el código en sus propios temas publicados recibidos de MQTT al aire acondicionado. Básicamente, crearía un bucle infinito. Al final, algunos borrados del búfer y retrasos en el procesamiento del código después de la publicación en MQTT lo solucionaron.

Los pines Rx, Tx a la CA están codificados como 3, 4 pero cámbielos si lo desea

El código está configurado para publicar y aceptar comandos como tales:

ha / mod / 5557 / P 0/1 - Powerha / mod / 5557 / M 0/1/2/3/4 - Modo Cool, Deshumidify, Fan, Auto, Heatha / mod / 5557 / F 0/1/2 - Ventilador bajo, medio, altoha / mod / 5557 / Z, es decir, 1111 para todas las zonas en 1000 para solo la zona 1 en encendido.

** Desde el controlador, las zonas no se pueden configurar en '0000', sin embargo, parecería que si emite el valor, volverá a '1000'.

La última versión del código está disponible en mi repositorio de GitHub:

Paso 6: algo más permanente

Algo más permanente
Algo más permanente
Algo más permanente
Algo más permanente

Reuní un prototipo de placa arduino e instalé todas las piezas tal como las tenía montadas.

Paso 7: Configuración de OpenHAB

Consulte el archivo adjunto para los elementos, el mapa del sitio y las reglas de OpenHAB

Combine esto con el enlace IFTTT OpenHab y Google Assistant / Home y tendrá un aire acondicionado muy potente controlado por voz y / o 'inteligente' que supera a casi todos los productos disponibles comercialmente.

Paso 8: Resumen

En conclusión: si usted es uno de los pobres que tiene un aire acondicionado dividido con conductos LG un poco más antiguo, no está solo. ¡Todavía hay esperanza para nosotros!

Espero que este instructable encuentre a alguien que lo necesite tanto como yo. Básicamente, NO hay información que pueda encontrar (aparte de la suma de comprobación de 'Nick'). Tuve que empezar desde cero, pero estoy extasiado con el resultado.

La información es un poco vaga, lo sé, pero si estás en la misma situación que yo, estaré más que dispuesto a ayudarte.

- Precaución / Actualización --- Aunque es posible cambiar la configuración del aire acondicionado con la unidad apagada, me he dado cuenta de que cuando se trata del control de zona parece estropearlo. Hice muchas pruebas con la unidad apagada y descubrí que las zonas se mostraban inactivas, pero cuando la unidad está funcionando, parece que los amortiguadores no están completamente cerrados (pero tampoco completamente abiertos). Reinicié la unidad en el disyuntor principal y esto resolvió el problema. Dado que solo se cambian de zona cuando la unidad está encendida, esto no ha sido un problema

También he actualizado el código para publicar solo (en MQTT) los cambios que provienen del controlador maestro y no de la unidad principal. Una vez más, esto podría causar problemas porque la unidad principal enviará '0000' para las zonas (que también podría haber sido el problema)

El código actualizado también introduce algunas restricciones de tiempo para tratar de evitar que el arduino transmita al mismo tiempo la unidad principal y la maestra. Estoy seguro de que probablemente haya un método que usa el controlador para iniciar un envío de datos, como bajar la línea para Xms antes de enviar, pero aún no lo he descubierto si lo hay

Descubrí que la unidad principal envía datos cada 60 segundos y el controlador maestro envía cada 20 segundos. El código intenta detener el envío de datos dentro de los 2 segundos posteriores a la recepción del paquete de datos. Sin embargo, a veces la unidad principal y la maestra transmiten muy cerca una de la otra. Esto probablemente se perfeccionará más pronto.----------------------------

** Puede funcionar en unidades más nuevas

*** Alguna información encontrada en mis viajes de investigación indicó que el split con conductos de Panasonic podría usar el mismo protocolo. YMMV.