Виртуальные устройства


#1

Подскажите, как сохранить состояние switch триггеров после перезагрузки контроллера?
У меня они все переходят в положение ON, а хотелось бы их оставить в том положении, при котором они были до перезагрузки.
Вот пример:

defineVirtualDevice(“Air_Valve_Stroke_1_1”, {
title: “Air valve (Living room)”,
cells: {
‘open’ : {
type : “switch”,
value : dev[“wb-mio-gpio_191:2”][“DIR1”]
},
‘opening degree’ : {
type : “range”,
value : 0,
min : 0,
max : 90,
readonly: false
}
}
});

У реле dev[“wb-mio-gpio_191:2”][“DIR1”] положение вроде не меняется после перезагрузки, но
Air_Valve_Stroke_1_1/open становится всегда true.


назначил(а) ответственного Kilpio #2

#3

Добрый день, Stark!

Вот есть такое предостережение в описании движка правил:
“Не следует использовать объект dev вне кода правил. Не следует присваивать значения параметрам через dev вне then-функций правил и функций обработки таймеров (коллбэки setInterval / setTimeout). В обоих случаях последствия не определены”

Весьма вероятно, что когда после перезагрузки создается виртуальное устройство, движок правил ничего еще не знает о wb-mio-gpio_191:2, так как не успел прочесть нужный топик.

Попробуйте инициализировать контрол switch вашего виртуального устройства через таймер, по прошествии нескольких секунд, когда движок правил будет знать об устройстве. Поскольку в текущей версии движка нет persistent-значений, можно при изменении сохранять их в файловую систему, а при инициализации считывать оттуда (не годится для часто меняющихся значений, но для выключателей – вполне).


#4

Здравствуйте!
Есть ли способ в скрипте определить - создано ли, имеется ли вирт устройство или нет?
Мой скрипт создает вирт устройство и использует в работе его параметры. При создании я инициализирую некоторые из них. Если оно уже создано ранее, и пареметры уже выставлены, то нужно пользоваться теми, что стоят, не переопределять их.
Как мне узнать, что вирт. девайс уже есть?


#5

Думаю можно посмотреть значение какого-нибудь канала устройства через dev[]


#6

так и делаю, это вроде работает. Но приходится думать о канале. чтобы там не оказалось 0. Т.к. на undefined и null несуществующий канал не реагирует. Он воспринимается, как false или 0. Получается, что у несуществующего канала вполне существующее значение.

дополнение:
еще пытаюсь обратиться к св-ву title - не получается. Не знаете как?
dev.device80.title не работает


#7

А есть признак комлитности девайса?

019-04-09 14:44:43skipping rule due to incomplete cell WatchDog666: IncompleteCellCaught: incomplete cell encountered: start

2019-04-09 14:44:43skipping rule due to incomplete cell WatchDog666_stop: IncompleteCellCaught: incomplete cell encountered: start


#8

Нужно ли переопределять вирт устройство, если оно уже создано и я, например, рестартую правила?
Опытным путем вижу, что если вирт девайс уже был, то его контролы читаются. Но не те, которые можно с вэбморды менять. Наверное, если его не создавать каждый раз, москито его не обрабатывает и не подписывается? Значит, нужно каждый раз создавать и не обращать внимание на морду?


#9

Если вы запускаете движок правил заново, то и виртуальное устройство надо создавать заново, как-то так.


#10

понял, спасибо! Значит проверять создано оно или нет теряет смысл. Спасибо еще раз!


#11

Возможно ли создавать в скрипте виртуальное устройство с произвольным числом и именем полей? То есть я хочу, чтобы скрипт, в зависимости от введенных значений создавал вирт. устройство с указанным именем и полями.
Например, задаем массив нескольких объектов полей, а скрипт создает вирт. девайс с этими полями. Возможно ли такое сделать?

Вопрос снят, сделал)


#12

Добрый день!
Отлично. А можете сюда выложить: Примеры скриптов ?


#13

готово!