Inhaltsverzeichnis:

Hacken eines LG Ducted Split für die Hausautomation - Gunook
Hacken eines LG Ducted Split für die Hausautomation - Gunook

Video: Hacken eines LG Ducted Split für die Hausautomation - Gunook

Video: Hacken eines LG Ducted Split für die Hausautomation - Gunook
Video: Klimmaanlage Schlauch - Komfortabel mit Fenster nutzen, Fensterabdichtung aus solidem Plexiglas 2024, November
Anonim
Hacken eines LG Ducted Split für die Hausautomation
Hacken eines LG Ducted Split für die Hausautomation

Zuallererst - Dies ist kein weiterer Infrarot-Fernbedienungs-Emulations-Hack. Meine spezielle AC hat keine nutzbare Schnittstelle, die für irgendeine Art von Steuerung ausgelegt ist, außer den mitgelieferten, an der Wand montierten Smart Controls.

Ich habe ein LG Ducted Reverse-Split-System in meinem Haus. Leider wurde es zu einer Zeit entwickelt, in der IoT auf keiner Herstellerliste ganz oben stand. Ich entdeckte, dass es einige Optionen für die "Master" -Steuerung hatte, aber obwohl das Gerät zum Zeitpunkt meines ersten Versuchs erst 2 Jahre alt war, waren die Erweiterungsplatinen unobtanium und die Preise waren sowieso astronomisch. Ebenso wie das Add-on 'Wireless RF Remote', das die Dinge viel einfacher gemacht hätte, aber unmöglich zu kaufen wäre.

Wäre es meine Wahl gewesen, es wäre kein LG, aber da es beim Kauf im Haus installiert war (und die Wiederbeschaffungskosten wahrscheinlich mehr als 10.000 US-Dollar betragen würden), musste ich mich damit auseinandersetzen.

Ziel - Steuerung des AC über MQTT zum Zwecke der Automatisierung über OpenHAB und IFTTT/Google Assistant

Schritt 1: Decodierung des Datenformats

Decodierung des Datenformats
Decodierung des Datenformats
Decodierung des Datenformats
Decodierung des Datenformats

Ich habe diesen Prozess vor 4 Jahren begonnen, bin aber nicht sehr weit gekommen und wollte nicht riskieren, das Gerät zu beschädigen - Zumal Teile dafür fast unmöglich zu finden scheinen.

Als ich den Controller von der Wand riss, fand ich 3 Drähte, von denen ich feststellte, dass sie Masse, 12 V und "Signal" sind.

Die Signalspannung auf der Datenleitung betrug 12 V, aber ich habe bemerkt, dass sie auf dem Multimeter zu schwanken schien (eine Art Impulse auf der Leitung).

Ich habe eine Grundschaltung an Bord gesteckt, um einen Opto-Isolator über den Daten-Pin anzusteuern, und die andere Seite des Opto-Isolators als Eingang an die Soundkarte meines PCs angeschlossen und eine schlechte Version eines Oszilloskopausgangs erhalten (Bild 1).

Dies ist ungefähr so weit wie ich damals - ich konnte sehen, dass da etwas war, wusste aber nicht wirklich, wie ich es "entschlüsseln" sollte.

Seit ich meine Kaffeemaschine IoT aktiviert habe, hatte ich ein neues Interesse daran, dies dieses Mal mit etwas mehr Entschlossenheit erneut zu versuchen.

Ich habe meine Ergebnisse in den EEVBlog-Foren gepostet, um zu sehen, ob jemand in der Lage sein könnte, etwas Licht ins Dunkel zu bringen, und ein großartiger Typ namens Ian kam zu meiner Rettung - Er legte es so dar, dass es völlig sinnvoll war (Bild 2)

Grundsätzlich besteht der Datenstrom aus 13 Byte 'Standard Serial' - 8 Datenbits, ein Startbit und ein Stoppbit (keine Parität), aber bei einer SEHR niedrigen Baudrate von 104bps.

Schritt 2: Tiefer schauen

Tiefer schauen
Tiefer schauen

Nachdem ich nun eine Vorstellung davon hatte, wie die Daten formatiert wurden, brauchte ich eine Möglichkeit, die Daten dynamischer zu lesen.

Ich zog einen meiner Controller von der Wand und schloss ihn über einen Logikpegelumsetzer mit einer einfachen Skizze an einen Arduino an, um 13 Bytes Daten über einen mit 104 bps konfigurierten seriellen Software-Port zu lesen und auszudrucken:

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, **Eigentlich 12 Byte hier

Wir hatten Action!

Nachdem ich dann die verschiedenen Einstellungen am Controller geändert habe, konnte ich die sich ändernden Bytes herausfinden:

168, 3, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Lüfter LOW168, 35, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Lüfter MED 168, 67, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 152, Lüfter HOCH

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, Modus FAN 168, 79, 0, 0, 0, 136, 10, 35, 0, 0, 0, 0, 249, Modus AUTO 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, Modus KÜHL 168, 83, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 225, Modus HEAT 168, 7, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 61, Modus 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, Temperatur 30

Die Zahlen machen viel mehr Sinn, wenn man sie binär betrachtet, aber was ist mit dem 13. Byte?? Es ist überall…

Schritt 3: Mapping es aus

Kartieren Sie es aus
Kartieren Sie es aus

Durch Versuch und Irrtum konnte ich die relevanten Bits in den 13 Bytes Daten ermitteln, die ich zum Übertragen benötige.

Schritt 4: Mauer voraus

Mauer voraus!
Mauer voraus!
Mauer voraus!
Mauer voraus!
Mauer voraus!
Mauer voraus!

Hier wurde es kompliziert. Ich hatte zwei Hürden zu überwinden

a) Das 13. Byte schien eine Prüfsumme der Daten zu sein, die ich irgendwie ausrechnen musste. b) Wie übertrage ich die Daten dann? Es ist nur ein Draht.

Ausgabe 'a' stellte sich als WIRKLICH einfach heraus, aber es war reiner Zufall, dass ich es geschafft habe, daran vorbeizukommen.

In meinen Tests habe ich mir Daten angesehen wie: A802000000040F610000000004B A81200004004169A00000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A85200084000149C00000000A7

Dies sind die 13 Byte Daten inklusive der Prüfsumme (hier in HEX statt DEC).

Als ich das Orakel von Google nach "Wie man eine Prüfsumme zurückentwickelt" suchte, stieß ich auf diese Seite zum Stack-Austausch mit jemand anderem namens Nick, der so ziemlich das Gleiche wie ich fragte, aber nicht nur das, sie redeten über eine Klimaanlage und ihre Daten waren fast identisch mit meinen - Könnte es sein??? Bei all meiner Suche (in 4 oder so Jahren) hatte keine Person Informationen darüber gepostet, wie man das Protokoll dieser Klimaanlagen hackt, und ich stolpere zufällig über jemanden, der dasselbe tut, indem er nach etwas suchte, das fast nichts miteinander zu tun hat? Es war ein Segen - er hat sogar gepostet, dass er es ausgearbeitet hat und die Lösung war: Addiere alle Datenbytes und dann XOR mit "U".

Mit diesem in der Hand fügte ich es meinem Code hinzu, um zu berechnen, was ich dachte, dass die Prüfsumme im Vergleich zu dem sein sollte, was sie tatsächlich war, aber es war alles FALSCH!!

Wie sich herausstellte, war es irgendwie falsch. Als ich anfing, die Zahlen im Binärformat zu betrachten, ergab es völligen Sinn.

Die Antwort vom 'XOR mit U' lieferte immer 9 Datenbits (das 9. Bit immer eins), aber die anderen Bits waren richtig. Ich habe einfach das 9. Bit entfernt, indem ich 256 von der resultierenden Zahl genommen habe und dann passte es zusammen!!

Wäre diese Person nicht gewesen, würde ich mir vielleicht immer noch am Kopf kratzen. Hut ab vor ihm, aber ich kann ihn nicht kontaktieren - das war im Grunde sein einziger Beitrag im Stackexchange-Forum. Nun, danke Fremder:)

Die nächste Herausforderung bestand darin, eine Schaltung zu erstellen, mit der ich den vorhandenen Controller simulieren konnte. Ich habe den Schaltplan für die Antriebsschaltung (Bild 1 und Bild 2) gezeichnet, aber es schien mir viel zu kompliziert, um ihn reproduzieren zu müssen, um das zu bekommen, was ich wollte. Ich habe das Signal doch schon gelesen. Ich entschied mich für eine viel einfachere Methode - Verwenden Sie das Arduino, um einen Opto-Isolator anzusteuern, um die 12-V-Signalleitung nach Bedarf zu senken.

Ich habe auch eine einfachere Schaltung für den Rx entworfen, aber dies ist ungetestet, ich bin der Einfachheit halber beim Pegelwandler geblieben.

Schritt 5: Damit es funktioniert

Nachdem ich die Sendeschaltung mit einem Steckbrett versehen hatte, zerlegte ich mit rasendem Herzen eine (statische) Zeichenfolge von 12 Bytes, berechnete die Prüfsumme und ließ das Arduino den Befehl senden - Erstaunlicherweise wurde die Anzeige aktualisiert !!! Gewinnen!

Der letzte tatsächliche Test bestand darin, mein Arduino mit den 2 anderen Controllern für einen echten Live-Test zum BUS hinzuzufügen, und tatsächlich hat es funktioniert.

Jetzt konnte ich also im Bus lesen und schreiben, aber es fehlte mir einfach die Fähigkeit, dies einfach zu tun.

Da ich fast ausschließlich MQTT für meine gesamte Hausautomation verwende, war es selbstverständlich, dass dies auch so ist. Ich habe den Code über mehrere Tage geschrieben, um die 4 Hauptelemente des AC zu steuern, auch den vorhandenen Status (von den anderen Modulen am BUS) zurückzulesen.

