Происходит самопроизвольное включение разных реле на модуле WBIO-DO-R1G-16. Что может быть причиной данного глюка?
Добрый день.
Для диагностики проблемы пришлите, пожалуйста, архив с диагностической информацией контроллера. Создание архива описано в документации.
Максим, выше отправил вам
По логам ничего критичного не заметил, кроме как отсутствие связи с 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;
}
});
Записал откорректированный скрипт. Буду наблюдать. Через неделю (или раньше) дам обратную связь
Мне коллеги еще подсказали что возможно у вас схожая проблема как и в этом топике: Проблема с WBIO-DO-R1G-16 (напряжение на каналах при разомкнутых контактах)
Сможете провести диагностику по перечисленным рекомендациям?
В моём проекте к выходу “Com” подключен GND с 24-вольтового блока питания, поэтому предположу, что снаббер не пропускает постоянное напряжение.
По характеру проблемы мне видится ситуация с перезагрузкой какого-то драйвера контроллера (wb-mqtt-gpio, который I2C) или шины wbio. После чего драйвер считывает последнее сохранённое состояние канала из mqtt-брокера и отправляет эту команду каналу. Вопрос только, почему считывается не то состояние, которое было на момент сбоя.
В общем, на данный момент в драйвере wb-mqtt-gpio я переставил галку с “Загружать предыдущее состояние после перезагрузки” на “Начальное состояние канала”. Надеюсь, начальное состояние каналов is false)))
Пришлось отказаться от этих изменений, так как после их сохранения и после каждой перезагрузки контроллера почти все реле этих двух модулей переходят в состояние “Включено”.