Помогите с виртуальным устройством на WB8

Есть небольшой вопрос: есть реле WB-MR6C v.2
На 5 и 6 вход настроено управление штор по матрице, 5 - открыть, 6 - закрыть, время 44 секунды на открытие\закрытие.

Нужно создать виртуальное устройство, чтобы помимо кнопок нажатия был бегунок от 0 до 100, показывающий прогресс. Подскажите, есть ли данный шаблон в репозитории? если нет. не могли бы помочь с его примером?

Реле опускает экран проектора и поднимает его соответственно.

Здравствуйте.
По умолчанию такого шаблона нет.
Пробовали ли самостоятельно создать виртуальное устройство?
Так же можно написать свой шаблон, например взяв за основу наш.
Поможет ещё в дополнение описание как работает наш драйвер wb-mqtt-serial и движок правил wb-rules

Попробую, мне бот посоветовал это
/*
Правило для виртуального управления приводом штор.
При изменении параметра (бегунка) от 0 до 100 рассчитывается время движения:
время = (44 сек / 100) * target_position.
Настройте порт и адрес устройства согласно вашей конфигурации.
*/

// Инициализация порта и регистрация привода.
// Замените ‘/dev/ttyMOD4’, группу и индивидуальный адрес на актуальные для вашего монтажа.
rfblinds.add_serial_port(‘/dev/ttyMOD4’);
rfblinds.add_dooya(1, 2, ‘Virtual Blinds Device’);

// Полное время хода (от 0 до 100) в секундах.
var FULL_DURATION = 44;

/**

  • Функция для установки позиции шторы.
  • @param {number} targetPosition – целевое значение позиции (0…100)
    */
    function setBlindPosition(targetPosition) {
    // Вычисляем длительность движения относительно полной длительности.
    var duration = FULL_DURATION * targetPosition / 100;
    // Вызов метода управления мотором привода.
    // Метод “move_to_position” – условный, замените его на реальный (например, rfblinds.move_to(…))
    rfblinds.move_to_position(targetPosition, duration);
    log("Установка позиции шторы: " + targetPosition + “%, время движения: " + duration + " сек”);
    }

/*
Обработка изменения виртуального устройства.
Предположим, что создано виртуальное устройство с именем “VirtualBlinds”
и параметром “slider” (значение от 0 до 100).
*/
wb.on(“deviceChanged”, function(device, param, value) {
if (device.name === “VirtualBlinds” && param === “slider”) {
var pos = parseInt(value, 10);
if (!isNaN(pos) && pos >= 0 && pos <= 100) {
setBlindPosition(pos);
}
}
});

  1. Убедитесь, что пакет wb‑mqtt‑rfblinds установлен и устройство подключено.
    А что это за пакет?

К сожалению бот насоветовал немного не то.
Создайте новое правило со своим названием.
Добавьте туда пример кода ниже, “поиграйтесь” с ним под свои устройства.
появится вот такой виджет, из кода вы поймёте логику как это работает.

defineVirtualDevice(“projector_screen”, {
title: “Экран проектора”,
cells: {
position: {
type: “range”,
value: 0,
min: 0,
max: 100,
readonly: false
},
moving: {
type: “switch”,
value: false
},
open: {
type: “pushbutton”
},
close: {
type: “pushbutton”
},
stop: {
type: “pushbutton”
}
}
});

var moveTimer = null;
var moveStartPos = 0;
var moveStartTime = 0;
var moveDirection = null;
var moveDuration = 44; // секунд на полный ход

function stopMovement() {
dev[“projector_screen/moving”] = false;
dev[“wb-mr6c_XX/K5”] = false; // заменить на реальные каналы
dev[“wb-mr6c_XX/K6”] = false;
moveDirection = null;
if (moveTimer) {
clearTimeout(moveTimer);
moveTimer = null;
}
}

function startMovement(dir) {
stopMovement();
moveDirection = dir;
dev[“projector_screen/moving”] = true;
moveStartPos = dev[“projector_screen/position”];
moveStartTime = Date.now();

if (dir == “up”) dev[“wb-mr6c_XX/K5”] = true; // открыть
if (dir == “down”) dev[“wb-mr6c_XX/K6”] = true; // закрыть

moveTimer = setInterval(function() {
var elapsed = (Date.now() - moveStartTime) / 1000;
var delta = (elapsed / moveDuration) * 100;
var newPos = moveDirection == “up”
? moveStartPos + delta
: moveStartPos - delta;
newPos = Math.max(0, Math.min(100, newPos));
dev[“projector_screen/position”] = newPos;

if (newPos == 0 || newPos == 100) {
  stopMovement();
}

}, 500); // обновление каждые 0.5 с
}

// кнопки управления
defineRule(“screen_open”, {
whenChanged: “projector_screen/open”,
then: function() { startMovement(“up”); }
});

defineRule(“screen_close”, {
whenChanged: “projector_screen/close”,
then: function() { startMovement(“down”); }
});

defineRule(“screen_stop”, {
whenChanged: “projector_screen/stop”,
then: function() { stopMovement(); }
});

// слайдер
defineRule(“screen_set_position”, {
whenChanged: “projector_screen/position”,
then: function(newValue, devName, cellName) {
if (dev[“projector_screen/moving”]) return; // игнор, если движется
var cur = dev[“projector_screen/position”];
if (newValue > cur) startMovement(“up”);
else if (newValue < cur) startMovement(“down”);
}
});

Спасибо, попробую. подскажите. а виртуальные устройства с WB 8 пробрасываются в Sprut?

В Sprut.hub пробросятся контролы MQTT каналов всех устройств контроллера в том числе виртуальных.

SyntaxError: error parsing token (line 1) duk_lexer.c:1272

Подскажите, где синтаксическая ошибка?

Я создал файл с таким же названием в разделе правил.

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

Возьмите шаблон кода из этого файла.
projector_screen.txt (2,5 КБ)

В будущем если планируете писать правила, рекомендую глубже ознакомиться с движком правил wb-rules
если есть сложности с пониманием синтаксиса попробуйте для себя альтернативные инструменты для написания правил wb-rules например:

Спасибо, теперь скрипт запускается.
За ссылки спасибо. Вопрос можно закрыть.