Не работает правило на контроллере

Здравствуйте, помогите с простым правилом термостата, устройство создается, но описанная логика не работает, в чем ошибка :

defineVirtualDevice ("HR1", { //Виртуальное устройство
  title:"heater 1",
  cells: {
    "temperature": { //Температурная настройка
      type:"range",
      value: 20,
      max: 50
    },
    "On": {
      type:"switch", //Вкл/Выкл устройства
      value: 0,
    }
  }
});
defineRule ("heater-1_auto_enable", { // Правило работы для виртуального устройства по датчику w-1
  whenChanged: "wb-w1/28-00000d2a3003", // Когда изменились показания датчика
  then: function (newValue, devName, cellName) {
    if ((newValue>dev["HR1"]["temperature"])&&(dev["HR1"]["On"]>0)) { // Если значение датчика больше температурной настройики и "On" установлено в положение Вкл
      dev["wb-gpio"]["EXT1_K1"] = 1; // Включаем питание на термоголовке NO
    } else
      dev["wb-gpio"]["EXT1_K1"] = 0; // Выключаем питание на термоголовке NO
  }
});
defineRule( "heater-1_manual_on", { // Сразу же включает канал и перекрывает NO привод при сбросе кнопки "On"
  whenChanged: ["HR1/On"],
  then: function (newValue, devName, cellName) {
    if (newValue==0) { //Если переключатель в положении Off
      dev["wb-gpio"]["EXT1_K1"] = 1; // Включаем питание на термоголовке NO
    }
  }
});

Здравствуйте! Перенес ваше сообщение в новую тему. Пожалуйста, всегда создавайте новую тему для решения проблемы. Тема с примерами правил нужна для рабочих примеров кода.

Устройтсво переключателя switch может имеет булевы значения true или false. Попробуйте внести следующие исправления:

    "On": {
      type:"switch", //Вкл/Выкл устройства
      value: false,
    }

...

((newValue>dev["HR1"]["temperature"])&&(dev["HR1"]["On"] == true))
...
 if (newValue==false)


Тут все исправил, ориентировался на старые примеры и видимо не учёл что switch только на true и false реагирует, осталась одна маленькая сложность не понимаю как сделать простейшее правило которое бы транслировало показания с датчика w-1 в строку

type: ”temperature”,

Которую уже добавил в само виртуальное устройство.
Строку со свойством range переименовал в “set_temp” что бы не путаться.

Что бы на одном окошке устройства видеть и сетпойнт и текущую температуру.

Добрый день. Советую добавить в начале функции правила вывод в лог значений участвующих в условии.

log.info("HR1/On", dev["HR1"]["On"]);

например и особо обрать внимание на их тип

Не вижу проблем. Ниже привел пример, правда названия устройств немного изменил под свою конфигурацию. Добавил обновление температуры в окошке в уже реализованное ваше правило:

Пример
defineVirtualDevice ("HR1", { //Виртуальное устройство
  title:"heater 1", 
  cells: {
    "set_temp": { //Температурная настройка
      type:"range",
      value: 20,
      max: 50
    },
    "On": {
      type:"switch", //Вкл/Выкл устройства
      value: false,
    },
    "current_temp": { //Реальная температура
      type:"temperature",
      value: 0,
      max: 50
    },
  }
});


defineRule ("heater-1_auto_enable", { // Правило работы для виртуального устройства по датчику w-1
  whenChanged: "wb-w1/28-00000d214624", // Когда изменились показания датчика
  then: function (newValue, devName, cellName) {
    log("rule executed; " + newValue + " " + typeof(newValue) );

    dev["HR1"]["current_temp"] = newValue; // обновляем значение текущей температуры в окошке

    if ((newValue>dev["HR1"]["set_temp"])&&(dev["HR1"]["On"]==true)) { // Если значение датчика больше температурной настройики и "On" установлено в положение Вкл
      log("on");
      dev["wb-gpio"]["EXT1_R3A1"] = true; // Включаем питание на термоголовке NO
    } else
      dev["wb-gpio"]["EXT1_R3A1"] = false; // Выключаем питание на термоголовке NO
  }
});
defineRule( "heater-1_manual_on", { // Сразу же включает канал и перекрывает NO привод при сбросе кнопки "On"
  whenChanged: ["HR1/On"],
  then: function (newValue, devName, cellName) {
    if (newValue==false) { //Если переключатель в положении Off
      dev["wb-gpio"]["EXT1_R3A1"] = true; // Включаем питание на термоголовке NO
    }
  }
});

