homeAssistant и wb-mrgbw-d

Добрый день!
Развлекаюсь с подключением wb-mrgbw-d к homeassistant по MQTT
wb-mrgbw-d в режиме 2-х лент CCT
яркость и включение/выключение настроилось без проблем, залип на регулировке температуры цвета. Суть в том, что в WB6 цветовая температура идет в шкале 0-100, а HA пытается передать значение 0-500
сейчас конфиг mqtt имеет следующий вид (на примере 1 канала):

  • unique_id: “wb-mrgbw-d_1”
    name: “wb-mrgbw-d_1”
    command_topic: “/devices/wb-mrgbw-d-fw3_28/controls/CCT1 (channels 1_2)/on”
    state_topic: “/devices/wb-mrgbw-d-fw3_28/controls/CCT1 (channels 1_2)”
    color_temp_command_topic: “/devices/wb-mrgbw-d-fw3_28/controls/CCT1 Temperature/on”
    color_temp_state_topic: “/devices/wb-mrgbw-d-fw3_28/controls/CCT1 (channels 1_2)”
    brightness_command_topic: “/devices/wb-mrgbw-d-fw3_28/controls/CCT1 Brightness/on”
    brightness_state_topic: “/devices/wb-mrgbw-d-fw3_28/controls/CCT1 Brightness”
    brightness_scale: 100
    payload_on: 1
    payload_off: 0
    что то я явно упустил, но что пока не понимаю, прошу подсказать как задать диапазон в конфиге MQTT (предпочтительнее) или скриптом WB докинуть в топик, значения которого будут пересчитываться и передаваться в топик цветовой температуры.

Добрый день.
Что пишется в топик и что вы там ожидаете увидеть?
Почему просто не указать желлаемый диапазон? Color Temperature Min/Max, Units, and UI - #3 by moralmunky - Development - Home Assistant Community

В топик обе системы пишут цифру, в топик wb-mrgbw-d ставит цифру от 1 до 100,
HA в топик ставит цифру от 1 до 500
на сколько я понимаю НА пытается выставить температуру в mired,
а вот что обозначают цифры в шкале от 1 до 100 в WB я не понимаю.
предполагаю что есть 2 варианта решения:
1-й - на уровне HA поменять значение перед публикацией в топик mqtt
2-й - скрипт на WB, который создаст еще 1 топик, в который будет слать значение HA, после чего значение пересчитывается и передается уже в топик устройства.
остался вопрос как именно пересчитывать, т.е. что значат цифры от 1 до 100 в топике управления температурой цвета у wb-mrgbw-d и как это реализовать.

Оптимально, скорей всего. Прочее - это лишний костыль. Color Temperature Min/Max, Units, and UI - Development - Home Assistant Community

Можно и так, конечно. И добавить в топики самого устройства дополнительный - тоже.

по 2 му варианту, скрипт получается примерно такой:

//wb_mrgbw_d_fw_v1.js 12.05.23 test
var dimmNumber = "01" //name VIRTUAL device (this) #ChangeMe!#
var devDimmer = "wb-mrgbw-d-fw3_28" // For name REAL MRGBW-D device #ChangeMe!#
defineVirtualDevice(dimmNumber +"mrgbw-d", {
  title: dimmNumber +" MRGBW-D", //
  cells: {
    RLine : {
      type : "range",
      value : 0,
      max:255,
      readonly: false,
      order: 1,
    },
    GLine : {
      type : "range",
      value : 0,
      max:255,
      readonly: false,
      order: 2,
    },
    BLine : {
      type : "range",
      value : 0,
      max:255,
      readonly: false,
      order: 3,
    },
    WLine : {
      type : "range",
      value : 0,
      max:255,
      readonly: false,
      order: 4,
    },
    colourTemp1 : {
      type : "range",
      value : 4150, // for neutral white
      min : 1800, // warm white
      max : 6500, // cool white
      readonly: false,
      order: 5,
    },
  }
});

defineRule("colourTemp1_change", {
  whenChanged: dimmNumber +"mrgbw-d/colourTemp1",
  then: function (newValue, devName, cellName) {
    coolWhite = Math.round((dev[dimmNumber +"mrgbw-d/colourTemp1"] - 1800) / 18,44);
    warmWhite = 255 - coolWhite;
    dev[dimmNumber +"mrgbw-d/RLine"] = coolWhite;
    dev[dimmNumber +"mrgbw-d/GLine"] = warmWhite;
  }
});

это будет отдельное виртуальное устройство, у которого есть все 4 цвета и отдельный параметр температура, при изменении которого изменяются 2 канала RGB одновременно.
к HA это прикручивается без проблем, мне остался непонятен момент как сопоставить действия на виртуальном и на реальном устройстве? и да, в топик регулятора цвета виртуального устройства так же подаются значения от 153 до 500.
PS. у меня сейчас шаблон устройства выбран 2 шт. cct, возможно нужно поменять на RGB

Так и остался вопрос, что такое 0-100 в топике /devices/wb-mrgbw-d-fw3/controls/CCT1 Temperature как оно рассчитывается и что передает на каналы при использовании

В документации к диммеру:


При значении “0” - теплые светодиоды выключены, “холодные” - светят с яркостью, определяемой регистром яркости.
При значении “100” - наоборот.
При значении “50” - светятся одинаково.

