สารบัญ:

การแฮ็ก LG Ducted Split สำหรับระบบอัตโนมัติภายในบ้าน: 8 ขั้นตอน (พร้อมรูปภาพ)
การแฮ็ก LG Ducted Split สำหรับระบบอัตโนมัติภายในบ้าน: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การแฮ็ก LG Ducted Split สำหรับระบบอัตโนมัติภายในบ้าน: 8 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: การแฮ็ก LG Ducted Split สำหรับระบบอัตโนมัติภายในบ้าน: 8 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Who Installed This Abortion? Another Hacked Central AC System Replaced with Bosch IDS 2.0 Equipment 2024, ธันวาคม
Anonim
การแฮ็ก LG Ducted Split สำหรับระบบอัตโนมัติภายในบ้าน
การแฮ็ก LG Ducted Split สำหรับระบบอัตโนมัติภายในบ้าน

ก่อนอื่น - นี่ไม่ใช่แฮ็กการจำลองการควบคุมระยะไกลด้วยอินฟราเรดแบบอื่น AC เฉพาะของฉันไม่มีอินเทอร์เฟซที่ใช้งานได้ซึ่งออกแบบมาสำหรับการควบคุมประเภทอื่นนอกเหนือจากตัวควบคุมอัจฉริยะติดผนังที่รวมอยู่

ฉันมีระบบแยกส่วนย้อนกลับของ LG Ducted ในบ้านของฉัน น่าเสียดายที่มันถูกสร้างขึ้นในช่วงเวลาที่ IoT ไม่สูงในรายชื่อผู้ผลิตใดๆ ฉันพบว่ามันมีตัวเลือกบางอย่างสำหรับการควบคุม 'หลัก' แต่ถึงแม้ว่าหน่วยนี้จะมีอายุเพียง 2 ปีในขณะที่ฉันพยายามทำสิ่งนี้ครั้งแรก แต่บอร์ดส่วนขยายนั้นไม่ได้มาตรฐานและราคาก็แพงมากอยู่ดี เช่นเดียวกับส่วนเสริม 'Wireless RF Remote' ซึ่งจะทำให้สิ่งต่าง ๆ ง่ายขึ้นมาก แต่ไม่สามารถซื้อได้

หากเป็นทางเลือกของฉัน มันคงไม่ใช่ LG แต่เนื่องจากมันถูกติดตั้งในบ้านเมื่อฉันซื้อมัน (และค่าทดแทนน่าจะมากกว่า $10,000) ฉันจึงต้องจัดการ

จุดมุ่งหมาย - เพื่อให้สามารถควบคุม AC ผ่าน MQTT สำหรับวัตถุประสงค์ของการทำงานอัตโนมัติผ่าน OpenHAB และ IFTTT/Google Assistant

ขั้นตอนที่ 1: ถอดรหัสรูปแบบข้อมูล

การถอดรหัสรูปแบบข้อมูล
การถอดรหัสรูปแบบข้อมูล
การถอดรหัสรูปแบบข้อมูล
การถอดรหัสรูปแบบข้อมูล

ฉันเริ่มกระบวนการนี้เมื่อ 4 ปีที่แล้ว แต่ยังไปได้ไม่ไกลนักและไม่อยากเสี่ยงที่จะทำลายตัวเครื่อง - โดยเฉพาะอย่างยิ่งเนื่องจากชิ้นส่วนต่างๆ ดูเหมือนจะหาแทบไม่ได้

ฉีกคอนโทรลเลอร์ออกจากผนังฉันพบสายไฟ 3 เส้นที่ฉันกำหนดให้เป็นกราวด์ 12v และ 'สัญญาณ'

แรงดันไฟสัญญาณบนสายดาต้าอยู่ที่ 12v แต่ฉันสังเกตว่ามันดูเหมือนจะผันผวนบนมัลติมิเตอร์ (พัลส์บางประเภทบนสาย)

ฉันต่อวงจรพื้นฐานเพื่อขับ opto isolator ผ่าน data pin และเชื่อมต่ออีกด้านหนึ่งของ opto isolator เป็นอินพุตบนการ์ดเสียงของพีซีของฉันและได้รับเอาต์พุตขอบเขตรุ่นที่ไม่ดี (รูปที่ 1)

