Ev Otomasyonu için LG Kanallı Bölmeyi Hacklemek: 8 Adım (Resimlerle)
Ev Otomasyonu için LG Kanallı Bölmeyi Hacklemek: 8 Adım (Resimlerle)
Anonim
Ev Otomasyonu için LG Kanallı Bölmeyi Hacklemek
Ev Otomasyonu için LG Kanallı Bölmeyi Hacklemek

Her şeyden önce - Bu başka bir Kızılötesi uzaktan kumanda öykünmesi hack değil. Özel AC'm, birlikte verilen duvara monte akıllı kontroller dışında herhangi bir kontrol türü için tasarlanmış kullanışlı bir arayüze sahip değil.

Evimde bir LG Kanallı ters split sistemim var. Ne yazık ki, IoT'nin hiçbir üretici listesinde üst sıralarda olmadığı bir zamanda yapıldı. 'Ana' kontrol için bazı seçenekleri olduğunu keşfettim, ancak bunu ilk denediğimde ünite sadece 2 yaşında olmasına rağmen, genişletme kartları unobtanium ve fiyatlar zaten astronomikti. İşleri çok daha kolay ancak satın almayı imkansız hale getiren 'Kablosuz RF Uzaktan Kumanda' eklentisi gibi.

Benim seçimim olsaydı, LG olmazdı ama ben satın aldığımda evde kurulu olduğu için (ve değiştirme maliyeti muhtemelen 10 bin doları aşacaktı), uğraşmam gereken şey buydu.

Amaç - OpenHAB ve IFTTT/Google Assistant üzerinden otomasyon amacıyla AC'yi MQTT üzerinden kontrol edebilmek

Adım 1: Veri Formatının Kodunu Çözme

Veri Formatının Kodunu Çözme
Veri Formatının Kodunu Çözme
Veri Formatının Kodunu Çözme
Veri Formatının Kodunu Çözme

Bu işleme 4 yıl önce başladım ama çok ileri gidemedim ve üniteye zarar verme riskini almak istemedim - Özellikle de parçalarının bulunması neredeyse imkansız göründüğü için.

Denetleyiciyi duvardan sökerek Toprak, 12v ve 'sinyal' olarak belirlediğim 3 kablo buldum

Veri hattındaki sinyal voltajı 12v idi, ancak multimetrede dalgalandığını fark ettim (hatta bir çeşit darbe).

Veri pini aracılığıyla bir opto izolatörünü sürmek için temel bir devreye bindim ve opto izolatörünün diğer tarafını bilgisayarımın ses kartına bir giriş olarak bağladım ve kapsam çıkışının zayıf bir versiyonunu aldım (Resim 1).

Bu, o zaman aldığım kadarıyla - orada bir şey olduğunu görebiliyordum ama gerçekten nasıl 'kodunu çözeceğimi' bilmiyordum.

Kahve Makinesi IoT'mi etkinleştirdiğimden beri, bu sefer biraz daha kararlılıkla tekrar denemeye ilgi duydum.

Bulgularımı, birisinin biraz ışık tutabileceğini görmek için EEVBlog forumlarında yayınladım ve Ian adında harika bir adam imdadıma yetişti - Tamamen mantıklı bir şekilde ortaya koydu (Resim 2)

Temel olarak, veri akışı 13 bayt 'standart seri'dir - 8 veri biti, bir başlangıç biti ve bir durdurma biti (eşlik yok), ancak 104bps'lik ÇOK düşük bir baud hızında.

Adım 2: Daha Derine Bakmak

Daha Derine Bakmak
Daha Derine Bakmak

Artık verilerin nasıl biçimlendirildiği hakkında bir fikrim olduğuna göre, verileri daha dinamik bir şekilde okuyabilmek için bir yola ihtiyacım vardı.

Denetleyicilerimden birini duvardan çıkardım ve 104bps'de yapılandırılmış yazılım seri bağlantı noktası aracılığıyla 13 bayt veriyi okumak ve yazdırmak için basit bir çizimle bir mantık seviye değiştirici aracılığıyla bir Arduino'ya bağladım:

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, **Aslında burada 12 bayt

Harekete geçtik!

Daha sonra denetleyicideki çeşitli ayarları değiştirerek, değişen baytları hesaplayabildim:

168, 3, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Fan DÜŞÜK168, 35, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, Fan MED 168, 67, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 152, Fan YÜKSEK

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, Mod FAN 168, 79, 0, 0, 0, 136, 10, 35, 0, 0, 0, 0, 249, OTOMATİK Mod 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, SOĞUTMA Modu 168, 83, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 225, Mod ISITMA 168, 7, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 61, Mod DH

168, 15, 0, 0, 0, 136, 3, 34, 0, 0, 0, 0, 49, Sıcaklık 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, Sıcaklık 30

