Добрый день!
Дано:
- WB-MRGBW-D
- MQTT Dash for Android
(ПО MQTT Dash for Android может отправлять цвет в формате HEX или число в виде строки.)
Задача:
Конвертирование HEX в RGB на стороне Wiren Board.
Решение:
В WB Rules пытаюсь реализовать:
defineRule(“color_convert”, {
whenChanged: “colorButton/Dimmer 1”,
then: function (newValue, devName, cellName){
log(“I’m here!”)
if(newValue.substring(0,1) == ‘#’) {
newValue = newValue.substring(1);
}
var rgbColor = {};
rgbColor.r = parseInt(newValue.substring(0,2),16);
rgbColor.g = parseInt(newValue.substring(2,4),16);
rgbColor.b = parseInt(newValue.substring(4),16);
color = rgbColor;
log(rgbColor);
}
});
Данный способ не работает, так как не срабатывает whenChanged.
Виртуальное устройство создаю:
defineVirtualDevice(“colorButton”,
{
title: “Color Buttons”,
cells: {
“Dimmer 1”: {
type: “value”,
readonly: false,
value: 0,
},
}
});
Параметр value все равно имеет атрибут только для чтения хоть я и указываю readonly: false
Вопрос:
Прошу просмотреть код конвертации HEX to RGB на наличие ошибок и помочь с проблемой виртуального устройства. В WB UI показывает какой HEX прилетает, но стоит обновить страницу value снова 0.
//12_14_test3.js
defineVirtualDevice("colorButton",
{
title: "Color Buttons",
cells: {
"Dimmer 1": {
type: "value",
readonly: false,
//writable: true,
value: 0,
},
}
});
log.info("start")
defineRule("color_convert", {
whenChanged: "colorButton/Dimmer 1",
then: function (newValue, devName, cellName){
log.info("I’m here!")
if(newValue.substring(0,1) == "#") {
newValue = newValue.substring(1);
}
var rgbColor = {};
rgbColor.r = parseInt(newValue.substring(0,2),16);
rgbColor.g = parseInt(newValue.substring(2,4),16);
rgbColor.b = parseInt(newValue.substring(4),16);
color = rgbColor;
log(rgbColor);
}
});
Пишу для теста:
mosquitto_pub -t "/devices/colorButton/controls/Dimmer 1/on" -m 2222222222
Правило срабатывает
Обратите внимание, пишу в on
Добрый вечер.
Что сделал:
- вынес всю конструкцию (вирт. уст-во и правило) в отдельный файл;
- с приложения на телефоне пишу в топик */on;
- выполнил apt update && upgrade.
Что произошло:
- при сохранении файла/обновлении скрипта в дебаге не пишет что добавлено новое правило, как обычно это происходит;
- отправленное значение с телефона в топик */on ни к чему не приводит, в логе нет никаких сообщений, в WB UI так же не видно изменения значения value;
- вирт. уст-во по прежнему readonly.
Не надо вносить сразу несколько новых элементов. То есть сейчас мы видим что значение в MQTT не изменилось.
Предлагаю разобраться или с работой правила или с изменением значения сначала.
Для того чтобы убедиться что значение меняется - можно воспользоваться командой, которую я приводил выше.
“Readonly” - этот атрибут читается только веб-интерфейсом.
Я не вношу несколько изменений. Просто сначала преобразование формата цвета было в файле правила отвечающего за освещение в квартире. Сейчас вынес все что относится к димерам в отдельный файл правил, вот и все.
Я не тестирую Ваши советы через терминал WB, только с приложения на телефоне. Соответственно, если отправляю HEX в топик /devices/colorButton/controls/Dimmer 1/on ничего не происходит. Если писать в /devices/colorButton/controls/Dimmer 1, то в WB UI видно что в вирт. уст-во прилетает HEX цвета, но правило почему-то это все равно не видит и при обновлении страницы Devices значение вирт. уст-ва обнуляется.
[UPD]
Что получилось узнать:
mosquitto_pub -t “/devices/colorButton/controls/Dimmer 1/on” -m #8C1A1A
не срабатывает, терминал пишет:
Error: -m argument given but no message specified.
конструкция:
mosquitto_pub -t “/devices/colorButton/controls/Dimmer 1/on” -m 222
отрабатывается, попадаю в условие изменения colorButton/Dimmer 1, но ruleDebug сообщает:
2020-12-18 09:13:57ECMAScript error: TypeError: call target not an object
duk_js_executor.c:2761
anon /etc/wb-rules/Dimmer.js:18 preventsyield
call native strict preventsyield
anon /usr/share/wb-rules-system/scripts/lib.js:233 preventsyield
А в данной строке имеем:
if(newValue.substring(0,1) == “#”)
Соответственно как я понял движку правил не нравится первый символ #.
Какие есть варианты?
Достаточно экранировать.
mosquitto_pub -t "/devices/colorButton/controls/Dimmer 1/on" -m "#8C1A1A"
Использовать правильные типы значений. Ну и соответственно не пытаться писать в value text
Попытка взять “первый символ” из числа, не преобразовывая его в строку - заведомо неудачна.
//12_14_test3.js
defineVirtualDevice("colorButton",
{
title: "Color Buttons",
cells: {
"Dimmer 1": {
type: "text",
readonly: false,
//forceDefault: true,
value: "",
},
}
});
defineRule("color_convert", {
whenChanged: "colorButton/Dimmer 1",
then: function (newValue, devName, cellName){
log.info("I’m here!", newValue, newValue.substring(0,1))
if(newValue.substring(0,1) == "#") {
newValue = newValue.substring(1);
}
var rgbColor = {};
rgbColor.r = parseInt(newValue.substring(0,2),16);
rgbColor.g = parseInt(newValue.substring(2,4),16);
rgbColor.b = parseInt(newValue.substring(4),16);
color = rgbColor;
log(rgbColor);
}
});
Согласен, подход неверный спасибо за правку.
Теперь при отправки в /devices/colorButton/controls/Dimmer 1/on правило срабатывает:
- в log.info(“I’m here!”, newValue, newValue.substring(0,1)); прилетает ,например, I’m here! #D72121 #.
Спасибо.
Отлично разд что получилось.
Первый раз - глянул на правило, отладил его выполнение при изменении топика - и не стал типы проверять.