เท่าที่ฉันได้รับในเวลานั้น - ฉันเห็นว่ามีบางอย่างอยู่ที่นั่น แต่ไม่รู้จริงๆว่าจะ 'ถอดรหัส' ได้อย่างไร

ตั้งแต่เปิดใช้งาน Coffee Machine IoT ฉันก็รู้สึกสนใจที่จะลองอีกครั้งโดยตั้งใจมากขึ้นในครั้งนี้

ฉันโพสต์ผลการวิจัยของฉันที่ฟอรัม EEVBlog เพื่อดูว่ามีใครสามารถให้ความกระจ่างได้บ้างและชายผู้ยิ่งใหญ่ชื่อเอียนมาช่วยฉัน - เขาอธิบายในลักษณะที่เหมาะสมอย่างสมบูรณ์ (รูปที่ 2)

โดยพื้นฐานแล้ว สตรีมข้อมูลคือ 'อนุกรมมาตรฐาน' 13 ไบต์ - 8 บิตข้อมูล หนึ่งบิตเริ่มต้นและหนึ่งบิตหยุด (ไม่มีพาริตี) แต่ที่อัตรา baud ที่ต่ำมากที่ 104bps

ขั้นตอนที่ 2: มองให้ลึกขึ้น

มองลึกขึ้น
มองลึกขึ้น

ตอนนี้ เมื่อฉันมีความคิดเกี่ยวกับการจัดรูปแบบข้อมูลแล้ว ฉันต้องการวิธีที่จะอ่านข้อมูลในรูปแบบไดนามิกมากขึ้น

ฉันดึงตัวควบคุมของฉันออกจากผนังและเชื่อมต่อผ่านตัวเปลี่ยนระดับลอจิกไปยัง Arduino ด้วยภาพร่างอย่างง่าย ๆ เพื่ออ่านข้อมูล 13 ไบต์ผ่านพอร์ตอนุกรมของซอฟต์แวร์ที่กำหนดค่าที่ 104bps แล้วพิมพ์ออกมา:

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, **จริง ๆ แล้ว 12 ไบต์ที่นี่

เรามีการกระทำ!

จากนั้นเปลี่ยนการตั้งค่าต่างๆ บนคอนโทรลเลอร์ ฉันสามารถคำนวณไบต์ที่เปลี่ยนแปลงได้:

168, 3, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, พัดลม LOW168, 35, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 248, พัดลม MED 168, 67, 0, 0, 0, 192, 3, 31, 0, 0, 0, 0, 152, พัดลมสูง

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, โหมดพัดลม 168, 79, 0, 0, 0, 136, 10, 35, 0, 0, 0, 0, 249, โหมด AUTO 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, โหมดCOOL 168, 83, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 225, โหมด HEAT 168, 7, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 61, โหมดDH

168, 15, 0, 0, 0, 136, 3, 34, 0, 0, 0, 0, 49, อุณหภูมิ18 168, 15, 0, 0, 0, 136, 4, 34, 0, 0, 0, 0, 48, อุณหภูมิ 19 168, 15, 0, 0, 0, 136, 5, 34, 0, 0, 0, 0, 51, อุณหภูมิ20 168, 15, 0, 0, 0, 136, 15, 34, 0, 0, 0, 0, 37, อุณหภูมิ30

ตัวเลขดูสมเหตุสมผลกว่ามากเมื่อคุณดูเป็นไบนารี่ แต่ไบต์ที่ 13 คืออะไร?? มีอยู่ทุกที่…

ขั้นตอนที่ 3: การทำแผนที่ออก

การทำแผนที่ออก
การทำแผนที่ออก

จากการลองผิดลองถูก ฉันสามารถระบุบิตที่เกี่ยวข้องใน 13 ไบต์ของข้อมูลที่ฉันจะต้องส่งได้

ขั้นตอนที่ 4: กำแพงอิฐข้างหน้า

กำแพงอิฐข้างหน้า!
กำแพงอิฐข้างหน้า!
กำแพงอิฐข้างหน้า!
กำแพงอิฐข้างหน้า!
กำแพงอิฐข้างหน้า!
กำแพงอิฐข้างหน้า!

นี่คือที่ที่มันซับซ้อน ฉันมีอุปสรรคสองอย่างที่ต้องเอาชนะ

