Диммирование кнопкой на SVG панели

Здравствуйте, сделал изменение яркости одной кнопкой (по принципу физического кнопочного выключателя) на SVG панели по аналогии с решением в этой теме, но выяснился интересный нюанс, хотел узнать сталкивались ли вы с ним и если сталкивались то как решили.

А нюанс состоит в следующем: если открыть панель на компьютере и управлять курсором, то все работает как нужно, длительное нажатие изменяет яркость, отпускание останавливает изменение и кажется что все хорошо, но при использовании HMI панели или телефона алгоритм ломается и при отпускании клавиши изменение не останавливается и требуется дополнительное короткое нажатие, как вы думаете с чем это может быть связано?

Добрый день!

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

Рекомендую посмотреть примеры по данной ссылке.

А какое нибудь решение нашлось или эта разница просто существует и с этим ничего нельзя сделать? Можете уточнить о каком конкретно примере идет речь, или это общая информация о работе с SVG панелями?

Добрый день!

Например, вот простая реализация кнопки. Она работает как при нажатии мышью, так и при нажатии кнопки. Настраивается через привязки в веб-интерфейсе.

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

Мне важно понять рабочая ли это идея поскольку такой метод управления яркостью мне кажется наиболее удобным и понятным в использовании, поскольку есть ассоциации с физическими клавишами, это не загружает интерфейс, не требуется делать множество разных панелей для диммируемых устройств. И интересно здесь то что оно работает “мышкой”, если бы эта идея была изначально нерабочей было бы понятно, (хотя если честно странно что подобной функции нет, как и ползунков, но тут я уже не специалист по какой причине это так), а когда оно работает тут и не работает там это вызывает вопросы.

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

Добрый день!

Мне потребуется некоторое время, чтобы проверить вашу задачу.

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

defineVirtualDevice("VDmdm3_Channel_2", {
    title: "VDmdm3_Channel_2",
    cells: {
        Up: {
            type: "switch",
            value: false,
            order: 1
        },
        StopUp: {
            type: "pushbutton",
            order: 2
        },
        Direction: {
            type: "switch",
            value: true,
            order: 3
        },
    }
});
defineRule({
    whenChanged: "VDmdm3_Channel_2/Up",
    then: function(newValue, devName, cellName) {
        if (newValue) {
            upDIMInterval = setInterval(function() {
                if (dev["VDmdm3_Channel_2/Up"]) {
                    dev["wb-mdm3_179/K2"] = true;
                    if (dev["VDmdm3_Channel_2/Direction"]) {
                        dev["wb-mdm3_179/Channel 2"] += 1;
                    } else {
                        dev["wb-mdm3_179/Channel 2"] -= 1;
                    };
                };
                if (!dev["VDmdm3_Channel_2/Up"]) {
                    clearTimeout(upDIMInterval)
                }
            }, 100);
        }
        if (!newValue) {
            changeDIMTimer = setTimeout(function() {
                if (dev["wb-mdm3_179/Channel 2"] >= 50) {
                    dev["VDmdm3_Channel_2/Direction"] = false;
                } else {
                    dev["VDmdm3_Channel_2/Direction"] = true;
                };
            }, 5000)

        } else {
            clearTimeout(changeDIMTimer);
        };
    }
});

defineRule({
    whenChanged: "VDmdm3_Channel_2/StopUp",
    then: function(newValue, devName, cellName) {
        if (newValue) {
            if (dev["VDmdm3_Channel_2/Up"]) {
                dev["VDmdm3_Channel_2/Up"] = false;
                dev["VDmdm3_Channel_2/Direction"] = !dev["VDmdm3_Channel_2/Direction"]
            } else {
                dev["wb-mdm3_179/K2"] = !dev["wb-mdm3_179/K2"]
            }
        }
    }
});

defineRule({
    whenChanged: "wb-mdm3_179/Channel 2",
    then: function(newValue, devName, cellName) {
        if (dev["wb-mdm3_179/Channel 2"] <= 0 || dev["wb-mdm3_179/Channel 2"] >= 100) {
            if (dev["wb-mdm3_179/Channel 2"] <= 0) {
                dev["wb-mdm3_179/Channel 2"] += 1
            };
            if (dev["wb-mdm3_179/Channel 2"] >= 101) {
                dev["wb-mdm3_179/Channel 2"] -= 1
            }
        }
    }
});

1 лайк

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

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