Не находит путь к реле

модуль реле WBIO-DO-R10A-8

выход wb-gpio/EXT2_R3A1 (скопирован из топика)

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

Правило: При срабатывании датчика уровня (wb-gpio/EXT1_IN1) кран должен закрыться (wb-gpio/EXT2_R3A1)

В логах выходит:

Jun 21 10:08:16 wirenboard-ADLWN6IQ wb-rules[1139392]: INFO: [rule info] [RULE-TEST] Правило сработало: devName=wb-gpio, newValue=true
Jun 21 10:08:16 wirenboard-ADLWN6IQ wb-rules[1139392]: INFO: [rule info] [RULE-ACTION] Срабатывание датчика: закрываем кран
Jun 21 10:08:16 wirenboard-ADLWN6IQ wb-rules[1139392]: INFO: [rule info] ERROR при установке крана: TypeError: call target not an object
Jun 21 10:08:20 wirenboard-ADLWN6IQ wb-rules[1139392]: INFO: [rule info] [RULE-TEST] Правило сработало: devName=wb-gpio, newValue=false
Jun 21 10:08:20 wirenboard-ADLWN6IQ wb-rules[1139392]: INFO: [rule info] [RULE-INFO] Датчик вернулся в норму

Здравствуйте! Я — автоматический помощник техподдержки Wiren Board.
Сейчас выходной — я постараюсь помочь сразу, а в ближайший рабочий день
инженеры посмотрят тему и ответят.

Судя по логу, проблема не в самом выходе реле, а в обращении к объекту в wb-rules: ошибка TypeError: call target not an object обычно означает, что в правиле вызывается несуществующий метод или переменная с путём к каналу указана не так.

Что проверить в первую очередь:

  1. В правиле убедитесь, что для управления выходом используется именно запись в свойство value, а не вызов как функции.
  2. Проверьте, что путь к каналу совпадает с тем, что виден в mqtt/Dashboards и в wb-mqtt-db — для модулей WBIO-DO-R10A-8 путь может отличаться от скопированного из другого устройства.
  3. Если EXT2_R3A1 работает с дашборда, но не из правила, пришлите фрагмент правила целиком — там, вероятно, ошибка в строке обращения к каналу.
  4. Если хотите, я могу помочь прямо по коду: пришлите 10–20 строк правила, где создаётся обработчик и где пишется в реле.

По симптомам это похоже на ошибку в синтаксисе wb-rules, а не на аппаратную неисправность.

Примечание: я — ИИ, а не человек; в моих ответах возможны неточности.
Инженеры посмотрят тему в ближайший рабочий день. Если хотите ускорить —
приложите диагностические данные.

var sensorName = “wb-gpio/EXT1_IN1”;
var valveName  = “EXT2_R3A1”;
var CLOSE_VAL = 0;

function closeValve() {
var ctrl = dev[valveName];
if (!ctrl) {
log(“CRITICAL: контроль крана не найден: "” + valveName + “"”);
return;
}
try {
ctrl.set(CLOSE_VAL);
log("Кран закрыт: установлено " + CLOSE_VAL + " на " + valveName);
} catch (e) {
log("ERROR при установке крана: " + e.toString());
}
}

defineRule(“close_valve_on_sensor”, {
whenChanged: sensorName,
then: function(newValue, devName) {
log(“[RULE-TEST] Правило сработало: devName=” + devName + “, newValue=” + newValue);

    if (newValue === true || newValue === 1) {
        log("[RULE-ACTION] Срабатывание датчика: закрываем кран");
        closeValve();
    } else {
        log("[RULE-INFO] Датчик вернулся в норму");
    }
}

});

Добрый день!

Движок сохраняет правило без ошибок, так как синтаксически код написан верно. Однако в процессе работы в рантайме возникает ошибка TypeError: call target not an object.

Это происходит из-за трех небольших нюансов в логике скрипта:

  • Неполный адрес крана. В переменной valveName указан только канал EXT2_R3A1. Движку нужен полный путь в формате "устройство/канал", то есть "wb-gpio/EXT2_R3A1".

  • В wb-rules нет метода .set(). Конструкция dev["устройство/канал"] возвращает не пульт управления с кнопками, а просто текущее значение датчика или реле (например, true или false). У простого значения нельзя вызвать метод .set(), поэтому движок выдает ошибку. В wb-rules управление всегда происходит через простое присваивание знака равенства =.

  • Типы данных. Так как WBIO-DO-R10A-8 — это релейный модуль, его выходами правильнее и надежнее управлять с помощью логических true (включить) и false (выключить), а не числами 1 и 0.

Можете попробовать использовать код ниже:

var sensorName = "wb-gpio/EXT1_IN1";
var valveName  = "wb-gpio/EXT2_R3A1";   // Исправлено: указан полный путь
var CLOSE_VAL  = false;                  // Исправлено: для реле используем false/true вместо 0/1

function closeValve() {
    // Исправлено: управляем через простое равенство "=" вместо ".set()"
    dev[valveName] = CLOSE_VAL; 
    log("Кран закрыт: {} = {}", valveName, CLOSE_VAL);
}

defineRule("close_valve_on_sensor", {
    whenChanged: sensorName,
    then: function(newValue, devName, cellName) {
        log("[RULE-TEST] Сработало: {}/{} = {}", devName, cellName, newValue);
        
        // Если датчик замкнулся (newValue === true)
        if (newValue) { 
            log("[RULE-ACTION] Срабатывание датчика: закрываем кран");
            closeValve();
        } else {
            log("[RULE-INFO] Датчик вернулся в норму");
        }
    }
});