WB-MSx Consumer IR Manual: различия между версиями

Материал из Wiren Board
(поправил)
(не показано 119 промежуточных версий 11 участников)
Строка 1: Строка 1:
<languages/>
{{DISPLAYTITLE:Инструкция по работе с ИК-приёмопередатчиком в устройствах WB-MS/WB-MSW/WB-MSW2}}
<translate>
=== Назначение ===
{{DISPLAYTITLE: Инструкция по работе с ИК-приёмопередатчиком в устройствах WB-MSW, WB-MIR }}
Инфракрасный приёмопередатчик, установленный в устройствах WB-MS/WB-MSW/WB-MSW2 модификации I, предназначен для записи сигналов с бытовых пультов ДУ и дальнейшего управления бытовой техникой, в том числе кондиционерами, телевизорами и т.д.


== Назначение == <!--T:1-->
'''Внимание! Пока что управление возможно только с небольшого расстояния (до 1 метра).'''
Инфракрасный приёмопередатчик, установленный в устройствах WB-MSW модификации I и WB-MIR, предназначен для записи сигналов с ИК-пультов ДУ бытовых устройств и дальнейшего управления бытовой техникой: кондиционерами, телевизорами и т.д. Модули WB-MIR v.2 и WB-MSW v.3 (WB-MSW v.4) поддерживают около 80 ИК-команд (зависит от объема занимаемой в памяти).  
=== Принцип работы ===
Сигнал с пульта ДУ сигнал записывается ИК-приёмником и хранится в памяти устройства, откуда может быть воспроизведён. Можно хранить несколько сигналов. Также сигнал может быть записан не с пульта ДУ, а передан в виде последовательности чисел по Modbus. Сохранённый сигнал воспроизводится ИК-передатчиком при получении специальной команды по Modbus.


'''Внимание! Все модули, кроме WB-MSW v.3 (WB-MSW v.4), обеспечивают управление возможно только с небольшого расстояния (< 1 метра).'''
Устройство имеет два режима работы: постоянный и оперативный.
== Принцип работы == <!--T:2-->
=== Описание ===
Записываете управляющий сигнал с пульта дистанционного управления устройством в память модуля и потом воспроизводите его.


Вы можете записать сигнал в одну из двух видов памяти:
В постоянном режиме записанные команды хранятся в ПЗУ устройства. В устройстве можно хранить не более <code>number_of_banks</code> сигналов (это значение варьируется в зависимости от версии прошивки, но составляет не менее 6). Записанные в ПЗУ сигналы сохраняются при отключении питания. Однако при каждой перезаписи сигнала на новый расходуется физический ресурс ПЗУ - всего можно перезаписать сигнал не более 1000 раз.
* Постоянную — записанные команды хранятся в ROM-буферах, которые записываются в ПЗУ модуля и сохраняются при отключении питания.
* Оперативную — это RAM-буфер модуля, данные теряются при отключении питания.


Помните, что при использовании постоянной памяти вы расходуете ресурс ПЗУ, каждую ячейку можно перезаписать не более 1000 раз.
В оперативном режиме команда (только одна) находится в оперативной памяти устройства. Она записывается туда Modbus-командой с внешнего устройства (например, контроллера [[Wiren Board]]). Она может быть воспроизведена из оперативной памяти и затем перезаписана новой. Ресурс ПЗУ при этом не расходуется. При отключении питания команда не сохраняется.