Rakamlar ikili olarak baktığınız zaman çok daha anlamlı oluyor ama 13. baytın nesi var?? Her yerde var…

3. Adım: Haritayı Çıkarmak

Haritayı Çıkarmak
Haritayı Çıkarmak

Deneme yanılma yoluyla, iletebilmem gereken 13 baytlık verideki ilgili bitleri belirleyebildim.

Adım 4: Önünüzde Tuğla Duvar

Önümüzde Tuğla Duvar!
Önümüzde Tuğla Duvar!
Önümüzde Tuğla Duvar!
Önümüzde Tuğla Duvar!
Önümüzde Tuğla Duvar!
Önümüzde Tuğla Duvar!

İşte bu noktada karmaşıklaştı. üstesinden gelmem gereken iki engel vardı

a) 13. bayt, bir şekilde çözmem gereken verilerin bir sağlama toplamı gibi görünüyordu.b) O zaman verileri nasıl iletebilirim? Sadece bir tel.

'a' konusunun GERÇEKTEN kolay olduğu ortaya çıktı, ancak tamamen tesadüf eseri onu geçmeyi başardım.

Testlerimde aşağıdaki gibi verilere bakıyordum: A802000000040F61000000004B A81200004004169A00000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A85200084000149C00000000A7

Bu, sağlama toplamı dahil 13 baytlık veridir (burada DEC yerine HEX'te).

'Bir sağlama toplamının nasıl tersine mühendislik yapılacağı' konusunda google olan oracle'ı ararken, Nick adında başka biriyle hemen hemen aynı şeyi soran yığın değişiminde bu sayfaya rastladım ama sadece bu değil, konuştular bir klima hakkında ve verileri benimkiyle neredeyse aynı formattaydı - Olabilir mi??? Tüm araştırmalarımda (4 ya da daha fazla yıl içinde), hiç kimse bu klimalardaki protokolün nasıl hackleneceğine dair herhangi bir bilgi yayınlamamıştı ve neredeyse tamamen alakasız bir şey arayarak aynı şeyi yapan birine rastladım mı? Bu bir lütuftu - Hatta bunu çözdüğünü ve çözümün şu olduğunu bildirdi: Tüm Veri Baytlarını ve ardından XOR'u "U" ile toplayın.

Bununla elimde, sağlama toplamının gerçekte ne olması gerektiğini düşündüğümü hesaplamak için koduma ekledim ama hepsi YANLIŞ!

Anlaşıldığı üzere, biraz yanlıştı. İkili sayılara bakmaya başladığımda, tamamen mantıklı geldi.

'U ile XOR'dan gelen yanıt her zaman 9 bit veri döndürdü (9. bit her zaman birdir), ancak diğer bitler doğruydu. Sonuçta ortaya çıkan sayıdan 256 alarak 9. biti çıkardım ve sonra eşleşti!

Bu birey için olmasaydı, hala kafamı kaşıyor olabilirdim. Ona da şapka çıkartıyorum ama onunla iletişim kuramıyorum - Bu, temel olarak stackexchange forumunda yaptığı tek gönderiydi. peki teşekkür ederim yabancı:)

Bir sonraki zorluk, mevcut denetleyiciyi simüle etmeme izin verecek bir devre yapmaktı. Sürücü devresinin şemasını çıkardım (Pic1 ve Pic 2) ama istediğimi elde etmek için onu yeniden üretmem gerekmeyecek kadar karmaşık görünüyordu. Ne de olsa sinyali zaten okuyordum. Çok daha basit bir yöntem seçtim - 12v sinyal hattını gerektiği gibi düşürmek için bir opto izolatörü sürmek için arduino'yu kullanmak.

Ayrıca Rx için daha basit bir devre tasarladım ama bu denenmedi, basitlik için seviye dönüştürücüye bağlı kaldım.

Adım 5: Çalıştırmak.

İletim devresini devre tahtasına yerleştirdikten ve yarışan bir kalple, 12 baytlık (statik) bir diziyi karıştırdım, sağlama toplamını hesapladım ve arduino'nun komutu göndermesini sağladım - Şaşırtıcı bir şekilde, ekran güncellendi!!! Kazanç!

Son gerçek test, gerçek bir canlı test için arduino'mu diğer 2 kontrolörle birlikte BUS'a eklemekti ve kesinlikle işe yaradı.

Yani şimdi otobüse Okuyup Yazabiliyordum ama bunu basitçe yapabilme yeteneğinden yoksundum.