a) ไบต์ที่ 13 ดูเหมือนจะเป็นเช็คซัมของข้อมูลที่ฉันต้องการเพื่อให้ได้ผลลัพธ์ b) ฉันจะส่งข้อมูลได้อย่างไร เป็นเพียงลวดเส้นเดียว

ปัญหา 'a' กลับกลายเป็นว่าง่ายจริงๆ แต่มันเป็นเรื่องบังเอิญที่ฉันสามารถผ่านมันไปได้

ในการทดสอบของฉัน ฉันกำลังดูข้อมูลเช่น: A802000000040F61000000004B A81200004004169A0000000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A85200084000149C00000000A7

นี่คือข้อมูล 13 ไบต์รวมถึงการตรวจสอบ (ที่นี่ใน HEX แทนที่จะเป็น DEC)

เมื่อฉันกำลังค้นหา oracle ที่เป็น google เกี่ยวกับ 'วิธีวิศวกรรมย้อนกลับ checksum' ฉันเจอหน้านี้ในการแลกเปลี่ยนสแต็คกับคนอื่นที่ชื่อ Nick ถามในสิ่งเดียวกับฉันมาก แต่ไม่เพียงแค่นั้นพวกเขาคุยกัน เกี่ยวกับเครื่องปรับอากาศและข้อมูลของพวกเขาเกือบจะเหมือนกันกับของฉัน - เป็นไปได้ไหม??? ในการค้นหาทั้งหมดของฉัน (ใน 4 ปีหรือมากกว่านั้น) ไม่มีใครโพสต์ข้อมูลใด ๆ เกี่ยวกับวิธีการแฮ็คโปรโตคอลบนเครื่องปรับอากาศเหล่านี้และฉันเพิ่งสะดุดกับใครบางคนที่ทำสิ่งเดียวกันโดยค้นหาบางสิ่งที่ไม่เกี่ยวข้องกันเกือบทั้งหมด? มันเป็นพร - เขายังโพสต์ว่าเขาทำงานออกมาและวิธีแก้ไขคือ: เพิ่มข้อมูลทั้งหมด Bytes แล้ว XOR ด้วย "U"

ด้วยสิ่งนั้นในมือ ฉันจึงเพิ่มมันลงในโค้ดของฉันเพื่อคำนวณว่าฉันคิดว่าเช็คซัมควรเป็นอย่างไร เทียบกับที่เป็นจริง แต่มันผิดทั้งหมด!!

ปรากฎว่ามันผิด เมื่อฉันเริ่มดูตัวเลขในเลขฐานสอง มันสมเหตุสมผลดี

การตอบสนองจาก 'XOR with U' จะส่งคืนข้อมูล 9 บิตเสมอ (บิตที่ 9 เสมอหนึ่ง) แต่บิตอื่นๆ ถูกต้อง ฉันแค่ลบบิตที่ 9 โดยเอา 256 จากจำนวนผลลัพธ์แล้วจับคู่ !!

ถ้าไม่ใช่สำหรับบุคคลนี้ ฉันอาจจะยังเกาหัวอยู่ ชื่นชมเขาเช่นกัน แต่ฉันติดต่อเขาไม่ได้ - นั่นเป็นโพสต์เดียวของเขาในฟอรัม stackexchange ขอบคุณคนแปลกหน้า:)

ความท้าทายต่อไปคือการสร้างวงจรที่อนุญาตให้ฉันจำลองตัวควบคุมที่มีอยู่ ฉันทำแผนผังสำหรับวงจรไดรฟ์ (Pic1 และ Pic 2) แต่ดูเหมือนซับซ้อนเกินไปสำหรับฉันที่จะต้องทำซ้ำเพื่อให้ได้สิ่งที่ฉันต้องการ ฉันอ่านสัญญาณแล้ว ฉันเลือกใช้วิธีที่ง่ายกว่ามาก - การใช้ Arduino เพื่อขับเคลื่อน opto isolator เพื่อดึงสายสัญญาณ 12v ให้ต่ำตามที่ต้องการ

ฉันยังออกแบบวงจรที่ง่ายกว่าสำหรับ Rx แต่สิ่งนี้ยังไม่ผ่านการทดสอบ ฉันลงเอยด้วยการใช้ตัวแปลงระดับเพื่อความเรียบง่าย

ขั้นตอนที่ 5: ทำให้มันใช้งานได้.

