Перевести записанное значение ИК кода в MSW в код

Добрый день!

Не могу разобраться с описанием работы записи ИК команд в WB-MSW v.4

Согласно описанию
https://wirenboard.com/wiki/index.php/WB-MSx_Consumer_IR_Manual

Cигнал хранится в памяти устройства виде последовательности натуральных чисел (каждое от 0 до 65535), где каждое число - продолжительность логического 0 или 1 в сигнале в квантах по 10 микросекунд. Следовательно, максимальная продолжительность каждого нуля или единицы должна быть не более 65535 * 10 мкс = 655350 мкс = 0,655 секунд . Первое число последовательности — длительность первой логической единицы. Конец последовательности маркируется двумя периодами продолжительностью 0.

Но это не понятно.
В ИК сначала светодиод светит с какой-то длительностью (которую же надо записать?), потом пауза какой-то длительности.
Единица при этом это сигнал + пауза (при чем есть разные варианты и разные протоколы, единица может быть и пауза-сигнал-сигнал-пауза и т.п.).
Первое слово у вас описано как “единица”. Это что значит?

Далее вопрос, как перевести записанный в RAM сигнал в код?
Читая одну и ту же команду с пульта получаешь разные значения. Но это понятно (то же не совсем), например первым словом может быть и 0x133 и 0x134 … и похоже от 0х130 до … 0х137 (но бывает и 0х13с) - это одна и та же длительность и это … “1”? А что тогда значение больше?

Или 0x0133 0x0132 - это длительность сигнала и длительность паузы за ним, и тогда это 1[0](первые два слова примерно одинаковой длины), следующие два слова 0x0131 0x01bb это уже 0 (сигнал той же длины, а затем пауза большей длины) ?
Но тогда что такое 0x0036 0x0036 - очень маленький сигнал и пауза затем?

В общем, непонятно, что именно и как записывает ваш передатчик (чтобы понять как потом это перевести в код посылки).

Пример кода (с завершающими нулями):

0x0133 0x0132 0x0131 0x01bb 0x0036 0x00a5 0x0036 0x0036 0x0036 0x00a6 0x0035 0x0037 0x0036 0x0036 0x0036 0x00a5 0x0036 0x00a6 0x0035 0x0037 0x0036 0x00a5 0x0036 0x0037 0x0035 0x0037 0x0036 0x00a5 0x0036 0x00a5 0x0036 0x0037 0x0035 0x00a6 0x0035 0x0037 0x0036 0x00a5 0x0036 0x0037 0x0035 0x00a6 0x0036 0x0036 0x0036 0x00a5 0x0036 0x00a6 0x0035 0x00a6 0x0035 0x0037 0x0036 0x0036 0x0036 0x0037 0x0035 0x0037 0x0036 0x0036 0x0036 0x0037 0x0035 0x0037 0x0035 0x0037 0x0036 0x0036 0x0036 0x0037 0x0035 0x00a6 0x0036 0x00a5 0x0036 0x0037 0x0035 0x00a6 0x0035 0x0037 0x0036 0x0036 0x0036 0x0037 0x0035 0x00a6 0x0035 0x0037 0x0036 0x00a5 0x0036 0x0037 0x0035 0x0037 0x0036 0x0036 0x0036 0x0037 0x0035 0x0037 0x0035 0x0037 0x0036 0x0037 0x0035 0x0037 0x0035 0x0037 0x0036 0x0036 0x0036 0x0037 0x0035 0x0037 0x0035 0x0037 0x0036 0x00a5 0x0036 0x0037 0x0035 0x003a 0x0033 0x0036 0x0036 0x0037 0x0033 0x0039 0x0035 0x003a 0x0033 0x0039 0x0033 0x0037 0x0035 0x0037 0x0036 0x0039 0x0033 0x0037 0x0035 0x003a 0x0030 0x0039 0x0036 0x0037 0x0033 0x0039 0x0035 0x003a 0x0033 0x0039 0x0031 0x003b 0x0033 0x0037 0x0033 0x003a 0x0032 0x003c 0x0031 0x0039 0x0033 0x003c 0x0030 0x003c 0x0031 0x003b 0x0031 0x003c 0x0030 0x003c 0x0031 0x003b 0x0031 0x003c 0x0030 0x003c 0x0030 0x003c 0x0031 0x003b 0x0031 0x003c 0x0030 0x003c 0x0031 0x003b 0x0031 0x003c 0x0030 0x003c 0x0030 0x003c 0x0031 0x003c 0x0030 0x003c 0x0030 0x003c 0x0031 0x003c 0x0030 0x003c 0x0030 0x003c 0x0031 0x00aa 0x0031 0x003c 0x0030 0x00ab 0x0030 0x003c 0x0031 0x00aa 0x0031 0x00ab 0x0030 0x00ab 0x0030 0x00ab 0x0031 0x003b 0x0031 0x00ab 0x0030 0x00ab 0x0030 0x0000 0x0000 

