WirenBoard 6 + WB-MR6C (v3.4A) + соленоидные клапана

обновил прошивку командой
apt update && apt dist-upgrade
появился русский язык и ушли проблемы с вкладкой правила

Вот теперь более понятно. Реализовать можно, но тут уже алгоритм должен быть посложнее. То есть нужно создавать очередь запросов на включение клапанов и обработку этих запросов с заданным периодом, если очередь не пустая. Пока не готов навскидку дать пример.

Есть возможность исправить вкладку правила?
После моих экспериментов с JS у меня опять
Ошибка записи файла: MQTT RPC request timed out MqttTimeoutError

Спасибо за уделенное время, буду ждать пример.

обновил прошивку командой
apt update && apt dist-upgrade

Если на контроллере было старое ПО до системы релизов, то нужно 2 раза выполнять команду

apt update && apt dist-upgrade

Если не уверены, то выполните ее еще раз.

Попробуйте использовать браузер Chrome (если еще не используете), обновите страницу со сбросом кеша (Ctrl+F5), удалите (сделайте копию, если нужно) все свои правила из директории
/mnt/data/etc/wb-rules, проверьте статус работы сервиса wb-rules командой:

systemctl status wb-rules

Должен быть active (running). Попробуйте перезапустить сервис командой:

systemctl restart wb-rules
2 лайка

Добрый вечер, провожу эксперименты с реле WB-MR6
не подскажите почему в моем JS - скрипте не корректно работает интервал в 4 секунды?

setInterval(function() {
dev[“wb-mr6c_21”][“K1”] = false;
}, 4000);
setInterval(function() {
dev[“wb-mr6c_21”][“K1”] = true;
}, 4000);

Функция setInterval выполняет через заданные промежутки времени действия, указанные в качестве ее аргумента. В данном случае вы используете две такие функции. То есть раз в 4 секунды значению канала реле будет присваиваться 0 и сразу же 1.

А какое действие хотите реализовать? Например, если нужно периодически включать и отключать реле раз в 2 секунды, то нужно сделать так:

var impulse_duration = 2000;

setInterval(function () {
    dev["wb-mr6c_78"]["K1"] = true;
    setTimeout(function () {
        dev["wb-mr6c_78"]["K1"] = false;
    }, impulse_duration);
}, impulse_duration * 2);
1 лайк

Добрый вечер!
Возможно существование функции

setTimeout(function () {
dev[“wb-mr6c_78”][“K1”] = false;

отдельно от

setInterval(function () {

извиняюсь если вопрос задан не корректно.

Я хочу

  1. мониторить состояние счетчиков срабатывания
  2. отключать реле сразу после срабатывания
  3. включать реле с интервалом в 1 секунду на основе счетчика срабатывания.

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

наша переписка от 03.03.2022
Пример
Замкнулись 1,2,6 контакты на 1 реле
и 3,4 контакты на 2 реле

Производить дальше мониторинг открытия, закрытия реле
закрыть 1 соленоид на 1 реле
через 5 секунд закрыть 2 соленоид на 1 реле
через 5 секунд закрыть 6 соленоид на 1 реле
через 5 секунд закрыть 3 соленоид на 2 реле
через 5 секунд закрыть 4 соленоид на 2 реле
на основе мониторинга закрывать соленоиды далее
открывать с интервалом в 1 секунду.

Да, конечно. Это описано в документации:

https://wirenboard.com/wiki/Rule_Examples

Добрый вечер, подскажите как прочитать канал
Input 1 counter на моём реле и сравнить его с числом

Это можно сделать, например, так:

if (dev["wb-mr6c_78/input_1 Counter"] > 0) {
  log("Input 1 Counter is bigger than 10");
}

Спасибо за примеры.
Имеется ли возможность использую JS отключить режим управления входами реле K1-6 и сделать возможность управления данным режимом через виртуальные переключатели?
Режим работы входа 1
Управление отключено
Режим работы входа 2
Управление отключено
Режим работы входа 3
Управление отключено
Режим работы входа 4
Управление отключено
Режим работы входа 5
Управление отключено
Режим работы входа 6
Управление отключено

Параметры обычно меняются один раз при конфигурировании модуля в веб-интерфейсе контроллера. Так это сделать проще и понятнее. Также параметры можно изменять, используя в командной строке контроллера утилиту modbus_client при остановленном драйвере wb-mqtt-serial.

Вы хотите изменять режим работы входа, когда модуль уже сконфигурирован и опрашивается? Какая у вас задача?
Без дополнительных ухищрений это сделать нельзя, так как порт занят драйвером. Можно, конечно, из правил сначала остановить драйвер, вызвать утилиту modbus_client с нужными параметрами, затем опять запустить драйвер. Но это будет очень коряво и неудобно.

var impulse_duration = 3000;

setInterval(function() {

setTimeout(function () {
	if (dev["wb-mr6c_21/Input 1"] == 1) 

// если было выполнено первое условие “первый if” жди 5 секунд и не выполняй код дальше
// после паузы 5 секунд выполняй код дальше
// если не было выполнено первое условие “первый IF” выполняй код дальше

	{dev["wb-mr6c_21"]["K1"] = true;}
	else {dev["wb-mr6c_21"]["K1"] = false;}
}, impulse_duration * 1);  	

setTimeout(function () {    
    if (dev["wb-mr6c_21/Input 2"] == 1) 
	{dev["wb-mr6c_21"]["K2"] = true;}
	else {dev["wb-mr6c_21"]["K2"] = false;}
}, impulse_duration * 2); 

}, impulse_duration * 1);

Добрый вечер, подскажите как вставить паузу в код

Добрый день, подскажите куда “сыпятся логи” при создании строки
log(“off counter” + i);
в Rules JS

Вот здесь описано:

Также эти логи можно просматривать из веб-интерфейса либо на странице системного журнала:


либо (что удобнее) из вспомогательного окна, которое вызывается по нажатию на кнопку с гаечным ключом:

В JavaScript нет возможности непосредственно остановить выполнение кода. Можно только задать отложенное событие с помощью, например, функции setTimeout, при активации которого будет выполнен указанный код.
Довольно сложно написать код по описанию. Алгоритмически это будет примерно так:

 - если было выполнено первое условие “первый if”, то запусти функцию setTimeout с аргументом 5000. В теле передаваемой функции-аргумента указать нужные действия для этого варианта событий.
 - иначе выполняй другие действия