เมื่อฉันมีแผงวงจรส่งสัญญาณและด้วยหัวใจที่แข่งกันฉันก็จัดการสตริง (คงที่) ขนาด 12 ไบต์คำนวณการตรวจสอบและให้ Arduino ส่งคำสั่ง - น่าประหลาดใจที่จอแสดงผลได้รับการอัปเดต !!! ชนะ!

การทดสอบจริงขั้นสุดท้ายคือการเพิ่ม Arduino ของฉันลงใน BUS กับตัวควบคุมอีก 2 ตัวสำหรับการทดสอบจริงและแน่นอนว่ามันใช้ได้ผล

ตอนนี้ฉันสามารถอ่านและเขียนบนรถบัสได้ แต่ขาดความสามารถในการทำมันอย่างเรียบง่าย

เนื่องจากฉันใช้ MQTT เกือบทั้งหมดสำหรับระบบอัตโนมัติภายในบ้านทั้งหมดของฉัน จึงเป็นเรื่องปกติที่สิ่งนี้จะเหมือนกัน ฉันเขียนโค้ดออกมาเป็นเวลาหลายวันเพื่อควบคุมองค์ประกอบหลัก 4 อย่างของ AC และอ่านสถานะที่มีอยู่ (จากโมดูลอื่นๆ บน BUS)

ความตั้งใจที่จะให้โค้ดทำงานบนโมดูล ESP8266 อย่างไรก็ตาม ดูเหมือนว่า ESP8266 จะไม่สามารถสร้างอัตราบอดที่ต่ำถึง 104bps ได้ ฉันต้องเปลี่ยนกลับเป็น Arduino Uno ทั่วไปที่มี Wiznet ethernet แต่นั่นก็ไม่ยากเพราะชั้นวาง comms ของฉันอยู่อีกด้านหนึ่งของผนังจากตัวควบคุม AC ตัวใดตัวหนึ่ง

รหัสมีทั่วทุกที่ แต่ควรอ่านได้ชัดเจน ฉันมีปัญหามากมายในการป้องกันไม่ให้คอนโทรลเลอร์อ่านเอาต์พุตของตัวเอง แต่ยังทำซ้ำโค้ดซึ่งเป็นหัวข้อที่เผยแพร่ของตัวเองซึ่งได้รับจาก MQTT กลับไปที่เครื่องปรับอากาศ โดยพื้นฐานแล้ว มันจะสร้างการวนซ้ำที่ไม่สิ้นสุด ในท้ายที่สุด การล้างบัฟเฟอร์บางส่วนและความล่าช้าในการประมวลผลโค้ดหลังจากเผยแพร่ไปยัง MQTT ได้รับการจัดเรียง

Rx, Tx พินไปยัง AC มีรหัสเป็น 3, 4 แต่เปลี่ยนหากคุณต้องการ

รหัสได้รับการกำหนดค่าให้เผยแพร่และยอมรับคำสั่งดังนี้:

ha/mod/5557/P 0/1 - Powerha/mod/5557/M 0/1/2/3/4 - โหมด Cool, Dehumidify, พัดลม, อัตโนมัติ, Heatha/mod/5557/F 0/1/2 - Fan low, med, highha/mod/5557/Z ie 1111 for all zones on 1000 for just zone 1 on.

**จากคอนโทรลเลอร์ ไม่สามารถตั้งค่าโซนเป็น '0000' ได้ แต่ดูเหมือนว่าหากคุณตั้งค่า โซนจะเปลี่ยนกลับเป็น '1000'

รหัสเวอร์ชันล่าสุดมีอยู่ใน GitHub Repo ของฉัน:

ขั้นตอนที่ 6: บางสิ่งที่ถาวรกว่านี้

บางสิ่งบางอย่างถาวรมากขึ้น
บางสิ่งบางอย่างถาวรมากขึ้น
บางสิ่งบางอย่างถาวรมากขึ้น
บางสิ่งบางอย่างถาวรมากขึ้น

ฉันรวบรวมบอร์ดต้นแบบ Arduino และติดตั้งชิ้นส่วนทั้งหมดในขณะที่ฉันใส่บอร์ดไว้

ขั้นตอนที่ 7: การกำหนดค่า OpenHAB

ดูไฟล์แนบสำหรับรายการ OpenHAB แผนผังเว็บไซต์และกฎ

เมื่อรวมสิ่งนี้เข้ากับการผูก IFTTT OpenHab และ Google Assistant/Home แล้วคุณมีเครื่องปรับอากาศที่ควบคุมด้วยเสียงและ/หรือ 'อัจฉริยะ' ที่ควบคุมด้วยเสียงที่ทรงพลังซึ่งเหนือกว่าผลิตภัณฑ์ที่มีจำหน่ายในท้องตลาดเกือบทุกชนิด!

ขั้นตอนที่ 8: สรุป

สรุป - หากคุณเป็นคนยากจนที่มีเครื่องปรับอากาศแบบแยกส่วน LG รุ่นเก่ากว่าเล็กน้อย คุณไม่ได้อยู่คนเดียว ยังมีความหวังสำหรับเรา!

ฉันหวังว่าผู้สอนนี้จะพบคนที่ต้องการมันมากเท่ากับฉัน โดยพื้นฐานแล้วไม่มีข้อมูลที่ฉันสามารถหาได้ (นอกเหนือจากเช็คซัมจาก 'Nick') ฉันต้องเริ่มต้นจากศูนย์ แต่ฉันดีใจกับผลลัพธ์ที่ได้

ข้อมูลค่อนข้างคลุมเครือฉันรู้ แต่ถ้าคุณอยู่ในสถานการณ์เดียวกับฉัน ฉันยินดีที่จะช่วยเหลือมากกว่า

-- ข้อควรระวัง / อัปเดต --- แม้ว่าจะเป็นไปได้ที่จะเปลี่ยนการตั้งค่าใน AC โดยที่เครื่องปิด แต่ฉันพบว่าเมื่อมาถึงตัวควบคุมโซน ดูเหมือนว่าจะยุ่งกับมัน ฉันทำการทดสอบหลายครั้งโดยปิดเครื่อง และพบว่าโซนจะแสดงเป็นไม่ทำงาน แต่เมื่อเครื่องทำงาน ดูเหมือนว่าแดมเปอร์ไม่ได้ปิดจนสุด (แต่ยังไม่เปิดจนสุด) ฉันรีเซ็ตเครื่องที่เบรกเกอร์หลักและสิ่งนี้สามารถแก้ไขปัญหาได้ เนื่องจากเปลี่ยนเฉพาะโซนเมื่อเปิดเครื่อง จึงไม่เป็นปัญหา

ฉันยังอัปเดตโค้ดเพื่อเผยแพร่ (เป็น MQTT) การเปลี่ยนแปลงที่มาจากตัวควบคุมหลักเท่านั้น ไม่ใช่ยูนิตหลัก อีกครั้ง สิ่งนี้อาจทำให้เกิดปัญหาได้ เนื่องจากยูนิตหลักจะส่ง '0000' สำหรับโซน (ซึ่งอาจเป็นปัญหาได้เช่นกัน)

โค้ดที่อัปเดตยังแนะนำข้อจำกัดด้านเวลาบางอย่างเพื่อพยายามป้องกันไม่ให้ Arduino ส่งสัญญาณพร้อมกันของมาสเตอร์และยูนิตหลัก ฉันแน่ใจว่าอาจมีวิธีที่ตัวควบคุมใช้ในการเริ่มต้นการส่งข้อมูล เช่น ดึงบรรทัดให้ต่ำสำหรับ Xms ก่อนส่ง แต่ฉันยังไม่ได้ค้นพบหากมี

ฉันค้นพบว่ายูนิตหลักจะส่งข้อมูลทุกๆ 60 วินาที และตัวควบคุมหลักจะส่งทุกๆ 20 วินาที รหัสพยายามระงับการส่งข้อมูลภายใน 2 วินาทีหลังจากได้รับแพ็กเก็ตข้อมูล อย่างไรก็ตาม บางครั้งหน่วยหลักและหน่วยหลักส่งใกล้กันมาก นี้อาจจะได้รับการขัดเกลาในเร็ว ๆ นี้ ------------------------------------

**อาจทำงานในหน่วยที่ใหม่กว่า

*** ข้อมูลบางส่วนที่พบในการเดินทางเพื่อการวิจัยของฉันระบุว่า Panasonic ducted split อาจใช้โปรโตคอลเดียวกัน วายเอ็มเอ็มวี

แนะนำ: