Een LG Ducted Split hacken voor domotica - Ajarnpa
Een LG Ducted Split hacken voor domotica - Ajarnpa
Anonim
Een LG Ducted Split hacken voor domotica
Een LG Ducted Split hacken voor domotica

Allereerst - Dit is niet weer een emulatie-hack voor infraroodafstandsbedieningen. Mijn specifieke AC heeft geen bruikbare interface die is ontworpen voor enige vorm van bediening, behalve de meegeleverde aan de muur gemonteerde slimme bedieningselementen.

Ik heb een LG Ducted reverse split-systeem in mijn huis. Helaas is het gemaakt in een tijd dat IoT niet hoog op de lijst van fabrikanten stond. Ik ontdekte dat het enkele opties had voor 'master'-besturing, maar hoewel het apparaat slechts 2 jaar oud was toen ik dit voor het eerst probeerde, waren de uitbreidingskaarten van unobtanium en waren de prijzen sowieso astronomisch. Net als de add-on 'Wireless RF Remote', die het een stuk eenvoudiger zou hebben gemaakt, maar onmogelijk om te kopen.

Als het mijn keuze was geweest, zou het geen LG zijn, maar aangezien het in het huis was geïnstalleerd toen ik het kocht (en de vervangingskosten zouden waarschijnlijk meer dan $ 10k zijn), was dit waar ik mee te maken had.

Doel - De AC via MQTT kunnen aansturen ten behoeve van automatisering via OpenHAB en IFTTT/Google Assistant

Stap 1: Decodering van het gegevensformaat

Het gegevensformaat decoderen
Het gegevensformaat decoderen
Het gegevensformaat decoderen
Het gegevensformaat decoderen

Ik begon dit proces 4 jaar geleden, maar kwam niet ver en wilde niet het risico lopen het apparaat te beschadigen - vooral omdat onderdelen ervoor bijna onmogelijk te vinden lijken.

Toen ik de controller van de muur scheurde, vond ik 3 draden waarvan ik vaststelde dat ze aarde, 12v en 'signaal' waren

De signaleringsspanning op de datalijn was 12v, maar ik merkte wel dat het leek te fluctueren op de multimeter (een soort pulsen op de lijn).

Ik ging aan boord van een basiscircuit om een opto-isolator via de datapin aan te sturen en verbond de andere kant van de opto-isolator als een ingang op de geluidskaart van mijn pc en kreeg een slechte versie van een scope-uitgang (foto 1).

Dit is ongeveer zo ver als ik destijds kwam - ik kon zien dat er iets was, maar ik wist niet echt hoe ik het moest 'decoderen'.

Sinds ik mijn Coffee Machine IoT heb ingeschakeld, had ik een hernieuwde interesse om dit deze keer opnieuw te proberen met een beetje meer vastberadenheid.

Ik heb mijn bevindingen op de EEVBlog-forums geplaatst om te zien of iemand misschien enig licht kan werpen en een geweldige kerel genaamd Ian kwam me te hulp - hij legde het op een manier uit dat het volkomen logisch was (foto 2)

In principe is de datastroom 13 bytes 'standaard serieel' - 8 databits, één startbit en één stopbit (geen pariteit), maar met een ZEER lage baudrate van 104bps.

Stap 2: Dieper kijken

Dieper kijken
Dieper kijken

Dus nu ik een idee had van hoe de gegevens waren geformatteerd, had ik een manier nodig om de gegevens op een meer dynamische manier te kunnen lezen.

Ik trok een van mijn controllers van de muur en sloot hem via een logische niveauverschuiver aan op een Arduino met een eenvoudige schets om 13 bytes aan gegevens te lezen via de seriële softwarepoort geconfigureerd op 104bps en uit te printen:

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, **Eigenlijk 12 bytes hier

We hadden actie!

Door vervolgens de verschillende instellingen op de controller te wijzigen, kon ik de bytes berekenen die veranderen:

168, 3, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Ventilator LAAG168, 35, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Ventilator MED 168, 67, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 152, Ventilator HOOG

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 VENTILATOR 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 COOL 168, 83, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 225, Modus VERWARMEN 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, Temperatuur 30

De getallen zijn veel logischer als je ze binair bekijkt, maar wat is er met de 13e byte?? Het is overal…

Stap 3: Het in kaart brengen

Het in kaart brengen
Het in kaart brengen

Met vallen en opstaan kon ik de relevante bits in de 13 bytes aan gegevens bepalen die ik zou moeten kunnen verzenden.

Stap 4: Bakstenen muur vooruit

