Написать правило

Написать правило за вознаграждение:

  • T2 < 60 и T1 <= 60 - включить реле К1
  • T2 < 60 и T1 >= 70 - выключить реле К1
  • T2 >= 60 и T1 <= 60 - включить реле К1
  • T2 >= 60 и T1 >= 70 - выключить реле К1

Контроллер Wiren Board 8.4, Модуль реле 6-канальный WB-MR6C v.2, Датчики температуры 1-wire DS18B20

Добрый день,

Обычно в этом сообществе принято помогать друг другу, и вы можете рассчитывать на отзывчивость и поддержку.Т ак же можно обратиться в Telegram-чат Wiren Board, где вы, скорее всего, получите опыт других пользователей в кратчайшие сроки.

Также можно ознакомиться с основами создания правил для движка wb-rules:

Пример простого правила для вашей задачи:

defineRule("temperature_control_K1", {
  whenChanged: [
    "/devices/wb-msw-v4_1_2/controls/Temperature",  // Топик датчика температуры T1
    "/devices/wb-msw-v4_1_2/controls/Humidity"     // Топик датчика влажности T2 для примера второй метрики 
  ],
  then: function () {
    var T1 = dev["wb-msw-v4_1_2"]["Temperature"];  // Значение температуры
    var T2 = dev["wb-msw-v4_1_2"]["Humidity"];     // Значение влажности

    if (T1 <= 60) {
      dev["wb-mdm3_27"]["K1"] = true;  // Включаем реле К1
    } else if (T1 >= 70) {
      dev["wb-mdm3_27"]["K1"] = false; // Выключаем реле К1
    }
  }
});

Пояснения:

  1. Топики температуры и влажности:
  • /devices/wb-msw-v4_1_2/controls/Temperature — значение температуры T1.
  • /devices/wb-msw-v4_1_2/controls/Humidity — значение T2 (влажность). Замените на свой реальный топик для T2.
  1. Реле:
  • /devices/wb-mdm3_27/controls/K1 — реле, которое будет управляться. Замените на ваш реальный топик реле, если отличается.

Если у вас возникнут трудности, задавайте вопросы и я постараюсь вам помочь.

Если же требуется профессиональная помощь, рекомендую обратиться к интеграторам, которые смогут оперативно настроить и оптимизировать вашу систему.

1 лайк

Добрый день.
Вижу пример так:

//11_06_test_01.js

var tSensor1="hwmon/CPU Temperature";
var tSensor2="hwmon/CPU Temperature";
var oRelay1="wb-gpio/A1_OUT";
var oRelay2="wb-gpio/A2_OUT";
var oRelay3="wb-gpio/A3_OUT";


defineRule("whenChanged tSensor", {
    whenChanged: [tSensor1, tSensor2], // топик, при изменении которого сработает правило
      then: function (newValue, devName, cellName) {
        log.info(newValue, cellname);
        T1 = dev[tSensor1];
        T2 = dev[tSensor2];
        if(T1<=60 && T2<60){
          dev[oRelay1] = true;
        }
        if(T1>=70 && T2<60){
          dev[oRelay1] = false;
        }
        if(T1<=60 && T2>=60){
          dev[oRelay1] = true;
        }
        if(T1>=70 && T2>=60){
          dev[oRelay1] = false;
        }
    }
});

Не тестировал.

Написал правило, но почему то не работает (реле не вкл / выкл)…
где что надо подправить ?

defineRule("termostat", {
  whenChanged: [
    "/devices/wb-w1/controls/28-011449b828aa",				// Топик датчика температуры котла T1		
    "/devices/wb-w1/controls/28-01204dc4005c",				// Топик датчика температуры бойлера T2
	"/devices/wb-mr6c_219_2/controls/K1"					// Топик реле К1
  ],
  then: function () {
    var T1 = dev["28-011449b828aa"]["Temperature"];			// Значение температуры котла Т1
    var T2 = dev["28-01204dc4005c"]["Temperature"];			// Значение температуры бойлера Т2

    if (T1 <= 38) {
      dev["wb-mr6c_219_2"]["K1"] = true;					// Включаем реле К1
    } else if (T1 >= 40) {
      dev["wb-mr6c_219_2"]["K1"] = false;					// Выключаем реле К1
    }
  }
});

image

Добрый день,
Добавил в скрипт немного вам отладочной информации.



defineRule("termostat", {
  whenChanged: [
    "/devices/wb-w1/controls/28-011449b828aa",  // Топик датчика температуры котла T1
    "/devices/wb-w1/controls/28-01204dc4005c", // Топик датчика температуры бойлера T2
    "/devices/wb-mr6c_219_2/controls/K1"       // Топик реле К1
  ],
  then: function () {
    log("Rule triggered");
    
    var T1 = dev["wb-w1"]["28-011449b828aa"];  // Значение температуры котла Т1
    var T2 = dev["wb-w1"]["28-01204dc4005c"];  // Значение температуры бойлера Т2

    log("T1 (котел): " + T1 + "°C");
    log("T2 (бойлер): " + T2 + "°C");

    if (T1 <= 38) {
      dev["wb-mr6c_219_2"]["K1"] = 1; // Включаем реле К1
      log("Реле К1: включено");
    } else if (T1 >= 40) {
      dev["wb-mr6c_219_2"]["K1"] = 0; // Выключаем реле К1
      log("Реле К1: выключено");
    }
  }
});

