Управление RGB лентой через dac 0..10в в MQTT Dash


#1

Добрый день!
Не планировал в квартире “играть” огоньками, но так получилось, что к концц ремонта квартиры остались 3 выхода из wb-dac и китайский контроллер RGB-ленты, работающий через управление напряжением 0…10в.
В результате сейчас есть свет в коридоре, которым можно управлять через wb-dac.

Настраиваю управление через приложение mqtt dash for android. Сделал три различных контрола для управления каждым из цветов ленты - работает.

Теперь хочу настроить управление через контрол color picker в mqtt dash. Как это сделать?

Я правильно понимаю, что нужно создать виртуальное устройство, которое принимать значение в формате rgb разбирать на составляющие в формате 0…10в и писать в wb-dac? Так же будет опрашивать все три входа, чтобы вернуть значение в формате rgb?

Если есть похожие скрипты, поделитесь, пожалуйста!


#2

Добрый день, Arty!
Да, ваша концепция совершенно верна:
вам надо создать виртуальное устройство, имитирующее color picker,c такими же контролами. И написать правила, которые будут:

  1. При изменении контрола color-picker’а выставлять нужные напряжения на DAC
  2. При изменении значений напряжения на выходах DAC изменять значение контрола пикера. Главное при этом избежать ситуации, когда одни контролы начнут менять другие контролы, а те, в свою очередь, первые.
    Может быть, второе правило и излишне, если вы захотите программно изменить цвет, то меняйте значения прямо в color picker.

#3

Второй обработчик нужен, т.к. менять значения в квартире можно будет с разных устройств.

Есть ли пример скрипта для работы с color picker? :slight_smile:
Если искать такой скрипт в инете, с какими еще системами кроме WB, такой скрипт будет совместим?


#4

Смотрите, ничего готового вы, скорее всего, не найдете.
Что вам надо сделать:

  1. Создать в движке правил виртуальное устройство с контролом, в котором будет хранится цвет.
  2. Соответственно, у вас появится MQTT-топик, чтобы писать в этот контрол.
  3. Этот топик вы указываете в качестве топика в MQTT-Dash для колор-пикера, который при изменении цвета в пикере будет присылать в контрол новый цвет скажем, RGB-компоненты в шестнадцатеричном виде (FFFFFF).
  4. Правило, которое обрабатывает изменение преобразует полученную hex-строку в три компонента (255,255,255) и прописывает их в контролы диммера.
  5. Для установки цвета пикера создаете другой контрол, пишете в него, и пикер меняет свой цвет.

#5

Попробовал написать первые правила…
Не могу считать данные с виртуального устройства после изменения в ColorPicker, нужное значение появляется в MQTT очереди, но при сохранении в лог значения из правила setGreenlight (скрипт ниже) в лог записывается не последнее значение переменной s, а его значение, установленное при предыдущем вызове этого правила.
При этом что ColorPicker (в MQTT dash), что правило setGreenlight обновляют значение в одном и том же месте в очереди [“myColorPicker”][“Color”].

defineVirtualDevice(“myColorPicker”, {
title: “Управление освещением в коридоре через MQTT RGB control”,
cells: {
Color: {
type: “rgb”,
value: “#FFFFFF”,
forceDefault: true
},
}
});

// place your rules here or add more .js files in this directory
// Если меняются отдельные контролы

defineRule(“setGreenlight”, {
whenChanged: “wb-dac/EXT1_O6”,
then: function (newValue, devName, cellName){
var ss = parseInt(newValue*255/10000).toString(16).toUpperCase();
var s = dev[“myColorPicker/Color”].toString();
log(“RGB Color. Green = " + ss + " (old RGB = " + s +” )");
dev[“myColorPicker/Color”] = “#00” + ss + “00”; // Green

}
});

log("started at " + Date());

Скриншот сообщений в очереди:


#6

А это какая-то проблема, что в лог пишется не то значение? При управлении виртуальным устройством myColorPicker его значение в веб-интерфейсе меняется как надо?
И еще не вижу правила, которое переносит значения, установленные myColorPicker при их изменении, в значения напряжения на DAC. Может, в этом проблема?


#7

а как мне отлаживать код, если даже в лог значения хотят пишутся, а хотят - мимо пролетают.
да, в веб-интерфейсе значение меняется.
Проблема точно не в том, что нет метода сохранения данных из ColorPicker в wb-dac, т.к. в одну-то сторону должно все работать… или я не прав?

Ниже текущий код. Управление каждым каналом меняет ColorPicker. При изменении ColorPicker каналы не меняются, лог не пишется.

// place your rules here or add more .js files in this directory

defineVirtualDevice(“myColorPicker”, {
title: “RGB picker”,
cells: {
Color: {
type: “text”,
value: “#FFFFFF”,
forceDefault: true
},
}
});

defineRule(“pick_color”, {
whenChanged: “myColorPicker/Color”,
then: function (newValue, devName, cellName) {

dev["wb-dac"]["EXT1_O8"] = parseInt(newValue.substr(1,2),16)*10000/255; // Red

dev[“wb-dac”][“EXT1_O7”] = parseInt(newValue.substr(5,2),16)*10000/255; // Blue
dev[“wb-dac”][“EXT1_O6”] = parseInt(newValue.substr(3,2),16)*10000/255; // Green

// log("pickcolor: " + devName + “/” + cellName + “=” + newValue);
}
});

// Если меняются отдельные контролы

defineRule(“setGreenlight”, {
whenChanged: “wb-dac/EXT1_O6”,
then: function (newValue, devName, cellName){
var ss = parseInt(newValue*255/10000).toString(16).toUpperCase();
var s = dev[“myColorPicker/Color”].toString();

// log(“RGB Color. Green = " + ss + " (old RGB = " + s.substr(0,3) + " " + s.substr(5,2) + " )”);
dev[“myColorPicker/Color”] = s.substr(0,3) + ss + s.substr(5,2);

}
});

defineRule(“setRedlight”, {
whenChanged: “wb-dac/EXT1_O8”,
then: function (newValue, devName, cellName){
var ss = parseInt(newValue*255/10000).toString(16).toUpperCase();
var s = dev[“myColorPicker/Color”].toString();

// log(“RGB Color. Red = " + ss + " (old RGB = " + s.substr(3,4) + " )”);
dev[“myColorPicker/Color”] = “#” + ss + s.substr(3,4);

}
});

defineRule(“setBluelight”, {
whenChanged: “wb-dac/EXT1_O7”,
then: function (newValue, devName, cellName){
var ss = parseInt(newValue*255/10000).toString(16).toUpperCase();
var s = dev[“myColorPicker/Color”].toString();

// log(“RGB Color. Blue = " + ss + " (old RGB = " + s.substr(0,5) + " )”);
dev[“myColorPicker/Color”] = s.substr(0,5) + ss;

}
});

log("started at " + Date());


#8

Похоже, что когда я меняю ColorPicker в приложении, происходит запись в очередь, меняется состояние в webUI, но правило pick_color не вызывается.
Когда я меняю один из цветов отдельно с помощью ProgressControl, при записи общего значения в myColorPicker происходит вызов правила pick_color.


#9

Вопрос решен: нужно было еще прописать в ColorPicker строку для записи сообщений “…/on”


#10

Сейчас подумал, что рано расслабляться.
У меня же правила друг друга теперь дергают по кругу, т.к. каждое генерит событие, на которое сробатывает другое или я ошибаюсь?

Так у меня было: менял зеленый, писался лог, который находился в pick_color.

Как сделать так, чтобы в контрол устройства значение записывалось, но правило на изменение этого контрола не срабатывало?


#11

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