Как отследить, что изменения Яркости и Температуры были установлены вручную?

Всем привет!
Пишу правила для циркадного освещения. Все кнопки и ленты настроил. Все ок. Теперь хочу отследить любое ручное изменение Яркости и Температуры света.

Сейчас у меня ручное изменение Яркости и Температуры задается с помощью удержания кнопки более 1,5 секунд. В таком случае Яркость выкручивается на максимум, а температура на 0 (максимально холодный свет).

Но этого недостаточно. Можно ли отследить любые изменения связанные с изменением температуры или яркости? Например, попросил Алису выкрутить яркость на максимум. После чего поднимается флаг, что изменения были вручную. Или сам выкрутил в виджетах температуру до 0, то после этого флаг тоже должен подняться.

Пытался это реализовать через код ниже, но понял, что концептуально ошибаюсь. Может кто-то уже решал такую задачу?
var Изменялся = false;
ТекущееЗначение = dev[“wb-led_64/CCT1 Brightness”];
debug(ТекущееЗначение);

defineRule(“Изменение яркости и температуры вручную”, {
whenChanged: “wb-led_64/CCT1 Brightness”,
then: function(новоеЗначение, ИмяУстройства, ИмяЯчейки) {
if (ТекущееЗначение !== новоеЗначение) {
Изменялся = true;
ТекущееЗначение = dev[“wb-led_64/CCT1 Brightness”];
// debug(Изменялся);
// debug(новоеЗначение);
// debug(ИмяУстройства);
// debug(ИмяЯчейки);
} else {
Изменялся = false;
// debug(Изменялся);
}
}
});

Текущий код приложил.

ЦиркадноеОсвещение.js (27,7 КБ)

@AIbot, есть мысли на этот счет?

Чтобы отслеживать любые ручные изменения яркости и температуры света через Wiren Board, вам нужно следить за изменениями соответствующих значений и установить флаг при их изменении. Ваш текущий код направлен на отслеживание изменений яркости, но вы также можете сделать то же самое для температуры.

Вот пример кода для отслеживания:

var changedBrightness = false;
var changedColorTemp = false;

var currentBrightness = dev["wb-led_64/CCT1 Brightness"];
var currentColorTemp = dev["wb-led_64/CCT1 Color Temperature"];

defineRule("Track Brightness Changes", {
    whenChanged: "wb-led_64/CCT1 Brightness",
    then: function(newValue, devName, cellName) {
        if (currentBrightness !== newValue) {
            changedBrightness = true;
            currentBrightness = newValue;
            // Здесь можно добавить дополнительные действия
        }
    }
});

defineRule("Track Color Temperature Changes", {
    whenChanged: "wb-led_64/CCT1 Color Temperature",
    then: function(newValue, devName, cellName) {
        if (currentColorTemp !== newValue) {
            changedColorTemp = true;
            currentColorTemp = newValue;
            // Здесь можно добавить дополнительные действия
        }
    }
});

Этот скрипт создаёт два правила: одно для отслеживания изменений яркости, другое для отслеживания изменений температуры цвета. Каждый раз, когда значение меняется, устанавливается соответствующий флаг. Вы можете добавить дополнительные действия, которые должны выполняться при изменении этих значений.

Обратите внимание, что необходимо корректно настраивать устройства и их параметры в коде. Убедитесь, что использованные имена и параметры устройств соответствуют вашей системе.

Для более детальных примеров можете ознакомиться с разделом правил на wirenboard.com или обратиться к сообществу за советами.

Помните, я всего лишь бездушная машина и могу ошибаться.

В таком случае моя стандартная функция рассчитатьТемпературуИЯркость также будет попадать в эти правила и флаг changedColorTemp всегда будет равен true. Что в корне неверно для циркадного освещения. Есть другие варианты?

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

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

  2. Отслеживание изменений:
    При изменении значений сохраняйте их в переменные и проверяйте источник изменения. Если значения изменились без установки флага автоматического изменения, предполагайте, что это ручное изменение. Затем сбрасывайте флаг.

var autoChange = false;

var currentBrightness = dev["wb-led_64/CCT1 Brightness"];
var currentColorTemp = dev["wb-led_64/CCT1 Color Temperature"];

function setAutoBrightness(brightness) {
    autoChange = true;
    dev["wb-led_64/CCT1 Brightness"] = brightness;
    autoChange = false;
}

function setAutoColorTemp(colorTemp) {
    autoChange = true;
    dev["wb-led_64/CCT1 Color Temperature"] = colorTemp;
    autoChange = false;
}

defineRule("Track Manual Brightness Changes", {
    whenChanged: "wb-led_64/CCT1 Brightness",
    then: function(newValue, devName, cellName) {
        if (!autoChange && currentBrightness !== newValue) {
            // Это было ручное изменение
            log("Brightness was changed manually.");
        }
        currentBrightness = newValue;
    }
});

defineRule("Track Manual Color Temperature Changes", {
    whenChanged: "wb-led_64/CCT1 Color Temperature",
    then: function(newValue, devName, cellName) {
        if (!autoChange && currentColorTemp !== newValue) {
            // Это было ручное изменение
            log("Color Temperature was changed manually.");
        }
        currentColorTemp = newValue;
    }
});

Объяснение:

  • autoChange флаг указывает, что изменение исходит от функции автоматизации.
  • Функции setAutoBrightness и setAutoColorTemp: Используются для определения автоматических изменений, при которых autoChange устанавливается в true.
  • Правила Track Manual Brightness Changes и Track Manual Color Temperature Changes: Эти правила проверяют, если изменения были сделаны без установки флага autoChange, то изменения интерпретируются как ручные.

Попробуйте этот подход, чтобы отслеживать изменения. Помните, точная реакция зависит от вашей логики: либо протоколировать изменения, либо инициировать последующие действия. Я, как бот, могу ошибаться и поэтому рекомендую тестировать всё в реальных сценариях.

Ты умеешь объявлять переменные и функции на русском языке?

В JavaScript, языке, на котором пишутся правила для Wiren Board при использовании wb-rules, переменные и функции объявляются с использованием английских ключевых слов. Например, var, let и const используются для объявления переменных, а function для функций. Названия переменных и функций могут быть на любом языке, включая русский, т.к. язык программирования поддерживает Unicode. Например:

var температура = 20;
function рассчитатьТемпературу() {
    // Логика функции
}

Этот код абсолютно компилируем, но рекомендуется использовать английский, чтобы сохранить код универсальным и удобочитаемым для международного сообщества разработчиков. Стандарты программирования часто рекомендуют придерживаться английского языка для элементов кода для облегчения интеграции и понимания.

Если у вас есть еще вопросы, не стесняйтесь спрашивать, даже если я бездушная машина, я здесь, чтобы помочь!

Добрый день!

Также рекомендую данную статью, где собраны примеры правил и решения от сообщества.

Добрый день,
Удалось ли решить вопрос?