Рекомендую ссылки на основные статьи по написанию правил:
ссылка на гит и на википедию

Так почему не срабатывает правило ? Куда посмотреть ?

Добрый день!

Для проверки работы правила рекомендую добавить логирующую функцию на каждое действие. Эта функция должна выводить информацию о срабатывании правила. Пример таких функций я разместил выше на основе скрипта.

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

Если потребуется дополнительная помощь, пишите!

приложен диагностический архив, доступен только сотрудникам поддержки
(378,9 КБ)
приложил архив

Не смотрели архив ?
Позавчера перезагрузил контроллер, после этого началась чехарда с датчиками температуры, то все красное, то вообще связи нет (датчики и отключал и подключал, несколько раз контроллер выключал / включал, нет порядка)…

Добрый день!

По данной проблеме наблюдаются ошибки, связанные с KNX. В логах фиксируется следующее:

WirenboardKNX: E00000064: [19:router] router: setup router: failed

WirenboardKNX: F00000105: [12:server] Link down, terminating

Рекомендую:

  1. Проверить физическое подключение KNX-оборудования.
  2. Убедиться в корректности конфигурации маршрутизатора KNX.

Я переподключился к Интерфейс RS485-1, правило так и не срабатывает…

Добрый день!

  1. Нажмите внизу пиктограмму гаечного ключа и включите режим отладки, установив галочку:

изображение
изображение

  1. Также прошу уточнить:
  • Вы внесли изменения в код?
  • Установили необходимые топики и добавили вывод логов при работе правила?

Вот так написано правило…

defineRule("termostat", {
  whenChanged: [
    "/devices/wb-w1/controls/28-011449b828aa",  // Топик датчика температуры котла T1
    "/devices/wb-w1/controls/28-01204dc4005c", // Топик датчика температуры бойлера T2
    "/devices/wb-mr6c_219/controls/K1"       // Топик реле К1
  ],
  then: function () {
    log("Rule triggered");
    
    var T1 = dev["wb-w1"]["28-011449b828aa"];  // Значение температуры котла Т1
    var T2 = dev["wb-w1"]["28-01204dc4005c"];  // Значение температуры бойлера Т2

    log("T1 (котел): " + T1 + "°C");
    log("T2 (бойлер): " + T2 + "°C");

    if (T2 < 49) {
      dev["wb-mr6c_219"]["K1"] = 1; // Включаем реле К1
      log("Реле К1: включено");
    } else if (T2 > 51) {
      dev["wb-mr6c_219"]["K1"] = 0; // Выключаем реле К1
      log("Реле К1: выключено");
    }
  }
});

Вот что выводится под ключом…

Добрый день!

Внешне ошибок не вижу, но немного подкорректировал, добавив логирующую информацию.

Рекомендации:

  1. Проверьте правильность топиков и всю остальную информацию.
  2. Напоминаю про полезные ссылки для написания правил:
defineRule("termostat", {
  whenChanged: [
    "/devices/wb-w1/controls/28-011449b828aa",  // Топик датчика температуры котла T1
    "/devices/wb-w1/controls/28-01204dc4005c"   // Топик датчика температуры бойлера T2
  ],
  then: function () {
    log("Rule triggered");

    // Проверка доступности устройств и параметров
    if (!dev["wb-w1"] || !dev["wb-w1"]["28-011449b828aa"] || !dev["wb-w1"]["28-01204dc4005c"] || !dev["wb-mr6c_219"]) {
        log("Error: One or more devices or parameters are unavailable.");
        return;
    }

    // Получение значений температур
    var T1 = dev["wb-w1"]["28-011449b828aa"];  // Температура котла
    var T2 = dev["wb-w1"]["28-01204dc4005c"];  // Температура бойлера

    // Проверка валидности значений
    if (typeof T1 !== "number" || typeof T2 !== "number") {
        log("Error: Invalid temperature values. T1: {}, T2: {}", T1, T2);
        return;
    }

    log("T1 (котел): {}°C", T1);
    log("T2 (бойлер): {}°C", T2);

    // Управление реле с проверкой текущего состояния
    if (T2 < 49 && dev["wb-mr6c_219"]["K1"] !== 1) {
        dev["wb-mr6c_219"]["K1"] = 1;
        log("Реле К1: включено");
    } else if (T2 > 51 && dev["wb-mr6c_219"]["K1"] !== 0) {
        dev["wb-mr6c_219"]["K1"] = 0;
        log("Реле К1: выключено");
    } else {
        log("Температура бойлера в допустимом диапазоне (49–51°C). Реле К1 не изменяется.");
    }
  }
});

Это выводится под ключом:

2024-12-04 07:46:55using file /var/lib/wirenboard/wbrules-persistent.db for persistent DB
2024-12-04 07:46:55DAC: no config file
2024-12-04 07:46:55add your rules to /etc/wb-rules/

Добрый день!

Рекомендую разделить логику следующим образом:

  1. Создайте отдельное виртуальное устройство для вывода температуры.
  2. Создайте отдельное виртуальное устройство для управления реле.

Начнём с простого, чтобы выявить, где именно логика не отрабатывает.

Так же для диагностики проблемы пришлите, пожалуйста, архив с диагностической информацией контроллера. Создание архива описано в документации.

приложен диагностический архив, доступен только сотрудникам поддержки
(415,3 КБ)

Добрый день!

Удалось ли вам создать простые правила?

Нет, не удалось… Отправил контроллер назад производителю…