Wb-rules Virtual Device

Добрый день.
Подскажите, что я делаю не так:
хочу сделать виртуальный переключатель, который выключается через 2 секунды после включения.
написал такое правило:

defineVirtualDevice(“virtual_btn”, {
title: “Virtual button”,
cells: {
state: {
title: ‘State’,
type: “value”,
value: 0,
enum: {
0: “Off”,
1: “On”
}
}
}
});

defineRule({
whenChanged: “virtual_btn/state”,
then: function (newValue, devName, cellName) {
log(“newValue - '” + newValue + “'”);
if(newValue)
{
log(“Virtual btn - ON”);
setTimeout(function () {
log(“Virtual btn - OFF”);
dev[“virtual_btn/state”] = 0;
}, 2000);
}
}
});

устанавливаю свойство в “1” через

mosquitto_pub -h 127.0.0.1 -t /devices/virtual_btn/controls/state -m “1”

Вижу, что в устройствах свойство меняется, но в логах тишина и в “0” не переключается

https://wirenboard.com/wiki/MQTT#Структура_сообщения_—_команды_на_изменение_состояния

и
https://wirenboard.com/wiki/MQTT#Управление_устройствами_из_командной_строки

Передавать устройству команду (побудить к действию) необходимо в топик /on
попробуйте

mosquitto_pub -h 127.0.0.1 -t /devices/virtual_btn/controls/state/on -m “1”
1 лайк

Не получается. В логах:
ERROR: [backend] failed to process /on request to virtual_btn/state: This control is not writable

Добрый день.

Вы устанавливаете для контрола с неззананным readonly: false
То есть:

defineVirtualDevice("virtual_btn", {
  title: "Virtual button",
    cells: {
      state: {
        title: ‘State’,
        type: "value",
        teadonly: false,
        value: 0,
        enum: {
          0: "Off",
          1: "On"
        }
}
}
});

Проверил ваш код.
У меня правило отрабатывает при (после записи 1 через 2 секунды в появившаяся 1 меняется на 0 с соответствующем отображением в логе)

mosquitto_pub -h 127.0.0.1 -t /devices/virtual_btn/controls/state/on -m 1

и ошибок не вызывает

Если без /on , то значение в вирт устройстве меняется, а правило не отрабатывает (лог пустой).

Единственное, что я заменил у вас

dev["virtual_btn/state"] = 0;

Т.е. в устройство отправляю “цифру” 0, а не символ “0”

test3.7z (594 байта)
Прикрепил рабочий js скрипт (в архиве .7z ).

defineVirtualDevice("virtual_btn", {
  title: "Virtual button",
    cells: {
      state: {
      title: "State",
      type: "value",
      value: 0,
            enum: {
              0 :{en: 'Off', ru: 'ВЫКЛ'},
              1 :{en: 'On', ru: 'ВКЛ'},
            },
      readonly: false,
   }
 }
});


defineRule("test3",{
   whenChanged: "virtual_btn/state",
   then: function (newValue, devName, cellName) {
   log("newValue - " + newValue );
   if(newValue) { 
              log("Virtual btn - ON");
              setTimeout(function () {
                  log("Virtual btn - OFF");
                  dev["virtual_btn/state"] = 0;
                                      }, 2000);
            }
      }
  });


# Правило отрабатывает при записи  1  в топик /devices/virtual_btn/controls/state/on 
# 
# mosquitto_pub -h 127.0.0.1 -t /devices/virtual_btn/controls/state/on -m 1
#

C “readonly: false” и “…/on -m 1” заработало :slight_smile: