Помогите разобраться

Доброго времени суток. Столкнулся с не совсем понятными для меня проблемами:
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;
}

устройство работает все нормально , но при нажатии на кнопку вылезает ошибка:

ECMAScript error: Error: setting unsupported proxy value: /devices/wb-mr6cv3_101/controls/K6/on
setDevValue /usr/share/wb-rules-system/scripts/lib.js:124 preventsyield
OpenDoor /etc/wb-rules/lock.js:32
anon /etc/wb-rules/lock.js:24 preventsyield
call native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:238 preventsyield

Найти описание ошибки не вышло, но складывается ощущение, что я как-будто где-то что-то упустил

Ошибку обнаружил.

Добрый день.

Думаю что использовать полный mqtt топик не нужно.

Отлично! :slight_smile:

А подскажите, пожалуйста, не до конца что-то понимаю
У меня получается есть виртуальное устройство, которое я вижу в devices

Что я хочу сделать:

  1. Для начала я пробую установить таймер на этом виртуальном устройстве, чтобы в течение трех секунд после нажатия на кнопку в топик /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)

  1. Дальше я хочу связать это вирутальное устройство с существующим wb-mr6c_v3 /devices/wb-mr6cv3_101/controls/K6, то есть опять же таким образом, чтобы при изменении в ВИРТУАЛЬНОМ устройстве, происходило замыкание контактов (чтобы выполнялось некоторое определенное действие) на wb-mr6c_v3 и таким образом на условных 3 секунды значение 1 выводилось в топик /devices/wb-mr6cv3_101/controls/K6

Вы (зачем?) используете полный путь. Не нужно при описаниии топика включать в него ниичего кроме имени устройства и имени канала.
Например

panel-logic/OpenLockFront"

Про это прямо написано в документации

О, спасибо!
Почему-то не додумался зайти на гит и посмотреть, смотрел только документашку и какие-то примеры оттуда

Всегда пожалуйста. Я и гадаю - ну видно ж что код написан уверенно, откуда ж думаю такая вольность в обращении с именами.
Тут дело в том что “недостающее” - потом уже подставляется, при создании подписки на топик. Оно (“devices”, “controls”) всегда одно, нет смысла его записывать.
Вот при использовании trackMqtt - да, там полный путь.

Все равно не понимаю, где я не прав)

Я вот что хочу сделать:
по задумке после нажатия на кнопку
image
дожно произойти следующее:

  1. В топик /devices/panel-logic/controls/OpenLockFront прийти значение 1 и такое же значение прийти на wb-mr6c_v3 (пока не соединял устройства, разбираюсь на вирутальном только)
  2. По истечение 3 секунд в тот же топик /devices/panel-logic/controls/OpenLockFront (и соответственно на mr6c_v3) должен попасть обратно 0

Но у меня почему-то 1 поступает, а обратно в нолик не сбрасывается, при этом вроде и до функции доходит и даже все пишет в самой функции
image

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);
}

Единственный момент , может, я неправильно выбрал control type ?
image

“on” - не нужно…
Верно:

dev["panel-logic/OpenLockFront"] = false;  //тип все ж булево

Вроде все ± заработало, но 3 вопроса остались:

  1. В mqtt-explorer вижу, что топик /devices/panel-logic/controls/OpenLockFront действительно перезаписывает значение, но у меня есть же еще в нем подтопик on , и , если в нем изменить значение , то оно перезапишет также и родителя, а вот наоборот уже не сработает (т.е если /devices/panel-logic/controls/OpenLockFront= 0 , то /devices/panel-logic/controls/OpenLockFront/on = 1 ) /

  2. Почему надо в случае как у меня “открытия двери” писать dev['panel-logic/OpenLockFront'] = 1; , а обратно именно dev['panel-logic/OpenLockFront'] = false;

  3. Попробовал слегка изменить код так, чтобы функция приняла вид:

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);
}

то начнется полный балаган:
image
это как раз из-за истории с


?

А вот это:

    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" 
}

то есть изменение контрола внутри самого правила, срабатывающего на этот же контрол?разве не должно его зациклить?

Да, точно
У меня видно мозг потек, спасибо!