Dooya DT82 (Onviz)

Имеются моторы Onviz DT82 (Dooya). При подключении и настройке через Serial Tool корректно исполняют команды и отвечают на них. При добавлении в wb-mqtt-serial.conf ловлю следующий баг:


Планировщик не успевает получить полный ответ от мотора, и либо режет часть CRC либо считает что ответ очень короткий. Изменение периода вопроса частично решило проблему только с одним мотором (стал время от времени отвечать). wb-mqtt-serial_20220807T180603.log (19.0 КБ)

Добрый день.
А попробуйте пожалуйста установить для порта “Задержка перед записью в порт”, больше чем 20000. 40000 например.
Ну и выложите диагностический архив, попробую воспроизвести.

diag_output_AO2T7LJW_2022-08-12-15.42.22.zip (92.4 КБ)


Изменил.
В интерфейсе ничего не изменилось
диагностику выложил

defineRule(“dooya_bla_bla_bla”, {
whenChanged: “dooya/position”,
then: function(newValue) {
// s = addCrc16MODBUS([0x55,0x01,0x01,0x03,0x04, newValue]); СURTAIN_COMMAND_PERCENT 0x04
s = addCrc16MODBUS([0x55,0x01,0x01,0x01,0x02]); // CURTAIN_READ_WRITE_PERCENT 0x02, addr 0x0101
log(s)
s = “/usr/bin/printf '” + (’ ’ + s).replace(/ /g, “\x”) + “’ > /dev/ttyMOD1”;
runShellCommand(s, {
captureOutput: true,
captureErrorOutput: true,
exitCallback: function(exitCode, capturedOutput, capturedErrorOutput ){
log("exitCode: " + exitCode)
log("capturedOutput: " + capturedOutput)
log("capturedErrorOutput: " + capturedErrorOutput)
return;
}
});
}
});

пока так сделал.
По крайней мере контролы в интерфейсе не красные.
но и тут вопрос.
Команды нормально уходят и четко исполняются.
А ответа от мотора runShellCommand exitCallback нет. Только exitCode возвращает исправно.
Как достучаться до мотора и прочитать, что он там вернул?
Очевидно там ответ не мгновенный…и runShellCommand в этом не поможет?

Так… Но зачем? “красные” - просто оттого что ответа от устройства или нет или он “неверный”.
Изобретать альтернативную систему обработки ответов - можно, но непродуктивно, совершенно. Ну и получим кучу недостатоков.
Я думаю что нужно настроить wb-mqtt-serial.
Воспроизвел конфигурацию, подключив к ttyRS485-2 привод:

Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Write: 55 01 01 01 02 01 a1 42
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] <10.0.0.71:502>145624910: Wait until 145625278
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 10000 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] ReadFrame: 55 01 01 01 01 2d a0 6f
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145624931: Wait until 145624942
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145624942: Wait until 145624968
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145624969: Wait until 145624999
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625000: Wait until 145625005
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625005: Wait until 145625105
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] <10.0.0.71:502>145625010: Wait until 145625278
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Write: 55 01 01 01 02 01 a1 42
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] <10.0.0.71:502>145625110: Wait until 145625278
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 10000 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] ReadFrame: 55 01 01 01 01 2d a0 6f
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625132: Wait until 145625142
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [serial client] </dev/ttyRS485-2 9600 8 N 2>145625142: Wait until 145625168
Aug 15 11:15:50 wirenboard-AQASN7R6 wb-mqtt-serial[10449]: DEBUG: [port] Sleep 100 us

настройки по умолчанию:

    {
      "baud_rate" : 9600,
      "data_bits" : 8,
      "devices" : 
      [
        {
          "device_type" : "Dooya 82",
          "slave_id" : "0x0101"
        }
      ],
      "enabled" : true,
      "guard_interval_us" : 100,
      "parity" : "N",
      "path" : "/dev/ttyRS485-2",
      "port_type" : "serial",
      "read_rate_limit_ms" : 200,
      "response_timeout_ms" : 500,
      "stop_bits" : 2
    },

Картину похожую на ту, что приведена в первом сообщении (чуть лучше) удается получить если отключить провод от клеммы gnd или добавить резистор на 470 последовательно с одной линией шины.
Если подключаю все провда - ошибок нет, совсем.
У вас точно именно с физическим подключением все в порядке?

Предлагаю подключить один привод заведомо исправным кабелем и проверить?

:slight_smile: ну, зато поупражнялся…поглубже узнал как работает runShellCommand и serial_tool :slight_smile:
Я пробовал одним кабелем на прямую подключать (длина кабеля 20 м, 4 витые жилы). Эффекты те же.

Назовите мне несколько объективных параметров, что бы я понял, что у меня физическое подключение страдает. В арсенале есть мультиметр и даже осциллограф найду если надо.
Я еще раз все кропотливо проверю.
Провода вроде все правильно подключены. Я прозвонил их неоднократно все от клемм контроллера до RJ. Подключение попробовал делать ко всем трем доступным портам.

Могу все это проделать в anydesk например под чутким руководством, если такое практикуется.

Вот такой подход - всецело одобряю!

Для теста лучше все ж покороче. Хотя - сейчас взял кусок около 30 м - работает (чего б не работать).
А на клеммы A и B подключали по одному проводу одной пары? Покажите фото подключения, на контроллере и на приводе? неконтакт разьема rj на самом приводе исключен?

Тут методика такая, с помощью мультиметра: Вытаскиваяем разьем из контроллера (оставляем подключенным к приводу) и в режиме измерения напряжения между Gnd и A около 4-4,7В
Между A и B -4-4,7В.

Ну и вот так тоже:

serial_tool -b 9600 -p N -d 8 -s 1 -t 1 /dev/ttyRS485-2
serial_tool on /dev/ttyRS485-2: 9600 8N1.0
Enter your commands below in HEX form. 
All characters but 0-9,a-f including spaces are ignored.
Press Control-D or Control-C to leave the application.
Press [Enter] to print received data
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 55 01 01 01 02 01 a1 42
<< 55 01 01 01 01 4A E1 85
>> 

В общем можно, но со временем пока не особо.
И покажите, кстати, как в wb-mqtt-serial.conf настроено.

И да, в диагностическом архиве нет почему-то данных о релизе. Какой на контроллере?

Взял новый провод. Новый джек. Обжал.
Напряжение Gnd A 4.7 v A и B -3.27 v попробовал на всех движках…одинаково.

sysinfo

Это нормально работает

да, по одному.


у stop_bits не 2, а 1…
0х0101 вроде работает. но он и раньше проявлял признаки жизни.
Не красный. Но позиции крайние 1 и 98
Лимиты настроил, как написано.
2022-08-15_19-00-29
2022-08-15_19-00-46

0х0201 красный… на изменения position реагирует, но пассивно… положение не считывает.
Крайние позиции 2 и 95 Лимиты настроил, как написано.
2022-08-15_19-15-04
но тут ОК
2022-08-15_19-13-21

перемерил с коротким проводом (20 см), Gnd и A около 4-4,7В
Между A и B 3.25
может это с движками что то …но это так на всех
:frowning:

Обратите внимание, у меня порт настроен с 2 стопбитами.

Попрбуйте установить, ну и вообще все паратметры для порт сделать такими же.

Ок. Завтра уже.
Но у меня с 2 стопбитами вообще ничего не работало.
Даже serial_tool…
Вроде.

сделал все настройки как тут кроме “path”
при подключении отдельным проводом 2 движка выглядят так
2022-08-16_19-19-23
остальные так
2022-08-16_19-20-30
на смену Position все открываются и закрываются.

два вот этих правила управляют каждым движком в отдельности ожидаемо: и позиция меняется и считывается без ошибок.
posChanging = false;

defineRule(“Dooya_position”, {
whenChanged: “Dooya_0x0101/position”,
then: function(newValue) {
if (posChanging){
return;
}
posChanging = true;
s = addCrc16MODBUS([0x55,0x01,0x01,0x03,0x04, newValue]);
// s = addCrc16MODBUS([0x55,0x01,0x01,0x01,0x02]);
// s = “/usr/bin/printf '” + (’ ’ + s).replace(/ /g, “\x”) + “' > /dev/ttyMOD1”; //“/usr/bin/printf ‘\x55\x01\x01\x03\x04\x1E\x42\xEA’ > /dev/ttyMOD1”
log(s)
s = “'” + s + “'”
log(s)
// // runShellCommand(“serial_tool -b 9600 -s1 -pN /dev/ttyMOD1 --batch ‘55 01 01 01 02 01 A1 42’ -t 1.0”, {
// runShellCommand(“serial_tool -b 9600 -pN -d8 -s1 -t0.2 /dev/ttyMOD1 --batch ‘55 01 01 01 02 01 A1 42’”, {
runShellCommand("serial_tool -b 9600 -pN -d8 -s1 -t0.2 /dev/ttyMOD1 --batch " + s, {
captureOutput: true,
captureErrorOutput: true,
exitCallback: function(exitCode, capturedOutput, capturedErrorOutput ){
log("exitCode: " + exitCode)
log("capturedOutput: " + capturedOutput)
log("capturedErrorOutput: " + capturedErrorOutput)
dev[“Dooya_0x0101”][“enabled”] = true;
//return;
}
});
}
});

var _interval = null;

defineRule({
whenChanged: “Dooya_0x0101/enabled”,
then: function (newValue, devName, cellName) {
var n = 0;
var P = 0;
var prevP = -1;
if (dev[“Dooya_0x0101”][“enabled”]){
log(“Старт”)
_interval = setInterval(function () {
n += 1;
runShellCommand(“serial_tool -b 9600 -pN -d8 -s1 -t0.2 /dev/ttyMOD1 --batch ‘55 01 01 01 02 01 A1 42’”, {
captureOutput: true,
exitCallback: function(exitCode, capturedOutput){
var s = ‘0x’ + capturedOutput.substring(15,17);
P = parseInt(s, 16);
if (P > -1 ) {
dev[“Dooya_0x0101”][“position”] = P;
}
}
});
if ((n >= 20) || (P == prevP)){
clearInterval(_interval);
posChanging = false;
}
prevP = P;
}, 500);
}
}
});
Это может быть аргументом, что с физикой все норм или мне не расслабляться?
тогда я уже не знаю, куда двигаться.

2022-08-16_19-39-52
один прям совсем ожил!!! :slight_smile:
Но так только если он напрямую подключен или если на общей шине не больше 3 движков одновременно.
Все таки физические проблемы похоже…

1 лайк

А шина не звездой ли случайно?
Да, все ж физика. Мощный и хорошо спроектированный передатчик контроллера обеспечивает хороший “исходящий” уровень а в приводах видимо недостаточно сильные.
То есть до приводов команды доходят а их ответ контроллеру - нет. Или все ж где-то емкость/наводки. А отключение терминирующего резистора и растяжки в контроллере как-то влияет на связь?

не, точно не звезда.
Но я сейчас выяснил вот что.
Кабель выходит из щитка, соединяет все движки…и от дальнего движка возвращается в шкаф.
Обратка просто свободно висит на клеммниках…
Завтра повешу туда согласующий резистор.
Но это ладно, на прямое то подключение движков та же история…

согласующий резистор ситуацию не изменил.

Установка дополнительного или отключение контроллерного или отключение растяжки?
Что именно не изменило?

я повесил резистор 100 ом на самый дальний конец кабеля.
не изменилась картинка в интерфейсе и функционал.

и еще странность обнаружил.
подключаю в интерфейсе несуществующее устройство (ситирон например)
и вот картинка до подключения


все движки с ошибками
а вот после подключения

два движка без ошибок

Это как? ;))))

Ну, резистор все ж лучше 120 ом. И попробовать с ним, с резистором не три (или сколько приводов работало без ошибок) а на один больше. Ну и если шина приводов заходит вторым концом в щит - попробовать этот конец подключить и проверить сколько с “другого края” работает. Можно шину разделить на две тогда, добавив в контроллер еще порт.

Устройство на тот же порт? может быть связано с тем что опрос стал реже. Это можно проверить простым увеличением периода опроса для порта.

Здравствуйте! Получилось ли решить проблему?