всем день добрый!
решил при помощи WB-MR6C организовать сигнальный щит
на котором будут зеленые и красные лампы
задумал три режима
1 - горит зеленым, “нормальная работа”
2 - горит красным, “холостой ход” (оборудование не запустилось после прогрева)
3 - мигает красным (blink mode), “запуск-прогрев”
вкл/выкл будет реализовано через действия заббикса, он у меня за всем следит, соответственно он будет запускать скрипт удаленно или выполнять команду по ssh
прошу совета, как лучше организовать “моргающий режим” - blink mode?
Добрый день. Вообще - я бы сделал штатным скриптовым движком wb-rules.
Использовать Как писать правила — Wiren Board
который срабатывая включает выход “на лампу” и запускает startTimer(); на перод свечения.
Ну и управление сигнализацией - свел бы к виртуальному устройству, управление которым легко делается через записть в MQTT топики.
где ж вы раньше были, почему я раньше не спросил?
у WBIO-DO-R1G-16 противопоказания на счет светодиодных ламп, а у меня лампы светодиодные, хотя думаю что в описании имеются в виду лампы освещения - их не рекомендуется подключать, а к сигнальным это не относится - они маломощные
а WBIO-DO-SSR-8 на оптронах, думаю самое то
вспомнил, почему выбрал WB-MR6C - потому что про него написано, что он:
"Предназначен для прямого управления маломощной нагрузкой (до 7А) без больших пусковых токов: сигнальные лампы, промежуточные контакторы.
прошу подсказать по синтаксису, где ошибка?
blink_r50k3 - определил в device name устройства в serial.conf
устройство в интерфейсе появилось, в mqtt отображается
switch переключается, только ничего не происходит
2021-05-19 17:23:17skipping rule due to incomplete cell 1: IncompleteCellCaught: incomplete cell encountered: K1
почему-то не хочет признавать K1, K2 и т.д., хотя в шаблоне /usr/share/wb-mqtt-serial/templates/config-wb-mr6c.json:
channels": [
{
“name”: “K1”,
“reg_type”: “coil”,
“address”: 0,
“type”: “switch”
},
на данный момент создал 12 виртуальных устройств (использую два реле, на каждое по 6 шт)
я так понял что зона действия startTicker(); глобальна
т.е. пока в каждом скрипте не прописал свой таймер получалась непонятная ерунда
сейчас у каждого свой уникальный таймер, но кнопки моргают вразнобой, не совсем красиво
как лучше сделать, описать startTicker() как-то отдельно или оставить как есть?
Здравствуйте! В первом варианте правил у вас было несколько ошибок:
В правиле “1” для функции Return используется регистр реле для запуска таймера, а надо использовать канал виртуального устройства.
Использование заглавных букв в названиях топиков - нужно было проверить названия топиков на странице Settings → MQTT Channels
В правиле “2” использование регистра реле для остановки таймера. Нужно было использовать канал виртуального устройства. В целом все, указанное выше, вы исправили сами.
Также при остановке таймера, наверное, нужно отключать все реле, а в вашем варианте реле может остаться включенным после остановки таймера.
Я бы предложил следующий вариант:
//виртуальные выключатели
defineVirtualDevice("blink_switches", {
title: "blink_switches",
cells: {
k1: {
type: "switch",
value: false
},
k2: {
type: "switch",
value: false
},
k3: {
type: "switch",
value: false
},
k4: {
type: "switch",
value: false
},
k5: {
type: "switch",
value: false
},
k6: {
type: "switch",
value: false
},
}
});
//запуск общего таймера
defineRule("start_timer",{
//если хотя бы один переключатель включен
whenChanged: function() { return ( dev["blink_switches/k1"] ||
dev["blink_switches/k2"] ||
dev["blink_switches/k3"] ||
dev["blink_switches/k4"] ||
dev["blink_switches/k5"] ||
dev["blink_switches/k6"]
)
},
then: function (newValue, devName, cellName) {
//запускаем общий таймер
if ( newValue == true) { startTicker("clock_1s", 1000); }
else {
//иначе останавливаем таймер; отключаем все реле, чтобы они не остались во включенном состоянии
timers.clock_1s.stop();
dev["wb-mr6c_50/K1"] = false;
dev["wb-mr6c_50/K2"] = false;
dev["wb-mr6c_50/K3"] = false;
dev["wb-mr6c_50/K4"] = false;
dev["wb-mr6c_50/K5"] = false;
dev["wb-mr6c_50/K6"] = false;
};
}
});
//управление реле
//добавляем переменную для определения времени включения реле
var oddCount = 0;
defineRule("switch_relay",{
when: function () { return timers.clock_1s.firing; },
then: function () {
//меняем значение oddCount с 0 на 1 или наоборот
oddCount = oddCount ^ 1;
//если oddCount == 1 и переключатель соответствующего реле включен, то включить реле, иначе выключить
if ( (oddCount == 1) && (dev["blink_switches/k1"] == true ) ) { dev["wb-mr6c_50/K1"] = true; } else { dev["wb-mr6c_50/K1"] = false; };
if ( (oddCount == 1) && (dev["blink_switches/k2"] == true ) ) { dev["wb-mr6c_50/K2"] = true; } else { dev["wb-mr6c_50/K2"] = false; };
if ( (oddCount == 1) && (dev["blink_switches/k3"] == true ) ) { dev["wb-mr6c_50/K3"] = true; } else { dev["wb-mr6c_50/K3"] = false; };
if ( (oddCount == 1) && (dev["blink_switches/k4"] == true ) ) { dev["wb-mr6c_50/K4"] = true; } else { dev["wb-mr6c_50/K4"] = false; };
if ( (oddCount == 1) && (dev["blink_switches/k5"] == true ) ) { dev["wb-mr6c_50/K5"] = true; } else { dev["wb-mr6c_50/K5"] = false; };
if ( (oddCount == 1) && (dev["blink_switches/k6"] == true ) ) { dev["wb-mr6c_50/K6"] = true; } else { dev["wb-mr6c_50/K6"] = false; };
}
});
попробовал
моргает, но
гасит все реле при включении и при выключении
мне надо чтобы конфигурация остальных реле, на момент включения блинка на каком-нибудь одном, не затрагивалась конфигурация остальных
попробовал несколько вариантов, не получается пока
так мы уберем выключение всех реле при остановке таймера, но
выключение реле при выключении блинка работает только при работающем таймере,
если блинк единственный, то при отключении его, вырубается таймер и отключение реле уже не срабатывает
это работает, но выключать реле не надо, они в этот момент вкл или выкл - соответственно своему состоянию, и лампы сигнальные горят или не горят согласно схеме, а тут их всех раз и выключили
если включить 1 блинк, то он не выключиться (если попал неудачно)
Это был только пример использования общего таймера для мигания ламп. Если у вас лампы еще и горят, то измените условия под себя, не отключайте нужные при остановке таймера. К тому же таймер можно вообще не останавливать.