Оглавление:

Взлом LG Ducted Split для домашней автоматизации: 8 шагов (с изображениями)
Взлом LG Ducted Split для домашней автоматизации: 8 шагов (с изображениями)

Видео: Взлом LG Ducted Split для домашней автоматизации: 8 шагов (с изображениями)

Видео: Взлом LG Ducted Split для домашней автоматизации: 8 шагов (с изображениями)
Видео: Начало работы с Home Assistant: все, что вам нужно, это Raspberry Pi 2024, Ноябрь
Anonim
Взлом LG Ducted Split для домашней автоматизации
Взлом LG Ducted Split для домашней автоматизации

Прежде всего - это не очередной хакерский взлом для эмуляции инфракрасного пульта ДУ. Мой конкретный кондиционер не имеет удобного интерфейса, предназначенного для какого-либо вида управления, кроме встроенных интеллектуальных элементов управления на стене.

У меня дома есть реверсивная сплит-система LG Ducted. К сожалению, это было сделано в то время, когда IoT не занимал высоких позиций ни в одном списке производителей. Я обнаружил, что у него есть несколько вариантов «главного» управления, но даже несмотря на то, что устройству было всего 2 года на момент, когда я впервые попробовал это, платы расширения были анобтаническими, а цены в любом случае были астрономическими. Как и дополнение «Wireless RF Remote», которое упростило бы задачу, но было бы невозможным для покупки.

Если бы это был мой выбор, это был бы не LG, но поскольку он был установлен в доме, когда я его покупал (а его стоимость замены, вероятно, превысила бы 10 тысяч долларов), мне пришлось столкнуться с этим.

Цель - иметь возможность управлять AC через MQTT в целях автоматизации через OpenHAB и IFTTT / Google Assistant.

Шаг 1. Расшифровка формата данных

Расшифровка формата данных
Расшифровка формата данных
Расшифровка формата данных
Расшифровка формата данных

Я начал этот процесс 4 года назад, но не продвинулся далеко и не хотел рисковать повредить устройство - тем более, что запчасти для него найти почти невозможно.

Отрывая контроллер от стены, я обнаружил 3 провода, которые я определил как заземление, 12 В и «сигнал».

Напряжение сигнализации на линии передачи данных было 12 В, но я заметил, что на мультиметре оно, казалось, колебалось (какие-то импульсы на линии).

Я подключил базовую схему для управления оптоизолятором через контакт данных и подключил другую сторону оптоизолятора в качестве входа звуковой карты моего ПК и получил плохую версию выхода осциллографа (рис. 1).

Это примерно то, что я сделал в то время - я мог видеть, что там что-то есть, но на самом деле не знал, как это «расшифровать».

После включения IoT для кофемашины у меня появился новый интерес попробовать это еще раз, но на этот раз с большей решимостью.

Я разместил свои выводы на форумах EEVBlog, чтобы посмотреть, сможет ли кто-нибудь пролить свет, и мне на помощь пришел отличный парень по имени Ян - он изложил это так, чтобы это имело смысл (фото 2)

Обычно поток данных составляет 13 байтов «стандартного последовательного» - 8 бит данных, один стартовый бит и один стоповый бит (без контроля четности), но с ОЧЕНЬ низкой скоростью передачи 104 бит / с.

Шаг 2: Заглянем глубже

Глядя глубже
Глядя глубже

Итак, теперь, когда у меня было представление о том, как были отформатированы данные, мне понадобился способ более динамичного чтения данных.

Я снял один из своих контроллеров со стены и подключил его через переключатель логического уровня к Arduino с помощью простого эскиза, чтобы прочитать 13 байтов данных через программный последовательный порт, настроенный на 104 бит / с, и распечатать его:

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, вентилятор LOW 168, 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, Fan ВЫСОКИЙ

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, режим FAN 168, 79, 0, 0, 0, 136, 10, 35, 0, 0, 0, 0, 249, режим АВТО 168, 67, 0, 0, 0, 136, 3, 35, 0, 0, 0, 0, 204, режим ОХЛАЖДЕНИЕ 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: Впереди кирпичная стена

