Обработка потери и восстановления связи с модулями

После ознакомления с Отработка правил завязанных на счетчики при перезагрузке - #86 от пользователя Teemon и проверки в текущем варианте возникли некоторые вопросы. Возможно, что я что-то упускаю.

Итак, есть контроллер WB 8.5, ПО версии 2504, WB-MCB8 прошивка 1.6.8.

Берем MQTT Explorer, подключаемся и смотрим, скажем, на Input 1 Single Press Counter.

  1. Изначально он равен, скажем, 2. В MQTT Explorer 2, в списке устройств 2.2.
  2. Сбрасываем питание с модуля, но не контроллера.
  3. Ждем и видим, что модуль и его топики переходят в ошибку.
  4. Включаем питание.
  5. Ждем, устройство возвращается обратно. В списке устройств значение топика остается 2, в MQTT Explorer тоже 2.
  6. Нажимаем и отпускаем кнопочку.
  7. Счетчик обновляется в 1 и в списке устройств и в MQTT Explorer. WB Rules реагирует на изменение значения.
  8. Непонятный момент: Input 1 counter при этом не сбрасывается, а прирастает на 1.

Вопрос: следует ли из этого, что 0 мы получаем только при переполнении счетчика. Из предыдущей темы этого не следует, но эксперимент не соответствует предыдущей теме.

Очень хочется избежать ложных срабатываний, но городить ненужный огород в коде не слишком хочется.

Добрый день.
Попробую воспроизвести.

Я подписался на топики устройства и выполнил два нажатия

Jul 18 14:39:08 /devices/wb-mcm8_28/controls/Input 1 counter 1
Jul 18 14:39:08 /devices/wb-mcm8_28/controls/Input 1 1
Jul 18 14:39:08 /devices/wb-mcm8_28/controls/Input 1 0
Jul 18 14:39:09 /devices/wb-mcm8_28/controls/Input 1 counter 2
Jul 18 14:39:09 /devices/wb-mcm8_28/controls/Input 1 1
Jul 18 14:39:10 /devices/wb-mcm8_28/controls/Input 1 0

Затем отключил и включил устройство.

Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 1 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 2 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 3 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 4 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 5 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 6 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 7 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 8 counter/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Serial/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 1/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 2/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 3/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 4/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 5/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 6/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 7/meta/error r
Jul 18 14:40:38 /devices/wb-mcm8_28/controls/Input 8/meta/error r
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 1/meta/error (null)
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 2/meta/error (null)
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 3/meta/error (null)
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 4/meta/error (null)
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 5/meta/error (null)
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 6/meta/error (null)
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 7/meta/error (null)
Jul 18 14:40:44 /devices/wb-mcm8_28/controls/Input 8/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 1 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 2 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 3 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 4 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 5 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 6 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 7 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Input 8 counter/meta/error (null)
Jul 18 14:40:45 /devices/wb-mcm8_28/controls/Serial/meta/error (null)

Соответственно в топике прежнее значение.
В регистре устройства после включения - 2. Восстановлены из EEPROM
Увеличиваю счетчик на устройстве:

Jul 18 14:43:23 /devices/wb-mcm8_28/controls/Input 1 1
Jul 18 14:43:23 /devices/wb-mcm8_28/controls/Input 1 counter 3
Jul 18 14:43:24 /devices/wb-mcm8_28/controls/Input 1 0

Получаю 3 в топике.
проверяю:

modbus_client_rpc --debug -mrtu -b115200 -pnone -s1 /dev/ttyRS485-1 -a28 -t0x04 -r 0x003C -c2
2025-07-18 14:50:00,079 [DEBUG] [1c][04][00][3c][00][02][b2][4a]
2025-07-18 14:50:00,082 [DEBUG] Connecting to broker unix:///var/run/mosquitto/mosquitto.sock
2025-07-18 14:50:00,088 [DEBUG] RPC Client -> {'path': '/dev/ttyRS485-1', 'baud_rate': 115200, 'parity': 'N', 'data_bits': 8, 'stop_bits': 1, 'response_size': 9, 'format': 'HEX', 'msg': '1c04003c0002b24a', 'total_timeout': 1000} (1000 timeout ms)
2025-07-18 14:50:00,115 [DEBUG] RPC Client <- {'response': '1c0404000000037684'}
2025-07-18 14:50:01,117 [DEBUG] Response: 1c0404000000037684
2025-07-18 14:50:01,118 [DEBUG] <1c><04><04><00><00><00><03><76><84>
SUCCESS: read 2 elements:
	Data: 0x0000 0x0003 

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

И можно уточнить вашу ревизию прошивки MCM8?

1.6.8 (актуальная)

Все как в старой шутке про «хороший инженер должен быть внимательным и не брезгливым» :slight_smile:

Перепроверил. Input 1 Counter действительно не сбрасывается. Но вот Input 1 Single Press Counter сбрасывается по первому короткому нажатию. При этом Input 1 Long Press Counter живет отдельной жизнью и сбрасывается по первому длинному нажатию. Это я посмотрел по топикам MQTT в GUI.

Кратко подводя итоги:

  1. Просто Counter живет в EEPROM и переходит через 0 только по переполнению.
  2. Типы нажатий сбрасываются после потери питания, но 0 никогда не присылается, вместо этого приходит сразу 1.
  3. Было бы неплохо добавить инструкцию по обработке всего этого куда-нибудь на страничку про правила и, возможно, ссылки туда со страниц устройств.

Не только, может быть сброшен и записью в регистр.

Нет, как раз в нем после сброса питания - 0. Можно убедиться прочитав его, именно значение регистра.

“1” - публикуется потому что если на модуле нет регистров настроенных на периодический опрос - то событием является только инкремент счетчика.
Соответственно я бы рекомендовал в любом случае ориентироваться на событие “отсутствие связи”.

Да, согласен…

Добрый день, удалось ли решить вопрос?

Не совсем. Остался вот какой вопрос: только что смотрел в конфигурацию MCM8. Там сказано, что опрос Input 1 Single Press Counter происходит “In order”. После восстановления питания его значение становится равным 0. Почему тогда оно не публикуется, а вместо этого присылается сразу 1?

Если для регистра в шаблоне указано “sporadic” - то перезапуск модуля не является “событием”. А вот инкремент значения - да.

Тогда все понятно. Остается все это выразить в логике обработчика.

Спасибо