Перевести записанное значение ИК кода в 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. То есть свет пошел, начинаем считать. Тут как бы других вариантов быть не может)

1 Like

Нет, инструкция вводит в заблуждение!
“Есть сигнал” - это не единица, и не ноль. У вас, во внутренней логике это может быть единицей, нулем или третьим состоянием … только пользователю от этого какой прок?

Единица при ИК излучении, это, например: пауза длительностью 1хT, затем сигнал длительностью 1хТ. А ноль, часто, это: пауза длительностью 3хТ, затем сигнал длительностью 1хТ.
Но может быть сложнее, может быть единица это пауза 1хТ, затем сигнал 1хТ, а ноль наоборот, сигнал 1хТ, а потом пауза 1хТ (в этом случае последовательность “10” у вас будет записана как: пауза длительностью 1хТ, затем сигнал длительностью 2хТ, а потом снова пауза 1хТ … и сигнал 2хТ вы считаете какой-то там единицей???

Вы пишите только и исключительно длительности сигнала и паузы последовательно, не квантуя их и запись у вас всегда начинается с сигнала и заканчивается сигналом (что логично, и что в жизни всегда так). Никаких единиц и нулей вы не пишите!!! А исключительно длительности: длительность сигнала, длительность паузы …,… длительность сигнала. Все!

При этом есть куча вопросов по самой записи …
По факту все сигналы и паузы квантуются. И используются длительности 1хТ, 2хТ и 3хТ (возможно, в некоторых случаях, может быть 4хТ и 5хТ, но я не видел такого в описаниях протоколов.
То есть нужно вычислить из всей последовательности 1хТ и усреднить его (а сделать это относительно легко) и записывать только в первом слове длительность Т, а затем битами: 1 есть сигнал, 0 нет сигнала длительностью Т.
Тогда обычная единица будет записана как “01”, а обычный ноль будет записан как “0001”, то есть место будет экономиться минимум 4 раза (на самом деле больше). А стартовая последовательность в моем случае будет записана как: “110011001” …
Что-то подобное вы делаете при “сжатии”, но по описанию именно подобное, что вы там вычисляете и что теряете - абсолютно непонятно, но “квант” - “единица времени” всегда и в любых ИК командах один, и все остальные длительности пляшут от него.

Также абсолютно непонятно, почему окончание последовательности два подряд 0x00? Зачем два? Ноль же в вашем случае в принципе не бывает! При этом в начале всегда сигнал и в конце всегда сигнал … то есть число нечетное. А регистров выделено четное кол-во. То есть в самом худшем сценарии вы не экономите целое слово, последнее четное слово всегда не используется …

Также абсолютно непонятно, почему нельзя подряд записать несколько последовательностей, разделяя их нулем? Взять тот же телевизор. Часто нужны именно последовательности и они очень короткие … почему из нельзя записать подряд, но разделить, чтобы была пауза между посылками и телевизор понял это как несколько последовательных команд?

Почему нельзя прямо из интерфейса записать команду в RAM и выполнить ее?
Нужно отключать канал, запускать модбас клиент … что за ужас такой из средневековья?
В моем случае, например, кондиционер управляется 14 байтами и есть стартовая посылка … То есть нужно записать (если в формате: первое слово длительность, а потом посылки) всего 8 слов в самом худшем сценарии. Да они моментом передадутся по модбас и выполняются … Но нет, нужно извращаться с ROM, которая имеет ограниченное число циклов перезаписи … при этом с пульта я все равно не могу записать в ROM команды, так как их нужно модифицировать перед записью (пульт так не умеет) …

Я думаю, что никто не парился с разбором длительностей сигналов и их декодированием, обозвали 1 свечение диода, 0 - отсутствием свечения. Записали последовательность. Повторили. Всё. Без каких-либо разборов по байтам, командам и т.п… Документацию скорее всего описали для порядка, но на деле вряд ли кто-то занимался именно разбором посылок - работает и работает.
И с устройством так же не стали парится. Я думаю для серьезного управления модуль мало используют. Там кондей включить, отключить, прибавить, убавить. И всё. Управлять тв - опять же может включить по сценарию. Придумать можно то много всего, но что на практике реально надо, я бы не стал полноценно управлять тв с умного дома, с пульта удобнее.
Может в будущем допилят, не знаю. Работы у ВБ ещё на полвека вперёд. Сами разработчики ВБ молодцы, но мнение о сием продукте у меня не однозначное, скажу кратко.

2 Likes

Вообще если так подумать, то сам по себе модуль это костыль. Суть в него такая, и судьба. Ибо в нормальном проекте умного дома возьмут кондей с нужными интерфейсами. И т.п…

Вы пишите бред. К сожалению.

Отнюдь. Так и есть.
У MWS никогда не стояло задачи генерировать нужные посылки. По сути это “диктофон”. Записал - воспроизвел.

Что именно?
Бред, что “нормальный умный дом” не нуждается в ИК?

Это и есть один из вариантов “генерации нужных посылок”.

Абсолютно ничего не мешает доработать до нормального уровня.

Более того, готовые комбинации посылок (но не на этом этапе) есть в разных ESP проектах.
Но ничего не мешает собирать нужные комбинации самим пользователям!
Но, в отличии от ESP*…, WB может дать для этого удобный инструмент! И тут кроме плюсов управления будет куча других плюсов (ведь многие ищут от обратного: своя модель устройства → чем можно управлять … и будут находить WB)

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

WB отлично работает с ESPhome

Т.е. Вы предлагаете поддерживать варианты кодирования всех стандартов? Сейчас их 5-6. Потом появятся другие. Их добавлять, поддерживать. Это всё человеко-часы, зарплата и т.д.
Будет массовый спрос - уверен, что сделают.

И да, при куче телевизоров (7), сплитов (8), других устройств, у меня нет ни одного, которым я управляю по ИК.

Не всегда “лучше”. Далеко не всегда.

Если у тебя 5 устройств ИК, и одно из них невозможно по ИК подключить … или 4 из 5! То какой смысл переплачивать за штробление, прокладку … ???

Далеко не всегда.

Есть только один аргумент “по другому”. Единственный! Нужна обратная связь. Все.

Более того. Кондиционер “пищит”. А MSW имеет микрофон. Он легко и вполне может определять писк после выполнения команды в общем случае. И все, имеем обратную связь …

И? Яндексу выпилить теперь ИК из своей Алисы? А все проекты ESP и умных домов в части ИК закрыть?

Зачем? Для любой задачи есть свой инструмент. Не хватает функционала - пожелание (не требование) разработчику или DIY

И?