Впереди кирпичная стена!
Впереди кирпичная стена!
Впереди кирпичная стена!
Впереди кирпичная стена!
Впереди кирпичная стена!
Впереди кирпичная стена!

Здесь все усложнилось. Мне нужно было преодолеть два препятствия

а) 13-й байт оказался контрольной суммой данных, которые мне нужно было как-то обработать. б) Как мне передать данные? Это всего лишь один провод.

Проблема «а» оказалась ДЕЙСТВИТЕЛЬНО простой, но мне удалось ее пройти по чистой случайности.

В своих тестах я рассматривал такие данные, как: A802000000040F61000000004B A81200004004169A00000000FB A81200004004159A00000000F8 A81200004004149A00000000E5 A81200084000149C00000000E7 A83200084000149C0000000087 A852000000084000149

Это 13 байтов данных, включая контрольную сумму (здесь в HEX вместо DEC).

Когда я искал оракул, то есть Google, на тему «как перепроектировать контрольную сумму», я наткнулся на эту страницу об обмене стеками с кем-то еще по имени Ник, спрашивающим почти то же самое, что и я, но не только это, они говорили о кондиционере, и их данные были почти идентичны моему формату - Может ли это быть ??? За все мои поиски (примерно за 4 года) ни один человек не опубликовал никакой информации о том, как взломать протокол на этих кондиционерах, и я случайно наткнулся на кого-то, кто делает то же самое, ища что-то почти совершенно не связанное с этим? Это было благословением - он даже написал, что разработал это, и решение было: сложить все байты данных, а затем выполнить XOR с «U».

Имея это в руках, я добавил его в свой код, чтобы вычислить, какая, по моему мнению, должна быть контрольная сумма, по сравнению с тем, чем она была на самом деле, но все это было НЕПРАВИЛЬНО !!

Как оказалось, это было неправильно. Когда я начал рассматривать числа в двоичном формате, это имело смысл.

Ответ от «XOR с U» всегда возвращал 9 бит данных (9-й бит всегда один), но остальные биты были правильными. Я просто удалил 9-й бит, взяв 256 из полученного числа, а затем он совпал !!

Если бы не этот человек, я бы все еще чесал в затылке. Снимаю шляпу перед ним, но я не могу с ним связаться - это, по сути, его единственный пост на форуме stackexchange. Ну спасибо незнакомец:)

Следующей задачей было создание схемы, которая позволила бы мне смоделировать существующий контроллер. Я составил схему приводной цепи (рис. 1 и рис. 2), но она показалась мне слишком сложной, чтобы мне пришлось воспроизводить ее, чтобы получить то, что я хотел. В конце концов, я уже читал сигнал. Я выбрал гораздо более простой метод - использование Arduino для управления оптоизолятором, чтобы при необходимости понизить уровень сигнала на 12-вольтовой линии.

Я также разработал более простую схему для Rx, но она не тестировалась, поэтому для простоты я остановился на преобразователе уровня.

Шаг 5: заставить его работать

После того, как у меня была макетная схема передачи и с бешено колотящимся сердцем, я исказил (статическую) строку из 12 байтов, вычислил контрольную сумму и послал команду arduino - удивительно, но дисплей обновился !!! Победить!

Последним фактическим тестом было добавление моего arduino к шине с двумя другими контроллерами для реального живого теста, и, конечно же, это сработало.

Итак, теперь я мог читать и писать в шину, но просто не мог делать это просто.

Поскольку я использую MQTT почти исключительно для всей домашней автоматизации, было естественно, что это будет то же самое. Я писал код в течение нескольких дней для управления 4 основными элементами AC, а также считывал существующий статус (от других модулей на шине)

Намерение состояло в том, чтобы код работал на модуле ESP8266, однако могло показаться, что ESP8266 не может обеспечить такую низкую скорость передачи, как 104 бит / с. Мне пришлось вернуться к обычному Arduino Uno с Wiznet Ethernet, но это было несложно, так как моя стойка связи находилась буквально по другую сторону стены от одного из контроллеров переменного тока.

