Самопроизвольное включение реле боковых модулей

Происходит самопроизвольное включение разных реле на модуле WBIO-DO-R1G-16. Что может быть причиной данного глюка?

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

приложен диагностический архив, доступен только сотрудникам поддержки
(240,1 КБ)

Максим, выше отправил вам

По логам ничего критичного не заметил, кроме как отсутствие связи с WB-MSW (slave id 20, 21), они физически отключены?
Но это к изначальному вопросу не имеет отношения.
Подскажите, какой сторонний софт у вас установлен? Настроены ли какие-то автоматизации на стороне или в wb-rules?
И можете более подробно описать что у вас происходит?
Реле просто сами включаются без каких либо вмешательств? С какой периодичностью? Каждый раз разное реле замыкается? Через какое время реле отключаются? Или так и остаются во включенном состоянии?

Закономерность срабатывания я не смог установить. Срабатывают разные реле, не одно и то же, но только реле модулей WBIO-DO-R1G-16. Срабатывают в рандомный момент времени. Срабатывают ли реле только на одном модуле или на обоих, я затрудняюсь ответить.
Для понимания: к контроллеру кроме прочих устройств подключены 2 модуля WBIO-DO-R1G-16. Часть реле используется для управления клапанами подачи воды, часть - для воздушных форсунок. Клапаны подачи воды могут открываться по нажатию кнопок. Для этого написаны несложные правила, но с использованием setTimeout. И изначально я думал, что причиной могла быть наводка по линии кнопок, но позже эта версия отвалилась, так как такой же глюк словило реле воздушной форсунки. А оно работает исключительно в скрипте, в котором также используется setTimeout.
Стороннего софта нет (tailscale был установлен по инструкции в wiki).
Реле остаются во включенном состоянии.
Последний раз глюк проявил себя 29.12.23 в отрезке времени между 16 и 22 часами

Можете правила скинуть? Может какая-то ошибка есть. Постараюсь проверить.

var downpourButton = 'wb-gpio/EXT1_IN11';
var downpourValve = 'wb-gpio/EXT3_K7';
var valveOpeningTime = 5000;


defineRule({
  whenChanged: downpourButton,
  then: function(newValue) {
    if (newValue) {
      timers.enableDownpour.stop();
      dev[downpourValve] = true;
      startTimer('enableDownpour', valveOpeningTime);
    };
  }
});


defineRule({
  when: function() {return timers.enableDownpour.firing;},
  then: function() {
    dev[downpourValve] = false;
  }
});
var steamButton = 'wb-gpio/EXT1_IN1';
var humidification = 'HumidityControl/OnOff';

var timerLast;
var timerTime;
var j = 0;


defineRule({
  whenChanged: steamButton,
  then: function(newValue) {
    if (newValue) {
      timerLast = Date.now();
    } else {
      timerTime = Date.now();
      if ((timerTime - timerLast) < 1000) {
        jCounter();
      } else {
        dev[humidification] = !dev[humidification];
      };
    };
  }
});

defineRule({
  when: function() {return timers.jclicksNumber.firing;},
  then: function() {
    dev['SteamSupply/PortionOfWater'] = dev['SteamSupply/MinPortion']*j;
    j = 0;
    dev['SteamSupply/ExecutionFlag'] = true;
  }
});


function jCounter() {
  timers.jclicksNumber.stop();
  j++;
  startTimer('jclicksNumber', 1000);
};

Давайте попробуем учесть дребезг?
Немного модифицировал код:

var downpourButton = 'wb-gpio/EXT1_IN11';
var downpourValve = 'wb-gpio/EXT3_K7';
var valveOpeningTime = 5000;
var debounceTime = 300; // время в миллисекундах для устранения дребезга

defineRule("debounceTimer", {
  asSoonAs: function() {
    return dev[downpourButton] && !timers.debounceTimer.isPending();
  },
  then: function() {
    startTimer("debounceTimer", debounceTime);
  }
});

defineRule({
  whenChanged: downpourButton,
  then: function(newValue) {
    if (newValue && !timers.debounceTimer.isPending()) {
      timers.enableDownpour.stop();
      dev[downpourValve] = true;
      startTimer('enableDownpour', valveOpeningTime);
    };
  }
});

defineRule({
  when: function() {return timers.enableDownpour.firing;},
  then: function() {
    dev[downpourValve] = false;
  }
});

Записал откорректированный скрипт. Буду наблюдать. Через неделю (или раньше) дам обратную связь

1 лайк

Мне коллеги еще подсказали что возможно у вас схожая проблема как и в этом топике: Проблема с WBIO-DO-R1G-16 (напряжение на каналах при разомкнутых контактах)
Сможете провести диагностику по перечисленным рекомендациям?

В моём проекте к выходу “Com” подключен GND с 24-вольтового блока питания, поэтому предположу, что снаббер не пропускает постоянное напряжение.
По характеру проблемы мне видится ситуация с перезагрузкой какого-то драйвера контроллера (wb-mqtt-gpio, который I2C) или шины wbio. После чего драйвер считывает последнее сохранённое состояние канала из mqtt-брокера и отправляет эту команду каналу. Вопрос только, почему считывается не то состояние, которое было на момент сбоя.
В общем, на данный момент в драйвере wb-mqtt-gpio я переставил галку с “Загружать предыдущее состояние после перезагрузки” на “Начальное состояние канала”. Надеюсь, начальное состояние каналов is false)))

Пришлось отказаться от этих изменений, так как после их сохранения и после каждой перезагрузки контроллера почти все реле этих двух модулей переходят в состояние “Включено”.