Table des matières:

Piratage d'un LG Ducted Split pour la domotique : 8 étapes (avec photos)
Piratage d'un LG Ducted Split pour la domotique : 8 étapes (avec photos)

Vidéo: Piratage d'un LG Ducted Split pour la domotique : 8 étapes (avec photos)

Vidéo: Piratage d'un LG Ducted Split pour la domotique : 8 étapes (avec photos)
Vidéo: Une MAISON ZERØ GAZ avec uniquement des SYSTÈMES DAIKIN est-elle possible ? 2024, Novembre
Anonim
Piratage d'un LG Ducted Split pour la domotique
Piratage d'un LG Ducted Split pour la domotique

Tout d'abord - Ce n'est pas un autre hack d'émulation de télécommande infrarouge. Mon climatiseur particulier n'a pas d'interface utilisable conçue pour tout type de contrôle autre que les commandes intelligentes murales incluses.

J'ai un système de split inversé LG Ducted dans ma maison. Malheureusement, il a été fabriqué à une époque où l'IoT ne figurait en bonne place sur aucune liste de fabricants. J'ai découvert qu'il y avait quelques options pour le contrôle "maître", mais même si l'unité n'avait que 2 ans au moment où j'ai essayé pour la première fois, les cartes d'extension étaient unobtanium et les prix étaient de toute façon astronomiques. Tout comme l'addon 'Wireless RF Remote' qui aurait rendu les choses beaucoup plus faciles mais impossibles à acheter.

Si cela avait été mon choix, ce ne serait pas un LG, mais comme il a été installé dans la maison lorsque je l'ai acheté (et son coût de remplacement serait probablement supérieur à 10 000 $), c'est ce à quoi j'ai dû faire face.

Objectif - Pouvoir contrôler l'AC via MQTT à des fins d'automatisation via OpenHAB et IFTTT/Google Assistant

Étape 1: décoder le format des données

Décodage du format des données
Décodage du format des données
Décodage du format des données
Décodage du format des données

J'ai commencé ce processus il y a 4 ans mais je ne suis pas allé très loin et je ne voulais pas risquer d'endommager l'appareil - D'autant plus que les pièces semblent presque impossibles à trouver.

En arrachant le contrôleur du mur, j'ai trouvé 3 fils que j'ai déterminés comme étant la masse, 12v et "signal"

La tension de signalisation sur la ligne de données était à 12v, mais j'ai remarqué qu'elle semblait fluctuer sur le multimètre (une sorte d'impulsions sur la ligne).

J'ai monté un circuit de base pour piloter un isolateur optique via la broche de données et connecté l'autre côté de l'isolateur optique en tant qu'entrée sur la carte son de mon PC et j'ai obtenu une mauvaise version d'une sortie d'oscilloscope (Pic 1).

C'est à peu près tout ce que j'ai obtenu à l'époque - je pouvais voir qu'il y avait quelque chose là-bas mais je ne savais pas vraiment comment le "décoder".

Depuis que l'IoT de ma machine à café a été activé, j'ai eu un nouvel intérêt à réessayer avec un peu plus de détermination cette fois.

J'ai posté mes découvertes sur les forums EEVBlog pour voir si quelqu'un pourrait faire la lumière et un gars formidable nommé Ian est venu à mon secours - Il l'a présenté d'une manière tout à fait logique (Photo 2)

Fondamentalement, le flux de données est de 13 octets de "série standard" - 8 bits de données, un bit de démarrage et un bit d'arrêt (pas de parité) mais à un débit en bauds TRÈS faible de 104 bps.

Étape 2: Regarder plus en profondeur

Regarder plus profondément
Regarder plus profondément

Alors maintenant que j'avais une idée de la façon dont les données étaient formatées, j'avais besoin d'un moyen de pouvoir lire les données de manière plus dynamique.

J'ai retiré l'un de mes contrôleurs du mur et l'ai connecté via un décaleur de niveau logique à un Arduino avec un simple croquis pour lire 13 octets de données via un port série logiciel configuré à 104 bps et l'imprimer:

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 fait 12 octets ici

Nous avons eu de l'action !

En modifiant ensuite les différents paramètres du contrôleur, j'ai pu déterminer les octets qui changent:

168, 3, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, ventilateur FAIBLE168, 35, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Ventilateur MED 168, 67, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 152, Ventilateur HAUT

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, Mode VENTILATEUR 168, 79, 0, 0, 0, 136, 10, 35, 0, 0, 0, 0, 249, Mode AUTO 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, Mode COOL 168, 83, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 225, Mode CHALEUR 168, 7, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 61, Mode DH

168, 15, 0, 0, 0, 136, 3, 34, 0, 0, 0, 0, 49, Temp 18 168, 15, 0, 0, 0, 136, 4, 34, 0, 0, 0, 0, 48, Temp 19 168, 15, 0, 0, 0, 136, 5, 34, 0, 0, 0, 0, 51, Temp 20 168, 15, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 37, Temp 30

Les nombres ont beaucoup plus de sens quand on les regarde en binaire mais qu'est-ce que c'est que le 13ème octet ?? C'est partout…

Étape 3: Cartographier

Cartographier
Cartographier

Par essais et erreurs, j'ai pu déterminer les bits pertinents dans les 13 octets de données que j'aurais besoin de transmettre.

Étape 4: Mur de briques à venir

Mur de briques à venir !
Mur de briques à venir !
Mur de briques à venir !
Mur de briques à venir !
Mur de briques à venir !
Mur de briques à venir !

C'est là que ça s'est compliqué. J'ai eu deux obstacles à surmonter

a) Le 13e octet semblait être une somme de contrôle des données dont j'avais besoin pour travailler d'une manière ou d'une autre.b) Comment puis-je transmettre les données alors ? Ce n'est qu'un fil.

