Анализ пульта кондиционера

LEOWRS
Offline
Зарегистрирован: 08.08.2018

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

Естественно одна из функций умного дома — управление климатом, и кондиционерами в частности. У меня однотипные древние кондиционеры под маркой Zephir, гуглить которую бесполезно, и разумеется никаких smart функций там нет и быть не может, соответственно единственный вариант делать эмуляцию пульта.

Чтобы считать, что же там передает пульт, зацепил к Arduino датчик KY-022, поставил библиотеку irremote и залив банальный пример, получил довольно приличный объем данных, передаваемый от пульта к кондиционеру.

Encoding : SANYO

Code : FFFFFFFF (0 bits)

Timing[97]: 

+ 650, -3350 + 650, -3350 + 650, -3350 + 650, -3350

+ 650, -1400 + 600, -3350 + 650, -3350 + 650, -3300

+ 650, -1400 + 600, -1400 + 650, -1400 + 600, -1400

+ 600, -3350 + 650, -1400 + 600, -1400 + 650, -1500

+ 600, -1350 + 650, -3350 + 650, -3350 + 650, -1400

+ 600, -1400 + 600, -1450 + 600, -3350 + 650, -1350

+ 600, -3400 + 600, -1400 + 650, -1400 + 600, -3350

+ 650, -3350 + 650, -3350 + 650, -1400 + 600, -3350

+ 600, -1400 + 650, -3350 + 650, -1400 + 600, -3350

+ 650, -1400 + 600, -3400 + 600, -1400 + 600, -1350

+ 650, -3350 + 650, -1350 + 650, -3350 + 650, -1400

+ 600, -3400 + 600, -1400 + 600, -3400 + 600, -3300

+ 600

Этот результат дал понять, что в реальности Zephir это как минимум по части электроники SANYO, и что даже если затея провалится, на алиэкспресс легко можно будет заказать пульты ZH/LW-03, так как из четырех один сломался и один потерялся.

Второй очевидный момент, который предполагался и ранее, так как настроенный в одной комнате на 25 градусов пульт, кнопкой ВКЛ передавал настройки температуры, заключается в том, что пульт передает не команды в режиме «ВКЛ-ВЫКЛ», «увеличить-уменьшить температуру», а весь пакет настроек, то есть режим работы «обогрев-охлаждение-осушка-автомат», скорость вентиляторов, температуру и т.д. одним пакетом.

Поковыряв исходник и найдя там константу под названием USECPERTICK, наводящую на мысль о том, что цифры в результате это микросекунды (для информации в 1 секунде 1000000 микросекунд).

Очевидно, что китайский пульт, читаемый землячкой ардуиной через датчик, который тоже им земляк, имеет определенную погрешность, и по факту из всего ряда цифр есть +600(650), а так же -1400 и -3400 с погрешностью до 100 микросекунд.

Появилась мысль, что всё, что + это фиксированные разделители данных, а минуса, то есть когда инфракрасный светодиод не горит — это собственно данные, где по логике 3400 это единица, а 1400 это ноль.

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



[97] = {111101110000100001100010100111010101010010101011}; - включение

[97] = {111101110000100001110010100011010101010010101011}; - выключение




То есть, очевидно 20 и 28 биты отвечают за включение и выключение, а поскольку «хвост» не изменился, значит контрольная сумма похоже не использует, хотя не факт, что контрольная сумма не в 28 или 20 бите, иначе зачем менять два бита для состояния ON-OFF. Сразу скажу, заметка эта пишется по ходу экспериментов.

Вторая, очевидная штука — это установленная температура, которая на пульте выставляется от 18 до 30 градусов, и нажав пульт, опуская с 30 до 18 получилась вот такая картинка, сильно сомневаюсь, и даже надеюсь, что температуры на каждый режим отдельно протоколе общения пульта и кондея нет, но увидим. Результат от 30 до 18 выглядит следующим образом:



