Отваливается Милур 107 - invalid crc

Периодически отваливается счетчик Милур 107.
После перезагрузки wb-serial работает несколько минут, в это время периодически в логах появляются такие ошибки:

Apr 25 22:32:11 wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: invalid crc [slave_id is milur:87
352]
Apr 25 22:32:20 wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: invalid crc [slave_id is milur:87
352]

Версии ПО:
Linux wirenboard 4.9.22-wb6 #2 SMP Sat Jan 26 11:34:05 UTC 2019 armv7l GNU/Linux

wb-mqtt-serial 1.50.1 armhf Wiren Board Smart Home MQTT serial protocol driver.

Конфиг:
{
“debug”: false,
“ports”: [
{
“path”: “/dev/ttyRS485-1”,
“devices”: [
{
“slave_id”: “87352”,
“device_type”: “Milur 104/105”,
“device_max_fail_cycles”: 2,
“guard_interval_us”: 0,
“device_timeout_ms”: 3000,
“frame_timeout_ms”: 150,
“max_read_registers”: 1,
“max_bit_hole”: 0,
“max_reg_hole”: 0,
“delay_ms”: 100,
“access_level”: 1,
“password”: [],
“channels”: [],
“setup”: [],
“poll_interval”: 20,
“enabled”: true
}
],
“port_type”: “serial”,
“baud_rate”: 9600,
“parity”: “N”,
“data_bits”: 8,
“stop_bits”: 1,
“poll_interval”: 10,
“enabled”: true,
“type”: null,
“response_timeout_ms”: 0,
“guard_interval_us”: 0
},
{
“path”: “/dev/ttyRS485-2”,
“devices”: [],
“baud_rate”: 9600,
“parity”: “N”,
“data_bits”: 8,
“stop_bits”: 1,
“poll_interval”: 10,
“enabled”: false
},
{
“path”: “/dev/ttyMOD1”,
“devices”: [],
“baud_rate”: 9600,
“parity”: “N”,
“data_bits”: 8,
“stop_bits”: 2,
“poll_interval”: 10,
“enabled”: false
},
{
“path”: “/dev/ttyMOD2”,
“devices”: [],
“baud_rate”: 9600,
“parity”: “N”,
“data_bits”: 8,
“stop_bits”: 2,
“poll_interval”: 10,
“enabled”: false
},
{
“path”: “/dev/ttyMOD3”,
“devices”: [],
“baud_rate”: 9600,
“parity”: “N”,
“data_bits”: 8,
“stop_bits”: 2,
“poll_interval”: 10,
“enabled”: false
}
]
}

Добрый день, cbv!
А вообще удается считывать показания хотя бы однократно?
Как подключен счетчик к контроллеру?
Помогает ли уменьшение частоты опроса?

Да, первые минуты показания успешно передаеются.
Он один на линии RS-485/
Увеличил poll_interval до 100

В логе:
Apr 29 13:25:37 wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: failed to establish meter connection [slave_
id is milur:87352]
Apr 29 13:25:37 wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: failed to establish meter connection [slave_
id is milur:87352]
Apr 29 13:25:43 wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: invalid crc [slave_id is milur:87352]
Apr 29 13:25:44 wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: invalid crc [slave_id is milur:87352]
Apr 29 13:25:49 wirenboard user.notice serial: TSerialDevice::ReadRegisterRange(): warning: Serial protocol error: invalid crc [slave_id is milur:87352]
и т.д.

То есть сначала показания снимаются нормально, а потом перестают?
Помогает ли выполнить в консоли service wb-mqtt-serial restart
?

Да, но при этом в лог завален сообщениями об ошибке invalid_crc каждый несколько секунд.

После того, как показания перестают передаваться, ошибки в логе не появляются.

После выполнения restart все повторяется.

А попробуйте применить советы отсюда: Счетчики Милур-107
В частности, попробуйте включить режим однобайтовой адресации, и в интерфейсе указать однобайтовый адрес.

Также попробуйте, пожалуйста, включить режим отладки: “debug”: true,
и прислать кусок лога, когда всё нормально, и после возникновения проблемы.

Логи прикладываю
https://drive.google.com/open?id=1hhhhu3DyBXnvs89y91TEXIHA199gypYE

cbv, здравствуйте!
Скажите, а рекомендации выше вам удалось применить (однобайтовый режим адресации включить и обращаться по однобайтовому адресу)?

Здравствуйте!
Режим однобайтовой адресации на счетчике включил.
Счетчик по однобайтовому адресу не цеплялся, передачи показаний в этом случае не происходило. Лог я так же приложил в предыдущем сообщении.

А пришлите пожалуйста кусок лога, в котором одновременно будет и момент, когда всё работает, и момент, когда уже не работает.
То есть там должны быть записаны пакеты отправленные и принятые, когда всё работает, и пакеты отправленные и принятые, когда уже не работает (судя по предыдущим сообщениям, из-за ошибок CRC).

А через родную утилиту Милур счётчик был доступен по адресу 255?

Это как раз 3 файл, который приложен (Последние…).
Там видно, что на счётчик перестает что либо отправляться и с него так же ничего не приходит.

На память не скажу. Если это важно, могу проверить позже.

Да, желательно проверить.

Переключил на однобайтовую адресацию.
Счетчик цепляется по короткому адресу и к милуровской программе и контроллеру.
Ошибка invalid_crc исчезла, но счетчик продолжает отваливаться через какое-то время.
Лог прилагаю.
https://drive.google.com/open?id=1hdmzfnCO63B9ue-7R0gKXZhk5tq7VjN_

Обнаружил, что при отключении подачи электроэнергии на счетчик и возобновлении через некоторое время, счетчик автоматически не подключаются к контроллеру. Необходимо перезапускать mqtt-serial. Насколько я понимаю, такого быть не должно.

Не должно. Запишите пожалуйста новый лог и добавьте в него комментарии: в какой момент сняли питания с счётчика, в какой вернули обратно.

По вашему логу никаких ошибок как раз не видно, видно только нормальный обмен данными.

В логах видно только то, что ничего не происходит. От wb-mqtt-serial в логе после (выключения и включения счетчика) или нескольких минут работы нет никаких записей - на счетчик ничего не шлется и с него ничего не приходит.

service wb-mqtt-serial status
● wb-mqtt-serial.service - LSB: MQTT Driver for serial devices
Loaded: loaded (/etc/init.d/wb-mqtt-serial; generated; vendor preset: enabled)
Active: active (running) since Mon 2019-05-06 15:59:25 UTC; 4min 59s ago
Docs: man:systemd-sysv-generator(8)
Process: 21483 ExecStop=/etc/init.d/wb-mqtt-serial stop (code=exited, status=0/SUCCESS)
Process: 21492 ExecStart=/etc/init.d/wb-mqtt-serial start (code=exited, status=0/SUCCESS)
CGroup: /system.slice/wb-mqtt-serial.service
├─21499 /bin/bash -c exec /usr/bin/wb-mqtt-serial -c /etc/wb-mqtt-serial.conf 2>&1 | logger -t serial
├─21500 /usr/bin/wb-mqtt-serial -c /etc/wb-mqtt-serial.conf
└─21501 logger -t serial

ага, понял. В настройках у вас

“response_timeout_ms”: 0,

Нужно поставить туда что-то разумное, например 100мс. 0 - это ждать вечно ответа.

Спасибо, работает теперь.
Подскажите, пожалуйста, можно ли как-то поймать событие - дисконнект устройства, чтобы через wb-rules его обрабатывать?

к сожалению, нельзя. Только по каким-нибудь косвенным данным, например что какое-нибудь напряжение слишком долго не обновлялось.