Wb-rules и publish извне

Здравствуйте, друзья!
Например, есть виртуальное устройство с топиком типа switch и есть правило типа whenChanged на данный топик. Если я меняю этот топик виджетом на дашборде - все ок, правило стабильно срабатывает. Но если я делаю публикацию в топик из внешнего приложения, то виджет на дашборде правильно отображет состояние, при этом правило не срабатывает. Т.е. изменения не доходят в wb-rules.
Что можно сделать чтобы заработало?

Объясни более предметно.
Покажи настройку tile на DashBoard`е. Что за внешнее приложение, покажи как там tile настроен.

Некоторое уточнение, данная проблема актуальна только для виртуальных устройств. Я попробовал для “wb-gpio/EXT1_K1” все хорошо работает.
Попробовать воспроизвести можно так:

  1. в 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"]);        
     	}
     });
    
  2. в 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

Спасибо! Все работает!

1 лайк

Добрый вечер.
Спрошу здесь. Аналогичная ситуация (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 (последнее сообщение) то правило срабатывает , а по отдельности нет.

Выскажусь аккуратно, если в чем не прав - пусть старшие товарищи меня поправят.

  1. Для виртуальных устройств публиковать новые значения надо с /on на конце. Если опубликовать без /on - wb-rules видит старое значение, соответственно, whenChanged не сработает.
  2. Доступ к субтопикам /devices/+/controls/+/meta средствами wb-rules есть только для тех субтопиков, которые созданы wb-rules.
1 лайк

Добрый день.
ну так правило и виртуальное устройство создано в 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 дня.