Подбор оборудования для автополива

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

И то мы “лажанули” и заказали не те, которые были нужны (без протокола RS-485).
Но они вполне себе работали. Была только проблема с калибровкой.
На данный момент мы поливаем по времени, а необходимость полива определяем вручную. Сценарий, по времени, может быть разный, в зависимости от растений и необходимой частоты. Мы поливаем по 10мин каждые 2 часа в дневное время. Но у нас есть дренаж. Возможно вам будет достаточно по чуть-чуть раз в день.
Для включения насоса используем модули WB-MR6CU v.2. Но можете посмотреть и подобрать что-то более подходящее из релейных модулей.
сценарий для полива по времени (может немного кривоватый в плане описания, но сделан на основе другого сценария и работает, а это, лично для меня, самое главное):

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

var dimmer_relay = "wb-mr6cu_22/K1"; //CHANGE_ME! устройство-реле питания диммера (доработка, используемй диммер подтягивает свой вход к VCC)

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

var pumpStartTime; //Время начала "полива"
var pumpStopTime; //Время конца "полива"
setTimeVariable();

//Элементы виртуального устройства
//управления
var deviceCells = { 
  
  //Начало рассвета hh:mm
  "Pump (start) time": {
    type: "text",
    readonly: false,
    value: ps["pump_start_time"],
  },
  //Длительность рассвета
  "Pump duration": {
    type: "text",
    readonly: false,
    value: ps["sun_start_duration"],
  },

  pumpON : {
          type : "switch",
          value : false,
  },   

  pumpOFF : {
          type : "switch",
          value : false,
  },
};


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

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

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

defineRule("dayProcess change", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpOFF",
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if (newValue){ //Включаем "день"
      dev["pump_"+grow_box+"/pumpON"] = false; 
    }
  }
});

defineRule("dayProcess change off", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpON", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    if ((dev["pump_"+grow_box]["pumpON"] == true)){ 
      dev["pump_"+grow_box+"/pumpOFF"] = false; 
    }
  }
});

//*Дополнение для реле диммера

defineRule("dimmer_relay_on", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpON", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
  if ((dev["pump_"+grow_box]["pumpON"] == true)){ 
    dev[dimmer_relay] = true; //включаем реле
  }
}
});  
defineRule("dimmer_relay_off", { //название правила 
whenChanged:"pump_"+grow_box+"/pumpON", 
  then: function (newValue, devName, cellName) { //выполняй следующие действия
   if ((dev["pump_"+grow_box]["pumpON"] == false)){ 
    dev[dimmer_relay] = false;
  }
}
});

//*Конец дополнения

defineRule("cron minute timer", { //Просто задание, которое выполняется каждую минуту
  when: cron("00 * * * * *"),
  then: function () {
    //log.info(grow_box, "cron timer executed! DEBUG ONLY.");
    d = new Date(); //Текущее время
    //pumpStartTime
    if ((dev["pump_"+grow_box]["pumpON"]==false) && (d > pumpStartTime) && (d<pumpStopTime)){
      log.info(grow_box, "cron timer executed! Sunraise process START", "pumpStartTime",pumpStartTime,"pumpStopTime",pumpStopTime);
      dev["pump_"+grow_box]["pumpON"] = true;
    }
    //dayProcess
    if ((dev["pump_"+grow_box]["pumpOFF"]==false) && (d > pumpStopTime)){
      log.info(grow_box, "cron timer executed! DAY process START","pumpStopTime",pumpStopTime);
      dev["pump_"+grow_box]["pumpOFF"] = 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() { 
  pumpStartTime = string_to_time(ps["pump_start_time"]); 
  pumpStopTime = new Date(pumpStartTime);
  pumpStopTime.setMinutes(pumpStopTime.getMinutes() + parseInt(ps["sun_start_duration"])); 
};


defineRule("SunRaise_starter", { //название правила 
whenChanged: "pump_"+grow_box+"/pumpON",
  then: function (newValue, devName, cellName) { //выполняй следующие действия
    log.info("pump_"+grow_box+" pumpON function", newValue, devName, cellName); //Это лог.
    if (newValue){
      dura = (pumpStopTime - pumpStartTime)/1000; //время в секундах
	  log.info("pump_"+grow_box+" pumpON", "dura", dura); //Это лог.
      startTicker(grow_box+"raiseTicker", 1000); //Запуск таймера, отрабатывает раз в секунду.
    } else {
      timers[grow_box+"raiseTicker"].stop(); 
      log.info("pump_"+grow_box+"Ticker STOP sunraise");
    }
  }
});

Получится такого плана штука:
Screenshot_1
Время начала (start) вводится вручную ввиде hh:mm (или h:mm)
Продолжительность (duration) вводится просто минутами.

Для уменьшения напора можно применить системы капельного полива. Плюс хочу обратить ваше внимание, что у вас насосы на 12в. Будьте внимательны при подключении!

Честно говоря не подскажу по поводу датчика и работы через датчик тк у нас работа в этом направлении не была завершена ввиду потери необходимости в этом.

1 лайк