Здравствуйте. В то время, когда мы использовали датчики влажности почвы, мы использовали вот такие:
И то мы “лажанули” и заказали не те, которые были нужны (без протокола 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");
}
}
});
Получится такого плана штука:
Время начала (start) вводится вручную ввиде hh:mm (или h:mm)
Продолжительность (duration) вводится просто минутами.
Для уменьшения напора можно применить системы капельного полива. Плюс хочу обратить ваше внимание, что у вас насосы на 12в. Будьте внимательны при подключении!
Честно говоря не подскажу по поводу датчика и работы через датчик тк у нас работа в этом направлении не была завершена ввиду потери необходимости в этом.