Помогите пожалуйста с подбором и настройкой оборудования для теплиц

Всё верно. Тогда каким образом 100 (условно) таких стеллажей подключить к контроллеру? через RS-485? то есть вывести с контроллера на разветвительную планку и соединить туда стеллажи? Честно говоря не особо разбираюсь в системе modbus по этому мне немного сложно понять.

Модбус (точнее шина rs-485) подключает устройства “гирляндой”, то есть на один кабель UTP можно подключать последовательно все модули.

Понял. Спасибо

Есть ли смысл ставить какую-нибудь защиту перед блоком питания (Mean Well входящие 0,5А 220В), если да, то что порекомендуете? спасибо

В общем в этих БП уже есть предохранитель. На случай КЗ - автомат в зависимости от провода, которым подключаете блок питания к сети. Если провод сечением 1.5 мм^2 - то автомат на 5А.

Бета-скрипт Рассвет/закат

//light1.js
//'use strict';

var grow_box = "test1"; // CHANGE_ME! имя устройства. Выводится в заголовок окна и служит для разделения устройств
log.info("light_"+grow_box+"START######################"); //Это лог.

var dimmer_light = "wb-mdm3_42/Channel 1"; // CHANGE_ME! устройство-диммер То есть строка, которая определяет куда писать изменения мощности.
var dimmer_zeroValue = 23; //"0" диммера
var dimmer_maxValue = 95; //100% диммера

var sensor_light = "wb-ms_41/Illuminance"; // CHANGE_ME! устройство-датчик освещенности

var ps = new PersistentStorage("storage_"+grow_box, {global: true});// Определим объект-хранилище.

var sunraiseStartTime; //Время начала "рассвета"
var sunraiseStopTime; //Время конца "рассвета"
var sunsetStartTime;//Время начала "заката"
var sunsetStopTime; //Длительность "заката"
var light_increment = 0; //Глобальная для хранения приращения освещенности
var setPointLight = Number(ps["light_setpoint"]); // уставка освещенности
//var dimmer_increment = (dimmer_maxValue-dimmer_zeroValue)/400; //увеличение освещения в цикл расчетное на 0.25%
var dimmer_increment = (dimmer_maxValue-dimmer_zeroValue)/100; //увеличение освещения в цикл расчетное на 1%
setTimeVariable();

//Элементы виртуального устройства
//управления
var deviceCells = { 
  "Light_measured": {
    type: "text",
    value: "0"
  },
  "Lamp power set" : {
    type : "range",
    value : dimmer_zeroValue,
    min : dimmer_zeroValue,
    max : dimmer_maxValue
  },
  //Начало рассвета hh:mm
  "Sunraise (start) time": {
    type: "text",
    readonly: false,
    value: ps["sun_start_time"],
  },
  //Длительность рассвета
  "Sunraise duration": {
    type: "text",
    readonly: false,
    value: ps["sun_start_duration"],
  },
  //Начало заката hh:mm
  "Sunset (stop) time": {
    type: "text",
    readonly: false,
    value: ps["sun_stop_time"],
  },
  //Длительность заката
  "Sunset duration": {
    type: "text",
    readonly: false,
    value: ps["sun_stop_duration"],
  },
  "Light SetPoint": {
    type: "value",
    readonly: false,
    value: ps["light_setpoint"]
  },
  sunraiseProcess : {
          type : "switch",
          value : false,
  },   
  sunsetProcess : {
          type : "switch",
          value : false,
  },
  dayProcess : {
          type : "switch",
          value : false,
  },
};


//Создадим виртуальное устройство и добавим в него элементы 
  defineVirtualDevice("light_"+grow_box, {
    title:"Light of "+grow_box,
    cells: deviceCells
  });

defineRule("Sunraise start time change", { //название правила 
whenChanged: "light_"+grow_box+"/Sunraise (start) time", //при изменении поля времени начала рассвета запишем его в хранилище
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("light_"+grow_box+"/Sunraise start time ", newValue); //Это лог. Он попадает в /var/log/messages
    ps["sun_start_time"] = newValue;
    setTimeVariable();
  }
});

defineRule("Sunraise duration change", { //название правила 
whenChanged: "light_"+grow_box+"/Sunraise duration", //при изменении поля времени начала рассвета запишем его в хранилище
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("light_"+grow_box+"/Sunraise duration", newValue); //Это лог. Он попадает в /var/log/messages
    ps["sun_start_duration"] = newValue;
    setTimeVariable();
  }
});

