WB-MIR WB-MSW скрипт для сохранения и записи команд ИК (IR)

Добрый день.

Столкнулся с проблемой воспроизведения записанных команд из памяти, при попытке воспроизвести команды ничего не происходит.
До этого модули были на прошивке 4.15.1 и команды работали нормально, но после нескольких месяцев от модулей перестала приходить информация (отслеживал по напряжению модуля, оно было одним и тем же). По описанию из вики - это был баг прошивки (ERRWB-MS0005: Зависание устройства после полутора месяцев непрерывной работы).
Я обновил прошивку до версии 4.16.7, данные от модулей стали приходить, но при попытке воспроизвести команды ничего не происходит.
Подписался на топик:

mosquitto_sub -v -t /devices/IR_94_Mansard/#

получаю ответ:

/devices/IR_94_Mansard/controls/Play from ROM1/meta/order 2
/devices/IR_94_Mansard/controls/Play from ROM1/meta/readonly 0
/devices/IR_94_Mansard/controls/Play from ROM1/meta/type pushbutton
/devices/IR_94_Mansard/controls/Play from ROM2/meta/order 3
/devices/IR_94_Mansard/controls/Play from ROM2/meta/readonly 0
/devices/IR_94_Mansard/controls/Play from ROM2/meta/type pushbutton
/devices/IR_94_Mansard/controls/Play from ROM3/meta/order 4
/devices/IR_94_Mansard/controls/Play from ROM3/meta/readonly 0
/devices/IR_94_Mansard/controls/Play from ROM3/meta/type pushbutton
/devices/IR_94_Mansard/controls/Internal Temperature Sensor 25
/devices/IR_94_Mansard/controls/Internal Temperature Sensor/meta/order 5
/devices/IR_94_Mansard/controls/Internal Temperature Sensor/meta/readonly 0
/devices/IR_94_Mansard/controls/Internal Temperature Sensor/meta/type temperature
/devices/IR_94_Mansard/controls/Input Voltage 27.178
/devices/IR_94_Mansard/controls/Input Voltage/meta/order 1
/devices/IR_94_Mansard/controls/Input Voltage/meta/readonly 1
/devices/IR_94_Mansard/controls/Input Voltage/meta/type voltage
/devices/IR_94_Mansard/controls/Input 1-wire 1
/devices/IR_94_Mansard/controls/Input 1-wire/meta/order 6
/devices/IR_94_Mansard/controls/Input 1-wire/meta/readonly 1
/devices/IR_94_Mansard/controls/Input 1-wire/meta/type switch
/devices/IR_94_Mansard/meta/driver wb-modbus
/devices/IR_94_Mansard/meta/name IR 94 Mansard
/devices/IR_94_Mansard/controls/Input Voltage 27.053
/devices/IR_94_Mansard/controls/Input Voltage 26.998

пытаюсь воспроизвести команды из памяти:

/devices/IR_94_Mansard/controls/Play from ROM1/on 1
/devices/IR_94_Mansard/controls/Play from ROM1 1
/devices/IR_94_Mansard/controls/Play from ROM1/on 1
/devices/IR_94_Mansard/controls/Play from ROM1 1
/devices/IR_94_Mansard/controls/Play from ROM2/on 1
/devices/IR_94_Mansard/controls/Play from ROM2 1
/devices/IR_94_Mansard/controls/Play from ROM2/on 1
/devices/IR_94_Mansard/controls/Play from ROM2 1
/devices/IR_94_Mansard/controls/Play from ROM2/on 1
/devices/IR_94_Mansard/controls/Play from ROM2 1
/devices/IR_94_Mansard/controls/Play from ROM3/on 1
/devices/IR_94_Mansard/controls/Play from ROM3 1
/devices/IR_94_Mansard/controls/Play from ROM3/on 1
/devices/IR_94_Mansard/controls/Play from ROM3 1
/devices/IR_94_Mansard/controls/Play from ROM3/on 1
/devices/IR_94_Mansard/controls/Play from ROM3 1
/devices/IR_94_Mansard/controls/Input Voltage 27.167
/devices/IR_94_Mansard/controls/Play from ROM1/meta/error r
/devices/IR_94_Mansard/controls/Play from ROM2/meta/error r
/devices/IR_94_Mansard/controls/Play from ROM3/meta/error r
/devices/IR_94_Mansard/controls/Input Voltage 27.171
/devices/IR_94_Mansard/controls/Play from ROM3/on 1
/devices/IR_94_Mansard/controls/Play from ROM3 1
/devices/IR_94_Mansard/controls/Play from ROM3/on 1
/devices/IR_94_Mansard/controls/Play from ROM3 1

