whenChanged не реагирует на изменение значение виртуального устройства

Добрый день,

Сделал правило для включения/выключения света при открытии ворот гаража и откатных ворот во двор с применением логики восход\закат через внешнее виртуальное устройство.
Управление светом у меня реализовано на HDL с которым WB общается через Iridium Server (тут крутиться вся визуализация) посредством MQTT.
Простое управление по WhenChanged с передачей топика по MQTT работает отлично. Я попробовал реализовать слежение за виртуальным устройством для переключения света и в зависимости от состояния (0 или 100 для HDL) записывать промежуточную переменную, а на основании её состояния позже выключать или нет свет во дворе.
По неизвестной причине скрипт wb-rules прекрасно читает положение виртуального переключателя день/ночь, но не читает значение из виртуального устройства с топиком типа value.
Подскажите куда копать?

Объявляю виртуальные устройства:

Спойлер

defineVirtualDevice(“sun_state”, {
title: “Sun status”,
cells: {
state: {
type: “switch”,
value: false,
},
}
});
defineVirtualDevice(“light”, {
title: “Light status”,
cells: {
garage: {
type: “value”,
value: 0,
},
parking: {
type: “value”,
value: 0,
},
}
});

Правило для управления:

Спойлер

defineRule(“Outside_light”,
{
whenChanged: [“wb-mrm2-mini_107/Button 2”,“wb-mrm2-mini_176/Button 1”,“wb-mrm2-mini_176/Button 2”],
then: function(newValue, devName, cellName)
{
var light_state = new PersistentStorage(“states”, {global: true});
log("Initial value "+light_state[“garage”]);
if (dev [“sun_state”][“state”] == false)
{
if ((dev[“wb-mrm2-mini_107”][“Button 2”] == false) || (dev[“wb-mrm2-mini_176”][“Button 1”] == false) || (dev[“wb-mrm2-mini_176”][“Button 2”] == false))
{
log("Intermidiate value Light Parking "+ dev[“light”][“parking”]);
if ((dev[“light”][“parking”] == 0) && (light_state[“garage”] == 0))
{
dev[“light”][“parking”] = 100;
light_state[“garage”] = 100;
log("Intermidiate value "+light_state[“garage”]);
}
}
if ((dev[“wb-mrm2-mini_107”][“Button 2”] == true) && (dev[“wb-mrm2-mini_176”][“Button 1”] == true) && (dev[“wb-mrm2-mini_176”][“Button 2”] == true) && (light_state[“garage”] == 100) )
{
dev[“light”][“parking”] = 0;
light_state[“garage”] = 0;
log("Switch off value "+light_state[“garage”]);
}
}
}
});

Добрый день.

Покажите пожалуйста правило, которое должно реагировать на изменение топиков light/garage`` и light/parking? Или вы просто читаете значения из этих топиков? Что возвращается при чтении? Ну и пользуйтесь пожалуйста вставкой кода через ```

Я просто читаю топик и сравниваю.
"if ((dev[“light”][“parking”] == 0) "

А какое значение читается-то?

Читается всегда 0.

Сделал тестовый скрипт:
defineRule(“test_whenChanged”, {
whenChanged: [“light/parking”],
then: function (newValue, devName, cellName) {
log("Intermidiate value Light Parking "+ dev[“light/parking”]);
}
});

Пробовал задавать значение вручную из Iridium - в логах даже не отображается, что значение меняется. В тоже время интерфейс WB адекватно демонстрирует все изменения.

Может попробовать как-то по-другому обратиться к топику?

Какой именно топик изменяется? Выложите результат подписки на него.

Я управлял со стороны Iridium Server, в это время слушал MQTT

~# mosquitto_sub -t ‘/devices/light/controls/parking’ -v
/devices/light/controls/parking 0
/devices/light/controls/parking 100
/devices/light/controls/parking 0
/devices/light/controls/parking 100
/devices/light/controls/parking 0
/devices/light/controls/parking 100
/devices/light/controls/parking 0

Лог WB пустой, т.е. мой тестовый скрипт который должен слушать этот топик его не видит.

Чтобы ваше правило заработало, нужно:

  1. В описании cells добавить
readonly: false,
  1. Публиковать из другого приложения новое значение в топик:
/devices/light/controls/parking/on

Проверил - у меня работает только так.
Если публиковать без /on - в mqtt брокере значение изменяется, это видно и в виджете виртуального устройства, и в Настройки-Каналы MQTT, но wb-rules видит старое значение, которое было когда-то опубликовано в /on.

2 лайка

Всё заработало. Проверил через MQTT Explorer - когда я записываю из стороннего приложения в /on, то значение изменяется одновременно и в /devices/light/controls/parking

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.