Le problème 'a' s'est avéré VRAIMENT facile, mais c'est par pure coïncidence que j'ai réussi à le surmonter.

Dans mes tests, je regardais des données comme: A802000000040F61000000004B A81200004004169A00000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A85200084000149C00000000A7

Il s'agit des 13 octets de données, y compris la somme de contrôle (ici en HEX au lieu de DEC).

Quand je cherchais l'oracle qui est google sur "comment faire de l'ingénierie inverse une somme de contrôle", je suis tombé sur cette page sur l'échange de piles avec quelqu'un d'autre du nom de Nick demandant à peu près la même chose que moi mais pas seulement cela, ils ont parlé à propos d'un climatiseur et leurs données étaient de format presque identique aux miennes - Serait-ce ??? Au cours de toutes mes recherches (en 4 ans environ), aucune personne n'avait publié d'informations sur la façon de pirater le protocole de ces climatiseurs et je suis tombé sur quelqu'un faisant la même chose en recherchant quelque chose de presque sans rapport ? C'était une bénédiction - Il a même posté qu'il avait résolu le problème et la solution était la suivante: additionnez tous les octets de données, puis XOR avec "U".

Avec cela en main, je l'ai ajouté à mon code pour calculer ce que je pensais que la somme de contrôle devrait être par rapport à ce qu'elle était réellement, mais tout était FAUX !!

Il s'est avéré que c'était un peu faux. Quand j'ai commencé à regarder les nombres en binaire, cela avait tout son sens.

La réponse du 'XOR with U' renvoyait toujours 9 bits de données (le 9ème bit toujours un) mais les autres bits avaient raison. J'ai simplement supprimé le 9ème bit en prenant 256 du nombre résultant et cela correspondait !!

Sans cet individu, je serais peut-être encore en train de me gratter la tête. Chapeau à lui aussi mais je ne peux pas le contacter - C'était essentiellement son seul message sur le forum stackexchange. Eh bien, merci étranger:)

Le prochain défi consistait à créer un circuit qui me permettrait de simuler le contrôleur existant. J'ai tracé le schéma du circuit d'entraînement (Pic1 et Pic 2) mais cela me semblait beaucoup trop compliqué pour avoir besoin de le reproduire pour obtenir ce que je voulais. Je lisais déjà le signal après tout. J'ai opté pour une méthode beaucoup plus simple - Utiliser l'arduino pour piloter un isolateur opto pour tirer la ligne de signal 12v au niveau requis.

J'ai également conçu un circuit plus simple pour le Rx mais cela n'a pas été testé, j'ai fini par m'en tenir au convertisseur de niveau pour plus de simplicité.

Étape 5: le faire fonctionner

Une fois que j'ai eu le circuit de transmission, et avec un cœur battant, j'ai déformé une chaîne (statique) de 12 octets, calculé la somme de contrôle et demandé à l'arduino d'envoyer la commande - Étonnamment, l'affichage a été mis à jour !!! Gagner!

Le dernier test réel consistait à ajouter mon arduino au BUS avec les 2 autres contrôleurs pour un vrai test en direct et bien sûr, cela a fonctionné.

Alors maintenant, je pouvais lire et écrire dans le bus, mais je n'avais tout simplement pas la capacité de le faire simplement.

Comme j'utilise presque exclusivement MQTT pour toute ma domotique, il était naturel que ce soit la même chose. J'ai écrit le code sur plusieurs jours pour contrôler les 4 éléments principaux de l'AC, en relisant également l'état existant (à partir des autres modules sur le BUS)

L'intention était de faire fonctionner le code sur un module ESP8266, mais il semblerait que l'ESP8266 ne soit pas capable de produire un débit en bauds aussi bas que 104 bps. J'ai dû revenir à un Arduino Uno générique avec Wiznet ethernet, mais ce n'était pas difficile car mon rack de communication était littéralement de l'autre côté du mur de l'un des contrôleurs AC.

Le code est un peu partout mais doit être lisible. J'ai eu beaucoup de problèmes pour empêcher le contrôleur de lire sa propre sortie, mais aussi de répéter le code de ses propres sujets publiés reçus de MQTT vers la climatisation. Fondamentalement, cela créerait une boucle infinie. En fin de compte, un certain effacement de la mémoire tampon et des retards dans le traitement du code après la publication sur MQTT l'ont réglé.

Les broches Rx, Tx vers l'AC sont codées comme 3, 4 mais changent si vous le souhaitez

Le code est configuré pour publier et accepter les commandes en tant que telles:

ha/mod/5557/P 0/1 - Powerha/mod/5557/M 0/1/2/3/4 - Mode Refroidissement, Déshumidification, Ventilation, Auto, Heatha/mod/5557/F 0/1/2 - Fan low, med, highha/mod/5557/Z c'est-à-dire 1111 pour toutes les zones sur 1000 pour seulement la zone 1 sur.

** À partir du contrôleur, les zones ne peuvent pas être réglées sur « 0000 », mais il semblerait que si vous émettez la valeur, elle reviendra à « 1000 ».

La dernière version du code est disponible sur mon dépôt GitHub:

Étape 6: Quelque chose de plus permanent

Quelque chose de plus permanent
Quelque chose de plus permanent
Quelque chose de plus permanent
Quelque chose de plus permanent

J'ai rassemblé une carte prototype arduino et installé toutes les pièces comme je les avais montées sur planche à pain.

Étape 7: configuration OpenHAB

Voir le fichier joint pour les éléments OpenHAB, le plan du site et les règles

Combinez cela avec la liaison IFTTT OpenHab et Google Assistant/Home et vous obtenez une climatisation très puissante à commande vocale et/ou « Smart » qui surpasse presque tous les produits disponibles dans le commerce !

Étape 8: Résumé

En conclusion - Si vous êtes l'un des pauvres avec un climatiseur split à conduit LG légèrement plus ancien, vous n'êtes pas seul. Il y a encore de l'espoir pour nous !

J'espère que cette instructable trouve quelqu'un qui en a autant besoin que moi. Il n'y a fondamentalement AUCUNE information que j'ai pu trouver (autre que la somme de contrôle de 'Nick'). J'ai dû repartir de zéro mais je suis ravi du résultat.

L'information est un peu vague je sais mais si vous êtes dans la même situation que moi, je serai plus que disposé à vous aider.

- Attention / Mise à jour --- Bien qu'il soit possible de modifier les paramètres de l'AC avec l'unité éteinte, j'ai constaté que lorsqu'il s'agit de la commande de zone, cela semble déranger. J'ai fait beaucoup de tests avec l'unité éteinte et j'ai trouvé que les zones s'afficheraient comme inactives mais lorsque l'unité fonctionne, il semble que les registres ne soient pas complètement fermés (mais pas complètement ouverts non plus). J'ai réinitialisé l'unité au disjoncteur principal et cela a résolu le problème. Étant donné que les zones ne changent que lorsque l'unité est allumée, cela n'a pas été un problème

J'ai également mis à jour le code pour ne publier (sur MQTT) que les modifications provenant du contrôleur principal et non de l'unité principale. Encore une fois, cela pourrait causer des problèmes car l'unité principale enverra '0000' pour les zones (ce qui pourrait aussi être le problème)

Le code mis à jour introduit également des contraintes de temps pour essayer d'empêcher l'arduino de transmettre en même temps l'unité principale et l'unité principale. Je suis sûr qu'il existe probablement une méthode que le contrôleur utilise pour lancer un envoi de données, comme tirer la ligne vers le bas pour Xms avant l'envoi, mais je ne l'ai pas encore découvert s'il y en a

J'ai découvert que l'unité principale enverrait des données toutes les 60 secondes et que le contrôleur principal les envoie toutes les 20 secondes. Le code tente de bloquer l'envoi de données dans les 2 secondes suivant la réception du paquet de données. Cependant, parfois, l'unité principale et l'unité principale transmettent très près l'une de l'autre. Cela sera probablement affiné plus bientôt.-------------------------------------------

**Peut fonctionner sur des unités plus récentes

*** Certaines informations trouvées lors de mes voyages de recherche indiquaient que le split conduit Panasonic pourrait utiliser le même protocole. YMMV.

Conseillé: