Wb-rules: пытаюсь переназначить вход диммера на выход реле

Доброго времени суток. Имеется модуль реле WB-MR6C (управляет светом) и диммер светодиодных лент WB-MRGBW-D (управляет подсветкой). Возникла необходимость создать правило, при котором вход диммера управляет выходом реле, а вход реле управляет каналом диммера. Последнее у меня получилось, а вот с управлением реле возникли проблемы…

Имеется функция для перенаправления Input Диммера → Output Реле

К сожалению, эта функция не работает. Подскажите пожалуйста, в чем может заключаться ошибка?

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

Добрый день!

В коде у вас:

dev["wb – mr6c_" + relayId + "/" + channel]

Обратите внимание — здесь используется длинное тире и пробелы. В результате имя устройства получается не таким, как в MQTT.
Должно быть указано строго так же, как в системе. Рекомендую взять правильное имя в меню «Каналы MQTT» веб-интерфейса контроллера.

Вы совершенно правы, поправил, однако проблему это не решило. Для сравнения прикреплю обратную функцию, которая работает исправно (то есть по идее обращение к устройствам написано корректно в обоих случаях).


Также пробовал такой вариант (тоже не вышло):
dev[“/devices/wb-mr6c_” + relayId + “/controls/” + channel + “/on”] = newValue ? 1 : 0;
Все ещё ищу решение проблемы…

Добрый день!

Прошу прислать правило полностью, в текстовом формате.
Также рекомендую ознакомиться с данной статьёй, возможно, там уже есть готовые правила для решения вашей задачи.

Так выглядит правило полностью. Проблема с функцией makeDimmerToRelay и remapRelayInput (остальные работают корректно)

// Переназначение Input → Output внутри реле
function remapRelayInput(relayId, inputNum, targetOutput) {
defineRule(“remap_relay_” + relayId + “input" + inputNum + “to” + targetOutput, {
whenChanged: "wb-mr6c
” + relayId + "/Input " + inputNum,
then: function(newValue) {
// Управляем целевым выходом вместо стандартного
dev[“wb-mr6c_” + relayId + “/” + targetOutput] = newValue ? 1 : 0;
log("Реле " + relayId + ": Input " + inputNum + " → " + targetOutput + " = " + newValue);
}
});
}
// Переназначение Input → Channel внутри диммера
function remapDimmerInput(dimmerAddr, inputNum, targetChannel, brightnessLevel) {
defineRule(“remap_dimmer_” + dimmerAddr + “input" + inputNum + “to” + targetChannel, {
whenChanged: "wb-mrgbw-d-fw3
” + dimmerAddr + “/Input " + inputNum,
then: function(newValue) {
if (newValue) {
// Включение с указанной яркостью
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/” + targetChannel] = 1;
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/” + targetChannel + " Brightness”] = brightnessLevel;
log("Диммер " + dimmerAddr + “: Input " + inputNum + " → " + targetChannel + " = " + brightnessLevel + “%”);
} else {
// Выключение
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/” + targetChannel] = 0;
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/” + targetChannel + " Brightness”] = 0;
}
}
});
}

// Ванная и душевая - умное управление
function makeSmartDimmerLevel(addr, mainInput, nightInput, mainLevel, nightLevel) {
var state = { main: false, night: false, both: false };
// Основной свет
defineRule(“smart_dimmer_” + addr + “main", {
whenChanged: "wb-mrgbw-d-fw3
” + addr + "/Input " + mainInput,
then: function(newValue) {
state.main = newValue;
updateSmartDimmer(addr, state, mainLevel, nightLevel);
}
});
// Ночной свет
defineRule(“smart_dimmer_” + addr + “night", {
whenChanged: "wb-mrgbw-d-fw3
” + addr + "/Input " + nightInput,
then: function(newValue) {
state.night = newValue;
updateSmartDimmer(addr, state, mainLevel, nightLevel);
}
});
}

function updateSmartDimmer(addr, state, mainLevel, nightLevel) {
state.both = state.main && state.night;
if (state.both) {
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B)”] = 1;
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B) Brightness”] = mainLevel;
} else if (state.main) {
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B)”] = 1;
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B) Brightness”] = mainLevel;
} else if (state.night) {
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B)”] = 1;
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B) Brightness”] = nightLevel;
} else {
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B)”] = 0;
dev[“wb-mrgbw-d-fw3_” + addr + “/Channel 1 (B) Brightness”] = 0;
}
}

// Функция для перенаправления Input Диммера → Реле
function makeDimmerToRelay(dimmerAddr, inputNum, relayId, channel) {
defineRule(“dimmer_to_relay_” + dimmerAddr + “input" + inputNum, {
whenChanged: "wb-mrgbw-d-fw3
” + dimmerAddr + "/Input " + inputNum,
then: function(newValue) {
// Управляем реле (основной свет)
dev[“wb-mr6c_” + relayId + “/” + channel] = newValue ? 1 : 0;
}
});
}

