- Да, прошивку контроллера я уже обновил, но это ничего не изменило, что ожидаемо…
- У меня 1 модуль подключен непосредственно к контроллеру. Поэтому я и уточнил про “настройку wb-mqtt-gpio”.
- в скрипте есть только некоторое количество правил типа:
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 (тестил подключение Алисы через него). Сейчас, с обновлением контроллера, я кажется его снес Возможно, это он упарывался?
- Вернемся к начальной теме, так как она актуальна хотя бы для 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 вносит свои нюансы, и я не знаю, как правильно определить, онлайн-ли топик, или еще нет?