Здравствуйте, друзья!
Например, есть виртуальное устройство с топиком типа switch и есть правило типа whenChanged на данный топик. Если я меняю этот топик виджетом на дашборде - все ок, правило стабильно срабатывает. Но если я делаю публикацию в топик из внешнего приложения, то виджет на дашборде правильно отображет состояние, при этом правило не срабатывает. Т.е. изменения не доходят в wb-rules.
Что можно сделать чтобы заработало?
Объясни более предметно.
Покажи настройку tile на DashBoard`е. Что за внешнее приложение, покажи как там tile настроен.
Некоторое уточнение, данная проблема актуальна только для виртуальных устройств. Я попробовал для “wb-gpio/EXT1_K1” все хорошо работает.
Попробовать воспроизвести можно так:
-
в rules.js добавить такое:
defineVirtualDevice("Virtual", { title: "Virtual device", cells: { Ping_Pong: { type: "switch", value: false } } }); defineRule("test", { whenChanged: "Virtual/Ping_Pong", then: function (newValue, devName, cellName) { log(dev["Virtual/Ping_Pong"]); } });
-
в sh такое:
mosquitto_pub -t “/devices/Virtual/controls/Ping_Pong” -m “1” -r
и потом
cat /var/log/messages | grep wb-rules
Если хотите изменить состояние, то в конце топика надо добавить /on
https://wirenboard.com/wiki/index.php/MQTT#.D0.9D.D0.B0.D0.B6.D0.B0.D1.82.D0.B8.D0.B5_.D0.BA.D0.BD.D0.BE.D0.BF.D0.BA.D0.B8_.D0.B2_.D0.B2.D0.B5.D0.B1-.D0.B8.D0.BD.D1.82.D0.B5.D1.80.D1.84.D0.B5.D0.B9.D1.81.D0.B5_.D0.B8_.D0.BF.D0.B5.D1.80.D0.B5.D0.BA.D0.BB.D1.8E.D1.87.D0.B5.D0.BD.D0.B8.D0.B5_.D1.80.D0.B5.D0.BB.D0.B5_.D0.BD.D0.B0_.D0.B2.D0.BD.D0.B5.D1.88.D0.BD.D0.B5.D0.BC_.D0.BC.D0.BE.D0.B4.D1.83.D0.BB.D0.B5
Спасибо! Все работает!
Добрый вечер.
Спрошу здесь. Аналогичная ситуация (WB7 последний testing) при публикации из вне в топик meta “units”, значение в нем не меняется и остается “старым”
сама ячейка объявлена так
var gtDeviceID = "GT_MAI6_AI1";
try {
var gtDevice = defineVirtualDevice(gtDeviceID, {
title: "GT_MAI6_AI1",
cells: {
rawValue: {
title: "rawValue",
type: "value",
value: -999999999,
units: "%",
readonly: false,
order: 1,
},
соответственно не срабатывает правило
defineRule("isChangeRawValueUnits", {
whenChanged: gtDeviceID + "/rawValue#units", // При изменении ед. изм в топике поступающем с уcтройства
then: function (newValue, devName, cellName) {
try {
dev[gtDeviceID + "/inCalPoint_01#units"] = newValue;
Если сделать вызов с самого WB например так
dev[gtDeviceID + "/rawValue#units"] = "mA";
то правило срабатывает как надо.
И еще, если публиковать извне, то в веб интерфейсе значение меняется и даже переводится. Публиковал ед. изм. V, в не ( /on ) топик (см. скриншот выше) и она отобразилась веб интерфейсе
и даже перевелась, но срабатывание правила так и не произошло и в логе пусто .
Пробовал публиковать и
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/on
вообще ничего не меняется и
/devices/GT_MAI6_AI1/controls/rawValue/meta/units
так хоть web UI меняется. Искал по форуму вроде еще темы были, но не нашел.
нужно ли для виртуальных устройств всегда публиковать в топики /on для изменений? Вроде это относится только к физическим устройствам?.
что делаю неправильно?
UPD. Нашел похожую тему whenChanged не реагирует на изменение значение виртуального устройства - #9 от пользователя dust но у меня так не происходит
Вот что он ловит
Welcome to Wiren Board 7.3.3 (s/n AWH3C6UH), release staging.06865.cf98af374eb4 (as testing)
Linux wirenboard-AWH3C6UH 5.10.35-wb128 #1 SMP Wed Dec 28 07:35:41 UTC 2022 armv 7l GNU/Linux
System load: 34% Up time: 6:26
Memory usage: 21% of 997M Usage of /: 93% of 976M /mnt/data: 2 1% of 4.7G
7 package updates are available; type 'apt update && apt upgrade' to update them .
Last login: Sun Jan 8 00:50:46 2023 from 10.10.10.11
root@wirenboard-AWH3C6UH:~# mosquitto_sub -t '/devices/GT_MAI6_AI1/controls/rawValue' -v
/devices/GT_MAI6_AI1/controls/rawValue 8.058
^Croot@wirenboard-AWH3C6UH:~# mosquitto_sub -t '/devices/GT_MAI6_AI1/controls/rawValue/#' -v
/devices/GT_MAI6_AI1/controls/rawValue/meta {
"order": 1,
"readonly": false,
"title": {
"en": "rawValue"
},
"type": "value",
"units": "mA"
}
/devices/GT_MAI6_AI1/controls/rawValue/meta/type value
/devices/GT_MAI6_AI1/controls/rawValue/meta/units A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/on A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/ deg C
/devices/GT_MAI6_AI1/controls/rawValue/meta/order 1
/devices/GT_MAI6_AI1/controls/rawValue/meta/readonly 0
/devices/GT_MAI6_AI1/controls/rawValue 8.058
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/on "A"
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/on A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units "A"
/devices/GT_MAI6_AI1/controls/rawValue/meta/units "A"
/devices/GT_MAI6_AI1/controls/rawValue/meta/units A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/ (null)
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/on A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/on A
/devices/GT_MAI6_AI1/controls/rawValue/meta/units/on A
/devices/GT_MAI6_AI1/controls/rawValue/meta {
"order": 1,
"readonly": false,
"title": {
"en": "rawValue"
},
"type": "value",
"units": "A"
Вот если публиковать в meta весь JSON (последнее сообщение) то правило срабатывает , а по отдельности нет.
Выскажусь аккуратно, если в чем не прав - пусть старшие товарищи меня поправят.
- Для виртуальных устройств публиковать новые значения надо с /on на конце. Если опубликовать без /on - wb-rules видит старое значение, соответственно, whenChanged не сработает.
- Доступ к субтопикам /devices/+/controls/+/meta средствами wb-rules есть только для тех субтопиков, которые созданы wb-rules.
Добрый день.
ну так правило и виртуальное устройство создано в wb rules/
Виртуальное устройство
var gtDeviceID = "GT_MAI6_AI1";
try {
var gtDevice = defineVirtualDevice(gtDeviceID, {
title: "GT_MAI6_AI1",
cells: {
rawValue: {
title: "rawValue",
type: "value",
value: -999999999,
units: "%",
readonly: false,
order: 1,
},
Публикация в /оn из MQTT Explorera ничего не дает.
публикую
результат после публикации
в самом WB при подписке на топик
Правило не срабатывает, значение в виджите WEB UI не меняется.
А вот если так
Правило
// Правило изменения ед изм входных данных в калибровочной таблице
defineRule("isChangeRawValueUnits", {
whenChanged: gtDeviceID + "/rawValue#units", // При изменении ед. изм в топике поступающем с утройства
then: function (newValue, devName, cellName) {
try {
dev[gtDeviceID + "/inCalPoint_01#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_02#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_03#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_04#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_05#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_06#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_07#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_08#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_09#units"] = newValue;
dev[gtDeviceID + "/inCalPoint_10#units"] = newValue;
} catch (error) {
log("isChangeRawValueUnits Error: '" + error + "'");
}
Все изменяется и Web и правило срабатывает.
Update.Правило не срабатывает, из веб интерфейса по переключателю меняется
dev[gtDeviceID + "/rawValue#units"] = "mA";
Но вчера точно менялось.
Если устройство создано в wb-rules, то создавать, менять контролы, мету, публиковать данные может ТОЛЬКО wb-rules. Используйте API для установки новых значений.
Можно буквально одну строку примера для того чтобы понять что Вы имели ввиду.
Как я понял доступа из вне к топикам meta нет? или как то можно опубликовать? или нужно что-то по другому создать или динамически создать??
Буду премного благодарен.
UPD. Или Вы имеете ввиду создать еще один топик (cells) с ед изм. и уже публиковать в него с /on , а в правиле ловить этот топик и уже из него публиковать в подтопик meta/units?
А для чего, если не секрет, может понадобиться на ходу менять units?
просто попытка разобраться как это работает (возможность допустим изменять порядок в WEB UI, ну и ед. изм. изменять если оператор внизу ошибся), ведь выпадающего списка с Единцами нет. Так хоть сверху оператор поправит- по бриджу прилетит. Не всегда есть возможность связаться с монтажником на объекте, он сделал и уехал. Каналы связи не всегда наши. и иногда (в большинстве случаев ) это жестко прописанные IP и порт в сети заказчика. Сотовой связи нет, спутник
Переключение единиц измерения по нажатию кнопки в web интерфейсе:
var gtDeviceID = "GT_MAI6_AI1";
defineVirtualDevice("swUnits", {
title: "Switch units",
cells: {
state: {
type: "switch",
value: false,
},
}
});
defineVirtualDevice(gtDeviceID, {
title: "GT_MAI6_AI1",
cells: {
rawValue: {
title: "rawValue",
type: "value",
value: 11,
units: "mA",
readonly: false,
order: 1,
},
}
});
var gtControlID = getControl(gtDeviceID + "/rawValue");
defineRule("isChangeUnits", {
whenChanged: "swUnits/state",
then: function (newValue, devName, cellName) {
if (newValue) {
gtControlID.setUnits("A");
} else {
gtControlID.setUnits("V");
}
}
});
Суть вот в чём просто.
Если publish’ем извне изменить что-то, объявляемое правилами - оно поменяется обратно после следующего перезапуска. Чтобы не допускать бардака, сделано так, что это в принципе невозможно - менять /meta может только то, что его породило.
Доступа к веб-интерфейсу и даже ssh совсем нет?
Да доступа к ssh и web порой нет. Сделан один или два проброса порта (причем не нами, если сеть не наша) повлиять на это можно, но трудно, согласования могут длится долго. Собственно и смотрели на WB из-за прежде всего MQTT. Схема предполагалась такая : снизу модули ввода- вывода (до 12+12 AI на MAI-6 + 8 счетных или энкодер +5 счеттных на MCM8)/ и передача всего этого в верхний брокер (по мосту) , там ПО разгребет все это положит в базу доступ к этой базе будут иметь зарегистрированные клиенты которые смогут просматривать зарегистрированные данные , сделанные по ним расчеты и т.д. Просто иногда монтажники могут напутать, подключив датчик не на тот канал, заполнить не те описания,ед. изм, и т.д. Исправить? - а он уже уехал. Вернутся не просто пропускной режим, дорога зависит от погоды и т.д. Вот тогда оператор сверху мог бы поправить (опубликовав в свой брокер сообщение , далее по мосту в WB) допущенные ошибки или хотя-бы минимизировать и. Также нужен доступ к веб визуализации для персонала который находится или приедет на объект. Достаточно того что есть (виджеты), только бы с разграничением доступа как то решить . И последнее это не стационарные объекты (хотя таки тоже есть) , то есть приехали-смонтировались-уехали. Приехали через 3 недели, месяц, и т.д. -сделали демонтаж- уехали. Конечно есть выездная бригада, но она тоже не сможет мгновенно приехать - 3-4 дня.