Преобразование HEX в RGB

Добрый день!
Дано:

  • 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 #.

Спасибо.

Отлично разд что получилось.
Первый раз - глянул на правило, отладил его выполнение при изменении топика - и не стал типы проверять.