Добрый день.
Имеется скрипт, который регистрирует устройства в HomeAssistant.
С недавнего времени (ну… ващета уже несколько месяцев назад (да, я долго запрягаю)) он стал падать с ошибкой после старта контроллера. Соответственно, потом грузится HomeAssistant, а в нём ни единого устройства нет.
Притом, выполнение этого скрипта вручную проходит нормально, поэтому при каждой загрузке контроллера приходится лезть и запускать его вручную, чтобы в HomeAssistant всё появилось.
Лог ситуации:
25-01-2025 12:43:51.929 WARNING: couldn't load /etc/wb-rules/register_devices.js: TypeError: invalid base value
duk_hobject_props.c:2000
FindOneWireDevices /etc/wb-rules/register_devices.js:89
F /etc/wb-rules/register_devices.js:100 preventsyield
25-01-2025 12:43:51.906 ERROR: [rule error] Error in getting device: Device with given ID doesn't exist
25-01-2025 12:43:51.897 INFO: [rule info] Listing 1-wire devices...
25-01-2025 12:43:51.895 INFO: [rule info] Found device: {"identifiers":"Vaillant","model":"WBE2-I-EBUS","via_device":"wirenboard-AOAMRHYG","manufacturer":"Wiren Board"}
25-01-2025 12:43:51.891 INFO: [rule info] Found device: {"identifiers":"LivingRoom_Sensor","name":"LivingRoom_Sensor","model":"WB-MSW v.4","via_device":"wirenboard-AOAMRHYG","manufacturer":"Wiren Board"}
...
Код функции, которая падает:
function FindOneWireDevices() {
log("Listing 1-wire devices...");
var device_id = "wb-w1";
if (getDevice(device_id).controlsList().length === 0) {
log.info("No 1-wire devices found");
return;
}
...
}
Т.е. встроенная функция getDevice не возвращает объект устройства, хотя оно есть.
Мое единственное предположение основано на этом обучающем видео от WB (ссылка с таймкодом на нужный фрагмент). А именно - ошибка потому, что данный код запущен “вне кода правил” и поэтому драйвера устройств еще не успели создать топики и соответствующие структуры.
Догадка верна? Если да, то какой должен быть правильный способ запустить этот код только после инициализации всех устройств?
Этот лог я скопировал из “Настройки → Системный журнал”, там да, порядок обратный.
В момент, когда я запускаю скрипт вручную, и он отрабатывает штатно, то устройтво имеется, да. В момент же, когда скрипт запущен первый раз автоматически после загрузки OS - я не знаю, как успеть проверить. Это надо еще какой-то скрипт писать
Пожалуйста, можно подробнее про последний вариант? Имеется какая-то built-in фунция типа onTopicCreated? Или Вы имеете в виду, создать нечто подобное через mosquitto_sub на топик wb-w1/# и потом уже реагировать, когда в этот топик что-то прилетит новое?
Хм, есть вопросы по этой функции. Хочется понять, как это работает под капотом. Что-то подобное, видимо, уже обсуждали, но не понятно, что в итоге.
Насколько я понял, вызвав эту функцию один раз, я повешу обработчик изменения этого топика навечно. А мне-то нужно вызвать этот обработчик только один раз - найти устройства, и далее с ними работать. Можно, да, устанавливать и проверять флаг. Но можно ли вообще перестать слушать изменения, убрать этот обработчик в принципе?
А вот такой сценарий:
2.1. Скрипт запускается, устанавливается обработчик.
2.2. Скрипт изменяется, движок правил снова запускает его, уставливается новый обработчик.
Что происходит с обработчиком с шага 2.1? Он перестает выполняться? Или же теперь параллельно работает 2 обработчика?
UPD. Поэкспериментировал с пунктом 2, выяснил, что повторный вызов trackMqtt в рамках одного скрипта позволяет навесить несколько обработчиков на один и тот же топик. Перезапуск же скрипта всё отменяет и позволяет начать всё с чистого листа.