// Функция для перенаправления Input Реле → Диммер
function makeRelayToDimmer(relayId, inputNum, dimmerAddr, level) {
defineRule(“relay_to_dimmer_” + relayId + “input" + inputNum, {
whenChanged: "wb-mr6c
” + relayId + "/Input " + inputNum,
then: function(newValue) {
// Управляем диммером (подсветка)
if (newValue) {
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/Channel 1 (B)”] = 1;
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/Channel 1 (B) Brightness”] = level;
} else {
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/Channel 1 (B)”] = 0;
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/Channel 1 (B) Brightness”] = 0;
}
}
});
}

// Ванная и душевая - умное управление
makeSmartDimmerLevel(“115”, 2, 1, 80, 2); // Ванная
makeSmartDimmerLevel(“104”, 1, 2, 80, 2); // Душевая

// Зал-Кухня - перенаправление управления
remapRelayInput(“167”, 5, “K4”); // Input 5 → K4
remapDimmerInput(“122”, 2, “Channel 1 (B)”, 20); // Input 2 → Channel 1
makeDimmerToRelay(“122”, 1, “167”, “K4”); // Input 1 Диммера 122 → Реле 167, K4
makeRelayToDimmer(“167”, 4, “122”, 20); // Input 4 Реле 167 → Диммер 122, 20%

// Коридор - перенаправление управления
remapRelayInput(“146”, 2, “K1”); // Input 2 → K1
remapDimmerInput(“246”, 2, “Channel 1 (B)”, 20); // Input 2 → Channel 1
makeDimmerToRelay(“246”, 3, “146”, “K1”); // Input 3 Диммера 246 → Реле 146, K1
makeRelayToDimmer(“146”, 3, “246”, 20); // Input 3 Реле 146 → Диммер 246, 20%

// Спальня - перенаправление управления
makeDimmerToRelay(“14”, 1, “167”, “K1”); // Input 1 Диммера 14 → Реле 167, K1
makeDimmerToRelay(“14”, 2, “167”, “K1”); // Input 2 Диммера 14 → Реле 167, K1
makeDimmerToRelay(“14”, 3, “167”, “K1”); // Input 3 Диммера 14 → Реле 167, K1
makeRelayToDimmer(“167”, 1, “14”, 20); // Input 1 Реле 167 → Диммер 14, 20%
makeRelayToDimmer(“167”, 2, “14”, 20); // Input 2 Реле 167 → Диммер 14, 20%
makeRelayToDimmer(“167”, 3, “14”, 20); // Input 3 Реле 167 → Диммер 14, 20%

// Детская - перенаправление управления
makeDimmerToRelay(“190”, 2, “155”, “K4”); // Input 2 Диммера 190 → Реле 155, K4
makeDimmerToRelay(“190”, 3, “155”, “K4”); // Input 3 Диммера 190 → Реле 155, K4
makeRelayToDimmer(“155”, 5, “190”, 20); // Input 5 Реле 155 → Диммер 190, 20%
makeRelayToDimmer(“155”, 6, “190”, 20); // Input 6 Реле 155 → Диммер 190, 20%
remapDimmerInput(“155”, 1, “Channel 1 (B)”, 20); // Input 1 → Channel 1

Добрый день!

Рекомендую:

  • проверьте в MQTT Explorer или через mosquitto_sub реальное имя топиков /Input X — оно должно совпадать с тем, что указано в whenChanged
  • для отладки добавьте log(newValue) в проблемные правила, чтобы увидеть, срабатывает ли событие
  • убедитесь, что у реле или диммера действительно включены входы (параметр Input публикуется в MQTT). Если вход физически не задействован, правило не сработает

Также рекомендую дать нашему роботу на портале на анализ ваш код. Робот доступен сверху справа (иконка робота). Он достаточно хорошо пишет и корректирует правила.

Большое спасибо, это я ещё не пробовал. Буду разбираться дальше. Возникнут дополнительные вопросы/найдётся решение - сообщу в этом обсуждении.

Добрый день!

Будут вопросы — обязательно пишите, постараюсь помочь.

Четко выявил проблему через логи и методом проб и ошибок нашел решение.


Проблема заключается в том, что правила не понимают 0 и 1 как управляющие сигналы (определяется как float64, а нужен другой формат).
Несколько примеров из кода, где конкретно проблемы:

Методом проб и ошибок выяснил, что нужен boolean формат
dev[“wb-mr6c_” + relayId + “/” + channel] = Boolean(newValue);

dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/Channel 1 (B)”] = false;
dev[“wb-mrgbw-d-fw3_” + dimmerAddr + “/Channel 1 (B) Brightness”] = Number(0)

dev[“wb-mr6c_” + relayId + “/” + targetOutput] = Boolean(newValue);

Таким образом ошибки пропали, функции заработали корректно. Спасибо за помощь, вопрос закрыт.

Добрый день!

Отлично! Рад, что всё получилось!