Не разбирался, не в курсе. Но интуитивно это последовательность 1 и 0, при чем сначала идёт 1, затем 0. И так всегда. Если у вас, как вы пишите, сигнал+сигнал+пауза, значит это 1+1+0, а 1+1 есть длинная 1, между ними же нет нуля.

Судя по всему они тупо записывают код посылки - 0 и 1. Нет привязки к какому-либо протоколу. Просто считали 1, записали ее длительность, считали 0, записали длительность, и повторяют 1 в 1. В чуток разные цифры, потому что длительность по квантам прыгает. Но я думаю это не критично - свет тоже может хитро переотражаться, засвечиваться, принимался под разным углом, и в жизни идеального сигнала тоже не будет, поэтому приемник поймет.

Кодирование 0 и 1 зависит от длительности.
Что такое “1” в инструкции - совершенно непонятно.
Предполагаю, что записывается следующая последовательность:

  • Длительность (квантами по 10 микросекунд) когда есть на входе ИК сигнал
  • Длительность когда на входе пусто
  • Длительность (квантами по 10 микросекунд) когда есть на входе ИК сигнал
  • Длительность когда на входе пусто
  • Длительность когда на входе пусто
  • Длительность (квантами по 10 микросекунд) когда есть на входе ИК сигнал
  • нули
  • нули
  • ? (по факту тоже нули)
    Так как точность довольно высокая, длительность плавает. Да и вообще, ноль это или единица зависит от соотношения паузы и сигнала (и обычно 1 к 3 - это единица, а когда сигнал и пауза по длительности совпадают - ноль).

В моем случае получается сначала какая-то посылка повышенной длительности:
2х сигнал
2х пауза
2х сигнал
3х пауза

После чего начинается “обычное кодирование”
1х сигнал
1х или 3х пауза (соответственно либо 0, либо 1)

Получается посылка из 14 байт (из которых 6 нулевые вообще)

Сейчас думаю как написать простейший декодер, чтобы понять насколько правда … и вычислить где какой параметр. Сейчас беспокоит, что есть последний сигнал, недоделанный, болтающийся в воздухе(не ноль и не 1, так после него ничего нет … теоретически это 0).
И, по идее, должна быть и контрольная сумма.

P.S. Кондиционер Haier и описания я не нашел в гуглах никакого, даже на адруинках …

В общем, мое предположение верное.

Что имеет ввиду документация под единицей - вообще непонятно (вероятно, состояние внутреннего регистра, который находится в единице, когда есть сигнал от ИК хоть какой-нибудь, что не имеет никаког отношения ни к каким внешним устройствам и их единицам)

Длительности округлил, первые последовательности отбрасывают (видимо что-то типа магического пакета)
Получается в каждом пакете 14 байт.
Последний байт CRC сумма (и по трем записанным пакетам в MSW бьется)

Есть странности.
Включение и выключение не в первом байте (но остальные полностью совпадают, кроме контрольного), а в пятом. При чем меняется не один бит …
А выключение подсветки экрана меняет последний тринадцатый байт и … новое значение в пятом байте (но тут есть какая-то логика, состояние кондиционера не меняется, он остается включенным)

В общем, декодирование того, что записано в MSW успешно получилось.
Документацию надо бы поправить чуточку.
Теперь нужно понять что какой байт делает и найти как бы все байты (нужно звук штатно бы отключить)

Сам MSW, конечно, нужно дорабатывать. Чтобы записать посылку в RAM останавливать RS, запускать отдельный скрипт, восстанавливать - это не дело, все должно быть … прямо из WEB контроллера. Тут в постах на эту тему часто пишут, что медленно, но по факту все быстро … и все это дорабатывается …
Более того, если записывать не всю посылку, а только изменившиеся байты, это вообще очень быстро …
То что нет обучения по стандартным типам телевизоров, кондиционеров … оно в телефонах уже есть!, в китайских поделках на али, а у WB нет ни в каком виде … при этом есть ИК приемник!

Добрый день!

Занимаюсь вашим вопросом, мне понадобится ещё время на его изучение.

Однозначно, что единица, это световой сигнал излучения. У вас же запись ведётся всегда с 1. То есть свет пошел, начинаем считать. Тут как бы других вариантов быть не может)