спасибо, сейчас исправим.
Проблема со строковыми контролами.
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
Единственное отличие от вашего варианта - привязал правило к изменению напряжения на плате за неимением информации о вашем устройстве считывания карт.
Пожалуйста, уточните:
- какая версия wb-rules используется (воспроизводится ли на версии 2.2.2)?
- откуда ещё производится доступ к девайсу
moveTime
(возможно, оно презаписывается из каких-то других правил)?
Была 2.2.1. После апдейта до 2.2.2 заработало.
Нужно ли теперь и в 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 - в ней будет поправлено ещё некоторые неоднозначныые моменты в этом месте.
Было бы супер помещать где-либо информацию про обновления со списком новых возможностей и решенных проблем в релизе. Этого очень не хватает.
- Была 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
Подскажите как правильно сделать, не перебором же искать причину.