Подробнее о записи и воспроизведении сигналов читайте в разделах [[#Постоянный режим|Постоянный режим]] и [[#Оперативный режим|Оперативный режим]].
====Технические детали====
Сигнал хранится в памяти устройства виде последовательности натуральных чисел (каждое от 0 до 65535), где каждое число - продолжительность логического 0 или 1 в сигнале в квантах по 10 микросекунд. Следовательно, максимальная продолжительность каждого нуля или единицы должна быть не более <code>65535 * 10 мкс = 655350 мкс = 0,655 секунд</code>. Первое число последовательности - длительность первой логической единицы. Конец последовательности маркируется двумя периодами продолжительностью 0.


=== Управление телевизором ===
=== Управление модулем по Modbus ===
{{Wbincludes:WB-MSW v.3 IR TV Control}}
'''Внимание! Номера используемых Modbus регистров менялись, начиная с версии прошивки 3.2.0. В инструкции указаны новые номера регистров. Если вы пользуетесь устройством со старой прошивкой, общий принцип остаётся прежним, но номера регистров сдвигаются; как именно - смотрите в [[#Карта регистров флагов (Coils)]].'''


=== Управление климатической техникой ===
Управление ИК-приёмопередатчиком производится через регистры флагов Modbus (полный список можно найти в [[#Карта регистров флагов (Coils)]]). Есть 3 типа операций с сигналами:
{{Wbincludes:WB-MSW v.3 IR AC Control}}
 
=== Управление другой техникой по ИК ===
{{Wbincludes:WB-MSW v.3 IR Other Control}}
 
==Способ представления и хранения сигнала== <!--T:6-->
[[File:Buffer_mir.png |400px|thumb|right| Пример содержимого оперативного буфера WB-MIR]]
 
<!--T:7-->
Сигнал хранится в памяти устройства виде последовательности натуральных чисел (каждое от 0 до 65535), где каждое число - продолжительность логического 0 или 1 в сигнале в квантах по 10 микросекунд. Следовательно, максимальная продолжительность каждого нуля или единицы должна быть не более <code>65535 * 10 мкс = 655350 мкс = 0,655 секунд</code>. Первое число последовательности — длительность первой логической единицы. Конец последовательности маркируется двумя периодами продолжительностью 0.
 
<!--T:8-->
В оперативном режиме IR-сигнал (только один) находится в оперативной памяти устройства. Он записывается туда с пульта управления при подаче соответствующей Modbus-команды или путем записи значений в соответствующие регистры с внешнего устройства по Modbus (например, с контроллера [[Wiren Board]]), также IR-сигнал может быть скопирован из Flash-ПЗУ. IR-сигнал может быть воспроизведён из оперативной памяти и затем перезаписан; ресурс ПЗУ при этом не расходуется. При отключении питания сигнал в оперативной памяти не сохраняется.
 
<!--T:9-->
=== Сжатие ИК-команд ===
Начиная с версии прошивки 4.22.0 в WB-MIR v.2 и WB-MSW v.3 последовательности команд сжимаются по специальному алгоритму, чтобы обеспечить более высокую плотность хранения. Перед воспроизведением последовательности разархивируются. Максимальная длина команды увеличена до 1000 символов (2000 байт). Сжатие данных использует "словарь": длительности сигнала, которые близки друг к другу, заносятся в словарь как один элемент. Команда хранит индексы на элементы словаря. Максимальная длина словаря - 64 слова, то есть в ROM не получится записать произвольные данные. Также следует учитывать, что при редактировании банка команд записанные данные после сохранения в ROM будут сжаты и будут отличаться от оригинала при чтении из банка. При этом остается возможность записывать и воспроизводить произвольные данные из RAM - там алгоритм сжатия не применяется.
 
== Управление модулем по Modbus == <!--T:10-->
 
<!--T:11-->
'''Внимание!''' Номера используемых Modbus регистров менялись, начиная с версии прошивки '''3.2.0'''. В инструкции указаны новые номера регистров. Если вы пользуетесь устройством со старой прошивкой, общий принцип остаётся прежним, но номера регистров сдвигаются; как именно — смотрите в [[#Карта регистров флагов и входов (Coils и Inputs)|Карта регистров флагов и входов (Coils и Inputs)]]. Полное описание регистров ИК-устройств можно найти в этой статье в разделе [[#Карта регистров|Карта регистров]].
 
=== Обмен данными === <!--T:12-->
На физическом уровне модуль подключается через интерфейс [[RS-485]]. Для управления модулем используется протокол Modbus RTU. В устройствах Wirenboard данные Modbus передаются по линиям связи RS-485. Подробнее смотрите страницу [[Протокол Modbus]]. Modbus-адрес модуля задается на заводе и нанесен на наклейке на его боковой стороне. Адрес может быть изменен программно.
 
<!--T:13-->
В устройствах с версией прошивки '''3.1.0''' и позднее также можно изменить настройки параметров обмена данными — смотрите [[#Карта_регистров|таблицу регистров Modbus]].
 
<!--T:14-->
Управление ИК-приёмопередатчиком производится через регистры флагов Modbus; полный список можно найти в описании карты регистров. Есть 3 типа операций с сигналами:
* запись сигнала в память с пульта ДУ,
* запись сигнала в память с пульта ДУ,
* воспроизведение сигнала из памяти,
* воспроизведение сигнала из памяти,
* редактирование сигнала в оперативной памяти.
* редактирование сигнала в памяти.
В каждый момент времени можно выполнять только одну операцию только над одним сигналом. Так как во время выполнения любой операции в один из регистров флагов ставится 1, а после завершения операции туда же ставится 0, в каждый момент времени среди всех регистров флагов, относящихся к ИК-приёмопередатчику, только один регистр может быть установлен в единицу. Попытка записи 1 в регистры флагов, связанных с ИК, при уже имеющейся единице приведёт к ошибке <code>BUSY</code>.
В каждый момент времени можно выполнять только одну операцию только над одним сигналом. Так как во время выполнения любой операции в один из регистров флагов ставится 1, а после завершения операции туда же ставится 0, в каждый момент времени среди всех регистров флагов, относящихся к ИК-приёмопередатчику, только один регистр может быть установлен в единицу. Попытка записи 1 в регистры флагов, связанных с ИК, при уже имеющейся единице приведёт к ошибке <code>BUSY</code>.


=== Особенности при работе из Codesys ===
==== Постоянный режим ====
 
В постоянном режиме устройство может хранить <code>number_of_banks</code> ИК-сигналов. Это значение варьируется в зависимости от версии прошивки, но составляет не менее 6. Сигналы нумеруются с 0 до <code>number_of_banks - 1</code>.
Читайте статью [[Codesys_IR_manual | Работа с ИК-командами в Codesys]].
===== Запись сигнала в постоянную память с пульта ДУ =====
 
Чтобы записать сигнал под номером <code>i</code> с пульта ДУ в память, запишите 1 в регистр флагов по адресу <code>5300 + i</code>. Затем направьте пульт ДУ на ИК-приёмник и нажмите кнопку на пульте. После отпускания кнопки, завершите запись сигнала, записав 0 в регистр флагов по адресу <code>5300 + i</code>.
== Постоянный режим == <!--T:15-->
В постоянном режиме ИК-команды сохраняются в памяти устройства и доступны после перезагрузки по питанию. Каждая команда хранится в отдельном "банке" памяти. Количество банков памяти зависит отпрошивки устройства. До прошивки 3.7.2 включительно устройства имели 7 банков памяти ИК-команд. Начиная с версии 4.4.0 поддерживается 32 банка. Промежуточные версии позволяли записывать до 80 команд, но в ряде случаев делали это некорректно. Начиная с версии прошивки 4.22.0 снова поддерживается до 80 команд.
 
==== Запись сигнала в постоянную память с пульта ДУ ==== <!--T:16-->
'''Примечение:''' Подробно о работе в режиме командной строки рассказано в разделе [[#Управление модулем из командной строки|Управление модулем из командной строки]].
 
<!--T:17-->
Чтобы записать сигнал под номером <code>i</code> с пульта ДУ в память, запишите 1 в регистр флагов по адресу <code>5300 + i</code>. Затем направьте пульт ДУ на ИК-приёмник и нажмите коротко один раз кнопку на пульте. Сразу после этого, завершите запись сигнала, записав 0 в регистр флагов по адресу <code>5300 + i</code>.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
#Начинаем запись сигнала с номером 1. Устройство подключено к порту /dev/ttyRS485-1 и имеет Modbus-адрес 16
#Начинаем запись сигнала с номером 1. Устройство подключено к порту /dev/ttyAPP1 и имеет Modbus-адрес 16
root@wirenboard:~# modbus_client --debug -mrtu -b9600 -s2 -pnone /dev/ttyRS485-1 -a16 -t5 -r5301 1
root@wirenboard:~# modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyAPP1 -a16 -t5 -r5301 1
#Направляем пульт на окно приемника и нажимаем кнопку на пульте ДУ
#Нажимаем кнопку на пульте ДУ
root@wirenboard:~# modbus_client --debug -mrtu -b9600 -s2 -pnone /dev/ttyRS485-1 -a16 -t5 -r5301 0
root@wirenboard:~# modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyAPP1 -a16 -t5 -r5301 0
#Завершаем запись сигнала с номером 1
#Завершаем запись сигнала с номером 1
</syntaxhighlight>
</syntaxhighlight>
 
===== Воспроизведение сигнала из постоянной памяти =====
==== Воспроизведение сигнала из постоянной памяти ==== <!--T:18-->
Чтобы воспроизвести сигнал под номером <code>i</code> из памяти, запишите 1 в регистр флага по адресу <code>5100 + i</code>. Если сигнал под номером <code>i</code> не был записан ранее, будет возвращена ошибка. Пока идёт воспроизведение сигнала, регистр флага по адресу <code>5100 + i</code> будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.
Чтобы воспроизвести сигнал под номером <code>i</code> из памяти, запишите 1 в регистр флага по адресу <code>5100 + i</code>. Если сигнал под номером <code>i</code> не был записан ранее, будет возвращена ошибка. Пока идёт воспроизведение сигнала, регистр флага по адресу <code>5100 + i</code> будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.
<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
#Отдаём команду воспроизвести сигнал с номером 1. Устройство подключено к порту /dev/ttyRS485-1 и имеет Modbus-адрес 16
#Отдаём команду воспроизвести сигнал с номером 1. Устройство подключено к порту /dev/ttyAPP1 и имеет Modbus-адрес 16
root@wirenboard:~# modbus_client --debug -mrtu -b9600 -s2 -pnone /dev/ttyRS485-1 -a16 -t5 -r5101 1
root@wirenboard:~# modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyAPP1 -a16 -t5 -r5101 1
</syntaxhighlight>
</syntaxhighlight>
 
===== Редактирование сигнала в постоянной памяти =====
==== Редактирование сигнала в постоянной памяти ====
Чтобы отредактировать сигнал под номером <code>i</code> или записать его по Modbus (без пульта ДУ), запишите 1 в регистр флага по адресу <code>5200 + i</code>. После этого сигнал в виде последовательности натуральных чисел (смотрите [[#Технические детали]]) будет записан в подряд идущие регистры хранения, начиная с регистра <code>2000</code>. В конце последовательности будут два подряд идущих регистра хранения, содержащих 0. Если сигнал под номером <code>i</code> не был записан ранее, в регистрах хранения <code>2000</code> и <code>2001</code> будут находиться 0. Для внесения изменений в последовательность (в том числе для записи команды по Modbus) нужно записать правильную последовательность в данные регистры хранения с помощью команд <code>WRITE_SINGLE_REGISTER</code> и <code>WRITE_MULTI_REGISTERS</code>. В конце изменённой последовательности всё также должен быть маркер конца последовательности - два подряд идущих регистра хранения, содержащих 0. Чтобы удалить сигнал, запишите в первые два регистра хранения (<code>2000</code> и <code>2001</code>) 0. После окончания редактирования запишите 0 в регистр флагов по адресу <code>5200 + i</code>. До тех пор, пока в регистре флагов по адресу <code>5200 + i</code> не будет стоять 0, не будут доступны никакие другие операции, в том числе и над другими сигналами.
Чтобы отредактировать сигнал под номером <code>i</code> или записать его по Modbus (без пульта ДУ), запишите 1 в регистр флага по адресу <code>5200 + i</code>. После этого сигнал в виде последовательности натуральных чисел (смотрите рисунок "Пример содержимого оперативного буфера WB-MIR") будет записан в подряд идущие регистры хранения, начиная с регистра <code>2000</code>. В конце последовательности будут два подряд идущих регистра хранения, содержащих 0. Если сигнал под номером <code>i</code> не был записан ранее, в регистрах хранения <code>2000</code> и <code>2001</code> будут находиться 0. Для внесения изменений в последовательность (в том числе для записи команды по Modbus) нужно записать правильную последовательность в данные регистры хранения с помощью команд <code>WRITE_SINGLE_REGISTER</code> и <code>WRITE_MULTI_REGISTERS</code>. В конце изменённой последовательности всё также должен быть маркер конца последовательности - два подряд идущих регистра хранения, содержащих 0. Чтобы удалить сигнал, запишите в первые два регистра хранения (<code>2000</code> и <code>2001</code>) 0. После окончания редактирования запишите 0 в регистр флагов по адресу <code>5200 + i</code>. До тех пор пока в регистре флагов по адресу <code>5200 + i</code> не будет стоять 0, никакие другие операции, в том числе и над другими сигналами, не будут доступны.
===== Удаление всех сигналов из постоянной памяти ======
 
==== Удаление всех сигналов из постоянной памяти ==== <!--T:19-->
Чтобы удалить все записанные сигналы, запишите 1 в регистр флагов по адресу <code>5000</code>.
Чтобы удалить все записанные сигналы, запишите 1 в регистр флагов по адресу <code>5000</code>.
 
==== Оперативный режим ====
==== Работа с сигналами через holding регистры ====
===== Запись сигнала в оперативную память с пульта ДУ =====
Начиная с версии прошивки 4.18.0 доступны holding регистры для работы с сигналами:
* 5500 — воспроизведение
* 5501 — редактирование
* 5502 — запись
Регистры доступны как для чтения, так и для записи. Изначально в регистрах записан 0, что говорит о готовности к работе.
 
Для воспроизведения сигнала с номером <code>i</code> в регистр 5500 нужно записать число <code>i + 1</code>. Пока идет воспроизведение, при чтении регистра будет возвращаться номер воспроизводимого сигнала. После окончания воспроизведения регистр будет сброшен в 0. Если запрошенного сигнала не существует — в регистр будет записан код ошибки <code>0xFFFF</code>.
 
Редактирование и запись сигналов производятся аналогичным образом. Для того, чтобы завершить редактирование (запись) сигнала, в регистр нужно записать 0 или номер следующего сигнала для редактирования (записи).
 
== Оперативный режим == <!--T:20-->
=== Запись сигнала в оперативную память с пульта ДУ ===
Чтобы записать сигнал (только один) с пульта в оперативную память, не помещая при этом в ПЗУ - запишите 1 в регистр флага по адресу <code>5001</code>. Далее действия происходят так же, как описано выше для записи сигнала в ПЗУ. После прекращения записи в регистрах хранения по адресу <code>2000</code> и дальше будет храниться сигнал в виде последовательности чисел. Эту последовательность можно редактировать, как описано выше. Внимание: содержимое этих регистров хранения не сохраняется при отключении питания устройства!
Чтобы записать сигнал (только один) с пульта в оперативную память, не помещая при этом в ПЗУ - запишите 1 в регистр флага по адресу <code>5001</code>. Далее действия происходят так же, как описано выше для записи сигнала в ПЗУ. После прекращения записи в регистрах хранения по адресу <code>2000</code> и дальше будет храниться сигнал в виде последовательности чисел. Эту последовательность можно редактировать, как описано выше. Внимание: содержимое этих регистров хранения не сохраняется при отключении питания устройства!
=== Воспроизведение сигнала из оперативной памяти ===
====== Воспроизведение сигнала из оперативной памяти ======
Чтобы воспроизвести сигнал из оперативной памяти, запишите 1 в регистр флага по адресу <code>5002</code>. Будет воспроизведён сигнал, записанный в регистрах хранения, начиная с <code>2000</code>. В случае отсутствия маркера конца команды будет возвращена ошибка. Пока идёт воспроизведение сигнала, регистр флага по адресу <code>5002</code> будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.
Чтобы воспроизвести сигнал из оперативной памяти, запишите 1 в регистр флага по адресу <code>5002</code>. Будет воспроизведён сигнал, записанный в регистрах хранения, начиная с <code>2000</code>. В случае отсутствия маркера конца команды будет возвращена ошибка. Пока идёт воспроизведение сигнала, регистр флага по адресу <code>5002</code> будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.


<!--T:21-->
== Регистры, связанные с ИК ==
Управление ИК-приёмопередатчиком производится через регистры флагов Modbus (полный список можно найти в [[#Карта регистров флагов и входов (Coils и Inputs)|#Карта регистров флагов и входов (Coils и Inputs)]]). Есть 3 типа операций с сигналами:
* запись сигнала в память с пульта ДУ,
* воспроизведение сигнала из памяти,
* редактирование сигнала в памяти.
* в следующих версиях предполагается реализовать непосредственную запись из оперативного буфера в ПЗУ.


<!--T:22-->
=== Карта регистров хранения (Holding Registers)===
Как и в случае работы с регистрами постоянного хранения, в каждый момент времени можно выполнять только одну операцию только над одним сигналом. Так как во время выполнения любой операции в один из регистров флагов ставится 1, а после завершения операции туда же ставится 0, в каждый момент времени среди всех регистров флагов, относящихся к ИК-приёмопередатчику, только один регистр может быть установлен в единицу. Попытка записи 1 в регистры флагов, связанных с ИК, при уже имеющейся единице приведёт к ошибке <code>BUSY</code>.


=== Удаление всех сигналов из постоянной памяти === <!--T:23-->
В процессе наполнения.
Чтобы удалить все записанные сигналы, запишите 1 в регистр флагов по адресу <code>5000</code>.


== Чтение/запись банков команд ==
{| border="1" class="wikitable" style="text-align:center"
 
!Регистр / адрес
Пользователь [https://support.wirenboard.com/u/pivcheg pivcheg] написал скрипты чтения и записи IR-команд, которые [https://support.wirenboard.com/t/wb-mir-wb-msw-skript-dlya-sohraneniya-i-zapisi-komand-ik-ir/7918/16 опубликовал на портале поддержки].
!тип
 
!чтение/запись
Мы немного поправили им имена и опубликовали в архиве: [[Media:ir_backup.tgz | ir_backup.tgz]]
!значение по умолчанию
 
!формат
=== Подготовка ===
!назначение
 
!В модификациях
Содержимое архива:
|-
* read_roms.pl — скрипт сохранения ИК-команд в файлы
| 2000-2509 || holding || RW || || || Буфер периодов IR-приемопередатчика
* write_roms.pl — скрипт записи ИК-команд из файлов в регистры датчика
|I
* compare_bufs.pl, getbuffer.pl, putbuffer.pl — вспомогательные скрипты, запускаются автоматически.
|}
 
Перед тем, как приступить к чтению и записи команд:
# Зайдите в консоль контроллера по [[SSH]].
# Перейдите в папку <code>/home</code>
# Загрузите скрипт на контроллер и распакуйте его:
#:<syntaxhighlight lang="console">
# wget -qO- https://wirenboard.com/wiki/images/1/19/Ir_backup.tgz | tar -xvz  -C ./
ir_backup/
ir_backup/getbuffer.pl
ir_backup/write_roms.pl
ir_backup/putbuffer.pl
ir_backup/read_roms.pl
ir_backup/readme.txt
ir_backup/compare_bufs.pl
</syntaxhighlight>
# Перейдите в папку с распакованными файлами:
#: <syntaxhighlight lang="bash">
cd ir_backup
</syntaxhighlight>
 
Настройки скриптов '''read_roms.pl''' и '''write_roms.pl''':
* Скрипт читает/записывает только первые пять банков памяти: 0 — 4, если вам нужно считать/записать больше банков, то измените в скрипте значения <code>0..4</code>.
* Скорость подключения и serial-порту можно указать в строке <code>modbus_client…</code>.
 
=== Чтение команд в файлы ===
Для чтения ИК-команд используется скрипт <code>read_roms.pl</code>.
 
Формат запуска скрипта:
<syntaxhighlight lang="bash">
./read_roms.pl directory modbus-address
</syntaxhighlight>
 
Пример, в котором ИК-команды из устройства с адресом <code>22</code> сохраняются в папку <code>./roms</code>:
<syntaxhighlight lang="console">
# ./read_roms.pl ./roms 22
Stoping wb-mqtt-serial
->1<-->2<-->3<-->4<-->5<-
Starting wb-mqtt-serial
</syntaxhighlight>
 
=== Запись команд из файлов ===
Для записи ИК-команд используется скрипт <code>write_roms.pl</code>.
 
Формат запуска скрипта:
<syntaxhighlight lang="bash">
./write_roms.pl directory modbus-address
</syntaxhighlight>
 
Пример, в котором ИК-команды из папки <code>./roms</code> записываются в устройство с адресом <code>22</code>:
<syntaxhighlight lang="console">
# ./write_roms.pl ./roms/ 22
Stoping wb-mqtt-serial
->1<-->2<-->3<-->4<-->5<-
Starting wb-mqtt-serial
</syntaxhighlight>
 
<!-- Временно скрыл, возникли проблемы при проверке. Багрепорт в Битрикс 42664.
== Новый способ сохранения ИК-команд из устройств ==
 
Также появился новый способ сохранения ИК-команд, написанный нашими инженерами.
 
Архив с файлами скриптов доступен по ссылке: [[Media:Backup-ir-signal_tool.tgz | Backup-ir-signal_tool.tgz]]
 
=== Подготовка ===
 
Поставить
<syntaxhighlight lang="bash">
apt install python-wb-mcu-fw-updater
</syntaxhighlight>
 
Содержимое архива:
* read_signal.py — скрипт сохранения ИК-команд в файл
* write_signal.py — скрипт записи ИК-команд из файла в регистры датчика
* ir.py — набор инструкций и функций для работы вышеуказанных скриптов, запускается автоматически.


Перед тем, как приступить к чтению и записи команд:
===Карта регистров флагов (Coils)===
# Зайдите в консоль контроллера по [[SSH]].
# Перейдите в папку <code>/home</code>
# Загрузите скрипт на контроллер и распакуйте его:
#:<syntaxhighlight lang="console">
# wget -qO- https://wirenboard.com/wiki/images/7/7f/Backup-ir-signal_tool.tgz | tar -xvz  -C ./
ir.py
read_signal.py
write_signal.py
</syntaxhighlight>
# Также необходимо остановить сервис [[wb-mqtt-serial]] для получения доступа к устройствам:
#:<syntaxhighlight lang="console">
# systemctl stop wb-mqtt-serial
</syntaxhighlight>
# После окончания работ со скриптами, сервис нужно обратно включить:
#:<syntaxhighlight lang="console">
# systemctl start wb-mqtt-serial
</syntaxhighlight>


=== Немного о механизме работы скрипта ===
* Скрипт чтения автоматически создаст папку <code>/ir_backup</code>, в которую будет сохранять файлы с ИК-командами
* Название файлов с ИК-командами формируется по следующему принципу:
** <code>серийныйНомерУстройства_дата_время.txt</code>, пример - <code>4270625043_11172021_12:01:54.txt</code>
* Во время исполнения скрипта, контроллер издаст звуковой сигнал столько раз, сколько банков устройства было занято ИК-командами. Это касается как скрипта чтения, так и записи.


=== Чтение команд в файл ===
Для чтения ИК-команд используется скрипт <code>read_signal.py</code>.
Формат запуска скрипта:
<syntaxhighlight lang="bash">
python read_signal.py -a [address]
</syntaxhighlight>
Где [address] нужно заменить на желаемый адрес устройства. По умолчанию скрипт использует 2-й порт RS485, при необходимости, это можно изменить добавив к исходной команде ключ:
<syntaxhighlight lang="bash">
--port /dev/ttyRS485-n
</syntaxhighlight>
Где n - номер нужного порта RS485.
Пример команды запуска для устройства с адресом 84, находящемся на 2-м порту RS485:
<syntaxhighlight lang="console">
# python read_signal.py -a 84 --port /dev/ttyRS485-2
</syntaxhighlight>
=== Запись команд из файлов ===
Для записи ИК-команд используется скрипт <code>write_signal.py</code>.
Формат запуска скрипта:
<syntaxhighlight lang="bash">
python write_signal.py -a [address] ir_backup/[filename]
</syntaxhighlight>
Где [address] нужно заменить на желаемый адрес устройства. А [filename] на название файла, полученного при чтении ИК-команд из устройства. По умолчанию скрипт использует 2-й порт RS485, при необходимости, это можно изменить добавив к исходной команде ключ:
<syntaxhighlight lang="bash">
--port /dev/ttyRS485-n
</syntaxhighlight>
Где n - номер нужного порта RS485.
Пример команды запуска для устройства с адресом 84, находящемся на 2-м порту RS485:
<syntaxhighlight lang="console">
# python write_signal.py -a 84 --port /dev/ttyRS485-2 ir_backup/4270625043_11172021_12\:01\:54.txt
</syntaxhighlight>
-->
== Карта регистров == <!--T:24-->
=== Карта регистров флагов и входов (Coils и Inputs) === <!--T:27-->
<!--T:28-->
{|  border="1" class="wikitable" style="text-align:center"
{|  border="1" class="wikitable" style="text-align:center"
!Начальный адрес || Тип || Количество || Назначение || В модификациях
!Начальный адрес || Количество || Назначение || В модификациях
|-
| 5000 || coil || 1 || style="text-align:left" | Очистка всех банков ИК-команд || I
|-
| 5001 || coil || 1 || style="text-align:left" | Запись ИК-команды с ИК-приёмника в Modbus регистры хранения (2000-2509) (RAM), без сохранения в банк команд || I
|-
| 5002 || coil || 1 || style="text-align:left" | Воспроизведение ИК-команды из Modbus регистров хранения (2000-2509) (RAM) || I
|-
|-
| 5100 (в прошивке 3.1.0 и ранее - 0) || coil || number_of_banks || style="text-align:left" | Воспроизведение ИК-команды из соответствующего банка ROM (Play) || I
| 5000 || 1 || style="text-align:left" | Очистка всех банков ИК-команд || I
|-
|-
| 5200 (в прошивке 3.1.0 и ранее - 1000) || coil || number_of_banks|| style="text-align:left" | Редактирование ИК-команд (ROM) с копированием в RAM (ROM -> RAM) || I  
| 5001 || 1 || style="text-align:left" | Запись ИК-команды с ИК-приёмника в Modbus регистры хранения (2000-2509), без сохранения в банк команд || I
|-
|-
| 5300 (в прошивке 3.1.0 и ранее - 2000)|| coil || number_of_banks || style="text-align:left" | Запись в банк ИК-команд с использованием IR-приёмника  (Learn)|| I
| 5002 || 1 || style="text-align:left" | Воспроизведение ИК-команды из Modbus регистров хранения (2000-2509) || I
|-
|-
| 5400 || input || number_of_banks || style="text-align:left" | Размер данных IR-команды в байтах || I
| 5100 (в прошивке 3.1.0 и ранее - 0) || number_of_banks || style="text-align:left" | Воспроизведение ИК-команды из соответствующего банка || I
|-
|-
| 5500 || holding || 1 || style="text-align:left" | Воспроизведение ИК-команды из соответствующего банка ROM (Play) || FW 4.18.0
| 5200 (в прошивке 3.1.0 и ранее - 1000) || number_of_banks|| style="text-align:left" | Чтение и запись в банки команд IR || I
|-
|-
| 5501 || holding || 1 || style="text-align:left" | Редактирование ИК-команд (ROM) с копированием в RAM (ROM -> RAM) || FW 4.18.0
| 5300 прошивке 3.1.0 и ранее - 2000)|| number_of_banks || style="text-align:left" | Запись в банк команд IR использую IR-приёмник || I
|-
| 5502 || holding || 1 || style="text-align:left" | Запись в банк ИК-команд с использованием IR-приёмника (Learn) || FW 4.18.0
|-
|-
|}
|}
<!--T:29-->
Значения number_of_banks для различных устройств:
* WB-MSW v.3 - 32
* WB-MIR v.2 - 40
Начиная с версии прошивки 4.22.0 number_of_banks = 80
</translate>

Версия 14:51, 7 февраля 2017

Назначение

Инфракрасный приёмопередатчик, установленный в устройствах WB-MS/WB-MSW/WB-MSW2 модификации I, предназначен для записи сигналов с бытовых пультов ДУ и дальнейшего управления бытовой техникой, в том числе кондиционерами, телевизорами и т.д.

Внимание! Пока что управление возможно только с небольшого расстояния (до 1 метра).

Принцип работы

Сигнал с пульта ДУ сигнал записывается ИК-приёмником и хранится в памяти устройства, откуда может быть воспроизведён. Можно хранить несколько сигналов. Также сигнал может быть записан не с пульта ДУ, а передан в виде последовательности чисел по Modbus. Сохранённый сигнал воспроизводится ИК-передатчиком при получении специальной команды по Modbus.

Устройство имеет два режима работы: постоянный и оперативный.

В постоянном режиме записанные команды хранятся в ПЗУ устройства. В устройстве можно хранить не более number_of_banks сигналов (это значение варьируется в зависимости от версии прошивки, но составляет не менее 6). Записанные в ПЗУ сигналы сохраняются при отключении питания. Однако при каждой перезаписи сигнала на новый расходуется физический ресурс ПЗУ - всего можно перезаписать сигнал не более 1000 раз.

В оперативном режиме команда (только одна) находится в оперативной памяти устройства. Она записывается туда Modbus-командой с внешнего устройства (например, контроллера Wiren Board). Она может быть воспроизведена из оперативной памяти и затем перезаписана новой. Ресурс ПЗУ при этом не расходуется. При отключении питания команда не сохраняется.

Технические детали

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

Управление модулем по Modbus

Внимание! Номера используемых Modbus регистров менялись, начиная с версии прошивки 3.2.0. В инструкции указаны новые номера регистров. Если вы пользуетесь устройством со старой прошивкой, общий принцип остаётся прежним, но номера регистров сдвигаются; как именно - смотрите в #Карта регистров флагов (Coils).

Управление ИК-приёмопередатчиком производится через регистры флагов Modbus (полный список можно найти в #Карта регистров флагов (Coils)). Есть 3 типа операций с сигналами:

  • запись сигнала в память с пульта ДУ,
  • воспроизведение сигнала из памяти,
  • редактирование сигнала в памяти.

В каждый момент времени можно выполнять только одну операцию только над одним сигналом. Так как во время выполнения любой операции в один из регистров флагов ставится 1, а после завершения операции туда же ставится 0, в каждый момент времени среди всех регистров флагов, относящихся к ИК-приёмопередатчику, только один регистр может быть установлен в единицу. Попытка записи 1 в регистры флагов, связанных с ИК, при уже имеющейся единице приведёт к ошибке BUSY.

Постоянный режим

В постоянном режиме устройство может хранить number_of_banks ИК-сигналов. Это значение варьируется в зависимости от версии прошивки, но составляет не менее 6. Сигналы нумеруются с 0 до number_of_banks - 1.

Запись сигнала в постоянную память с пульта ДУ

Чтобы записать сигнал под номером i с пульта ДУ в память, запишите 1 в регистр флагов по адресу 5300 + i. Затем направьте пульт ДУ на ИК-приёмник и нажмите кнопку на пульте. После отпускания кнопки, завершите запись сигнала, записав 0 в регистр флагов по адресу 5300 + i.

#Начинаем запись сигнала с номером 1. Устройство подключено к порту /dev/ttyAPP1 и имеет Modbus-адрес 16
root@wirenboard:~# modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyAPP1 -a16 -t5 -r5301 1
#Нажимаем кнопку на пульте ДУ
root@wirenboard:~# modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyAPP1 -a16 -t5 -r5301 0
#Завершаем запись сигнала с номером 1
Воспроизведение сигнала из постоянной памяти

Чтобы воспроизвести сигнал под номером i из памяти, запишите 1 в регистр флага по адресу 5100 + i. Если сигнал под номером i не был записан ранее, будет возвращена ошибка. Пока идёт воспроизведение сигнала, регистр флага по адресу 5100 + i будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.

#Отдаём команду воспроизвести сигнал с номером 1. Устройство подключено к порту /dev/ttyAPP1 и имеет Modbus-адрес 16
root@wirenboard:~# modbus_client --debug -m rtu -b9600 -s2 -pnone /dev/ttyAPP1 -a16 -t5 -r5101 1
Редактирование сигнала в постоянной памяти

Чтобы отредактировать сигнал под номером i или записать его по Modbus (без пульта ДУ), запишите 1 в регистр флага по адресу 5200 + i. После этого сигнал в виде последовательности натуральных чисел (смотрите #Технические детали) будет записан в подряд идущие регистры хранения, начиная с регистра 2000. В конце последовательности будут два подряд идущих регистра хранения, содержащих 0. Если сигнал под номером i не был записан ранее, в регистрах хранения 2000 и 2001 будут находиться 0. Для внесения изменений в последовательность (в том числе для записи команды по Modbus) нужно записать правильную последовательность в данные регистры хранения с помощью команд WRITE_SINGLE_REGISTER и WRITE_MULTI_REGISTERS. В конце изменённой последовательности всё также должен быть маркер конца последовательности - два подряд идущих регистра хранения, содержащих 0. Чтобы удалить сигнал, запишите в первые два регистра хранения (2000 и 2001) 0. После окончания редактирования запишите 0 в регистр флагов по адресу 5200 + i. До тех пор, пока в регистре флагов по адресу 5200 + i не будет стоять 0, не будут доступны никакие другие операции, в том числе и над другими сигналами.

Удаление всех сигналов из постоянной памяти =

Чтобы удалить все записанные сигналы, запишите 1 в регистр флагов по адресу 5000.

Оперативный режим

Запись сигнала в оперативную память с пульта ДУ

Чтобы записать сигнал (только один) с пульта в оперативную память, не помещая при этом в ПЗУ - запишите 1 в регистр флага по адресу 5001. Далее действия происходят так же, как описано выше для записи сигнала в ПЗУ. После прекращения записи в регистрах хранения по адресу 2000 и дальше будет храниться сигнал в виде последовательности чисел. Эту последовательность можно редактировать, как описано выше. Внимание: содержимое этих регистров хранения не сохраняется при отключении питания устройства!

Воспроизведение сигнала из оперативной памяти

Чтобы воспроизвести сигнал из оперативной памяти, запишите 1 в регистр флага по адресу 5002. Будет воспроизведён сигнал, записанный в регистрах хранения, начиная с 2000. В случае отсутствия маркера конца команды будет возвращена ошибка. Пока идёт воспроизведение сигнала, регистр флага по адресу 5002 будет установлен в 1, а затем сам установится в 0. Пока идёт воспроизведение сигнала, никакие другие операции с ИК-приёмопередатчиком по Modbus не будут доступны.

Регистры, связанные с ИК

Карта регистров хранения (Holding Registers)

В процессе наполнения.

Регистр / адрес тип чтение/запись значение по умолчанию формат назначение В модификациях
2000-2509 holding RW Буфер периодов IR-приемопередатчика I

Карта регистров флагов (Coils)

Начальный адрес Количество Назначение В модификациях
5000 1 Очистка всех банков ИК-команд I
5001 1 Запись ИК-команды с ИК-приёмника в Modbus регистры хранения (2000-2509), без сохранения в банк команд I
5002 1 Воспроизведение ИК-команды из Modbus регистров хранения (2000-2509) I
5100 (в прошивке 3.1.0 и ранее - 0) number_of_banks Воспроизведение ИК-команды из соответствующего банка I
5200 (в прошивке 3.1.0 и ранее - 1000) number_of_banks Чтение и запись в банки команд IR I
5300 (в прошивке 3.1.0 и ранее - 2000) number_of_banks Запись в банк команд IR использую IR-приёмник I