Bakstenen muur vooruit!
Bakstenen muur vooruit!
Bakstenen muur vooruit!
Bakstenen muur vooruit!
Bakstenen muur vooruit!
Bakstenen muur vooruit!

Hier werd het ingewikkeld. Ik had twee hindernissen te overwinnen

a) De 13e byte bleek een controlesom te zijn van de gegevens die ik nodig had om op de een of andere manier uit te werken.b) Hoe verzend ik de gegevens dan? Het is maar één draad.

Probleem 'a' bleek ECHT makkelijk te zijn, maar het was puur toeval dat ik erin slaagde om er voorbij te komen.

In mijn tests keek ik naar gegevens zoals: A802000000040F61000000004B A81200004004169A00000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A85200084000149C00000000A7

Dit zijn de 13 bytes aan gegevens inclusief de controlesom (hier in HEX in plaats van DEC).

Toen ik aan het zoeken was in het orakel dat Google is over 'hoe een controlesom te reverse-engineeren', kwam ik deze pagina tegen op stapeluitwisseling met iemand anders die Nick heette en vroeg ongeveer hetzelfde als ik, maar niet alleen dat, ze spraken over een airconditioner en hun gegevens waren bijna identiek aan de mijne - zou dat kunnen? Tijdens al mijn zoeken (in ongeveer 4 jaar) had geen enkele persoon informatie gepost over hoe het protocol op deze airconditioners te hacken en ik kwam toevallig iemand tegen die hetzelfde deed door te zoeken naar iets dat bijna volledig niets met elkaar te maken had? Het was een zegen - hij postte zelfs dat hij het had uitgewerkt en de oplossing was: tel alle bytes aan gegevens bij elkaar op en vervolgens XOR met "U".

Met dat in de hand heb ik het aan mijn code toegevoegd om te berekenen wat ik dacht dat de controlesom zou moeten zijn versus wat het eigenlijk was, maar het was allemaal VERKEERD!!

Het bleek dat het een beetje verkeerd was. Toen ik begon te kijken naar de getallen in binair getal, was het volkomen logisch.

Het antwoord van de 'XOR met U' leverde altijd 9 bits data op (de 9e bit altijd één) maar de andere bits hadden gelijk. Ik heb eenvoudig het 9e bit verwijderd door 256 van het resulterende nummer te nemen en toen kwam het overeen !!

Als deze persoon er niet was geweest, zou ik misschien nog steeds op mijn hoofd krabben. Petje af voor hem, maar ik kan geen contact met hem opnemen - dat was eigenlijk zijn enige post op het stackexchange-forum. Nou, bedankt vreemdeling:)

De volgende uitdaging was het maken van een circuit waarmee ik de bestaande controller kon simuleren. Ik heb het schema voor het aandrijfcircuit (Pic1 en Pic 2) in kaart gebracht, maar het leek me veel te ingewikkeld om het te moeten reproduceren om te krijgen wat ik wilde. Ik was het signaal toch al aan het lezen. Ik koos voor een veel eenvoudigere methode - de Arduino gebruiken om een opto-isolator aan te sturen om de 12v-signaallijn naar behoefte laag te trekken.

Ik heb ook een eenvoudiger circuit voor de Rx ontworpen, maar dit is niet getest, ik bleef voor de eenvoud bij de niveau-omzetter.

Stap 5: Het laten werken

Toen ik het zendcircuit eenmaal had breadboarded, en met een bonzend hart, verminkte ik een (statische) reeks van 12 bytes, berekende de checksum en liet de arduino het commando verzenden - Verbazingwekkend, het display is bijgewerkt!!! Winnen!

De laatste daadwerkelijke test was om mijn arduino aan de BUS toe te voegen met de 2 andere controllers voor een echte live-test en ja hoor, het werkte.

Dus nu kon ik lezen en schrijven naar de bus, maar ik had gewoon niet de mogelijkheid om het eenvoudig te doen.

Aangezien ik MQTT bijna uitsluitend voor al mijn domotica gebruik, was het logisch dat dit hetzelfde zou zijn. Ik heb de code gedurende meerdere dagen uitgeschreven om de 4 hoofdelementen van de AC te besturen, en las ook de bestaande status terug (van de andere modules op de BUS)

De bedoeling was om de code op een ESP8266-module te laten draaien, maar het lijkt erop dat de ESP8266 geen baudrate van slechts 104bps kan produceren. Ik moest terugkeren naar een generieke Arduino Uno met Wiznet-ethernet, maar dat was niet moeilijk, want mijn communicatierek was letterlijk aan de andere kant van de muur van een van de AC-controllers.

