Совместная работа Yandex и NodeRED

Добрый день. При активации интеграции с Яндекс перестают работать автоматизации, прописанный в node-red. Подскажите, где закралась ошибка?

Контроллер - Wiren Board 7.3.4.
Прошивка - unstable.latest (as testing), 202601161725
Интеграция с Яндекс через - wb-mqtt-alice
Версия node-red - Node-RED v4.1.3, Node.js v22.15.0, Linux 5.10.35-wb180 arm LE
К контроллеру подключены моудли расширения:

  • WBIO-DO-R10A-8 - 4 шт
  • WBIO-DI-WD-14 - 1 шт

также всистеме есть:

  • Пульт Cityrom PU-3 - 3 шт
  • wb-mrm2-mini - 4 шт

Управление системой осущетсвляется из интерфейса node-red/ui.
Что хотим получить - Управление системой из приложения Яндекс и из интерфейса node-red. Логика упрвления устройствами вся сосредоточена в node-red. В то время, как в яндекс только - переключение режимов, выставление уставки темпретуры, просмотр фактической температуры, голосовое управление.

Что получаем (на примере одного мастер-выключателя):

  1. При первой активации интеграции Яндекс пропадает возможность управления устройствами, подключенными к боковым модулям. Управление из node-red не работает. после перезагрузки контроллера система приходит в норму. Управление из Яндекс отрабатывает хорошо.
  2. Но при попытке включить свет с физического выключателя (звонкового типа) свет начинает моргать быстро и непрерывно, отключть из web-интерфейса контроллера не получалось. помогла перезагрузка и отклчение службы wb-mqtt-alice.
  3. При изменении чего либо в яндекс - в node-red меняется состояние в тех нодах, которые считывают из mqtt, но записать в mqtt они ничего не могу, и не менют состояние контролов.

Выключатель подключен на - wb-gpio/EXT5_IN14
Исполняющее устройство - wb-gpio/EXT3_R3A8

Виртуальное устройство для выключателя:

var deviceName = 'master-switch';

defineVirtualDevice(deviceName, {
title: {‘en’: ‘Master-switch’, ‘ru’: ‘Мастер-свет’},
cells: {

    switch: {
        title: 'Вкл/выкл Статус',
        type: 'switch',
        value: false,
        readonly: true
    },

    switch_cmd: {
        title: 'Вкл/выкл (Cmd)',
        type: 'switch',
        value: false,
        readonly: false
    }
}

});

// Синхронизация и лог
defineRule({
whenChanged: [
deviceName + ‘/switch_cmd’
],
then: function (newValue, devName, cellName) {

    // синхронизация командных контролов → readonly
    if(cellName === 'switch_cmd'){
        dev[deviceName + '/switch'] = newValue; // обновляем readonly switch
    }


    // лог состояния
    var current = {
        switch_cmd: dev[deviceName + '/switch_cmd']
    };

    log.info(
        'master-switch changed:',
        cellName,
        '->',
        newValue,
        '| full state:',
        JSON.stringify(current)
    );

    // запись обратно в изменённую ячейку
    dev[deviceName + '/' + cellName] = newValue;
}

});

Устройство в интграции Яндекс:

  "devices": {
    "e84d5459-260120141038-1d030e9e-df1e-4a8b-a60b-3768a8ed8413": {
      "name": "Мастер свет",
      "status_info": null,
      "description": null,
      "room_id": "e84d5459-260120102657-4bca904d-39a2-469e-9006-3a1ff36adb3d",
      "type": "devices.types.switch",
      "capabilities": [
        {
          "type": "devices.capabilities.on_off",
          "mqtt": "master-switch/switch_cmd",
          "parameters": {
            "instance": "on"
          }
        }
      ],

flow в node-red

приложен диагностический архив, доступен только сотрудникам поддержки
(3.3 MB)

1 Like

Добрый день.

Плохо знаком с NodeRED к сожалению т.к. это стороннее ПО, но по описанию и записям в логах вижу что где то ломается логика.

Что желательно проверить и исключить:

  1. Зацикливание правила wb-rules в wb-rules.service.log`
master-switch changed: switch_cmd -> false | full state: {"switch_cmd":true}
master-switch changed: switch_cmd -> true | full state: {"switch_cmd":false}
master-switch changed: switch_cmd -> false | full state: {"switch_cmd":true}

Многократное чередование значений true/false с интервалом менее 1 секунды. Это типичный признак логического цикла: изменение control приводит к повторной записи в тот же control и повторному срабатыванию правила.

  1. Запись в control, инициировавший событие

скрипт wb-rules (виртуальное устройство)

whenChanged: [ master-switch/switch_cmd ]
...
dev[deviceName + '/' + cellName] = newValue;

При срабатывании правила выполняется запись обратно в switch_cmd, что гарантированно создаёт бесконечный цикл изменений.

  1. Конфликт источников управления

конфигурация wb-mqtt-alice

"mqtt": "master-switch/switch_cmd"

wb-mqtt-alice напрямую управляет тем же MQTT-control, который используется в Node-RED и обрабатывается wb-rules. При отсутствии разделения ролей control’ов возникает гонка состояний.

Как попытаться исправить:

Исключить обратную запись в switch_cmd из правила.
Удалить строку:

dev[deviceName + '/' + cellName] = newValue;

Разделить control’ы:

  • switch_cmd — только командный (запись из Яндекс, Node-RED);
  • switch — только статусный (readonly: true);
  • запись в switch выполнять однократно, без обратной синхронизации.

Оставить единственный уровень логики управления выходами
(либо Node-RED, либо wb-rules).
Физические выходы (wb-gpio/EXT3_R3A8) не должны управляться параллельно.

Проверить Node-RED flow
на отсутствие схемы «подписка → обработка → запись в тот же MQTT-топик».

После удаления обратной записи и разделения control’ов «моргание» выходов и блокировка управления должны прекратиться.

1 Like

Полностью согласен. Ну и

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

Добрый день.
Спасибо большое, @enginPetr и @BrainRoot за разбор.
Что сделал по итогу:

  1. Создал виртуальное устройство -
defineVirtualDevice('master-switch1', {
  title: 'Мастер свет',
  cells: {
    switch: {          // СТАТУС
      type: 'switch',
      value: false,
      readonly: false
    },
    switch_cmd: {      // КОМАНДА
      type: 'switch',
      value: false,
      readonly: false
    }
  }
});
  1. Поставил switch в начале flow, switch_cmd - в конце. Подписка и запись в рамках одного flow происходит в разные топики. Петли нет.
  2. Связал switch и switch_cmd в соседнем flow. Чтобы статусы менялись во всех средах управления.

В субботу 08.02. проверим физику.

Проблема с цикличным переключением ушла.
Спасибо.
Осталась другая. Открою новый тикет.