согласно документации:* Для бело-жёлтых лент регулируется температура в условных единицах от 0 (максимально жёлтая) до 100 (максимально белая) и яркость от 0 до 100
по какому алгоритму рассчитывается эта условная единица, как ее посчитать или из нее посчитать температуру света? Должен же быть алгоритм заложен под расчет этой единицы

Условная единица - процент. То есть яркость (мощность), делится пропорционально “температуре” между двумя каналами.
Ну совсем понял вопрос…

вот в этом и вопрос, как это реализовано, по какой формуле, т.к. кельвины идут условно от 2000 до 6500 а майред от 153 до 500 (1 майред = 1000000 / температуру в кельвинах) при тех же температурах, и там не совсем линейно, вот какую формулу использовали при создании этого параметра?
условно:
2000к = 500 майред = 0 на шкале wb
6500к = 153 майред = 100 на шкале wb
имеем 3700к (условно) это сколько на шкале? как это посчитать? линейная ли там зависимость?
45к на 1 единицу шкалы wb
или 3.47 майреда на 1 единицу шкалы
или зависимость не линейная и есть какая то формула расчета?

Кривая ШИМ(наприяжение)/цвет для каждой ленты своя.
Ну и “температуры” лент могут быть, например : 3000К на 6500K; 3500К /6000K.
Зависимость для каждой модели ленты - своя. Не всегда линейная, особенно на краях диапазона.

Диммер устанавливает уровень знергии на ленту. Если нужен расчет температуры - целесообразно сделать это скриптом, основываясь на графикаэ производителя именно для используемой модели.

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

Здравствуйте!

Диммер к сожалению не знает характеристики самой ленты, потому нельзя напрямую задать цветовую температуру в Кельвинах.
Шкала от 0 до 100 - это условные единицы, при 0 - включен “желый” канал, “белый” - выключен, при 100 - наоборот.
При значении 50 - работают оба канала одинаково.

Формула там такая:
Есть два выходных канала, OUT_Y (желтый) и OUT_W (белый) и входные данные BR (яркость) и TEMP (температура). Все единицы - проценты от 0 до 100.

if (TEMP <= 50) {
  // [0; 50]
  OUT_Y = BR;
  OUT_W = TEMP / (100 - TEMP) * BR;
} else {
  // [51; 100]
  OUT_Y = (100 - TEMP) / TEMP * BR;
  OUT_W = BR;
}

В итоге получаются значения OUT_Y и OUT_W в процентах (в тех же процентах, которые используются для независимых каналов), которые затем пересчитываются в единицы ШИМ по логарифмической кривой и отправляются на выходы.

Принимаются предложения, как можно сделать лучше

1 лайк

т.е. по сути простая линейная зависимость? т.е. при изменении значений 0-100 на диммере 1-й канал изменяет значение 0-100 2 й канал изменяет значение 100-0, оба канала изменяют значения линейно, т.е. по факту этот параметр никакого отношения к цветовой температуре не имеет и с ней никак не связан, это просто линейное смешивание цветов на 2-х каналах с сохранением уровня яркости и без привязки к цветовой температуре светового потока, если я правильно все понял.

Да, к цветовой температуре прямого отношения не имеет, смешивает 2 канала в разных пропорциях.

Зависимость такая:

Получается для управления внешними системами код должен быть примерно такой:

//wb_mrgbw_d_fw_v1.js 17.05.23 test
var dimmNumber = "01" //name VIRTUAL device (this) #ChangeMe!#
var devDimmer = "wb-mrgbw-d-fw3_28" // For name REAL MRGBW-D device #ChangeMe!#
defineVirtualDevice(dimmNumber +"mrgbw-d", {
  title: dimmNumber +" MRGBW-D", //
  cells: {
   colourTemp1 : {
      type : "range",
      value : 4150, // for neutral white
      min : 2000, // warm white
      max : 6500, // cool white
      readonly: false,
      order: 5,
    },
    colourTemp2 : {
      type : "range",
      value : 4150, // for neutral white
      min : 2000, // warm white
      max : 6500, // cool white
      readonly: false,
      order: 5,
    },
  }
});

defineRule("colourTemp1_change", {
  whenChanged: dimmNumber +"mrgbw-d/colourTemp1",
  then: function (newValue, devName, cellName) {
    coolWhite = Math.round(((1000000 / dev[dimmNumber +"mrgbw-d/colourTemp1"]) - 2035) / 45);
    dev[devDimmer +"/CCT1 Temperature"] = coolWhite;
  }
});
defineRule("colourTemp2_change", {
  whenChanged: dimmNumber +"mrgbw-d/colourTemp2",
  then: function (newValue, devName, cellName) {
    coolWhite1 = Math.round(((1000000 / dev[dimmNumber +"mrgbw-d/colourTemp2"]) - 2035) / 45);
    dev[devDimmer +"/CCT2 Temperature"] = coolWhite1;
  }
});

т.е. мы создаем 2 дополнительных топика, в них внешняя система управления передает значения в майредах, после чего переданные значения пересчитываем в кельвины, линейно переводим в условные единицы WB и записываем в целевой топик.
Код рабочий, тему можно закрывать. К цветовой температуре конечно отношения не имеет, но стало возможно поправить баланс белый / желтый.

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.