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

спасибо, сейчас исправим.

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

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

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