Сценарий термостата не работает после ребута

Есть еще один вариант, который сразу не учли: переписать решение на wb-rules. Вероятно, это самый безболезненный вариант.

Первый вариант фактически тоже сводится к wb-rules: правило будет отслеживать готовность датчика и через runshell перезапускать службу сценария. Второй вариант менее предпочтителен, так как при обновлении конфиг может быть перезаписан. Третий вариант также возможен, но его реализация может занять больше времени.

Да, код выше должен нивелировать данную проблему, хотя это и является обходным решением.

увеличение таймаута не спасло, контрол горит красным, cityron появился, на виртуальном контроле целевая температура выставлена, но вылазит ошибка:

2026-04-03 17:16:25

[WBSC-thermostat-mod]: Target temperature “null” must be in the range from “Min” to “Max”

2026-04-03 17:16:26

[WBSC‑base-mod/bedroom_heating]: Config validation failed for scenario: “bedroom heating”

2026-04-03 17:16:26

ECMAScript error: Error: Config validation failed for scenario: “bedroom heating”
anon wbsc-scenario-base.mod:248
anon wbsc-scenario-base.mod:225 preventsyield
apply native strict preventsyield
anon wbsc-wait-controls.mod:120 preventsyield

как это сделать? через /meta/error?

Да, черезе него.

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

Добрый день, нет, попробую на выходных.

upd: может, что-то не так я делаю, но отслеживать готовность датчика при перезапуске mqtt-serial таким образом не получается. НО. Если отключаю питание шины и включаю, то правило срабатывает.

defineRule({
    whenChanged: "cityron-pu-3_9/Main Temperature#error",
    then: function(newValue, devName, cellName) {
        log("newValue = " + newValue);
        if (newValue !== "") {
            log("!!!!!!!!!!!  cityron disabled !!!!!!!!!!!!");
        } else {
            log("!!!!!!!!!!   cityron EBABLED !!!!!!!!!!!!!");
        }
    }
});

ВОПРОС: как правильно отслеживать готовность датчика при старте службы?

Добрый день,
Попробуйте данный вариант,

// 1. Проверка при загрузке системы
defineRule("check_cityron_on_start", {
    when: cron("@reboot"),
    then: function () {
        setTimeout(tryCheckCityronState, 3000);
    }
});

// 2. Отслеживание изменений в процессе работы
defineRule("track_cityron_error_changes", {
    whenChanged: "cityron-pu-3_9/Main Temperature#error",
    then: function (newValue) {
        log("newValue = " + newValue);

        if (newValue !== "") {
            log("!!!!!!!!!!! cityron disabled !!!!!!!!!!!!");
        } else {
            log("!!!!!!!!!! cityron ENABLED !!!!!!!!!!!!!");
        }
    }
});

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

Добрый день!

А как функция tryCheckCityronState() дожна выглядеть и какова дальнейшая логика работы?

Что-то на 2602 у меня нет иконки робота в редакторе правил.

Добрый день,
Робот на портале размещен.

Ясно, спасибо, попробую.

А как функция tryCheckCityronState() дожна выглядеть и какова дальнейшая логика работы?

Добрый день,
Если я я понял верно ваш вопрос, то ответ в данной конструкции.

// 1. Проверка при загрузке системы
defineRule("check_cityron_on_start", {
    when: cron("@reboot"),
    then: function () {
        setTimeout(tryCheckCityronState, 3000);
    }
});

// 2. Отслеживание изменений в процессе работы
defineRule("track_cityron_error_changes", {
    whenChanged: "cityron-pu-3_9/Main Temperature#error",
    then: function (newValue) {
        log("newValue = " + newValue);

        if (newValue !== "") {
            log("!!!!!!!!!!! cityron disabled !!!!!!!!!!!!");
        } else {
            log("!!!!!!!!!! cityron ENABLED !!!!!!!!!!!!!");
        }
    }
});

Добрый день. В конструкции

setTimeout(tryCheckCityronState, 3000);

используется таймер, в котором функция tryCheckCityronState срабатывает каждые 3 секунды. Вот я и задаю вопрос: а что это за функция?

tryCheckCityronState — это просто пользовательская функция, которая должна быть объявлена выше в скрипте для считываения статуса ошибки.

Также через #error?

Насколько корректно в пользовательской функции считывать топик, которого нет?

И будет ли cron(@reboot) отрабатывать при сохранении настроек/рестарте serial-сервиса?

Добрый день, ответ будет какой-то?

Простите, пропустил сообщение.

Вполне. Подписка на отсутствующий на момент подписки топик вполне возможно, когда (если) в него будет что-то опубликовано - подписка сработает.

Нет.