WB Engine (топик автора скрипта)

Попробуйте следующий код для моста:

connection WB1
address 192.168.10.131
topic devices/# both 0 /wb1/ /
topic homeassistant/# both 0

На wb1 в скрипте wb-engine в разделе settings prefix = /wb1/

Если не заработает, покажите MQTT INFO из HA для канала реле.

Поведение не изменилось, еще сыпит ошибки в HA mqtt

error: received null username, clientid or topic, or access is equal or less than 0 for acl check

INFO

  • CHNO6 K1 (switch.wb2_kk1)
    MQTT discovery data:
    • Topic: homeassistant/switch/wb2_wb-mr6c_145/k1/config
    • PayloadSubscribed topics:
    • /wb2/devices/wb-mr6c_145/controls/K1

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K1/meta

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K1/meta/error

0 последних полученных сообщенийTransmitted messages:

  • wb2//devices/wb-mr6c_145/controls/K1/on

4 последних переданных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K1/on

1 последних переданных сообщений

  • CHNO6 K2 (switch.wb2_kk2)
    MQTT discovery data:
    • Topic: homeassistant/switch/wb2_wb-mr6c_145/k2/config
    • PayloadSubscribed topics:
    • /wb2/devices/wb-mr6c_145/controls/K2

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K2/meta

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K2/meta/error

0 последних полученных сообщенийTransmitted messages:

  • CHNO6 K3 (switch.wb2_kk3)
    MQTT discovery data:
    • Topic: homeassistant/switch/wb2_wb-mr6c_145/k3/config
    • PayloadSubscribed topics:
    • /wb2/devices/wb-mr6c_145/controls/K3

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K3/meta

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K3/meta/error

0 последних полученных сообщенийTransmitted messages:

  • CHNO6 K4 (switch.wb2_kk4)
    MQTT discovery data:
    • Topic: homeassistant/switch/wb2_wb-mr6c_145/k4/config
    • PayloadSubscribed topics:
    • /wb2/devices/wb-mr6c_145/controls/K4

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K4/meta

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K4/meta/error

0 последних полученных сообщенийTransmitted messages:

  • wb2//devices/wb-mr6c_145/controls/K4/on

1 последних переданных сообщений

  • CHNO6 K5 (switch.wb2_kk5)
    MQTT discovery data:
    • Topic: homeassistant/switch/wb2_wb-mr6c_145/k5/config
    • PayloadSubscribed topics:
    • /wb2/devices/wb-mr6c_145/controls/K5

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K5/meta

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K5/meta/error

0 последних полученных сообщенийTransmitted messages:

  • CHNO6 K6 (switch.wb2_kk6)
    MQTT discovery data:
    • Topic: homeassistant/switch/wb2_wb-mr6c_145/k6/config
    • PayloadSubscribed topics:
    • /wb2/devices/wb-mr6c_145/controls/K6

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K6/meta

0 последних полученных сообщений

  • /wb2/devices/wb-mr6c_145/controls/K6/meta/error

0 последних полученных сообщенийTransmitted messages:

Триггеры

Нет триггеров

Все равно с пустым топиком пробрасывается. Как на скрине.

Пустой и должен быть, MQTT INFO вам необходимо развернуть “Payload” и там будет конфиг, вот его скинуть для “Topic: homeassistant/switch/wb2_wb-mr6c_145/k1/config”

Вобщем какие траблы были с применением конфига. Пару раз перегрузил вроде все заработало. Все реле онлайн и управлябтся Буду тестировать.
В аддоне HA сыпет ошибку бесконечно:

error: received null username, clientid or topic, or access is equal or less than 0 for acl check

Развернул “Payload”:

device:
  identifiers: wb2_wb-mr6c_233
  manufacturer: WirenBoard
  model: wb-mr6c [wb-modbus]
  name: CHNO1
