Частично отсутствуют топики modbus устройств

Добрый день!

Сегодня обнаружил на одном из контроллеров ошибки в логах wb-rules:


root@IQ314000:~# journalctl -u wb-rules -f -n 5000 | grep Set
Aug 23 07:09:44 IQ314000 wb-rules[28317]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K1: true
Aug 23 07:09:44 IQ314000 wb-rules[28317]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K2: true
Aug 23 07:09:44 IQ314000 wb-rules[28317]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K3: true
Aug 23 07:10:09 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control wb-mr6c_43/K1: false
Aug 23 07:10:10 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control wb-mr6c_43/K2: false
Aug 23 07:10:11 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control wb-mr6c_43/K3: false
Aug 23 07:10:14 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K2: true
Aug 23 07:10:14 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K3: true
Aug 23 07:10:14 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K1: true
Aug 23 07:10:15 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control syberia5_1/Power_ON_OFF: true
Aug 23 07:10:15 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control syberia5_1/Extractor fan target: 20
Aug 23 07:10:15 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control syberia5_1/Inflow fan target: 20
Aug 23 07:10:15 IQ314000 wb-rules[28877]: ERROR: failed to SetValue for unexisting control syberia5_1/Temp target: 8
Aug 23 07:10:26 IQ314000 wb-rules[30712]: ERROR: failed to SetValue for unexisting control wb-mr6c_43/K1: false
Aug 23 07:10:26 IQ314000 wb-rules[30712]: ERROR: failed to SetValue for unexisting control wb-mr6c_43/K2: false
Aug 23 07:10:27 IQ314000 wb-rules[30712]: ERROR: failed to SetValue for unexisting control wb-mr6c_43/K3: false
Aug 23 07:10:28 IQ314000 wb-rules[30712]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K2: true
Aug 23 07:10:28 IQ314000 wb-rules[30712]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K3: true
Aug 23 07:10:28 IQ314000 wb-rules[30712]: ERROR: failed to SetValue for unexisting control wb-mr3_39/K1: true

Далее я проверил, есть ли эти допики в действительности. Оказалось, что отображается только кусок девайса.

IQ314000:~# mosquitto_sub -t /devices/wb-mr3_39/# -v
/devices/wb-mr3_39/controls/Uptime 4005746
/devices/wb-mr3_39/controls/Input Voltage 11.831
/devices/wb-mr3_39/controls/Uptime 4005749
/devices/wb-mr3_39/controls/Input Voltage 11.821

root@IQ314000:~# mosquitto_sub -t /devices/wb-mr6c_43/# -v
/devices/wb-mr6c_43/controls/Uptime 4008262
/devices/wb-mr6c_43/controls/Input Voltage 12.371
/devices/wb-mr6c_43/controls/Uptime 4008268
/devices/wb-mr6c_43/controls/Input Voltage 12.384

wb-mqtt-serial при этом работает, данные по напряжению на реле и uptime обновляется

Версия wb-mqtt-serial

root@IQ314000:~# apt-cache policy wb-mqtt-serial
wb-mqtt-serial:
  Installed: 2.45.0-wb2
  Candidate: 2.59.2-wb2
  Version table:
     2.59.2-wb2 990
        990 http://deb.wirenboard.com/wb6/stretch stable/main armhf Packages
 *** 2.45.0-wb2 100
        100 /var/lib/dpkg/status

включен ли опрос состояний самих каналов реле в wb-mqtt-serial?

Что это такое и как проверить?
Раньше работало, мы не меняли конфиг. После перезапуска wb-mqtt-serial топики появились.

Топики добавляются wb-mqtt-serial при чтении конфига, при запуске. Нужно посмотреть в его лог, нет ли там ошибок. То есть при опросе какого-то регистра топик должен добавляться автоматически.
Включается опрос так: Screenshot from 2022-08-23 16-22-14

Web интерфейс не используем.

Конфиг wb-mqtt-serial вот такой:

/etc/wb-mqtt-serial.conf
{
  "debug": false,
  "ports": [
    {
      "baud_rate": 9600,
      "data_bits": 8,
      "devices": [
        {
          "device_type": "WB-MR3",
          "enabled": true,
          "slave_id": "39"
        },
        {
          "device_type": "WB-MR6C",
          "enabled": true,
          "slave_id": "43"
        },
        {
          "device_type": "WB-MCM8",
          "enabled": true,
          "slave_id": "6"
        },
        {
          "device_type": "WB-MAP12E fw2",
          "enabled": true,
          "setup": [
            {
              "address": "0x1460",
              "title": "Ch 1 L1 Turns",
              "value": 3000
            },
            {
              "address": "0x1461",
              "title": "Ch 1 L2 Turns",
              "value": 3000
            },
            {
              "address": "0x1462",
              "title": "Ch 1 L3 Turns",
              "value": 3000
            },
            {
              "address": "0x2460",
              "title": "Ch 2 L1 Turns",
              "value": 3000
            },
            {
              "address": "0x2461",
              "title": "Ch 2 L2 Turns",
              "value": 3000
            },
            {
              "address": "0x2462",
              "title": "Ch 2 L3 Turns",
              "value": 3000
            },
            {
              "address": "0x3460",
              "title": "Ch 3 L1 Turns",
              "value": 3000
            },
            {
              "address": "0x3461",
              "title": "Ch 3 L2 Turns",
              "value": 3000
            },
            {
              "address": "0x3462",
              "title": "Ch 3 L3 Turns",
              "value": 3000
            },
            {
              "address": "0x4460",
              "title": "Ch 4 L1 Turns",
              "value": 3000
            },
            {
              "address": "0x4461",
              "title": "Ch 4 L2 Turns",
              "value": 3000
            },
            {
              "address": "0x4462",
              "title": "Ch 4 L3 Turns",
              "value": 3000
            }
          ],
          "slave_id": "12"
        },
        {
          "device_type": "Syberia5",
          "enabled": true,
          "slave_id": "1"
        }
      ],
      "enabled": true,
      "parity": "N",
      "path": "/dev/ttyRS485-1",
      "protocol": "Modbus",
      "stop_bits": 2
    },
    {
      "baud_rate": 9600,
      "data_bits": 8,
      "devices": [
        {
          "device_type": "WB-MIR v2",
          "enabled": true,
          "slave_id": "191"
        },
        {
          "device_type": "WB-MSW v.3",
          "enabled": true,
          "slave_id": "178"
        }
      ],
      "enabled": true,
      "parity": "N",
      "path": "/dev/ttyRS485-2",
      "protocol": "Modbus",
      "stop_bits": 2
    }
  ]
}

Даже если ошибка, должна же присутствовать хотя бы мета информация.
На всё устройство было всего два топика, это Uptime и Input Voltage.
Я выборочно проверил несколько устройств, на всех них мета информации небыло.

Это как раз неважно, в брокер все равно информация выводится и присутствует.

Да, опрос каналов не отключен. Шаблоны стандартные?

А логи самого wb-mqtt-serial есть?

wb-mqtt-serial.txt (1.0 МБ)

Набор шаблонов не совсем стандартный. Он от старой версии wb-mqtt-serial, часть топиков по счетчикам убрана. Добавлены свои устройства. Но за основу взяты стандартные шаблоны.
templates.zip (180.3 КБ)

Для этого устройства вижу

Aug 23 04:04:21 IQ314000 wb-mqtt-serial[18806]: WARNING: [modbus] failed to read 1 holding(s) @ 8 of device modbus:39: Serial protocol error: request timed out

И судя по логу оно постоянно не читается. А момент запуска wb-mqtt-serial сохранился? Независимо от последующей удачности чтния топики все равно должны создаваться, и какой версии wb-mqtt-serial используется?

К сожалению нет, прислал самое с самого начала, что доступно.

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

wb-mqtt-serial был запущен дней 10 назад, к сожалению момент запуска не сохранился.

Сейчас в стабильтном 2.59.2-wb2
А в тестинге вообще 2.68
Но честно говоря именно такого бага в старом не помню, возможно был но при рефакторинге исправили.
А если новый поставить? У меня не воччпроизводится, даже заведомо отсутствующих устройств подобавлял - топики создаются.
Но удалять топики при работающем еще не пробовал, проверю.

Вручную топики вроде не удаляли…
Попробую обновиться до новой.

Знаю как воспроизвести. В целом все логично.
Нужно перезапустить mosquitto. При этом сохранение состояния топиков в БД должно быть отключено в конфиге mosquitto.

wb-mqtt-serial поидее должен понять что был разрыв… но он игнорирует это.
Из-за этого исчезают все топики состояний реле и метаданные к ним. Uptime и Input Voltage почему то появляется, возможно потому что значения изменяются.

АгА! Так, то есть надо в случае разрыва просто преинициализировать все, как при старте работы. Благодарю, вот до этого не додумывался.
Просто удалять - удалял, но при удалении вручную поведение понятно.

Возможно, то же самое нужно делать для виртуальных устройств wb-rules. Я не проверял.

Да, довольно интересный баг. То есть топики только для чтения - пересоздаются. Создал баг.

Похожее поведение:

root@IQ266004:~# mosquitto_sub -t /devices/system/controls/# -v
/devices/system/controls/Current uptime 0d 15h 52m

Так же после перезапуска mosquitto.

Перезапуск wb-rules пересоздал топики.

Добрый день!
Сможете написать как будет исправлено и в какой версии?

Да, оповещение поставил. Но тут довольно двойственно, постоянная проверка того что все топики созданы- она ресурсы зацмет.

А там нет триггера на разрыв соединения? После разрыва можно пересоздавать мета-информацию.
Так же, как вариант, подписаться на сами топики с мета информацией, если прийдет null - бить тревогу.