Добрый день!
Столкнулся с проблемой при создании виртуальных устройств в 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
Что уже пробовал:
- Останавливал
wb-rules
перед удалением правила:
systemctl stop wb-rules
- Удалял кеш
wb-rules
:
rm -rf /var/lib/wb-rules
- Перезапускал
wb-rules
после удаления правила:
systemctl restart wb-rules
- Удалял устройства из MQTT:
mosquitto_pub -t '/devices/valve_2f_rad/meta/driver' -r -n
- Перезагружал контроллер.
Но устройства продолжают “залипать”, и при повторном добавлении правила defineVirtualDevice()
приводит к ошибке.
Вопросы:
- Как корректно удалить виртуальные устройства
wb-rules
, чтобы избежать конфликта ID? - Почему
defineVirtualDevice()
не удаляет предыдущие инстансы устройств при перезапускеwb-rules
? - Есть ли рекомендуемый способ перезаписи виртуальных устройств, если они уже существуют?
Буду благодарен за помощь.
Спасибо!
Спойлер
// 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] Виртуальные устройства успешно зарегистрированы.");
}
});