De code is een beetje overal maar moet leesbaar zijn. Ik had veel problemen met het voorkomen dat de controller zijn eigen uitvoer kon lezen, maar ook met het herhalen van de code die zijn eigen gepubliceerde onderwerpen ontvingen van MQTT terug naar de airconditioning. Kortom, het zou een oneindige lus creëren. Uiteindelijk hebben wat bufferopruiming en vertragingen in de verwerking van code na publicatie naar MQTT het opgelost.

Rx, Tx pinnen naar de AC zijn gecodeerd als 3, 4 maar veranderen als je wilt

De code is geconfigureerd om opdrachten als zodanig te publiceren en te accepteren:

ha/mod/5557/P 0/1 - Powerha/mod/5557/M 0/1/2/3/4 - Modus Koelen, Ontvochtigen, Ventilator, Auto, Heatha/mod/5557/F 0/1/2 - Ventilator laag, middelhoog, hoogha/mod/5557/Z dwz 1111 voor alle zones op 1000 voor alleen zone 1 aan.

**Vanaf de controller kunnen zones niet worden ingesteld op '0000', maar het lijkt erop dat als u de waarde afgeeft, deze zal terugkeren naar '1000'.

De nieuwste versie van de code is beschikbaar via mijn GitHub Repo:

Stap 6: Iets meer permanents

Iets meer permanent
Iets meer permanent
Iets meer permanent
Iets meer permanent

Ik verzamelde een Arduino-prototypebord en installeerde alle onderdelen zoals ik ze had laten boarden.

Stap 7: OpenHAB-configuratie

Zie bijgevoegd bestand voor OpenHAB-items, sitemap en regels

Combineer dit met de IFTTT OpenHab binding en Google Assistant/Home en je hebt een zeer krachtige spraakgestuurde en/of 'Smart' airco die bijna elk commercieel verkrijgbaar product overtreft!

Stap 8: Samenvatting

Tot slot - Als u een van de arme zielen bent met een iets oudere split-airconditioner van LG, bent u niet de enige. Er is nog hoop voor ons!

Ik hoop dat dit instructable iemand vindt die het net zo hard nodig heeft als ik. Er is eigenlijk GEEN informatie die ik kon vinden (behalve de checksum van 'Nick'). Ik moest helemaal opnieuw beginnen, maar ik ben dolblij met het resultaat.

De informatie is een beetje vaag, ik weet het, maar als u zich in dezelfde situatie bevindt als ik, ben ik meer dan bereid om te helpen.

- Let op / Update --- Hoewel het mogelijk is om de instellingen op de AC te wijzigen met het apparaat uit, heb ik gemerkt dat als het gaat om de zoneregeling, het ermee lijkt te knoeien. Ik heb veel getest met het apparaat uit en ik ontdekte dat de zones als inactief zouden worden weergegeven, maar wanneer het apparaat in werking is, lijkt het erop dat de dempers niet volledig gesloten zijn (maar ook niet volledig open). Ik reset het apparaat bij de hoofdschakelaar en dit loste het probleem op. Aangezien alleen het wisselen van zones wanneer het apparaat aan staat, is dit geen probleem geweest

Ik heb ook de code bijgewerkt om alleen wijzigingen (naar MQTT) te publiceren die afkomstig zijn van de hoofdcontroller en niet van de hoofdeenheid. Nogmaals, dit kan problemen veroorzaken omdat de hoofdeenheid '0000' voor de zones zal sturen (wat ook het probleem zou kunnen zijn)

Bijgewerkte code introduceert ook enkele timingbeperkingen om te proberen te voorkomen dat de arduino tegelijkertijd zendt van de master- en hoofdeenheid. Ik weet zeker dat er waarschijnlijk een methode is die de controller gebruikt om een gegevensverzending te initiëren, zoals het laag trekken van Xms voordat het wordt verzonden, maar ik heb het nog niet ontdekt als dat het geval is

Ik ontdekte dat de hoofdeenheid elke 60 seconden gegevens verzendt en de hoofdcontroller elke 20 seconden. De code probeert het verzenden van gegevens binnen 2 seconden na ontvangst van het gegevenspakket te blokkeren. Soms zenden de master en de hoofdeenheid echter heel dicht bij elkaar uit. Dit zal waarschijnlijk binnenkort verder verfijnd worden.----------------------------

**Kan werken op nieuwere units

*** Sommige informatie die ik tijdens mijn onderzoeksreizen vond, gaf aan dat Panasonic ducted split hetzelfde protocol zou kunnen gebruiken. YMMV.