Ошибка при создании виртуальных устройств в wb-rules

Добрый день!

Столкнулся с проблемой при создании виртуальных устройств в wb-rules. После нескольких циклов удаления и повторного добавления правила (01_01_home_2f-heat_register_virtual_devices.js) в логах начали появляться ошибки, связанные с уже существующими ID устройств.

Описание проблемы:

  • Виртуальные устройства регистрируются при загрузке правила (defineVirtualDevice).
  • После удаления правила (wb-rules перезапускался) и последующего возврата, wb-rules выдает ошибку:

ERROR: device definition error: Device with given ID already exists

  • Ошибка повторяется для всех устройств, создаваемых в скрипте.
  • Даже после очистки кеша (rm -rf /var/lib/wb-rules) и перезапуска службы wb-rules, устройства продолжают оставаться в системе.

Фрагмент кода, вызывающий ошибку:

defineVirtualDevice(“valve_2f_rad”, {
title: “Контроллер клапана (2 Этаж радиаторы)”,
cells: {
current_position_2f_rad: { type: “range”, value: 0, max: 100, readonly: false, units: “%” },
position_2f_rad: { type: “range”, value: 0, max: 100, readonly: false, units: “%” }
}
});

Полный код правила приложен ниже.

Фрагмент логов ошибки:

ERROR: device definition error: Device with given ID already exists
ERROR: [rule error] ECMAScript error: Error: Device with given ID already exists
anon native strict preventsyield
anon /etc/wb-rules/01_01_home_2f-heat_register_virtual_devices.js:78 preventsyield

Что уже пробовал:

  1. Останавливал wb-rules перед удалением правила:
systemctl stop wb-rules
  1. Удалял кеш wb-rules:
rm -rf /var/lib/wb-rules
  1. Перезапускал wb-rules после удаления правила:
systemctl restart wb-rules
  1. Удалял устройства из MQTT:
mosquitto_pub -t '/devices/valve_2f_rad/meta/driver' -r -n
  1. Перезагружал контроллер.

Но устройства продолжают “залипать”, и при повторном добавлении правила defineVirtualDevice() приводит к ошибке.

Вопросы:

  1. Как корректно удалить виртуальные устройства wb-rules, чтобы избежать конфликта ID?
  2. Почему defineVirtualDevice() не удаляет предыдущие инстансы устройств при перезапуске wb-rules?
  3. Есть ли рекомендуемый способ перезаписи виртуальных устройств, если они уже существуют?

Буду благодарен за помощь.
Спасибо!

Спойлер

// 1. Регистрация виртуальных устройств
// Правило для регистрации виртуальных устройств для управления 2 этажом.

defineRule(“register_virtual_devices_2f_rad”, {
when: function() {
// Это правило выполняется сразу после загрузки скрипта.
return true;
},
then: function() {
// Регистрация устройства для управления клапаном.
defineVirtualDevice(“valve_2f_rad”, {
title: “Контроллер клапана (2 Этаж радиаторы)”,
cells: {
current_position_2f_rad: {
type: “range”,
value: 0,
max: 100,
readonly: false,
units: “%”
},
position_2f_rad: {
type: “range”,
value: 0,
max: 100,
readonly: false,
units: “%”
},
integral_2f_rad: {
type: “value”,
value: 0,
readonly: false
},
prev_error_2f_rad: {
type: “value”,
value: 0,
readonly: false
},
P_value_2f_rad: {
type: “value”,
value: 0,
readonly: true,
units: “”
},
I_value_2f_rad: {
type: “value”,
value: 0,
readonly: true,
units: “”
},
D_value_2f_rad: {
type: “value”,
value: 0,
readonly: true,
units: “”
},
enable_pid_2f_rad: {
type: “switch”,
value: true,
readonly: false
},
reset_pid_2f_rad: {
type: “pushbutton”,
value: false
},
hysteresis_2f_rad: {
type: “range”,
value: 1,
max: 5,
min: 0,
readonly: false,
units: “°C”
},
force_pid_2f_rad: {
type: “pushbutton”,
value: false
}
}
});

    // Регистрация устройства для управления температурой радиатора.
    defineVirtualDevice("radiator_obr_temp_2f_rad", {
        title: "Управление температурой радиатора (2 Этаж радиаторы)",
        cells: {
            target_temp_2f_rad: {
                type: "range",
                value: 50,
                max: 70,
                min: 25,
                readonly: false,
                units: "°C"
            }
        }
    });

    // Регистрация устройства для отображения текущей температуры.
    defineVirtualDevice("temperature_2f_rad", {
        title: "Датчик температуры (2 Этаж радиаторы)",
        cells: {
            current_2f_rad: {
                type: "temperature",
                value: 20,
                readonly: false,
                units: "°C"
            },
            direction_2f_rad: {
                type: "text",
                value: "stable",
                readonly: true
            },
            prev_temp_2f_rad: {
                type: "value",
                value: 20,
                readonly: false
            }
        }
    });

    // Регистрация устройства для логов переключателей.
    defineVirtualDevice("switch_log_2f_rad", {
        title: "Логи переключателей (2 Этаж радиаторы)",
        cells: {
            last_switch_action: {
                type: "text",
                value: "Нет данных",
                readonly: true
            },
            seconds_since_action: {
                type: "value",
                value: 0,
                readonly: true
            }
        }
    });

    log("[register_virtual_devices_2f_rad] Виртуальные устройства успешно зарегистрированы.");
}

});

Добрый день!

Рекомендую очистить связанные топики.

Инструкция по очистке очереди сообщений доступна в данной статье.

Функция defineVirtualDevice() не должна удалять устройство. Можно добавить дополнительную проверку перед удалением, но после выполнения mqtt-delete-retained это, скорее всего, уже не потребуется.

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