defineRule("Sunset start time change", { //название правила 
whenChanged: "light_"+grow_box+"/Sunset (stop) time", //при изменении поля времени начала ЗАКАТА запишем его в хранилище
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("light_"+grow_box+"/Sunset (stop) time ", newValue); //Это лог. Он попадает в /var/log/messages
    ps["sun_stop_time"] = newValue;
    setTimeVariable();
  }
});

defineRule("Sunset duration change", { //название правила 
whenChanged: "light_"+grow_box+"/Sunset duration", //при изменении поля времени начала рассвета запишем его в хранилище
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("light_"+grow_box+"/Sunset duration", newValue); //Это лог. Он попадает в /var/log/messages
    ps["sun_stop_duration"] = newValue;
    setTimeVariable();
  }
});

defineRule("Light SetPoint change", { //название правила 
whenChanged: "light_"+grow_box+"/Light SetPoint", //при уставки желаемой освещенности -запишем в хранилище
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("light_"+grow_box+"/light_setpoint ", newValue); //Это лог. Он попадает в /var/log/messages
    ps["light_setpoint"] = newValue;
    setPointLight = Number(newValue);
  }
});

defineRule("dayProcess change", { //название правила 
whenChanged: "light_"+grow_box+"/dayProcess", // Для режима "День"
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if (newValue){ //Включаем "день"
    //log.info("light_"+grow_box+"/light_setpoint ", newValue); //Это лог. Он попадает в /var/log/messages
      dev["light_"+grow_box+"/sunraiseProcess"] = false; //Выключаем "рассвет" Таймер остановит правило "SunRaise_starter"
      //dev["light_"+grow_box+"/sunsetProcess"] = false; //Выключаем "закат" Таймер остановит правило "SunSet_starter"
      setPointLight = Number(ps["light_setpoint"]); // уставка освещенности
    }else{
      //dev[dimmer_light] = dimmer_zeroValue;
    }
  }
});


defineRule("sensor_light change", { //название правила 
whenChanged: sensor_light, //При изменении измеренной освещенности - установим значения виртуального устройства.
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    dev["light_"+grow_box]["Light_measured"] = newValue;
    if ((dev["light_"+grow_box]["sunraiseProcess"]==true)||(dev["light_"+grow_box]["dayProcess"]==true)||(dev["light_"+grow_box]["sunsetProcess"]==true)){// если сейчас нужен свет
      newValue = Number(newValue); //Приведем к числу
      if (newValue>setPointLight) { // Если текущая освещенность больше уставки
        //log.info("light_"+grow_box+"Light_measured BIG",newValue);
        if (dev[dimmer_light]>dimmer_zeroValue){
          dev[dimmer_light] -= dimmer_increment;
        }
      } else{ // если меньше
        //log.info("light_"+grow_box+"Light_measured LOW",newValue);
        if (dev[dimmer_light]<dimmer_maxValue){
          dev[dimmer_light] += dimmer_increment;
        }
      }
      dev["light_"+grow_box+"/Lamp power set"] = dev[dimmer_light];
    }
  }
});


defineRule("cron minute timer", { //Просто задание, которое выполняется каждую минуту и взводит/опускает флаги "Рассвет", "Закат"
  when: cron("00 * * * * *"),
  then: function () {
    //log.info(grow_box, "cron timer executed! DEBUG ONLY.");
    d = new Date(); //Текущее время
    //sunraiseStartTime 
    if ((dev["light_"+grow_box]["sunraiseProcess"]==false) && (d > sunraiseStartTime) && (d<sunraiseStopTime)){
      log.info(grow_box, "cron timer executed! Sunraise process START", "sunraiseStartTime",sunraiseStartTime ,"sunraiseStopTime",sunraiseStopTime);
      dev["light_"+grow_box]["sunraiseProcess"] = true;
    }
    //sunsetStartTime
    if ((dev["light_"+grow_box]["sunsetProcess"]==false) && (d > sunsetStartTime) && (d<sunsetStopTime)){
      log.info(grow_box, "cron timer executed! SunSET process START", "sunsetStartTime",sunsetStartTime ,"sunsetStopTime",sunsetStopTime);
      dev["light_"+grow_box]["sunsetProcess"] = true;
    }
    //dayProcess
    if ((dev["light_"+grow_box]["dayProcess"]==false) && (d > sunraiseStopTime) && (d<sunsetStartTime)){
      log.info(grow_box, "cron timer executed! DAY process START","sunraiseStopTime",sunraiseStopTime,"sunsetStartTime",sunsetStartTime);
      dev["light_"+grow_box]["dayProcess"] = true;
    }
  }
});