[97] = {111101110000100001100100100110110101010010101011}; - 30С

[97] = {111101110000100001101100100100110101010010101011};

[97] = {111101110000100001100010100111010101010010101011};

[97] = {111101110000100001101010100101010101010010101011};

[97] = {111101110000100001100110100110010101010010101011};

[97] = {111101110000100001101110100100010101010010101011};

[97] = {111101110000100001100001100111100101010010101011};

[97] = {111101110000100001101001100101100101010010101011};

[97] = {111101110000100001100101100110100101010010101011};

[97] = {111101110000100001101101100100100101010010101011};

[97] = {111101110000100001100011100111000101010010101011};

[97] = {111101110000100001101011100101000101010010101011};

[97] = {111101110000100001100111100110000101010010101011}; - 18С

Очевидно, что с 21 по 24 бит и 29 по 31 идет управление температурой, но так же очевидно, что если бы это была оригинальная бинарная система, то через строчку менялся бы последний бит, а меняется первый, что наталкивает на мысль что мы имеет дело с инверсией бинарной системы, которая логична, так как пульт пишет в стэк, а стэк это топка тарелок, где первая сложенная, вытирается последней.

С битами 21-24 инвертируя первую строку как 0010 получаем в десятичном значение 2, а инвертируя 0111 получаем 14 в DEC. Соответственно температура задается как 32-<требуемая температура> в инвертированном бинарном варианте.

С битами 29-32, похоже опять инверсия, 18 градусов записано как 0001 (то есть 1), 30 градусов как 1101 = 13, тут опять пазл сошелся, формула температуры получилась как <требуемая температура>-17, преобразованная в бинарную систему и инвертированная.

Проверяем теорию с режимами и температурами, меняя режимы «охлаждение, нагрев и осушка», при температуре 30 градусов, получаем следующие записи:



[97] = {111101110000100001100100100110110101010010101011};

[97] = {111101110000100011000100001110110101010010101011};

[97] = {111101110000100010100100010110110101010010101011};

Синим отмечена температура 30С, которая не зависит от режима, режимы же меняются 17-19 битах и в 25-27, и с ними всё просто, записать, что в 011-100 в этих диапазонах — это охлаждение, 110-001 — это обогрев, а 101-010 это осушка.

Остается разобраться еще с несколькими кнопками, а именно econom, уровень мощности вентилятора и hi power, которая походу антипод эконому.

Тестируем Air Flow:



[97] = {111101110000100001100100100110110101010010101011}; - автомат

[97] = {111111110000000001100100100110110101010010101011}; - пол силы

[97] = {111011110001000001100100100110110101010010101011}; - по максимуму

Тут на 4-5 и 12-13 битах очевидно прослеживается инверсия значений, хотя она же, кстати, если чуть выше взглянуть прослеживалась и на режимах, просто там она была не так заметна, походу вместо контрольной суммы используется задвоение инвертированных бинарных данных, и она же кстати применяется для контроля корректности температуры, так что зря я формулы выводил.

Экономичный режим.



[97] = {111101110000100001100100100110110101010010101011}; - обычный режим

[97] = {111100100000110101100100100110110101010010101011}; - экономичный режим

Тут даже комментировать по сути нечего, 6-8 бит, инвертированный на 14-16ых, в варианте 111-000 дает норму, 010-101 дает экономию, а на практике заставляет тупить кондей и заставляет потеть коженого ублюдка.

Смотрим управление скоростью вентиляторов, честно говоря я до конца не вкурил чем Air Flow отличается от Fan Speed, но кнопки разные и кондей ведет себя реально иначе.



[97] = {111101110000100001100100100110110101010010101011}; - автомат

[97] = {111100110000110001100100100110110101010010101011}; - вентиляторы на полную

[97] = {111101010000101001100100100110110101010010101011}; - средний уровень

[97] = {111100010000111001100100100110110101010010101011}; - низкий уровень мощности

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

Остался HiPower.



[97] = {111101110000100001100100100110110101010010101011}; - обычный режим

[97] = {111101100000100101100100100110110101010010101011}; - HiPower

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

Код для этой штуки писать не буду, меня тут уже на форуме профильном опускали, что дескать я «лох в стрингах», не в смысле чтобы пидером обозвали, а в смысле, что типа String в С++ использовал. Но на том же профильном форуме, уж простите, ничего кроме как «записать данные кнопки пульта» с вопросом «почему не могу воспроизвести?», без попытки разобраться как формируется код пульта, я лично не нагуглил.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Маладца!

Но вопросик остался. А на йух разбираться как формируется сигнал? Почему ты не можешь записать данные кнопки и воспроизвести? Результат-то тоже, так на йух трахаться?

LEOWRS
Offline
Зарегистрирован: 08.08.2018

Потому, что пульт кондея не имеет кода кнопки, как пультик ардуинки. Записывать все возможные сигналы, это 13 вариантов температуры * 3 варианта режима работы * 4 варианта работы вентиляторов * 2 экономии * 2 хайпаувер, плюс код выключения, итого в скетче надо держать 625 записанных сигнала, записать которые работа рутинная но по времени не меньше чем разобраться с формированием.

Конечно можно по тупому записать 3 команды, типа "выкл", "обогрев 30 градусов", "охлаждение 18 градусов", и врубать и вырубать эти режимы, ориентируясь на замеры температуры ардуиной, но комфорта от такой автоматизации не будет, и в первую же ночь в спальне, после 100500 циклов ключения-выключения кондея, плюс из-за шума на максималке, захочется демонтировать эту хрень.

 

lean_74
Offline
Зарегистрирован: 22.12.2015

как говорит "Ворота", а на иух нужно столько кнопок запоминать, мне хватает двух: Вкл, Выкл., а температура всегда одна и таже комфортная для сна стоит? 

LEOWRS
Offline
Зарегистрирован: 08.08.2018

Во-первых, вопросы по большому счету из цикла "нахрена париться, купил смарт кондей и нет проблем", ну или "нахрена автоматизация, взял пульт, подошел и включил". ИМХО иметь библиотеку которая может включить кондей в любом режиме лучше чем не иметь таковой, а разобраться с протоколом данных - легкая разминка для мозгов.

Во-вторых, как я писал в самом начале, у китайского пульта данные уходят не идеально, и приемник записывающий сигнал работает не идеально, как результат погрешность на уровне записи получается до 10%, при попытке повторить, повторяется и погрешность, и если в оригинале пауза должна быть 650, считана как 600, то в итоге передана-принята повторно может быть как 550 или даже 500, и в результате сигнал не будет обработан.

В-третьих, лично мне надо много режимов, потому как кондеев 4 штуки, в разное время года я их включаю по разному в разных помещениях, да и просто приятно иметь полную копию функций пульта на планшете через веб, а не просто "вкл-выкл". Если говорить про сон, конкретно, то нет, не одна, днем спальня летом прогревается как котел в аду, поэтому перед сном надо бы включить на 20 минут +18 на полную мощность, когда лег спать +26 в экономе на минимуме вентиляторов (чтобы не жужжали), часа в 2-3 ночи в зависимости от температуры за бортом чаще всего лучше вообще выключить. Зимой другая история, почти обратная, спальню перед сном надо прогреть, центрального отобления нет и всю ночь держать оптимальный вариант, в идеале замеряя уровень шума вентиляторов, расхода электричества и КПД, в частности если за бортом упала температура ночью ниже нуля, то проще не гонять инвертор, а вырубить его нахрен, включив элетрический обогрев теплого потолка, пола или банальный радиатор... И это только спальня, с кабинетом история совсем другая, в гостинной тоже свои алгоритмы, гостевая обычно живет в режиме "лишь бы инием не покрылась", но когда гости приезжают надо там климат нормальный включать.

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