Помогите пожалуйста с еще одним правилом, для модуля gpio вроде правило работает я добавил там гистерезис(только scale не смог сделать меньше еденицы, может быть это и нельзя) и оставил логику описанную выше.
Потом на базе этого же кода попытался сделать терморегулятор для элекрического теплого пола через модуль mrps6 но его каналы на код ниже не откликаются хотя переодически шелчки слышно:

// Теплый пол Сан узел главный


defineVirtualDevice ("WF1", { //Виртуальное устройство
  title:"теплый пол Санузел Главный", 
  cells: {
    "set_temp": { //Температурная настройка
      type:"range",
      value: 22,
      max: 32,
      min: 18,
      order: 3
    },
    "On": {
      type:"switch", //Вкл/Выкл устройства
      order: 1,
      value: false,
    },
    "current_temp": { //Реальная температура
      type:"temperature",
      value: 0,
      max: 50,
      order: 2
    },
    "gisteresis": { //Гистерезис
      type:"range",
      value: 1,
      scale: 0.1,
      max: 2,
      min: 0,
      order: 4
    },
  }
});
defineRule ("warm_floor_1_auto_enable", { // Правило работы для виртуального устройства по датчику w-1
  whenChanged: "wb-w1/28-3c01f0954659", // Когда изменились показания датчика
  then: function (newValue, devName, cellName) {
    log("rule executed; " + newValue + " " + typeof(newValue) );
    dev["WF1"]["current_temp"] = newValue; // обновляем значение текущей температуры в окошке
    if (newValue<(dev["WF1"]["set_temp"]-dev["WF1"]["gisteresis"])&&(dev["WF1"]["On"]==true)) { // Если значение датчика меньше температурной настройки и "On" установлено 
      log("enable");
      dev["wb-mrps6_14"]["K4"] = true; // Включаем питание
    } 
    if (newValue>(dev["WF1"]["set_temp"]+dev["WF1"]["gisteresis"])&&(dev["WF1"]["On"]==true)) { // Если значение датчика больше температурной настройки и "On" установлено
      log("disable");
      dev["wb-mrps6_14"]["K4"] = false; // Выключаем питание
    }
      else
      dev["wb-mrps6_14"]["K4"] = false; // Выключаем питание
  }
});
defineRule( "warm_floor_1_manual_off", { // Сразу же выключает питание при выключении виртуального устройства
  whenChanged: ["WF1/On"],
  then: function (newValue, devName, cellName) {
    if (newValue==false) { //Если переключатель в положении Off
      dev["wb-mrps6_14"]["K4"] = false; // Выключаем питание на теплом поле
    }
  }
});

Все просто, сначала реле включается а потом выполняется этот участок кода, где оно в любом случае выключится. Уберите блок кода else

1 Like

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

Действительно, условие после else будет отключать питание пола, когда его нужно было бы включить. Попробуйте сделать, как описано в предыдущем сообщении.

1 Like

Спасибо за помощь, вот в итоге правило терморегулятора с сервоприводом NO и датчиком w-1.

Работает, если что то есть смысл откорректировать то напишите.

// Термоголовка сервопривод 1 NO 

defineVirtualDevice ("ARA1", { //Виртуальное устройство терморегулятор
  title:"radiator actuator NO 1", 
  cells: {
    "set_temp": { //Температурная настройка
      type:"range",
      value: 22,
      max: 32,
      min: 18,
      order: 3,
    },
    "On": {
      type:"switch", //Вкл/Выкл устройства
      order: 1,
      value: false,
    },
    "current_temp": { //Реальная температура
      type:"temperature",
      value: 0,
      max: 50,
      order: 2,
    },
    "gisteresis": { //Гистерезис
      type:"range",
      value: 1,
      max: 2,
      min: 0,
      order: 4,
    }
  }
});
defineRule ("auto_radiator_actuator_1_auto_enable", { // Правило работы для виртуального устройства от сигнала датчика w-1
  whenChanged: "wb-w1/28-00000d2a3003", // Когда изменились показания датчика
  then: function (newValue, devName, cellName) {
    log("rule executed; " + newValue + " " + typeof(newValue) );
    dev["ARA1"]["current_temp"] = newValue; // обновляем значение текущей температуры в окошке
    if (newValue<(dev["ARA1"]["set_temp"]-dev["ARA1"]["gisteresis"])&&(dev["ARA1"]["On"]==true)) { // Если значение датчика меньше установки минус гестерезис и "On" установлено 
      log("enable");
      dev["wb-gpio"]["EXT1_K1"] = false; // Выключаем питание на термоголовке NO (открыли приток теплоносителя температура растет к цели)
    } 
    if (newValue>(dev["ARA1"]["set_temp"]+dev["ARA1"]["gisteresis"])&&(dev["ARA1"]["On"]==true)) { // Если значение датчика больше установки плюс гестерезис и "On" установлено
      log("disable");
      dev["wb-gpio"]["EXT1_K1"] = true; // Включаем питание на термоголовке NO (закрыли приток теплоносителя температура падает к цели)
    }
  }
});
defineRule( "auto_radiator_actuator-1_manual_on", { // Правило работы для виртуального устройства при положении кнопки "On"
  whenChanged: ["ARA1/On"],
  then: function (newValue, devName, cellName) {
    if (newValue==false) { //Если переключатель в положении Off
      dev["wb-gpio"]["EXT1_K1"] = false; // Выключаем питание на термоголовке NO (открыли приток теплоносителя)
    }
    if (newValue==true) { //Если переключатель в положении On
      if (dev["wb-w1"]["28-00000d2a3003"]<(dev["ARA1"]["set_temp"]-dev["ARA1"]["gisteresis"])&&(dev["ARA1"]["On"]==true)) { // Если значение датчика меньше установки минус гестерезис и "On" установлено 
      log("enable");
      dev["wb-gpio"]["EXT1_K1"] = false; // Выключаем питание на термоголовке NO (открыли приток теплоносителя температура растет к цели)
    } 
    if (dev["wb-w1"]["28-00000d2a3003"]>(dev["ARA1"]["set_temp"]+dev["ARA1"]["gisteresis"])&&(dev["ARA1"]["On"]==true)) { // Если значение датчика больше установки плюс гестерезис и "On" установлено
      log("disable");
      dev["wb-gpio"]["EXT1_K1"] = true; // Включаем питание на термоголовке NO (закрыли приток теплоносителя температура падает к цели)
    }
    }
  }
});
defineRule( "set_temp_set_radiator_actuator_1", { // Правило работы для виртуального устройства при изменении установки (set_temp)
  whenChanged: ["ARA1/set_temp"],
  then: function (newValue, devName, cellName) {
    if (newValue>(dev["wb-w1"]["28-00000d2a3003"]+dev["ARA1"]["gisteresis"])&&(dev["ARA1"]["On"]==true)) { // Если значение установки больше датчика плюс гестерезиса и "On" установлено 
      log("enable");
      dev["wb-gpio"]["EXT1_K1"] = false; // Выключаем питание на термоголовке NO (открыли приток теплоносителя температура растет к цели)
    } 
    if (newValue<(dev["wb-w1"]["28-00000d2a3003"]-dev["ARA1"]["gisteresis"])&&(dev["ARA1"]["On"]==true)) { // Если значение установки меньше датчика минус гестерезиса и "On" установлено
      log("disable");
      dev["wb-gpio"]["EXT1_K1"] = true; // Включаем питание на термоголовке NO (закрыли приток теплоносителя температура падает к цели)
    }
  } 
});

Да, не вижу явных несуразностей. Но вообще все такие вещи (для себя) обычно оборачиваю в функции так: Подключение термоэлектрических сервоприводов к WBIO-DO-SSR-8 или WBIO-DO-HS-8 - #6 от пользователя BrainRoot
Это удобнее в том смысле что при необходимости масштабировать - достаточно дописать одну строчку.

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.