Новая версия движка правил

Проблема со строковыми контролами.

defineVirtualDevice(‘moveTime’, {
title: ‘sensors’,
cells: {
person: {
type: ‘text’,
value: ‘’
},
access: {
type: ‘switch’,
value: false,
readonly: true
}
}
});

defineRule(‘card_read’, {
whenChanged: card_reader_device + ‘/’ + card_reader_number,
then: function (newValue, devName, cellName) {
var card_id = parseInt(newValue);
if (card_id > 0) {
var ownerName = ‘Stranger’;
var cardAccess = false;
log("{}'s card activated: {}", ownerName, card_id);
dev[‘moveTime’][‘access’] = cardAccess;
dev[‘moveTime’][‘person’] = ownerName;
log(“Saved values card = {}; acess = {}”, dev[‘moveTime’][‘person’], dev[‘moveTime’][‘access’]);
}
}
});

WebUI отображает правильно - person: Stranger
Log:
2020-03-30 13:53:50 Stranger’s card activated: 1223345951
2020-03-30 13:53:50 Saved values card = null; acess = false
Во всех правилах которые используют dev[‘moveTime’][‘person’] возвращается null. В чем проблема?

Исправлено в версии wb-rules-system v1.6.3. Проверьте, что у вас установлена последняя версия. Например, обновив все пакеты из stable:

apt update
apt upgrade

Либо установить конкретную версию wb-rules-system:

apt update
apt install wb-rules-system=1.6.3

К сожалению, не удалось воспроизвести описаное поведение. Вот такой скрипт отработал корректно (в логах присутствует значение “Stranger”, не null):

defineVirtualDevice("moveTime", {
  title: "sensors",
  cells: {
    person: {
      type: "text",
      value: ""
    },
    access: {
      type: "switch",
      value: false,
      readonly: true
    }
  }
});

defineRule("card_read", {
  whenChanged: "power_status/Vin",
  then: function (newValue, devName, cellName) {
    var card_id = parseFloat(newValue);
    if (card_id > 0) {
      var ownerName = "Stranger";
      var cardAccess = false;
      log("{}'s card activated: {}", ownerName, card_id);
      dev["moveTime"]["access"] = cardAccess;
      dev["moveTime"]["person"] = ownerName;
      log("Saved values card = {}; acess = {}", dev["moveTime"]["person"], dev["moveTime"]["access"]);
    }
  }
});

лог:

Mar 30 21:42:02 wirenboard-XXXXXXXX daemon.info wb-rules[6831]: INFO: [rule info] Stranger's card activated: 11.74
Mar 30 21:42:02 wirenboard-XXXXXXXX daemon.info wb-rules[6831]: INFO: [rule info] Saved values card = Stranger; acess = false

Также, при доступе из правила, запускаемого по таймеру получаем корректное значение:

startTicker("Ticker1", 3000);

defineRule("do1", {
  when: function () {
    return timers.Ticker1.firing;
  },
  then: function () {
    log("person: {}, access: {}", dev["moveTime"]["person"], dev["moveTime"]["access"]);
  }
});

лог:

Mar 30 21:47:45 wirenboard-XXXXXXXX daemon.info wb-rules[7314]: INFO: [rule info] person: Stranger, access: false

Единственное отличие от вашего варианта - привязал правило к изменению напряжения на плате за неимением информации о вашем устройстве считывания карт.

Пожалуйста, уточните:

  1. какая версия wb-rules используется (воспроизводится ли на версии 2.2.2)?
  2. откуда ещё производится доступ к девайсу moveTime (возможно, оно презаписывается из каких-то других правил)?

Была 2.2.1. После апдейта до 2.2.2 заработало.

1 лайк

Сообщение было перемещено в эту тему: Вероломное обновление wb-rules (2.2.2) over (1.7.1)

Нужно ли теперь и в MQTT топики писать true/false вместо 1/0 или ужесточение не касается этого? А другие типы данных?

Если запись производится напрямую в mqtt - всё остаётся как было раньше. Новые правила относятся только к написанию скриптов, которые обрабатываются wb-rules.

Создал новое виртуальное устройство новым движком правил (вер.2.2.2). Через внешнее устройство пробую писать в командный топик (который с /on) - безуспешно. В старых устройствах работает. Если писать в топик без /on, значение на WebUI обновляется. Изменилась логика работы или баг?

Логика управления виртуальными устройствами внешними командами из mqtt не изменялась. Проверил сейчас на версии 2.2.2 следующий код - правило успешно отписало в лог:

defineVirtualDevice("wb1", {
  title: "wierdTest",
  cells: {
    "cell1": {
      type: "text",
      value: "test-text",
      writeable: true,
    }
  }
});