Код немного разбросан, но должен быть разборчивым. У меня было много проблем с предотвращением чтения контроллером собственного вывода, а также с повторением кода в собственных опубликованных темах, полученных от MQTT, обратно в кондиционер. По сути, это создаст бесконечный цикл. В конце концов, некоторая очистка буфера и задержки в обработке кода после публикации в MQTT помогли ему разобраться.

Контакты Rx, Tx к AC имеют код 3, 4, но измените их, если хотите.

Код настроен на публикацию и прием команд как таковых:

ha / mod / 5557 / P 0/1 - Powerha / mod / 5557 / M 0/1/2/3/4 - Mode Cool, Dehumidify, Fan, Auto, Heatha / mod / 5557 / F 0/1/2 - Fan low, med, highha / mod / 5557 / Z т.е. 1111 для всех зон на 1000 только для зоны 1 вкл.

** С контроллера зоны не могут быть установлены на «0000», однако может показаться, что если вы введете значение, оно вернется к «1000».

Последняя версия кода доступна в моем репозитории GitHub:

Шаг 6: что-то более постоянное

Что-то более постоянное
Что-то более постоянное
Что-то более постоянное
Что-то более постоянное

Я собрал макетную плату Arduino и установил все детали, как я уже сделал.

Шаг 7: OpenHAB Config

См. Прикрепленный файл для элементов OpenHAB, карты сайта и правил

Объедините это с привязкой IFTTT OpenHab и Google Assistant / Home, и вы получите очень мощный голосовой и / или «умный» кондиционер, который превосходит почти все коммерчески доступные продукты!

Шаг 8: Резюме

В заключение - если вы один из бедняков с немного более старым канальным сплит-кондиционером LG, вы не одиноки. У нас еще есть надежда!

Я надеюсь, что эта инструкция найдет кого-нибудь, кому она нужна так же, как и мне. Фактически нет никакой информации, которую я мог бы найти (кроме контрольной суммы от «Ника»). Пришлось начинать с нуля, но я в восторге от результата.

Информация немного расплывчата, я знаю, но если вы окажетесь в той же ситуации, что и я, я буду более чем готов помочь.

- Предостережение / Обновление --- Хотя можно изменить настройки переменного тока при выключенном устройстве, я обнаружил, что, когда дело доходит до управления зоной, кажется, что это не так. Я провел много тестов с выключенным устройством и обнаружил, что зоны будут отображаться как неактивные, но когда устройство работает, кажется, что заслонки не полностью закрыты (но и не полностью открыты). Я перезагрузил блок на главном выключателе, и это решило проблему. Поскольку смена зон только при включенном устройстве, это не было проблемой

Я также обновил код, чтобы публиковать (в MQTT) только те изменения, которые поступают от главного контроллера, а не от основного модуля. Еще раз, это может вызвать проблемы, потому что основной блок отправит «0000» для зон (что также могло быть проблемой)

Обновленный код также вводит некоторые временные ограничения, чтобы попытаться предотвратить одновременную передачу Arduino ведущего и основного блока. Я уверен, что, вероятно, есть метод, который контроллер использует для инициирования отправки данных, например, вытаскивание линии для Xms перед отправкой, но я еще не обнаружил его, если он есть

Я обнаружил, что основной блок будет отправлять данные каждые 60 секунд, а главный контроллер - каждые 20 секунд. Код пытается остановить отправку данных в течение 2 секунд после получения пакета данных. Однако иногда ведущее и основное устройство осуществляют передачу очень близко друг к другу. Вероятно, в ближайшее время это будет уточнено.----------------------------

** Может работать на новых устройствах

*** Некоторая информация, найденная в моих исследовательских поездках, указывает на то, что раздельный воздуховод Panasonic может использовать тот же протокол. YMMV.

Рекомендуемые: