[Таймеры] помогите найти проблему

Пример скипта:

var ruleName = 'automation_zabor'
var devices = [
    'zigbeeRelayOut/zigbee_relay_8_zabor__state_l1',
    'zigbeeRelayOut/zigbee_relay_9_stolb__state'
]

var zabor1AutoOff = 15 * 60; // seconds

defineRule("{}/Zabor1 autoOff".format(ruleName), {
    whenChanged: devices,
    then: function (newValue, devName, cellName) {
        // log("{}/{}: {}", devName, cellName, newValue);
        timers.zabor1_timer.stop();
        if (newValue) {
            startTimer("zabor1_timer", zabor1AutoOff * 1000);
        }
    }
});

defineRule("{}/Zabor1 autoOff timer".format(ruleName), {
    when: function () {
        return timers.zabor1_timer.firing;
    },
    then: function () {
        for (var i in devices) {
            dev[devices[i]] = false;
        }
    }
});

defineRule("{}/Zabor2 sync zabor 1".format(ruleName), {
    whenChanged: 'zigbeeRelayOut/zigbee_relay_8_zabor__state_l1',
    then: function (newValue, devName, cellName) {
        // log("{}/{}: {}", devName, cellName, newValue);
        setTimeout(function() {
            dev['zigbeeRelayOut/zigbee_relay_8_zabor__state_l2'] = newValue;
        }, 2000);

    }
});

Есть несколько подобных правил. Все работают с таймерами, во время тестирования проблем нет - все отрабатывает четко. Но иногда не отключается второе устройство в списке zigbeeRelayOut/zigbee_relay_9_stolb__state. Не всегда, чаще почему-то ночью.

При тестировании все срабатывает четко, но уже после 2 ночей заметили что устройство не отключено.

Само вирт устройство:

var virtualDevName = "zigbeeRelayOut";

var whd02 = [
    {
        devName: "zigbee_relay_1",
        title: "zigbee_relay 1 (лестница)"
    },
    {
        devName: "zigbee_relay_2",
        title: "zigbee_relay 2 (кухня)"
    },
    {
        devName: "zigbee_relay_3",
        title: "zigbee_relay 3 (коридор б)"
    },
    {
        devName: "zigbee_relay_4",
        title: "zigbee_relay 4 (Зал)"
    },
    {
        devName: "zigbee_relay_5",
        title: "zigbee_relay 5 (Гостевая)"
    },
    {
        devName: "zigbee_relay_9_stolb",
        title: "zigbee_relay 9 (Столб)",
        sync: false,
    },
];

...

var cells = {};
var initialCellsLength = 0;

// Add whd02 relays
for (var i in whd02) {
    var device = whd02[i];
    initialCellsLength = Object.keys(cells).length;
    cells[device.devName] = {
        type: "switch",
        value: (dev[device.devName]["state"] === "ON"),
        title: device.title,
        order: initialCellsLength
    };
}

...

// ********************
// whd02 track ad sync
// ********************
var trackedDevices = [];
var syncDevices = [];
for (i in whd02) {
    if (!whd02[i].hasOwnProperty("sync") || whd02[i].sync === true) {
        syncDevices.push("{}/state".format(whd02[i].devName));
    }
    trackedDevices.push("{}/{}".format(virtualDevName, whd02[i].devName));
}

defineRule("{}/whd02 changed".format(virtualDevName), {
    whenChanged: trackedDevices,
    then: function (newValue, devName, cellName) {
        var payload = { state: (newValue) ? "ON" : "OFF" };
        publish("zigbee2mqtt/{}/set".format(cellName), JSON.stringify(payload), 2, false);
    }
});

defineRule("{}/whd02 sync".format(virtualDevName), {
    whenChanged: syncDevices,
    then: function (newValue, devName, cellName) {
        //log("{}/{}: {}", devName, cellName, newValue);
        dev[virtualDevName][devName] = (newValue === "ON");
    }
});

Думали что проблема с получением состояния из Zigbee реле, отключили правило получения состояния для этого реле чтобы не влияло на вирт устройство, но не помогло.

Некоторое время все работало стабильно.

Недавно обновились по последней стабильной версии WB. А так же добавили внешний клиент который обновляет значение 3-4 mqtt топиков:

Частота обновления от раз в 3 секунды до раз в несколько часов. Коннект с брокером не держим, то есть на каждое обновление значения идет новый коннект, обновление и закрытие соединения.

Диагностический архив не собирается. Час лоадер крутиться и никакого эффекта:

Нашел в логах

Похоже виртуальное устройство пропадает на время по каким-то причинам

Добрый день.
Понятно и подробно описано, весьма радует.
Я бы подошел к решению комплексно.
Для начала - видно что в первом скрипте

значения публикуются в виртуальное устройство в цикле. Нужно убедится что они, значение действительно публикуются. Для этого, если виртуальное устройство включено в штатный сервис “истории” (wb-mqtt-db) контролллера - достаточно посмотреть в нее.
Если нет - то можно дописать в этот же цикл вывод в лог.
То есть ожидается в случае успешного выполнения - две строчки в логе, две записи в “истории”.

А в логах wb-rules что-то есть?

В Wb-rules только это

если виртуальное устройство включено в штатный сервис “истории” (wb-mqtt-db) контролллера

Подскажите как включить.

Пока добавлю два лога до и после dev[devices[i]] = false;

Возможно стоит писать асинхронно?

for (var item of devices) {
            dev[item] = false;
        }

или версия языка это не поддерживает?

в wb-mqtt-db.service много таких сообщений, как можно исправить?

2-06-2025 15:49:51.140 [wb-mqtt-db.service]	INFO: [dblogger] Group data limit is reached: group all, row count 102001, limit 100000

Давайте диагностический архив с контроллера - оно полезнее будет.
Но да - такое впечатление что топики в какой-то момент недоступны.

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

Это штатное. Если в группе более установленного количества записей - самые старые удаляются. То есть не надо исправлять.

1 лайк

Я выше писал:
Диагностический архив не собирается. Час лоадер крутиться и никакого эффекта:

cli можно выкачать архив?

Создание архива командой описано в документации.