defineRule("onChange", { 
    whenChanged: "wb1/cell1",
    then: function (newValue, devName, cellName) {
      log("onChange fired");
      log("devName: " + devName + ", cellName: " + cellName + ", newValue: " + newValue);
    }
});

Изменение значения wb1/cell1:

mosquitto_pub -h wb-controller.local -t '/devices/wb1/controls/cell1/on' -m 'some1text'

Могу предположить, что ваш контрол создаётся без флага writable 1 из-за чего wb-rules не воспринимает команды в топик /on.

Если это не так: просьба, приведите код, которым тестируете и вывод mqtt топиков в процессе взаимодействия с виртуальным устройством

Проверил, да, они создались без флага writable. Добавил топик writable 1, потом удалил readonly, потом readonly 1 - всеравно, не работает как предыдущие. Теперь все пишется в /on но само значение на WebUI не изменяется.


Аналогичная операция для старого контрола - свое значение поменяли и командный и статусный топики.

Я чего то не понял:
Зачем делать топики, например, от цифровых датчиков или датчиков температуры writable, что бы отслеживать их значения с js-скрипте?

На сколько я понял - вы установили это значение напрямую в mqtt-топик снаружи. Это некорректный способ. Необходимо в самом скрипте контролу установить поле writeable: true (как в моём примере выше). В этом случае контрол корректно создастся, в mqtt ничего править уже не надо будет и вы сможете снаружи ему отправлять значения в топик /on.

Пожалуйста, приведите код объявления устройства cond_switcher если проблема так и не решается.

Кажется заработало, буду еще тестировать. Тоесть теперь для всех виртуальных контролов нужно добавить эту опцию? Было бы еще здорово если бы эти изменения были описаны в вики.

Предполагается, что значение по умолчанию поля writeable равно false (кроме типов switch, pushbutton и range - для них true). Но в любом случае для однозначности в своих скриптах лучше явно указывать это поле, чтобы избежать неопределённости.

Сейчас к релизу готовится версия 2.2.3 - в ней будет поправлено ещё некоторые неоднозначныые моменты в этом месте.

Было бы супер помещать где-либо информацию про обновления со списком новых возможностей и решенных проблем в релизе. Этого очень не хватает.

https://wirenboard.com/wiki/index.php?title=Движок_правил_wb-rules_2.0

https://wirenboard.com/wiki/index.php/Движок_правил_wb-rules#.D0.A1.D0.BE.D0.B2.D0.BC.D0.B5.D1.81.D1.82.D0.B8.D0.BC.D0.BE.D1.81.D1.82.D1.8C_.D1.81.D0.BA.D1.80.D0.B8.D0.BF.D1.82.D0.BE.D0.B2_.D0.BF.D1.80.D0.B8_.D0.BE.D0.B1.D0.BD.D0.BE.D0.B2.D0.BB.D0.B5.D0.BD.D0.B8.D0.B8_wb-rules

  • Была 2.2.1. После апдейта до 2.2.2 сразу заработало, но вчера заметил что баг начал воспроизводится опять (перед этим выключал всю систему физически).
  • Оно перезаписывается из одного единственного правила, отрабатывает правильно и есть в логе значительно позже.
    Тоесть ошибка точно не в правилах или их логике. (работало стабильно до апдейта на 2.2)
    Что можно попробовать?

Сообщение было перенесено в новую тему: Выполнение правила при условии

Движок правил 2.2.2

Что не так делаю в скрипте, суть пытаюсь изменить цвет/диммировать в WB-MRGB-D. Не реагирует на подобные команды

            dev["A4-MRGBW-D"]["RGB"] = "133;133;133";
            dev["A4-MRGBW-D"]["RGB"] = '155;155;155';
            dev["A4-WB-MRGB-D/White"] = 0;
            dev["A4-MRGBW-D"]["White"] = (255).toString();
            dev["A4-MRGBW-D"]["RGB"] = ('155;155;155').toString();

Но если надо вывести в лог, то читает

log("mode_btn: A4-MRGBW-D/RGB = " + dev["A4-MRGBW-D/RGB"]);

Есть ли в джвижке 2.2.2 какая-то особенность, типа например switch понимает только true/false. Как правильно мне присвоить значение контролу и поменять значение канала и общего RGB?

Посмотрел логи:
Apr 16 14:28:02 wirenboard-A3PW5UD7 daemon.info wb-rules[2194]: ERROR: control A4-MRGBW-D/RGB SetValue() error: This control is not writable

Подскажите как правильно сделать, не перебором же искать причину.

это баг, исправление планируется. Пока рекомендую откатиться на версию 1.7.
P.S. тема явно выбрана неправильно. Лучше всего создавать новую тему. Перенёс в другое место.