Die Absicht war, den Code auf einem ESP8266-Modul laufen zu lassen, aber es scheint, dass der ESP8266 keine Baudrate von nur 104 bps erzeugen kann. Ich musste zu einem generischen Arduino Uno mit Wiznet-Ethernet zurückkehren, aber das war nicht schwer, da sich mein Kommunikations-Rack buchstäblich auf der anderen Seite der Wand von einem der AC-Controller befand.

Der Code ist etwas verstreut, sollte aber lesbar sein. Ich hatte viele Probleme damit, den Controller daran zu hindern, seine eigene Ausgabe zu lesen, aber auch den Code, den seine eigenen veröffentlichten Themen von MQTT erhalten haben, an die Klimaanlage zu wiederholen. Im Grunde würde es eine Endlosschleife erstellen. Am Ende brachten einige Pufferlöschungen und Verzögerungen bei der Verarbeitung des Codes nach der Veröffentlichung in MQTT die Lösung.

Rx, Tx-Pins zum AC sind als 3, 4 codiert, aber ändern Sie, wenn Sie möchten

Der Code ist so konfiguriert, dass er Befehle als solche veröffentlicht und akzeptiert:

ha/mod/5557/P 0/1 - Powerha/mod/5557/M 0/1/2/3/4 - Modus Kühlen, Entfeuchten, Lüfter, Auto, Heizen/mod/5557/F 0/1/2 - Lüfter niedrig, mittel, hochha/mod/5557/Z dh 1111 für alle Zonen an 1000 für nur Zone 1 an.

** Vom Controller aus können Zonen nicht auf '0000' gesetzt werden, aber es scheint, dass wenn Sie den Wert eingeben, er auf '1000' zurückgesetzt wird.

Die neueste Version des Codes ist in meinem GitHub Repo verfügbar:

Schritt 6: Etwas Dauerhafteres

Etwas Dauerhafteres
Etwas Dauerhafteres
Etwas Dauerhafteres
Etwas Dauerhafteres

Ich sammelte ein Arduino-Prototyp-Board und installierte alle Teile, wie ich sie mit Brot versehen hatte.

Schritt 7: OpenHAB-Konfiguration

Siehe angehängte Datei für OpenHAB-Elemente, Sitemap und Regeln

Kombinieren Sie dies mit der IFTTT OpenHab-Bindung und Google Assistant/Home und Sie haben eine sehr leistungsstarke sprachgesteuerte und/oder „intelligente“Klimaanlage, die fast jedes handelsübliche Produkt übertrifft!

Schritt 8: Zusammenfassung

Fazit - Wenn Sie mit einer etwas älteren Split-Klimaanlage von LG zu den armen Seelen gehören, sind Sie nicht allein. Es gibt noch Hoffnung für uns!

Ich hoffe, dass dieses instructable jemanden findet, der es so sehr braucht wie ich. Es gibt im Grunde KEINE Informationen, die ich finden konnte (außer der Prüfsumme von 'Nick'). Ich musste bei Null anfangen, aber ich bin vom Ergebnis begeistert.

Die Informationen sind ein bisschen vage, ich weiß, aber wenn Sie in der gleichen Situation sind wie ich, bin ich mehr als bereit, Ihnen zu helfen.

- Achtung / Update --- Obwohl es möglich ist, die Einstellungen an der Klimaanlage bei ausgeschaltetem Gerät zu ändern, habe ich festgestellt, dass es bei der Zonensteuerung zu Problemen kommt. Ich habe viele Tests mit ausgeschaltetem Gerät durchgeführt und festgestellt, dass die Zonen als inaktiv angezeigt werden, aber wenn das Gerät in Betrieb ist, scheinen die Klappen nicht vollständig geschlossen (aber auch nicht vollständig geöffnet) zu sein. Ich habe das Gerät am Hauptschalter zurückgesetzt und dies hat das Problem behoben. Da der Zonenwechsel nur bei eingeschaltetem Gerät erfolgt, war dies kein Problem

Ich habe auch den Code aktualisiert, um nur Änderungen (in MQTT) zu veröffentlichen, die vom Master-Controller und nicht vom Hauptgerät stammen. Dies könnte wiederum zu Problemen führen, da das Hauptgerät '0000' für die Zonen sendet (was auch das Problem gewesen sein könnte)

Der aktualisierte Code führt auch einige Timing-Einschränkungen ein, um zu verhindern, dass das Arduino gleichzeitig vom Master und der Haupteinheit sendet. Ich bin mir sicher, dass es wahrscheinlich eine Methode gibt, die der Controller verwendet, um einen Datenversand zu initiieren, z

Ich habe entdeckt, dass das Hauptgerät alle 60 Sekunden Daten sendet und der Master-Controller alle 20 Sekunden sendet. Der Code versucht, das Senden von Daten innerhalb von 2 Sekunden nach Empfang des Datenpakets zu unterbrechen. Manchmal senden Master- und Hauptgerät jedoch sehr nahe beieinander. Dies wird wahrscheinlich bald weiter verfeinert. --------------------------

**Kann bei neueren Geräten funktionieren

*** Einige Informationen, die ich bei meinen Recherchereisen gefunden habe, zeigten, dass Panasonic Ducted Split möglicherweise das gleiche Protokoll verwendet. YMMV.

Empfohlen: