Проблемы с каналом MDM3

Последний месяц (после пары лет работы) начали происходит аномалии со вторым каналом mdm3. То свет не выключается, то не включается. Раньше решалось - перегрузкой устройства (запись в регистр). Сейчас опять это всплыло - никто ничего не трогает, хотим через Вас попробовать выявить причину. К сожалению на объекте бываю редко и по месту бабушке что-то тяжело сделать, но всё же возможно. Я сделал скриншот:


прошивка MDM3 - 2.5.1.
Какие нужно еще данные собрать?

Добрый день.
Что пишет в канал K2/on значение 0?

Это скриптом попытка выключить по нажатию кнопки. Свет не горит! Скрипт соответственно делает обратное значение от текущего, а как видно на скриншоте switch К2 включен, скрипт пытается всегда выключить. Но это у него не получается.
В контролах этот switch так же всегда true:
/devices/wb-mdm3_233/controls/K2 true

кусок скрипта:

if (dev["wb-mdm3_233"]["K2"]){ 
        log ("Свет в ванной выключаем...");
        ...
        dev["wb-mdm3_233"]["K2"] = false;
}

В данный момент по логам всегда попадаем в эту ветку выключения.

Не понимаю описание.
Если остановить движок правил и управлять только из интерфейса - диммер включается-выключается?

Нет ли ошибок обмена с диммером?

Так по шагам.

  1. Есть устройство wb-gpio с подключенной к входу EXT1_IN12 кнопочным выключателем.
  2. Есть модуль MDM3 с адресом 233.
  3. Есть скрипт:
defineRule("switchbath", {
  whenChanged: "wb-gpio/EXT1_IN12",
  then: function (newValue, devName, cellName){
    if (newValue>0){
....
        if (dev["wb-mdm3_233"]["K2"]){ 
        log ("Свет в ванной выключаем...");
        ...
        dev["wb-mdm3_233"]["K2"] = false;
...
}


Ошибок обмена в логах не находит:

root@wirenboard-AYFITZ72:~# less  /var/log/messages | grep mdm
root@wirenboard-AYFITZ72:~#

Если остановить движок правил и управлять только из интерфейса - диммер включается-выключается?

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

Нет. wb-mqtt-serial лог читать надо через journalctl — утилита просмотра системного журнала — Wiren Board

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

тип newValue скорее всего логический а сравниваете с числом. Почему?

ОК. Тогда так:

root@wirenboard-AYFITZ72:~# journalctl --since “50 hour ago” -p 3 -u wb-mqtt-serial
– No entries –

или

journalctl -b 0 -p 4 -u wb-mqtt-serial
– Logs begin at Thu 2022-07-28 11:14:16 MSK, end at Thu 2022-07-28 12:47:35 MSK. –
Jul 28 11:14:21 wirenboard-AYFITZ72 wb-mqtt-serial[1958]: WARNING: [serial device] TSerialDevice::ReadRegister(): Serial protocol error: request timed out [slave_id is mercury200:40637969]

и т.д. всё касаемо mercury200

Хороший вопрос, но наверное отвечу - что так издавна сложилось, причем во всех скриптах. Как надо верно? Просто везде на этом объекте все работает 2 года и именно в этом месте что-то идет не так.

efineRule("switchbath", {
  whenChanged: "wb-gpio/EXT1_IN12",
  then: function (newValue, devName, cellName){
    if (newValue>0){
      //log ("Свет в ванной выключаем1");
      if (dev["wb-mdm3_233"]["K2"]){ 
        log ("Свет в ванной выключаем...");
        if (true){ // по логу работы выражение истина и мы входим в If, по логике это проверка времени последнего включения
          	dev["wb-mdm3_233"]["K2"] = false; // собственно в этом месте мы и посылаем в топик 0 (который на первом скрине)
            }
        }
      }else{
      	dev["wb-mdm3_233"]["K2"] = true;  
      }
    }
  }
});

Есть вариант вкл./выкл намного проще, вся логика в одну строчку:
dev[“wb-mdm3_233”][“K2”] = !dev[“wb-mdm3_233”][“K2”]

Согласен, но тут логика намного сложнее и завязана с датчиками пере переключением. Поэтому проще было просто написать false. Это выжимка из скрипта, как просил Андрей.

Все ж не в скрипте дело. Драйвер при публикиции нового значение в /on пишет его, значение в устройство. При следующем чтении из устройства уже должно вернуться значение.
Тут - либо не записалось (но была б ошибка)
Все же что выводит в логи, покажите без параметра “-p”

может я не совсем понял с журналом, но лог начинается с Thu 2022-07-28 14:48:17 MSK. Что бы я не задавал по глубине - лог с этого момента.
Поэтому прикрепляю файл что есть. log-file.zip (226.2 КБ)

А Debug режим включен и был? То есть оно в продакшене с ним работало?
По логу: не вижу ни одного чтения ReadFrame: e9 01 02
Для этого входа настроено чтение в wb-mqtt-serial.conf?
Покажите секцию настроек диммера из конфига, настройте чтение входа.

я с последнего залипания от 12.07.2022 (тогда свет не выключался) я включил дебаг.

хм… в это время уже все наладилось и работало.

это вопрос про wb-gpio/EXT1_IN12?

это что?

Нет, про модуль MDM3

Лучше из конфига, что именно указано. Ну и укажите период чтения явно.

Это?

"debug" : false,
  "ports" :
  [
    {
      "baud_rate" : 9600,
      "data_bits" : 8,
      "devices" :
      [
        {
          "device_type" : "WB-MRPS6",
          "slave_id" : "102"
        },
        {
          "device_type" : "WB-MRPS6",
          "slave_id" : "112"
        },
        {
          "device_type" : "WB-MWAC",
          "setup" : [],
          "slave_id" : "75"
        },
        {
          "device_type" : "WB-MDM3",
          "setup" : [],
          "slave_id" : "233"
        }
      ],
      "enabled" : true,
      "parity" : "N",
      "path" : "/dev/ttyRS485-1",
      "read_rate_limit_ms" : 10,
      "stop_bits" : 2
    },

Да. Укажите явно приортет чтения каналов, можно в веб-интерфейсе, что-то у меня подобное не воспроизводится.

сколько нужно?

поставьте 100-200, для проверки.

Хорошо, настроил. Вопрос на будущее, что нужно подготовить если вдруг опять подзависнет. Зависает один и тот же канал, другие работают без проблем при настройках по дефолту.

Проверить нужно, (можно включить Debug на время проверки) что драйвер записывает в диммер значение coil и читает его оттуда.