availability_mode: latest
enabled_by_default: true
availability:
  - topic: /wb2/devices/wb-mr6c_233/controls/K1
    value_template: '{{ False if value == '''' else True }}'
    payload_not_available: false
    payload_available: true
  - topic: /wb2/devices/wb-mr6c_233/controls/K1/meta
    value_template: '{{ False if value == '''' else True }}'
    payload_not_available: false
    payload_available: true
  - topic: /wb2/devices/wb-mr6c_233/controls/K1/meta/error
    value_template: '{{ True if value == '''' else False }}'
    payload_not_available: false
    payload_available: true
unique_id: wb2_k1
object_id: wb2_k1
state_topic: /wb2/devices/wb-mr6c_233/controls/K1
payload_on: 1
payload_off: 0
command_topic: /wb2/devices/wb-mr6c_233/controls/K1/on
name: K1

Эта ошибка связана с HA issue, пишут вроде как может помочь удаление интеграции MQTT на стороне HA и добавление заново.

Выглядит правильно, раз все работает, значит “конфигурация” рабочая.

Супер скрипт, но только никак не въеду, где можно поправить скрипт для управления рольставнями с отображением положения, чтобы выдавал процентное соотношение, модуль используется такой WBIO-DO-R10R-4?

Спасибо за скрипт! Установил без проблем, но не вижу в списке “устройств”, которые сконфигурированы и добавлены через wb-mqtt-knx.conf, это наверное не делалось получается?

А где там проценты? Там же просто смена направления вращения и включение мотора?

Скрипт делался для себя, таких устройств у меня не было, как там оно выглядит я не представляю

да у вас так, у меня раньше считал положение nodered, но я обновил контроллер на 8ой, и пытаюсь запустить это все на home assistant без использования nodered, вот что мне выдает chat gpt,
Чтобы переделать ваш скрипт для управления рольставнями с отображением положения в процентах для интеграции с Home Assistant, необходимо:
1. Ввести расчет текущего положения на основе времени движения.
2. Обрабатывать команды, задающие целевую позицию в процентах.
3. Сохранять и публиковать состояние устройства через MQTT.

Вот переработанный скрипт:

function coverLogic(id, cmd) {
var run_time = scripts[id].run_time;
var relay = scripts[id].config.relay;
var relay_direction = scripts[id].config.relay_direction;

if (!relay || !relay_direction) {
    log('{} relay or relay_direction not defined', id);
    return;
}

log('{} cmd {}', id, cmd);

// Очистка таймеров, если они активны
if (scripts[id].timer) {
    clearTimeout(scripts[id].timer);
    scripts[id].timer = false;
}
if (scripts[id].timer2) {
    clearTimeout(scripts[id].timer2);
    scripts[id].timer2 = false;
}
if (scripts[id].timer3) {
    clearTimeout(scripts[id].timer3);
    scripts[id].timer3 = false;
}

// Остановка движения
if (cmd === 'stop') {
    dev[relay] = false;
    dev[id]['state'] = 'stopped';
    return;
}

// Получение целевой позиции
var currentPosition = dev[id]['position'] || 0; // Текущее положение (в процентах)
var targetPosition = typeof cmd === 'number' ? cmd : (cmd === 'open' ? 100 : 0);

if (targetPosition === currentPosition) {
    log('{} already at target position: {}%', id, currentPosition);
    return;
}

var isOpen = targetPosition > currentPosition; // true - вверх, false - вниз
var delay = dev[relay] ? 500 : 50; // Задержка перед переключением реле
var movementTime = Math.abs(targetPosition - currentPosition) / 100 * run_time * 1000; // Время движения в мс

// Отключение реле, если оно активно
log('{} relay off, delay = {}', id, delay);
dev[relay] = false;

scripts[id].timer = setTimeout(function () {
    scripts[id].timer = false;

    log('{} do {}', id, isOpen ? 'open' : 'close');
    dev[relay_direction] = isOpen;

    scripts[id].timer2 = setTimeout(function () {
        scripts[id].timer2 = false;

        dev[relay] = true;
        dev[id]['state'] = isOpen ? 'opening' : 'closing';

        var startTime = Date.now();

        scripts[id].timer3 = setTimeout(function () {
            scripts[id].timer3 = false;

            // Остановка движения
            log('{} relay off', id);
            dev[relay] = false;
            dev[id]['state'] = 'stopped';

            // Обновление текущего положения
            var elapsedTime = (Date.now() - startTime) / 1000;
            var deltaPosition = (elapsedTime / run_time) * 100;

            if (isOpen) {
                currentPosition = Math.min(100, currentPosition + deltaPosition);
            } else {
                currentPosition = Math.max(0, currentPosition - deltaPosition);
            }

            currentPosition = Math.round(currentPosition);
            dev[id]['position'] = currentPosition; // Синхронизация позиции
            log('{} position updated to {}%', id, currentPosition);
        }, movementTime);
    }, 100);
}, delay);

}

// Пример: привязка к виртуальному устройству
defineVirtualDevice(“living”, {
title: “Рольставни гостиная”,
cells: {
position: {
type: “range”,
value: 0, // Начальное положение
max: 100, // Максимум 100%
},
state: {
type: “text”,
value: “stopped”, // Начальное состояние
},
},
});

// MQTT-обработка
defineRule(“living_position_command”, {
whenReceiveCommand: “/devices/living/controls/position/on”,
then: function (cmd) {
var position = parseInt(cmd, 10);
if (isNaN(position) || position < 0 || position > 100) {
log(“Invalid position command: {}”, cmd);
return;
}
coverLogic(“living”, position);
},
});

// Публикация состояния
defineRule(“living_position_publish”, {
whenChanged: “living/position”,
then: function (newValue) {
publish(“/devices/living/controls/position”, newValue.toString());
},
});
Основные изменения:

  1. Поддержка позиции в процентах:

• Позиция (position) теперь обновляется на основе времени движения.

• Обработка команды position через MQTT для установки целевой позиции (0–100%).

  1. Состояние ( state**):**

• Поле state отображает текущее состояние устройства (opening, closing, stopped).

  1. MQTT-интеграция:

• Поддержка установки позиции через MQTT (/devices/living/controls/position/on).

• Публикация текущей позиции (/devices/living/controls/position).

  1. Виртуальное устройство:

• Поле position для отображения текущего положения (0–100%).

• Поле state для отображения состояния (stopped, opening, closing).

Настройка Home Assistant:

Добавьте в configuration.yaml:

cover:

  • platform: mqtt
    name: “Рольставни гостиная”
    command_topic: “/devices/living/controls/position/on”
    set_position_topic: “/devices/living/controls/position/on”
    position_topic: “/devices/living/controls/position”
    value_template: “{{ value | int }}”
    payload_open: “100”
    payload_close: “0”
    optimistic: false
    retain: false

не могу найти где у вас хранятся скрипты устройства

Там всего 4 файла основных , wb-rules скрипты тут хранятся: wb-engine-module.js

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

Посмотрел код который чат сделал, достаточно похоже, надо протестировать.

дак все топики будет обрабатывать home assistant.
было реализовано через ноду с соседней темы (node-red-contrib-wirenboard (node) - Node-RED)

все отлично работало, но хочется уйти от кучи программ, и рулить всем через home assistant, а ваш скрипт будет туда сюда топики слать

HA только говорит что он хочет, топики обрабатывает wb-rules. Как будет время свободное постараюсь реализовать, еще надо дать возможность управлять через % из WB.

могу прислать сейв nodered

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

Вопрос есть, время закрытия и открытия одинаковое , нет различий у “мотора” ?

1 лайк

да одинаковое

Раньше просто сценарий был такой: При рассвете рольставни приоткрывались на 55% процентов и закрывались на закате, если нужно было полностью открыть то открывались либо кнопками, либо через приложение)

Добавил (v0.3.14) возможность указать положение штор в процентах, также можно останавливать в процессе и скрипт пересчитает текущее положение. Попробуйте, все ли работает как надо.

С новым годом, это же просто супер новость, через пару дней смогу только потестить, отпишусь)))

Подскажите, а как перекинуть в HA метрики для вывода графиков?
Например, metrics/load_average_1min