defineRule("cron day timer", { //Просто задание, которое выполняется раз в сутки и меняет дату в переменных на текущую.
  when: cron("01 00 00 * * *"),
  then: function () {
    setTimeVariable();
  }
});

function string_to_time(srcString) { 
  //log.info("string_to_time_"+grow_box, srcString)
  var d = new Date();
  var datetime = new Date(d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate()+'T' + srcString + 'Z');
  datetime.setMinutes(datetime.getMinutes() + datetime.getTimezoneOffset());//Приведем к локальному:
  return datetime; 
};


function setTimeVariable() { 
  sunraiseStartTime = string_to_time(ps["sun_start_time"]); //Время начала "рассвета"
  sunraiseStopTime = new Date(sunraiseStartTime);
  sunraiseStopTime.setMinutes(sunraiseStopTime.getMinutes() + parseInt(ps["sun_start_duration"])); //окончание "рассвета"
  sunsetStartTime = string_to_time(ps["sun_stop_time"]);//Время начала "заката"
  sunsetStopTime = new Date(sunsetStartTime);
  sunsetStopTime.setMinutes(sunsetStopTime.getMinutes() + parseInt(ps["sun_stop_duration"])); //окончание "заката"
};


defineRule("SunRaise_starter", { //название правила 
whenChanged: "light_"+grow_box+"/sunraiseProcess", //При изменении переуключателя "рассвет"
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("light_"+grow_box+" sunraiseProcess function", newValue, devName, cellName); //Это лог.
    if (newValue){ //Запускаем "рассвет"
      dura = (sunraiseStopTime - sunraiseStartTime)/1000; //время в секундах
      setPointLight = Number(ps["light_setpoint"]); // уставка освещенности
      light_increment = setPointLight/dura; //увеличение освещенности в секунду расчетное
      setPointLight = 1;
	  log.info("light_"+grow_box+" sunraiseProcess", "dura", dura, "dimmer_increment", dimmer_increment); //Это лог.
      startTicker(grow_box+"raiseTicker", 1000); //Запуск таймера, отрабатывает раз в секунду.
    } else { //Останавливаем "рассвет"
      timers[grow_box+"raiseTicker"].stop(); 
      log.info("light_"+grow_box+"Ticker STOP sunraise");
    }
  }
});

defineRule("SunSet_starter", { //название правила 
whenChanged: "light_"+grow_box+"/sunsetProcess", //При изменении переуключателя "Закат"
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("light_"+grow_box+" sunsetProcess function", newValue, devName, cellName); //Это лог.
    if (newValue){ //Запускаем "закат"
      dev["light_"+grow_box]["dayProcess"] = false;
      setPointLight = Number(ps["light_setpoint"]); // уставка освещенности
      dura = (sunsetStopTime - sunsetStartTime)/1000; //время в секундах
      light_increment = -(setPointLight)/dura; //уменьшение освещения в секунду расчетное. От уставки!
      //dev["light_"+grow_box+"/dayProcess"] = false; //Выключаем "день"
	  log.info("light_"+grow_box+" sunsetProcess", "dura", dura, "light_increment", light_increment, "setPointLight", setPointLight); //Это лог.
      startTicker(grow_box+"raiseTicker", 1000); //Запуск таймера, отрабатывает раз в секунду.
    } else { //Останавливаем "закат"
      timers[grow_box+"raiseTicker"].stop(); 
      log.info("light_"+grow_box+"Ticker STOP sunset");
      setPointLight = 0;
      dev[dimmer_light] = dimmer_zeroValue;
    }
  }
});


