Добрый день! Предыстория: сделал у себя дома управление светом через реле (WBIO-DO-R10A-8) и диммеры (WB-MDM3). В целом все устраивает, кроме одного досадного момента: после перезагрузке контроллера, все реле выключаются (это еще терпимо, хотя и неприятно), а вот все диммеры включаются - и это уже “ни в какие ворота”, так как последнее время часто стали отключать свет посреди ночи, и после восстановления питания врубается свет во всем доме. Поискал тут на форуме, рекомендовали сделать сохранение значений реле в persistent storage и восстановление на загрузке скрипта. Сейчас у меня код выглядит примерно так:
// Создание хранилища для сохранения значений реле
var ps = new PersistentStorage("storage_floor2", { global: true });
var relaysList = [
// список реле, которые нужно сохранять
];
loadSavedValues(relaysList, ps);
subscribeToRelayChanges(relaysList, ps);
function loadSavedValues(relayList, ps) {
relayList.forEach(function (relayDev) {
if (ps[relayDev] !== undefined) {
dev[relayDev] = ps[relayDev]; // восстанавливаем значение из persistentStorage
log.info("Загружено значение для " + relayDev + ": " + ps[relayDev]);
}
});
};
function subscribeToRelayChanges(relayList, ps) {
relayList.forEach(function (relayDev) {
defineRule({
whenChanged: relayDev,
then: function (newValue) {
ps[relayDev] = newValue; // сохраняем значение в persistentStorage
log.info("Сохранено значение " + newValue + " для " + relayDev);
}
});
});
};
Но восстановления не происходит. Судя по логам, код вызывается (и сохранение и загрузка), но похоже, что восстановление происходит слишком рано, и восстановленное значение впоследствии перезатирается системой при инициализации. Так, все реле остаются выключенными, а диммеры включенными.
Пытался заменить на
setTimeout(function() {
debugLog("initial load");
loadSavedValues(relaysList, ps);
}, 0);
- с тем же успехом
Видел предложение поставить большую задержку в setTimeout, но это будет значить, что несколько секунд все люстры в доме будут светиться, ночью такое поведение не устраивает! Что посоветуете?