Помогите сделать скрипт, восстанавливающий состояние реле после перезагрузки

  1. Да, прошивку контроллера я уже обновил, но это ничего не изменило, что ожидаемо…
  2. У меня 1 модуль подключен непосредственно к контроллеру. Поэтому я и уточнил про “настройку wb-mqtt-gpio”.
  3. в скрипте есть только некоторое количество правил типа:
defineRule({
  whenChanged: "wb-mdm3_123/Input 6 Single Press Counter", // ВК203.1 Детская 2 выкл главн (свет)
  then: function (newValue, devName, cellName) {
    dev["wb-mdm3_123/K2"] = !dev["wb-mdm3_123/K2"]; // Детская 2 свет
  }
});

Вспомнил еще, что у меня ранее стоял Node-RED (тестил подключение Алисы через него). Сейчас, с обновлением контроллера, я кажется его снес :slight_smile: Возможно, это он упарывался?

  1. Вернемся к начальной теме, так как она актуальна хотя бы для WBIO реле, которые включены через BW-MIO:

Вот тут рассматривается: Восстановление состояния каналов WBIO-DO-SSR-8 - #3 от пользователя BrainRoot

Тут используется таймер на 2 секунды, это не выглядит надежным решением. Нельзя ли подписаться на какие-то события, которые бы означали, что устройство стало готовым у использованию?
У меня появилась идея что я могу опрашивать готовность устройства в defineRule с условием через when. Набросал что-то вроде такого (это не работает, потому что я выбрал не тот способ узнать, готов ли объект):

// Определение списка реле для этажа 2
var relaysList = [
  // F2 dimmer rooms
  "wb-mdm3_123/K1", // СВ-200 Детская 1 свет главный
  "wb-mdm3_123/K2", // СВ-203 Детская 2 свет главный
  "wb-mdm3_123/K3", // СВ-Л-3 Холл свет главный
  // ну и еще энное количество топиков, которые я хочу восстанавливать...
}

function isConnected(devName) {
  // Проверяем статус подключения по Modbus
  // Идея была в том, что если в девайсах у топика появится мета, значит девайс онлайн
  // Проблема в том, что отсутствие меты неотличимо от отсутствия ошибки, так что это не работает
  if ((dev[devName+"#error"] == null))
  {
    setTimeout(function(){log(devName+" status online: " + dev[devName+"#error"])}, 0);
    return true;
  }

  setTimeout(function(){log(devName+" status offline: " + dev[devName+"#error"])}, 0);
  return false;
}

var devsToReady = relaysList.slice();

var connectedWatcher = defineRule("modbusDeviceReady", {
  when: function() {
    for(var i = devsToReady.length - 1; i > 0; i = i - 1) {
      var relayDev = devsToReady[i];
      if (isConnected(relayDev)) {
        return true;
      }
    }
    return false;
  },
  then: function (newValue) {
    for(var i = devsToReady.length - 1; i > 0; --i) {
      var relayDev = devsToReady[i];
      if (isConnected(relayDev)) {
        setTimeout(function() {
          log.info("---- connected "+relayDev+" ----");
          var value = ps[relayDev] ? true : false;
          dev[relayDev] = value;
          log("Загружено значение для " + relayDev + ": " + ps[relayDev]);
        }, 0);
        devsToReady.splice(i, 1);
      }
    }

    if (devsToReady.length == 0) {
      log.info("---- all devices connected ----");
      disableRule(connectedWatcher);
    } else {
      log("More " + devsToReady.length + " to init..");
    }
  }
});

Если в кратце, я делаю 1 правило, которое в условии в цикле проверяет “онлайн” статус топиков в списке, и, если появляется кто-то онлайн, срабатывает функция, которая инициализирует появившееся онлайн топик и удаляет его из списка.
К сожалению я совсем не силен в JS, а тем более wb-rules вносит свои нюансы, и я не знаю, как правильно определить, онлайн-ли топик, или еще нет?