Доброго времени суток. Столкнулся с не совсем понятными для меня проблемами: 1)
Создал виртуальное устройство и хочу, чтобы при нажатии на кнопку созданного виртуального устрйоства срабатывало включение K6 на устройстве mr6c_v3:
Сам скрипт:
defineVirtualDevice('panel-logic', {
title: 'Security locks' ,
cells: {
OpenLockFront: {
title: "Open front lock",
type: "pushbutton",
value: false,
order: 2
},
OpenLockBehind: {
title: "Open back and stairs locks",
type: "pushbutton",
value: false,
order: 2
}
}
});
// Button "Open front lock"
defineRule({
whenChanged: ["panel-logic/OpenLockFront"],
then: function (newValue, devName, cellName) {
if (newValue){
OpenDoor(); // call the function "Open door"
}
}
});
// function "Open door"
function OpenDoor() {
// Perform other actions, e.g., open the door
dev["/devices/wb-mr6cv3_101/controls/K6/on"] = 1;
}
устройство работает все нормально , но при нажатии на кнопку вылезает ошибка:
А подскажите, пожалуйста, не до конца что-то понимаю
У меня получается есть виртуальное устройство, которое я вижу в devices
Что я хочу сделать:
Для начала я пробую установить таймер на этом виртуальном устройстве, чтобы в течение трех секунд после нажатия на кнопку в топик /devices/panel-logic/controls/OpenLockFront/on записывалось значение 1, а затем сбрасывалось в 0:
defineVirtualDevice('panel-logic', {
title: 'Security locks' ,
cells: {
OpenLockFront: {
title: "Open front lock",
type: "pushbutton",
value: false,
order: 2
},
OpenLockBehind: {
title: "Open back and stairs locks",
type: "pushbutton",
value: false,
order: 2
}
}
});
var isButtonPressed = false; // Variable to track button press state
// Button "Open front lock"
defineRule({
whenChanged: ["/devices/panel-logic/controls/OpenLockFront/on"],
then: function (newValue, devName, cellName) {
if (newValue) {
isButtonPressed = true; // Set the button press state to true
OpenDoor(); // call the function "Open door"
}
}
});
// function "Open door"
function OpenDoor() {
// Perform other actions, e.g., open the door
dev['/devices/panel-logic/controls/OpenLockFront/on'] = 1;
// set timeout for 3 seconds
setTimeout(function () {
dev["/devices/panel-logic/controls/OpenLockFront/on"] = 0;
isButtonPressed = false; // Reset the button press state to false
}, 3000);
}
но тут у меня возникается ошибка 2024-06-07 12:48:53 defineRule: (anon)
Дальше я хочу связать это вирутальное устройство с существующим wb-mr6c_v3 /devices/wb-mr6cv3_101/controls/K6, то есть опять же таким образом, чтобы при изменении в ВИРТУАЛЬНОМ устройстве, происходило замыкание контактов (чтобы выполнялось некоторое определенное действие) на wb-mr6c_v3 и таким образом на условных 3 секунды значение 1 выводилось в топик /devices/wb-mr6cv3_101/controls/K6
Всегда пожалуйста. Я и гадаю - ну видно ж что код написан уверенно, откуда ж думаю такая вольность в обращении с именами.
Тут дело в том что “недостающее” - потом уже подставляется, при создании подписки на топик. Оно (“devices”, “controls”) всегда одно, нет смысла его записывать.
Вот при использовании trackMqtt - да, там полный путь.
Я вот что хочу сделать:
по задумке после нажатия на кнопку
дожно произойти следующее:
В топик /devices/panel-logic/controls/OpenLockFront прийти значение 1 и такое же значение прийти на wb-mr6c_v3 (пока не соединял устройства, разбираюсь на вирутальном только)
По истечение 3 секунд в тот же топик /devices/panel-logic/controls/OpenLockFront (и соответственно на mr6c_v3) должен попасть обратно 0
Но у меня почему-то 1 поступает, а обратно в нолик не сбрасывается, при этом вроде и до функции доходит и даже все пишет в самой функции
defineVirtualDevice('panel-logic', {
title: 'Security locks',
cells: {
OpenLockFront: {
title: "Open front lock",
type: "pushbutton",
value: false,
order: 2
},
OpenLockBehind: {
title: "Open back and stairs locks",
type: "pushbutton",
value: false,
order: 2
}
}
});
var isButtonPressed = false; // Variable to track button press state
// Button "Open front lock"
defineRule({
whenChanged: ["panel-logic/OpenLockFront"],
then: function (newValue, devName, cellName) {
if (newValue) {
isButtonPressed = true; // Set the button press state to false
dev['panel-logic/OpenLockFront'] = 1;
OpenDoor(); // call the function "Open door"
}
}
});
// function "Open door"
function OpenDoor() {
log.info(1111);
// Perform other actions, e.g., open the door
// dev['panel-logic/OpenLockFront/on'] = 1;
// set timeout for 3 seconds
setTimeout(function () {log.info(221);
isButtonPressed = false;
log.info(isButtonPressed);
dev["panel-logic/OpenLockFront/on"] = 0; // в таком случае пишет **failed to SetValue for unexisting control panel-logic/OpenLockFront/on: 0**
// dev["panel-logic/OpenLockFront"] = 0; // в таком случае ничего не записывает
}, 3000);
}
В mqtt-explorer вижу, что топик /devices/panel-logic/controls/OpenLockFront действительно перезаписывает значение, но у меня есть же еще в нем подтопик on , и , если в нем изменить значение , то оно перезапишет также и родителя, а вот наоборот уже не сработает (т.е если /devices/panel-logic/controls/OpenLockFront= 0 , то /devices/panel-logic/controls/OpenLockFront/on = 1 ) /
Почему надо в случае как у меня “открытия двери” писать dev['panel-logic/OpenLockFront'] = 1; , а обратно именно dev['panel-logic/OpenLockFront'] = false;
Попробовал слегка изменить код так, чтобы функция приняла вид:
function OpenDoor() {
log.info(1111);
dev['panel-logic/OpenLockFront'] = true; // раньше здесь было dev['panel-logic/OpenLockFront'] = 1
// Perform other actions, e.g., open the door
// dev['panel-logic/OpenLockFront/on'] = 1;
// set timeout for 3 seconds
setTimeout(function () {
isButtonPressed = false;
dev["panel-logic/OpenLockFront"] = false;
// Reset the button press state to false
}, 3000);
}
то начнется полный балаган:
это как раз из-за истории с
whenChanged: ["panel-logic/OpenLockFront"],
then: function (newValue, devName, cellName) {
if (newValue) {
isButtonPressed = true; // Set the button press state to false
dev['panel-logic/OpenLockFront'] = true;
OpenDoor(); // call the function "Open door"
}
то есть изменение контрола внутри самого правила, срабатывающего на этот же контрол?разве не должно его зациклить?