Включил debug logging:

May 17 22:18:45 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: WARNING: [driver] Failed to accept ‘/meta/order’ on control ‘IR_94_Mansard/Input 1-wire’: strconv.Atoi: parsing “”: invalid syntax, ignored
May 17 22:18:45 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: WARNING: [driver] Failed to accept ‘/meta/order’ on control ‘IR_94_Mansard/Internal Temperature Sensor’: strconv.Atoi: parsing “”: invalid syntax, ignored
May 17 22:18:45 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: WARNING: [driver] Failed to accept ‘/meta/order’ on control ‘IR_94_Mansard/Input Voltage’: strconv.Atoi: parsing “”: invalid syntax, ignored
May 17 22:18:45 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: WARNING: [driver] Failed to accept ‘/meta/order’ on control ‘IR_94_Mansard/Play from ROM2’: strconv.Atoi: parsing “”: invalid syntax, ignored
May 17 22:18:45 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: WARNING: [driver] Failed to accept ‘/meta/order’ on control ‘IR_94_Mansard/Play from ROM1’: strconv.Atoi: parsing “”: invalid syntax, ignored
May 17 22:18:45 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: WARNING: [driver] Failed to accept ‘/meta/order’ on control ‘IR_94_Mansard/Play from ROM3’: strconv.Atoi: parsing “”: invalid syntax, ignored
May 17 22:42:47 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: ERROR: control IR_94_Mansard/Play from ROM1 SetValue() error: can’t convert control value ‘true’ (type bool) to datatype ‘’
May 17 22:44:36 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: ERROR: control IR_94_Mansard/Play from ROM1 SetValue() error: can’t convert control value ‘true’ (type bool) to datatype ‘’
May 17 22:45:12 wirenboard-AFU7YHZU daemon.info wb-rules[1624]: ERROR: control IR_94_Mansard/Play from ROM1 SetValue() error: can’t convert control value ‘true’ (type bool) to datatype ‘’

Единственное что пока не делал - не перезапускал модули по питанию (объект удаленный).

Всего в системе 8 модулей WB-MIR из них:
Работают без проблем с прошивкой 4.13.0 - 5 штук.
Проблемные с прошивкой 4.16.7 - 3 штуки.

Wirenboard 6
4.9.22-wb6 #2 SMP Sat Apr 18 17:58:18 UTC 2020 armv7l GNU/Linux

Package: wb-mqtt-serial
Version: 2.7.1

Советую для начала посмотреть - есть ли что-нибудь в банках команд.
Пример тут:

Добрый день!

При перепрошивке ИК-сигналы в памяти не сохраняются.

Это несвязанная ошибка. Чтобы её устранить, нужно отредактировать правила, чтобы типы совпадали: Новая версия движка правил - #26 от пользователя WierdBytes

Проверил банки пусты:

Data: 0x0000
Data: 0x0000
Data: 0x0000

Попытался записать ранее сохраненные команды через скрипт mir_banks, но получаю ошибку:

->1ERROR Connection timed out: select
ERROR Connection timed out: select
ERROR Connection timed out: select
ERROR Connection timed out: select
<–>2ERROR Connection timed out: select
ERROR Connection timed out: select
ERROR Connection timed out: select
ERROR Connection timed out: select
<–>3ERROR Connection timed out: select
ERROR Connection timed out: select
ERROR Connection timed out: select
ERROR Connection timed out: select

Наверное что-то поменялось в структуре регистров? Может есть обновленный скрипт?
И вообще возможно ли откатить прошивку до версии 4.13.0?

Подскажите, что тут нужно подправить?

function conditioner_status(name, conditioner_id, virtualDevice) {
  defineRule(name, {
      whenChanged: [  // Когда изменяется состояние входа на датчике WB-MIRv2
        conditioner_id + "/Input 1-wire",
        ],
      then: function(newValue, devName, cellName) {
        if (dev[conditioner_id]["Input 1-wire"] == 1) {  // Если вход замкнут, значит кондиционер выключен (шторки закрыты)
            dev[virtualDevice]["enabled"] = false;
        } else {
            dev[virtualDevice]["enabled"] = true;
        }
      }
  });
}

defineVirtualDevice("conditioner_mansard", {  // Виртуальный выключатель кондиционера Мансарда
    title: "Кондиционер Мансарда",
    cells: {
	enabled: {
	    type: "switch",
	    value: false,
        readonly: true
	},
    }
});

conditioner_status("conditioner_status_mansard", "IR_94_Mansard", "conditioner_mansard");  // Кондиционер мансарда

Давайте этот скрипт, посмотрю. Нет, карта регистров и методы работы с IR не менялись.

заменить на

if (dev[conditioner_id]["Input 1-wire"]) {  // Если вход замкнут, значит кондиционер выключен (шторки закрыты)

Скрипты приложил, запускаю вот так:

./write_rom.pl newcommands 94

get_ROM_IR.zip (4.2 КБ)

А понизить версию прошивки с 4.16.7 до 4.13.0 возможно?

Да, конечно.
https://wirenboard.com/wiki/WB_Modbus_Devices_Firmware_Update#.D0.A0.D1.83.D1.87.D0.BD.D0.B0.D1.8F_.D0.BF.D1.80.D0.BE.D1.88.D0.B8.D0.B2.D0.BA.D0.B0_.D1.83.D1.81.D1.82.D1.80.D0.BE.D0.B9.D1.81.D1.82.D0.B2
Но очень не советую, так как в прошивках правятся баги.

А устройство на порту /dev/ttyRS485-1 c дефолтной скоростью, четностью и стопбитами? Покажите просто запрос какого-то регистра с помощью modbus_client.

modbus_client -mrtu /dev/ttyRS485-1 -s2 -pnone --debug -a94 -t3 -r250 -c19

Opening /dev/ttyRS485-1 at 9600 bauds (N, 8, 2)
[5E][03][00][FA][00][13][28][99]
Waiting for a confirmation…
<5E><03><26><00><34><00><2E><00><31><00><36><00><2E><00><37><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><01><68><27><2C>
SUCCESS: read 19 of elements:
Data: 0x0034 0x002e 0x0031 0x0036 0x002e 0x0037 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0000 0x0001 0x6827

Опрашиваю проблемый модуль WB-MIR

А дайте пожалуйста фтнвуыл - сам гляну.

Ответил в личные сообщения

Автор скрипта не учел что в некоторх случаях длина RTU пакета может быть превышена.

foreach $i (2000, 2121, 2242, 2363) {
             $data="@buff[$i-2000..$i-2000+120]";
             #print "modbus_client --debug -mrtu -b9600  -pnone -s2 /dev/ttyRS485-1 -a$ARGV[1] -t0x10 -r$i $data \n";
             `modbus_client --debug -mrtu -b9600  -pnone -s2 /dev/ttyRS485-1 -a$ARGV[1] -t0x10 -r$i $data`;
    }
$i=2484;
$data="@buff[$i-2000..$i-2000+22]";

Пересчитал смещения в putbuffer.pl

1 лайк

diff’ом проверил считанное после записи доработанным скриптом - файлы сошлись. Кажется в смещениях не напутал.

Спасибо, теперь заработало, проверил на двух кондиционерах.

Выкладываю финальную версию скрипта для считывания и записи команд модуля. Редактировал под себя поэтому уменьшил число считываемых и записываемых команд до 4х. Кому нужно больше, редактируйте цикл foreach до нужного вам количества команд:

foreach $i (0…4)

Обновил архив, добавил readmi файл.

get_ROM_IR.zip (2.9 КБ)

1 лайк

Доброго дня!

Второй день пытаюсь осилить перенос команд с одного устройства WB-MIR v2 на другое с помощью этого скрипта.
У меня получилось считать команды с одного устройства, но записать на другое не получается. В командной строке всё идёт гладко якобы, ошибок нет, но команды в итоге не записываются на устройство. При попытке их считать снова скриптом - там пусто (нули).
Не могу понять что я делаю не так. Не подскажете в чём может быть проблема?
Либо он из файлов не читает, либо не записывает. Если бы содержимое putbuffer было бы в основном скрипте - можно было выводить логи, но принты внутри putbuffer не работают…
Скорость, адрес - всё указано верно. Скрипт якобы выполняет работу.
Если бы я понимал этот perl, перенёс бы содержимое putbuffer в основной скрипт write_roms.pl, чтобы работал вывод в консоль логов, но не хватает знаний…

Заранее спасибо за помощь!

Добрый день. А в сохраненных в файлы командах - последние два значения нулевые?

Добрый! Спасибо за ответ!
Да, файлы с командой выглядят так:


А после записи на новое устройство и чтения файла скриптом там все нули.

Вручную записывается всё нормально такими командами:

Выложите файл с сохраненной командой, проверю. С виду все хорошо.