WB-MRGBW-D плавность диммирования

В описании к диммеру WB-MRGBW-D указано: “Яркость канала задаётся 8-битным числом (0-255). Установка физической яркости светодиодов производится в соответствии с логарифмической кривой диммирования”.
Возникло два момента/вопроса:

  1. Как сделать линейное диммирование? (т.е., я так понимаю, нужно знать зависимость)
  2. Изменение яркости при значениях примерно от 200 до 255 происходит большими скачками: т.е. при некоторых шагах в 10 единиц не происходит видимого изменения яркости, а при некоторых - изменение на одну единицу ведет к значительному изменению яркости. Ситуация немого улучшается уменьшением разрядности ШИМ. Но это не правильно, т.к. данные диммеры были куплены в том числе из-за высокой частоты ШИМ.

Добрый день!

Так называемая “логарифмическая кривая диммирования” - это соотношение между “абстрактный параметр, задающий яркость для человека” - скважность ШИМ, наиболее приближенная к восприятию “каждый шажок параметра даёт примерно примерно одинаковое на глаз приращение”.
Если использовать “линейную кривую диммирования”, это дало бы гораздо худший результат - условно, при увеличении с 0 до 10 произошло бы всё заметное увеличение яркости, а потом она бы почти не менялась.

Напишите, пожалуйста, два разных шага (например, 112->113 и 200->201), которые, на ваш взгляд, дают слишком разные изменения яркости.

Добрый день!

У меня следующая конфигурация WB + Iridium. Хочу сделать плавное димирование через iridium. В iridium регулировкой планирую выполнять через элемент мультилевел, который выдает число от 0 до 30 (градация яркости).

Как мне это число применить к MRGBW чтобы влиять на яркость, ведь у MRGBW есть только кнопка (b1) т.е. регистр 0 или 1. Яркость модуль отрабатывает сам в зависимости от время нажатия этой кнопкой.

Из предположений, можно отправлять число из иридиум в WB исходя из числа запускать на определенное время реле которое будет замыкать вход b1 у MRGB. Но что-то это какой-то колхоз, да и в реальности задержки и т.д. какое тут плавное регулирование???

Подскажите решения, если таковые имеются.

Сделал следующее:

  1. сделал виртуальное устройство “яркость” от 0…255 и привязал его к иридиуму
  2. получая новое значение яркости вычисляю дельту по яркости и прибавляю ее к каждому каналу R,G,B в случае если идет зашкал ставлю каналу 0 или 255.

Можно ли элегантней решить задачу, с учетом того что у меня 6 RGB лент и не хотелось бы подобные скрипты писать для каждого, может кто поделится своими наработками, свой код прилагаю:

defineVirtualDevice("UserSettings", {
    title: "UserSettings",
    cells: {
	"Brigthness": {//виртуальный уровень
	    type: "range",
	    value: 0,
	    max: 255,
	    },
    }
});

defineRule("RGB_Br", { //название правила
  whenChanged: "UserSettings/Brigthness", //при изменении
  then: function (newValue, devName, cellName) { //выполняй следующие действия
      var ps = new PersistentStorage("my-storage", {global: true});

	  if ((dev["1A1-MRGBW-D/Red"] + (newValue - ps["RGB_BR3"])) > 255) {
        dev["1A1-MRGBW-D/Red"] = 255
      } else {
        if ((dev["1A1-MRGBW-D/Red"] + (newValue - ps["RGB_BR3"])) <0) {
        dev["1A1-MRGBW-D/Red"] = 0
        }
    	else{
      	dev["1A1-MRGBW-D/Red"] = dev["1A1-MRGBW-D/Red"] + (newValue - ps["RGB_BR3"])
        }
  	  }
 
	  if ((dev["1A1-MRGBW-D/Green"] + (newValue - ps["RGB_BR3"])) > 255) {
        dev["1A1-MRGBW-D/Green"] = 255
      } else {
        if ((dev["1A1-MRGBW-D/Green"] + (newValue - ps["RGB_BR3"])) <0) {
        dev["1A1-MRGBW-D/Green"] = 0
        }
    	else{
      	dev["1A1-MRGBW-D/Green"] = dev["1A1-MRGBW-D/Green"] + (newValue - ps["RGB_BR3"])
        }
  	  }

	  if ((dev["1A1-MRGBW-D/Blue"] + (newValue - ps["RGB_BR3"])) > 255) {
        dev["1A1-MRGBW-D/Blue"] = 255
      } else {
        if ((dev["1A1-MRGBW-D/Blue"] + (newValue - ps["RGB_BR3"])) <0) {
        dev["1A1-MRGBW-D/Blue"] = 0
        }
    	else{
      	dev["1A1-MRGBW-D/Blue"] = dev["1A1-MRGBW-D/Blue"] + (newValue - ps["RGB_BR3"])
        }
  	  }
    
      ps["RGB_BR3"] = newValue;
  }
});

Добрый день, somebody!
Поправил оформление вашего кода слегка.

Попробуйте использовать пример “Создание однотипных правил” из описания движка на странице
https://wirenboard.com/wiki/index.php/Движок_правил_wb-rules

Спасибо, такое практиковал уже (обертывание функцией). Все-таки вопрос был в другом - то как я решил задачу с димером это разумное решение или есть более правильный подход?

Мне кажется, ваше решение вполне функционально и компактно. Поскольку нет регистра общей яркости нет, это, наверное, единственно возможный способ.

Сделал обертку, перестало работать, где я допустил ошибку уже раз 5 все проверил, голова кругом
Дополнительно все жутко потормаживает и в скрипты заходит через раз
%D0%B8%D0%B7%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5

defineVirtualDevice("MRGBW_Brigthness", {
    title: "MRGBW_Brigthness",
    cells: {
	"3A2-MRGBW_Br": {//виртуальный уровень яркости RGB 1 секции комнаты
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"3A3-MRGBW_Br": {//виртуальный уровень яркости RGB 2 секции комнаты
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"1A1-MRGBW_Br": {//виртуальный уровень яркости RGB 3 секции комнаты
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"3A4-MRGBW_Br": {//виртуальный уровень яркости RGB спальни
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"1A2-MRGBW_Br": {//виртуальный уровень яркости RGB спальни
	    type: "range",
	    value: 0,
	    max: 255,
	    },
    }
});

function RGB_Brigthness(name, detector_control, device) {
defineRule(name, { //название правила
  whenChanged: detector_control, //при изменении яркости
  then: function (newValue, devName, cellName) { //выполняй следующие действия
      var ps = new PersistentStorage("my-storage", {global: true});

	  if ((dev[device]["Red"] + (newValue - ps[name])) > 255) {
        dev[device]["Red"] = 255
      } else {
        if ((dev[device]["Red"] + (newValue - ps[name])) <0) {
        dev[device]["Red"] = 0
        }
    	else{
      	dev[device]["Red"] = dev[device]["Red"] + (newValue - ps[name])
        }
  	  }
 
	  if ((dev[device]["Green"] + (newValue - ps[name])) > 255) {
        dev[device]["Green"] = 255
      } else {
        if ((dev[device]["Green"] + (newValue - ps[name])) <0) {
        dev[device]["Green"] = 0
        }
    	else{
      	dev[device]["Green"] = dev[device]["Green"] + (newValue - ps[name])
        }
  	  }

	  if ((dev[device]["Blue"] + (newValue - ps[name])) > 255) {
        dev[device]["Blue"] = 255
      } else {
        if ((dev[device]["Blue"] + (newValue - ps[name])) <0) {
        dev[device]["Blue"] = 0
        }
    	else{
      	dev[device]["Blue"] = dev[device]["Blue"] + (newValue - ps[name])
        }
  	  }
      ps[name] = newValue;
  }
});
}

RGB_Brigthness("RGB_Br1", "MRGBW_Brigthness/3A2-MRGBW_Br", "3A2-MRGBW-D");
RGB_Brigthness("RGB_Br2", "MRGBW_Brigthness/3A3-MRGBW_Br", "3A3-MRGBW-D");
RGB_Brigthness("RGB_Br3", "MRGBW_Brigthness/1A1-MRGBW_Br", "1A1-MRGBW-D");
RGB_Brigthness("RGB_Br4", "MRGBW_Brigthness/3A4-MRGBW_Br", "3A4-MRGBW-D");
RGB_Brigthness("RGB_Br5", "MRGBW_Brigthness/1A2-MRGBW_Br", "1A2-MRGBW-D");

Добрый день! Скорее всего, у вас вылетел процесс движка правил.
Запустите его пока из командной строки:
/usr/bin/wb-rules -debug -syslog -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules/
и посмотрите, какие ошибки он выдает. Ваш скрипт хранится в директории /etc/wb-rules.

Редактировать можно прямо там. Потом можно создать резервную копию, удалить из /etc/wb-rules файл скрипта, перезапустить движок правил и, добавляя, фрагменты кода, отлаживать снова в веб-интерфейсе.

root@wirenboard-A3PW5UD7:~# /usr/bin/wb-rules -debug -syslog -queue-len 2048 -editdir /etc/wb-rules /usr/share/wb-rules-system/rules/ /etc/wb-rules /usr/share/wb-rules
panic: error opening virtual cells storage: timeout

goroutine 1 [running]:
github.com/contactless/wb-rules/wbrules.NewRuleEngine(0x10c4ef40, 0x3ed5e0, 0x10c6c4e0, 0x10cbd2f0, 0x28)
/home/jenkins/wbdev/go/src/github.com/contactless/wb-rules/wbrules/engine.go:226 +0x580
github.com/contactless/wb-rules/wbrules.NewESEngine(0x10c4ef40, 0x3ed5e0, 0x10c6c4e0, 0x10c4f0c0, 0x10c0f768)
/home/jenkins/wbdev/go/src/github.com/contactless/wb-rules/wbrules/esengine.go:94 +0x58
main.main()
/home/jenkins/wbdev/go/src/github.com/contactless/wb-rules/main.go:55 +0x420

Думаю, что проблема происходит при вызове

Вы многократно при создании правил вызываете этот конструктор. Мне кажется, в этом дело. Попробуйте поотлаживать, например, создать хранилище вне кода функции-генератора правил.

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

То есть правило создается, но не отрабатывает? Попробуйте его сначала без функции-обертки создать, посмотрите, какие реальные параметры передаются внутрь при создании правила через обертку.
Проще всего отлаживать, вставляя log(); в подозрительные фрагменты кода. С диагностикой будет гораздо понятнее, что происходит.

Вынес за пределы функции следующее см. ниже + добавил начальные значения, думаю проблема была именно в отсутствии первоначальных значений. Для одной лампы отработало корректно, после протестирую на остальных и с главным регулятором (он у меня реализован на уровне иридиума) и позже выложу код.

var ps = new PersistentStorage(“my-storage”, {global: true});
ps[“RGB_Br1”] = 0;
ps[“RGB_Br2”] = 0;
ps[“RGB_Br3”] = 0;
ps[“RGB_Br4”] = 0;
ps[“RGB_Br5”] = 0;

1 лайк

Не знаю как вставить чтобы форматирование было нормальным, поэтому только так.
Возможно кому-то будет полезно, ниже скрипт

defineVirtualDevice("MRGBW_Brigthness", {
    title: "MRGBW_Brigthness",
    cells: {
	"3A2-MRGBW_Br": {//виртуальный уровень яркости RGB 1 секции комнаты
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"3A3-MRGBW_Br": {//виртуальный уровень яркости RGB 2 секции комнаты
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"1A1-MRGBW_Br": {//виртуальный уровень яркости RGB 3 секции комнаты
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"3A4-MRGBW_Br": {//виртуальный уровень яркости RGB спальни
	    type: "range",
	    value: 0,
	    max: 255,
	    },
	"1A2-MRGBW_Br": {//виртуальный уровень яркости RGB спальни
	    type: "range",
	    value: 0,
	    max: 255,
	    },
    }
});

var ps = new PersistentStorage("my-storage", {global: true});
ps["RGB_Br1"] = 0;
ps["RGB_Br2"] = 0;
ps["RGB_Br3"] = 0;
ps["RGB_Br4"] = 0;
ps["RGB_Br5"] = 0;

function RGB_Brigthness(name, detector_control, device) {
defineRule(name, { //название правила
  whenChanged: detector_control, //при изменении яркости
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    
	  if ((dev[device]["Red"] + (newValue - ps[name])) > 255) {
        dev[device]["Red"] = 255
      } else {
        if ((dev[device]["Red"] + (newValue - ps[name])) <0) {
        dev[device]["Red"] = 0
        }
    	else{
      	dev[device]["Red"] = dev[device]["Red"] + (newValue - ps[name])
        }
  	  }
 
	  if ((dev[device]["Green"] + (newValue - ps[name])) > 255) {
        dev[device]["Green"] = 255
      } else {
        if ((dev[device]["Green"] + (newValue - ps[name])) <0) {
        dev[device]["Green"] = 0
        }
    	else{
      	dev[device]["Green"] = dev[device]["Green"] + (newValue - ps[name])
        }
  	  }

	  if ((dev[device]["Blue"] + (newValue - ps[name])) > 255) {
        dev[device]["Blue"] = 255
      } else {
        if ((dev[device]["Blue"] + (newValue - ps[name])) <0) {
        dev[device]["Blue"] = 0
        }
    	else{
      	dev[device]["Blue"] = dev[device]["Blue"] + (newValue - ps[name])
        }
  	  }
      ps[name] = newValue;
  	  }
});
}

RGB_Brigthness("RGB_Br1", "MRGBW_Brigthness/3A2-MRGBW_Br", "3A2-MRGBW-D");
RGB_Brigthness("RGB_Br2", "MRGBW_Brigthness/3A3-MRGBW_Br", "3A3-MRGBW-D");
RGB_Brigthness("RGB_Br4", "MRGBW_Brigthness/3A4-MRGBW_Br", "3A4-MRGBW-D");
RGB_Brigthness("RGB_Br5", "MRGBW_Brigthness/1A2-MRGBW_Br", "1A2-MRGBW-D");
RGB_Brigthness("RGB_Br3", "MRGBW_Brigthness/1A1-MRGBW_Br", "1A1-MRGBW-D");

Спасибо, somebody! Код вставляется тремя обратными кавычками в начале и в конце, примерно так:

```JavaScript

defineVirtualDevice("MRGBW_Brigthness", {
//и так далее

```