MQTT'yi neredeyse tüm ev otomasyonum için kullandığım için, bunun aynı olması doğaldı. AC'nin 4 ana öğesini kontrol etmek için kodu birkaç gün içinde yazdım, ayrıca mevcut durumu da okudum (BUS'taki diğer modüllerden)

Amaç, kodu bir ESP8266 modülünde çalıştırmaktı, ancak ESP8266'nın 104bps kadar düşük bir baud hızı üretemediği görülüyor. Wiznet ethernetli genel bir Arduino Uno'ya geri dönmek zorunda kaldım ama bu zor değildi çünkü iletişim rafım tam anlamıyla AC kontrolörlerinden birinin duvarın diğer tarafındaydı.

Kod biraz her yerde ama okunaklı olmalı. Denetleyicinin kendi çıktısını okumasını engellemekle birlikte, MQTT'den aldığı yayınlanmış konuların kodunu tekrar klimaya geri döndürmekle ilgili birçok sorun yaşadım. Temel olarak, sonsuz bir döngü yaratacaktır. Sonunda, bazı arabellek temizleme ve kodun MQTT'ye yayınlandıktan sonra işlenmesindeki gecikmeler onu sıraladı.

AC'ye giden Rx, Tx pinleri 3, 4 olarak kodlanmıştır ancak isterseniz değiştirin

Kod, komutları şu şekilde yayınlayacak ve kabul edecek şekilde yapılandırılmıştır:

ha/mod/5557/P 0/1 - Powerha/mod/5557/M 0/1/2/3/4 - Mod Soğutma, Nem Alma, Fan, Otomatik, Heatha/mod/5557/F 0/1/2 - Fan low, med, highha/mod/5557/Z yani tüm bölgeler için 1000'de sadece bölge 1 için 1111.

**Kontrolörden bölgeler '0000' olarak ayarlanamaz, ancak değeri verirseniz '1000'e dönecek gibi görünüyor.

Kodun en son sürümü GitHub Repo'mdan edinilebilir:

Adım 6: Daha Kalıcı Bir Şey

Daha Kalıcı Bir Şey
Daha Kalıcı Bir Şey
Daha Kalıcı Bir Şey
Daha Kalıcı Bir Şey

Bir arduino prototip panosu topladım ve tüm parçaları ekmek tahtasına yerleştirdiğim gibi kurdum.

Adım 7: OpenHAB Yapılandırması

OpenHAB Öğeleri, site haritası ve kurallar için ekteki dosyaya bakın

Bunu IFTTT OpenHab bağlama ve Google Asistan/Ev ile birleştirin ve piyasada bulunan hemen hemen her ürünü aşan çok güçlü bir ses kontrollü ve/veya 'Akıllı' klimanız olur!

8. Adım: Özet

Sonuç olarak - Biraz daha eski bir LG kanallı split klimaya sahip zavallılardan biriyseniz, yalnız değilsiniz. Bizim için hala umut var!

Umarım bu talimat, benim kadar ihtiyacı olan birini bulur. Temelde bulabileceğim HİÇBİR bilgi yok ('Nick'ten gelen sağlama toplamı dışında). Sıfırdan başlamak zorunda kaldım ama sonuçtan çok mutluyum.

Bilgiler biraz belirsiz biliyorum ama benimle aynı durumdaysanız, yardım etmeye istekli olacağım.

-- Dikkat / Güncelleme --- Ünite Kapalıyken AC'deki ayarları değiştirmek mümkün olsa da, Bölge kontrolüne gelince, onunla uğraştığını gördüm. Ünite kapalıyken çok fazla test yaptım ve bölgelerin inaktif olarak görüneceğini ancak ünite çalışırken, damperlerin tamamen kapalı olmadığı (ama tam olarak açık olmadığı) görünüyor. Üniteyi ana kesicide sıfırladım ve bu sorunu çözdü. Sadece ünite açıkken bölgeleri değiştirdiği için bu bir problem olmadı

Ayrıca kodu, ana üniteden değil, yalnızca ana denetleyiciden gelen değişiklikleri yayınlamak (MQTT'ye) için güncelledim. Bir kez daha, bu sorunlara neden olabilir, çünkü ana ünite bölgeler için '0000' gönderir (bu da sorun olabilirdi)

Güncellenen kod ayrıca, arduino'nun ana ve ana üniteyi aynı anda iletmesini önlemeye çalışmak için bazı zamanlama kısıtlamaları getirir. Muhtemelen denetleyicinin göndermeden önce Xms için çizgiyi aşağıya çekmek gibi bir veri göndermeyi başlatmak için kullandığı bir yöntem olduğundan eminim, ancak varsa henüz keşfetmedim

Ana ünitenin her 60 saniyede bir veri göndereceğini ve ana kontrolörün her 20 saniyede bir veri göndereceğini keşfettim. Kod, veri paketini aldıktan sonra 2 saniye içinde veri göndermeyi durdurmaya çalışır. Ancak bazen ana ünite ve ana ünite birbirine çok yakın iletim yapar. Bu muhtemelen yakında daha da geliştirilecektir.------------------------------------------

**Daha yeni birimlerde çalışabilir

*** Araştırma seyahatlerimde bulunan bazı bilgiler, Panasonic kanallı split'in aynı protokolü kullanabileceğini gösterdi. YMMV.