Добрый вечер! На объекте стоит WB 7, было уже как минимум 2 случая, когда включились/выключились каналы реле. Взаимодействие выключателей (wb-mini) и реле (mr6c) происходит в основном через WB Rules (т.к. топологию делали не мы). Прошу посмотреть. Замеченный глюк в 11.15 2 февраля. Никого дома в этот момент не было. В контроллере стоит штатная батарея, внешних АКБ на блоке питания пока нет (заказали, ожидаем).
Архив с диагностическими данными прикладываю.
diag_output_ACS446IO_2023-02-03-16.49.15.zip (137.1 КБ)
Добрый день. В логах wb-rules первые записи от “фев 03 13:35:54”
Покажите подозрителные на ваш взгляд логи (тех же правил) за указанный период.
Ну и добавьте вывод в лог переключения из правил, на всякий случай. Кстати, в указанное время отсутствовал интернет.
Что показывает история за этот период? Не было ли отключения питания 11-11:15?
Судя по всему как раз было.
Уже вышел с рабочего места. Доберусь, отправлю логи. У меня тоже подозрения на скачки напряжения, то что интернета нет, обратил внимание. Приедут АКБ, поставим. Но все равно, самовольное включение (выключение) очень опасно) в этот раз не было отопления сутки.
Отправлено из мобильной Почты Mail.ru
А кким образом фиксируется отсутствие связи с Modbus модулями? Есть ли соответствующий скрипт? Что будет, если питание модулей отключить а потом включить?
Просветление ко мне постепенно приходит)
Я так понимаю, потерев питание Мини реле сбрасывает счетчик нажатий и соответственно правило отрабатывает включение (правило следит за изменением счетчика)
Я прав?
Как от этого защититься?
Да. Можно хранить, например счетчик (прошлое значение) и проверять его, если “новое” меньше старого - то не выполнять правило хх секунд. Но тут надо учесть переход через 2^16.
Лучше обрабатывать ошибки так: Сообщение при отключении или неисправности в Telegram
и в случае недоступности устройств блокировать правило.
Приветствую всех! Столкнулся с такой же проблемой. При перезагрузке контроллера по какой-либо причине, происходит обнуление счетчиков в журнале MQTT. Причем происходит это по разному: в одних случаях просто обнуляются и выходы меняют своё состояние, в других случаях происходит уменьшение значения счетчика на 1 пункт, затем выставляется ошибка и журнал полностью обнуляется. Тогда выходы меняют своё состояние два раза.
Как варианты решения предположил три пути:
- Игнорирование нуля, но это только уменьшит количество ложных срабатываний из-за прокрутки счётчика в обратную сторону.
- Срабатывание скрипта по увеличению счетчика нажатий в большую сторону
- Задержка выполнения правил после старта контроллера на какой-то приемлемый период.
Два последних варианта кажутся более оптимальными.
Так как совсем нет опыта и знаний в написании кода, прошу помочь с этим вопросом. Помогите дополнить скрипт для работы по второму и третьему пути для проверки и выбора оптимального.
defineRule( "FAN", {
whenChanged: "wb-mr6c_127/Input 3 Double Press Counter", //Детект нажатий
then: function(newValue, devName, cellName) {
dev['wb-mr6c_96']['K6'] = !dev['wb-mr6c_96']['K6']; //Переключаем реле
}
});
Спасибо.
Очень интересно.
А какой релиз ПО на контроллере?
И да - счетчики нажатий реле - не сохраняются в свмих подулях после выключения питания. То есть - вполне ожидаемо, контроллер запускается → восстанавливет состояния счетчиков из базы wb-mqtt-serial → читает новые (обнуленные) значения.
Посмотреть можно на Восстановление состояния каналов WBIO-DO-SSR-8 - #3 от пользователя BrainRoot
К сожалению, с моим уровнем знаний, не смог разобрать в этой теме. Попробовал добавить в свои скрипты ещё одну строчку и теперь они выглядят так:
defineRule( "FAN", {
whenChanged: "wb-mr6c_127/Input 3 Double Press Counter", // Детект нажатий
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)//это то, что я добавил
{dev['wb-mr6c_96']['K6'] = !dev['wb-mr6c_96']['K6']; // Переключаем реле
}
}
});
Теперь из 12 подобных устройств, включаются только 5. Остальные 7 остаются выключенными.
Помогите побороть эту проблему!
Спойлер
defineRule(“FAN”, {
whenChanged: “wb-mr6c_102/Input 1 Double Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_96’][‘K5’] = !dev[‘wb-mr6c_96’][‘K5’];
}
});
defineRule( “FAN”, {
whenChanged: “wb-mr6c_127/Input 3 Double Press Counter”, // Детект нажатий
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)//это то, что я добавил
dev[‘wb-mr6c_96’][‘K6’] = !dev[‘wb-mr6c_96’][‘K6’]; // Переключаем реле
}
});
defineRule(“Sconce”, {
whenChanged: “wb-mr6c_127/Input 5 Double Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_102’][‘K2’] = !dev[‘wb-mr6c_102’][‘K2’];
}
});
defineRule(“FAN”, {
whenChanged: “wb-mr6c_127/Input 2 Double Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_96’][‘K4’] = !dev[‘wb-mr6c_96’][‘K4’];
}
});
defineRule(“Выкл LED”, {
whenChanged: “wb-led_63/Input 4 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-led_17’][‘RGB Strip’] = !dev[‘wb-led_17’][‘RGB Strip’];
}
});
defineRule(“Выкл spot 2”, {
whenChanged: “wb-mr6c_96/Input 2 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_160’][‘K6’] = !dev[‘wb-mr6c_160’][‘K6’];
}
});
defineRule(“Выкл spot 1”, {
whenChanged: “wb-mr6c_96/Input 3 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_160’][‘K5’] = !dev[‘wb-mr6c_160’][‘K5’];
}
});
defineRule(//Гост люст
{ whenChanged: “wb-mr6c_102/Input 2 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_160’][‘K1’] = !dev[‘wb-mr6c_160’][‘K1’];
}
});
defineRule(“Выкл люстр прав”, {
whenChanged: “wb-led_63/Input 3 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_102’][‘K4’] = !dev[‘wb-mr6c_102’][‘K4’];
}
});
defineRule(“Выкл спотов прав”, {
whenChanged: “wb-led_63/Input 2 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_102’][‘K3’] = !dev[‘wb-mr6c_102’][‘K3’];
}
});
defineRule(“Выкл люстр лев”, {
whenChanged: “wb-mr6c_96/Input 5 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_102’][‘K4’] = !dev[‘wb-mr6c_102’][‘K4’];
}
});
defineRule(“Выкл спотов лев”, {
whenChanged: “wb-mr6c_96/Input 4 Single Press Counter”,
then: function(newValue, devName, cellName) {
if (newValue = newValue ++, newValue > 0)
dev[‘wb-mr6c_102’][‘K3’] = !dev[‘wb-mr6c_102’][‘K3’];
}
});
Сегодня попробовал засунуть все скрипты в одно правило, но похоже, что больше 50 строк не воспринимает система. Тогда разбил их на три файла, но результата это не дало. По-прежнему после перезагрузки включаются пять каналов из 12. Я их выделил жирным шрифтом и поставил сверху списка. Очень нужна ваша помощь!
Точно работают и гораздо более длинные скрипты. На моей памяти - в 4 сотни строк.
А что выводится в лог сервиса wb-rules?
Какая помощь требуется?
Не могу сделать так, чтобы после рестарта контроллера не включались самопроизвольно выходы на модулях.
Спойлер
28-11-2023 22:08:14.188 INFO: all rule files are loaded
28-11-2023 22:08:14.110 WARNING: [rule warning] DAC: no config file
28-11-2023 22:08:13.159 INFO: [engine] Starting sync loop
28-11-2023 22:08:13.158 INFO: the engine is ready
28-11-2023 22:08:13.157 INFO: [engine] Starting main loop
28-11-2023 22:08:13.106 INFO: [wbgo_mqtt] wb-rules-engine-wirenboard-ALPGJL27-12106: MQTT connection established
28-11-2023 22:08:13.103 INFO: [rule info] using file /var/lib/wirenboard/wbrules-persistent.db for persistent DB
28-11-2023 22:08:13.089 INFO: driver is ready
28-11-2023 22:08:12.891 INFO: wait for driver to become ready
28-11-2023 22:08:12.885 INFO: driver loop is started
28-11-2023 22:08:12.885 INFO: driver loop is started
28-11-2023 22:08:12.877 INFO: [wbgo_mqtt] rules-wirenboard-ALPGJL27-12106: MQTT connection established
28-11-2023 22:08:12.875 INFO: driver is created
28-11-2023 22:08:12.872 INFO: broker URL is default and mosquitto socket detected, trying to connect via it
28-11-2023 22:08:12.710 INFO: [engine] Stop main loop
28-11-2023 22:08:12.707 INFO: [engine] Stopping sync loop
Я рекомендую (самый простой путь) после рестарта запускать правила через секунд 20-30.
Я не пониманию выражений
к сожалению.
Необходимо все же понимание языка, могу посоветовать Язык JavaScript для начала.
Если сталкиваетесь с поведением которое противоречит ожидаемому и/или документированому - с удовольствием помогу.
Поэтому я и писал выше:
Этой строчкой я пытался добиться срабатывая правила только после изменения счетчика в большую сторону и чтобы воспринималось значение больше нуля.
Согласен, но в кратчайший период его не освоить, а проблема есть сейчас. Ведь нигде не указано, что для пользования WB необходим определённый уровень подготовки. Пример скрипта был взят из виде с официального канала на YouTube. С одной стороны вроде и работает, входы одного устройства включают выходы другого, но есть баг, после рестарта контроллера, самопроизвольно включаются некоторые выходы. Вот и приходится обратится в ТП за решением этого вопроса.
Ну а разве это нормальное поведение выходов релейных модулей? В некоторых ситуациях это может быть даже опасным.
Нет. Эта строчка не делает вообще ничего. Нет выполняемых действий.
Написано, в документации.
Пример в youtube - совершенно базовый демонстрирующий сам принцип.
В реальных скриптах учитываются все возможные состояния, включя неопределенность включения.
Нет, как я чуть выше писал это учитывается при написании.
Я занимаюсь техподдержкой, могу проконсультировать по особенностям использования реализации JS - но написание скриптов - это за пределами моей функции.
Тогда странная ситуация получается. Если миссия компании - заставить людей изучить язык программирования, то функции техподдержка становятся понятными.
Есть конкретная настройка в модулях “Состояния выходов при подаче питания → Безопасное состояние выходов → Выключено”. По факту - не работает. Ведь настройка в видео, которую Вы называете “Базовой”, ломает настройку модуля. Вся суть ответов техподдержка сводится к паре предложений “Ну да, есть такое. Ну напишите правило”
Миссия компании - создать оборудование для решения задач. Это промышленное оборудование, которое с успехом применяется также и для домашней автоматизации.
Настройка - подразумевает понимание принципов работы, естественно.
Так… Вот это уже как раз функция техподдержки.
Воспроизвожу.
Настраиваю в реле включение 1 канала при подаче питания:
Ожидаю: включенный канал 1 после подачи питания
Подаю питание - реле 1 канала включается.
Соответсвует ожидаемому, в точности по документации.
Настраиваю режим “выключен”. В таком случае канал при включении питания не включается, также соответствует ожидаемому.
В настройке я как правило, руководствуюсь картой регистров модуля. В “видео” может быть рассмотрен частный слчай, предназначенный для решения конкретной задачи. Это наверняка не совершенно универсальный способ, подходящий всем.
Не надо руководстваться демонстрационными примерами.
Я в теме пока не нашел чего-то что не соответствоало бы логике работы и документации. Поведение вполне предсказуемое. Если есть примеры- то опишите пожалуйста, воспроизведу и устраню.