defineRule("handmadeSunTicker", { // Таймер плавного рассвета/заката
  when: function () { return timers[grow_box+"raiseTicker"].firing; },
  then: function () {
    setPointLight += light_increment;
    if (setPointLight>Number(ps["light_setpoint"])){
      log.info("light_"+grow_box+"raiseTicker STOP ON setPointLight");
      dev["light_"+grow_box+"/sunraiseProcess"] = false; //Выключаем "рассвет" Таймер остановит правило "SunRaise_starter"
    }
    if (setPointLight<0){
      log.info("light_"+grow_box+"setTicker STOP ON setPointLight");
      dev["light_"+grow_box+"/sunsetProcess"] = false; //Выключаем "закат" Таймер остановит правило "SunSet_starter"
    }
    if ((dev["light_"+grow_box+"/Lamp power set"]>dimmer_maxValue)||(dev["light_"+grow_box+"/Lamp power set"]<dimmer_zeroValue)){
      log.info("light_"+grow_box+"raiseTicker STOP ON Lamp power set");
      dev["light_"+grow_box+"/sunraiseProcess"] = false; //Выключаем "рассвет" Таймер остановит правило "SunRaise_starter"
      dev["light_"+grow_box+"/sunsetProcess"] = false; //Выключаем "закат" Таймер остановит правило "SunSet_starter"
    }
  }
});

У провода 1,5 квадрата предельно допустимый ток примерно 15-16А. Вот и присматривал автомат. Вы правы, наверное 5А будет норм. На вводной автомат и до БП будем использовать 1,5 квадрата провод.

Спасибо большое попробуем прогнать завтра

Ну как, пробовали? Мне интересно, что получается, есть ли какие-то проблемы.

Здравствуйте. Честно говоря только что подключил его к питанию и настраиваю для работы. Надеюсь основные моменты сегодня закончить. Сразу подкинуть светильники не получится тк к нему будет подключаться особый светильник, который только прошёл разработку и сейчас в производстве. Но тестером можно будет посмотреть результат и настроить внешний вид с функционалом. Я отпишусь, как только будут результаты, но для этого надо настроить его в сети, подстроить функционал, показать в БТК (биотехнологический комплекс), для оценки и рекомендаций. Основную часть планирую сделать сегодня. Остальное завтра или на следующей неделе. Я думаю, что всё будет хорошо. Вопросы будут, но я их задам по мере их поступления. Думаю, что немного придётся повозиться с отстройкой параметров, но в итоге всё будет ок. По ходу движения я буду писать сюда результаты. Спасибо

Короче, походу, контроллер мы в конечном итоге убьём) какими-то шаманскими заклинаниями мы его подключили к вай фаю. Через провод подключаться на отрез отказывается, хоть модем и выдаёт ему адресс и показывает, что он подключен. Настроиться через putty получилось 1 раз. После этого он не может найти путь и всё… но ещё буду пробовать. Подключается к вай фаю он тоже как-то через раз. Возможно это связано со скоростью обмена данными или ещё чем-то. Не знаю. Будем разбираться. Датчик подключили и настроили (с горем пополам). Скрипт вписали. Тестовая панель появилась в “Devices” и всё. Как-то больше ничего не происходит.


Возможно мы ещё много не понимаем, как работать во всём этом, но с божьей помощью (вашей) планируем разобраться что и куда нажимать тк в любом случае проект надо развивать, а эти решения мне ну очень нравятся. Подскажите пожалуйста, как это всё настроить? спасибо

как настроить виджетом “Lamp pover set”- понятно, значения влажности и тд с датчика- понятно. но вот как выставить остальное и привязать это всё к аналоговым выходам?

По поводу соединения написал в другую тему, которая по этому вопросу.

И можно ли сделать мониторинг параметров на едином графике в реальном времени?

Ну, это вряд ли.

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

красным- это лажа, когда мы пробовали. У нас 1 датчик (№33). Его значения справа. Как убрать красную таблицу, не знаю. В Config не нашёл

Ну, для начала - надо бы обновить систему до актуальной.
Потом поставим веб-интерфейс свежий (там как раз можно удобно убирать отключенное) и движок скриптов.
Ну и в финале уже пропишем верные адреса устройств в сам скрипт. (скриптов - нужно столько же сколько устройств)

договорились. Спасибо. Сегодня обновлю, напишу

Систему обновил. Подключился сразу. Потом опять лажа с подключением. Но этот вопрос терпимо решим в другой ветке. Как-то через раз подключается

Ну, отлично. Давайте может быть я сам подключусь через Тимвьювер и покажу как настраивать?