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

MIO-MGE подключается к контроллеру через Ethernet, от каждого MIO - идет “своя” линия RS-485, на которую уже садятся все модули.

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

А делать “дерево” (разветвлять, делать отводки) от шины не надо. Может кое-как работать и будет но глючить постоянно .

Хорошо. На контроллере 2 выхода Ethernet. Чтобы подключить, условно, 20 MIO-MGE нужны разветвители как в обычной компьютерной сетке? правильно? я соединяю их, через разветвители, с контроллером и от каждого MIO-MGE веду линию в 20 https://wirenboard.com/wiki/WB-MAO4_Modbus_Dimmer

Сейчас у нас модуль подключён непосредственно к контроллеру. Вы предлагаете через RS485 подключать MIO-MGE и от него https://wirenboard.com/wiki/WB-MAO4_Modbus_Dimmer Правильно? То есть через провод это может решить проблему остаточного напряжения, которое сейчас есть?

Да, верно. Организуете ethernet сеть, к ней подключаете MIO, от которых идет RS-485, куда уже подключаются устройства.

MIO-MGE предлагаю подключить к контроллеру через Ethernet. Это именно для масштабирования, когда “своих” двух портов контроллера не хватит.
А MAO4 - можно подключть и непосредственно к контроллеру, на “встроенный” порт, так и через MIO.
И да, MAO4 умеет PWM(ШИМ), под который и задуманы используемые вами диммеры.

Понятно. Спасибо… Определение модулей в контроллере происходит таким же образом, как и по RS485 то есть после подключения к контроллеру я прописываю только номер конечного модуля или датчика?

Понятно. Спасибо. Надо будет заказать и попробовать

Сколько линий можно подключить к контроллеру, если они будут начинаться с WB-MIO-E? Спасибо

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

1,2,4 Полки работают по статическому сценарию без датчика освещённости,
3 Полка работает по динамическому сценарию с учётом датчика освещённости.
Есть рассвет, закат.
Мощность светильников на 1,2,4 полках выставляется в процентах и дополнительно регулируется ползунком, если надо быстро изменить мощность.
Мощность светильника на 3 полке выставляется в мкмоль/м2*с (облучённость) через переводной и поправочный коэффициент относительно середины полки.
Также измеряется СО2, влажность и тд.
Выведен в интернет и управляется с любого устройства.
Систему питания подключим на след.неделе.
ОГРОМНОЕ СПАСИБО ЗА ВАШУ ПОМОЩЬ!!!
Видео стеллажа:

Фото:

1 симпатия

Каждый MIO (точнее, MGE) представляется “портом” для контроллера. То есть при подключении очередного MGE - надо будет в контроллере создать вот ак: https://wirenboard.com/wiki/WB-MIO и потом при добавлении устройст добавлять в этот порт. Точно так же как на встроенный.

Линий - неограниченно. Но реально я думаю что больше полусотни конечных устройств (модулей) - перестанет хватать быстродействия. Если счиать что на “стеллаж” будет три-четрыере модуля - то контроллер на 15 стеллажей. Это пессиместичный прогноз, скорее на бОльшее число.

Честно говоря они для меня не сильно отличаются. Еще посмотрю, я бысро просмотрел описание регистров и все.

Это ВАМ спасибо. Самое приятное - когда видишь что то в чем принимал хоть малейшее участия - начинает работать. Мотивирует, да.

В данном случае на освещение стоит 3 модуля (на физическое размыкание, на диммирование 0-10 и датчик). Если новый модуль позволит сократить конечное количество модулей до 1 (диммирование 0-10) на стеллаж, то это будет хорошо.
То есть на один контроллер получится подключить в районе 50-100 стеллажей (примерно). Это вне зависимости от способа подключения (Modbus, Ethernet)? или можно и больше, используя MGE? Спасибо.

Тогда буду ориентироваться на эти 2 варианта. Посмотрим, что удастся приобрести.

Посмотрите пожалуйста вот этот:
https://easycraft.by/datchik-vlaghnosti-pochvy
Возможно получится его приспособить? Хотябы временно. Спасибо

Здравствуйте. К нам обратился один НИИ с просьбой дать им задание на разработку датчика для теплиц. Мы хотим дать им задание разработать комплексный датчик мониторинга воздуха и почвы. Подскажите пожалуйста, на что надо обратить внимание, чтобы по итогу датчик можно было бы подключить к вашему контроллеру? Спасибо

Да, но подключать к контроллеру на входы A1-4

Ещё вот такой вот вопрос: у нас есть проект теплицы. Там будет 200 светильников (200 драйверов). Я хочу поставить контроллер, 50 модулей https://wirenboard.com/wiki/WB-MAO4_Modbus_Dimmer и разделить на 2 линии RS485 к контроллеру. Так можно будет реализовать? просто не очень хочу сейчас использовать дополнительные модули для подключения по Ethernet. Просто далеко не всегда есть такая возможность

По 25 модулей на линии - будет работать.

Главное - чтобы датчик отдавал измеряемые параметры в строгом соответствии со спецификацией Modbus. В этом случае - будет подключаться без проблем.
То есть делаем таблицу, как у нас с регистрами, например https://wirenboard.com/wiki/WB-MAO4_Registers
и убеждаемся что все требуемые параметры - есть.

Здравствуйте. Тут возникает необходимость, чтобы сгруппировать несколько модулей, к примеру, управления 0-10в в одно правило, чтобы можно было задать рассвет и закат один раз и при этом сработало бы 2 и более модулей. Подскажите пожалуйста, как это сделать? может быть их можно вначале правила прописать через “;” или что-то в таком плане? Можно ли увеличить объём статистики, которую можно сохранять? к примеру вставив флешку или что-то в этом роде. Я заметил, что могу посмотреть статистику не более, чем за неделю. И я что-то слышал про новую панель для управления. Можно вас попросить ссылку на настройку панели? Спасибо

Так, понятно. Можно “разделить” управление, то есть интерфейс установки параметров и собственно сами правила. Да, архитектура получается следующая:

  • Интерфейс “уставок” - время рассвета, заката, их длительности.
  • отдельные “исполнительные” виртуальные устройства.
  • описываем “исполнительные” в массив вида: [№ стеллажа], [№ полки], [имя диммера], [остальное] и в цикле создаем для всего этого набора правила.

Да, для начала - надо проверить настройки Configs - /etc/wb-mqtt-db.conf
Там можно отпределить количество сохраняемых значений.
Если требуется вынести базу в другое место (на флешку, например) - то в поле “DB file path” можно указать путь к желаемому расположению.

Панель еще не в производстве, когда будет доступна - (и среда разработки интерфейсов) - напишу.

Понятно. Спасибо. Буду пробовать что-то написать.

Нашёл. Спасибо.

Договорились. У нас появилась система управления от другой компании (военная компания “dmt” сами занялись разработкой и установкой). У них большая панель. Смотрится очень эффектно даже учитывая то, что там много не доработано и много сильно неудобных штук, но интерфейс приятнее за счёт разных рычажков и тд и тп. В нашем в сами интерфейсе всё довольно примитивно и однотипно. Для контроля и управления - это то, что надо и для меня этого более чем достаточно. Но потребитель обычно, выбирает то, что приятнее глазу. По этому я очень надеюсь, что эта панель поможет сильно улучшить этот параметр. Хотя и сейчас возможностей более чем достаточно. Единственный минус- это не особо гибкий веб интерфейс в плане цветного оформления

Скрипт для полива (пояснения позже перепишу). Проверять включение полива за сутки можно через историю по пикам графика:
//Pump1.js
//‘use strict’;
var grow_box = “1”; // CHANGE_ME! имя устройства. Выводится в заголовок окна и служит для разделения устройств
log.info(“light_”+grow_box+“START######################”); //Это лог.

var dimmer_relay = “wb-mr6cu_29/K6”; //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; //Выключаем “рассвет” Таймер остановит правило “SunRaise_starter”
}
}
});

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; //Выключаем “рассвет” Таймер остановит правило “SunRaise_starter”
}
}
});

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

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”);
}
}
});

Скрипт для статического сценария без датчика освещённости с реле:
//light1.js
//‘use strict’;
var grow_box = “test1”; // CHANGE_ME! имя устройства. Выводится в заголовок окна и служит для разделения устройств
log.info(“light_”+grow_box+“START######################”); //Это лог.

var dimmer_light = “wb-dac/EXT1_O1”; // CHANGE_ME! устройство-диммер То есть строка, которая определяет куда писать изменения мощности.
var dimmer_zeroValue = 0; //“0” диммера
var dimmer_maxValue = 10000; //100% диммера

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

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

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

//Элементы виртуального устройства
//управления
var deviceCells = {
“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-1)*100).toString();
setPointLight = ((newValue-1)*100).toString();
}
});
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(“dimmer_relay_on”, { //название правила
whenChanged: “light_”+grow_box+"/Lamp power set", //При изменении мощности диммера - проверим и включим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия
if ((newValue>dimmer_zeroValue)&&(dev[dimmer_relay] == false)){ //Если диммер уже включен а реле выключено
dev[dimmer_relay] = true; //включаем реле
}
}
});
defineRule(“dimmer_relay_off”, { //название правила
whenChanged: “light_”+grow_box+"/sunsetProcess", //При изменении флага “закат” - проверим и выключим реле
then: function (newValue, devName, cellName) { //выполняй следующие действия

if ((newValue<=dimmer_zeroValue)&&(dev[dimmer_relay] == true)&&(dev[“light_”+grow_box][“sunraiseProcess”] == false)&&(dev[“light_”+grow_box][“sunsetProcess”] == false)){ //Если диммер на минимуме а реле включено
dev[dimmer_relay] = false;
}
}
});
//*Конец дополнения

//* Статический сценарий

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

defineRule(“start_sunraise change”, { //название правила
whenChanged: “light_”+grow_box+"/sunraiseProcess", //При изменении флага “рассвет” - установим значения виртуального устройства.
then: function (newValue, devName, cellName) { //выполняй следующие действия
dev[“light_”+grow_box][“dimmer_light”] = newValue;
if ((dev[“light_”+grow_box][“sunraiseProcess”]==true)){// если сейчас нужен свет
newValue = Number(newValue); //Приведем к числу
if (dev[dimmer_light]=0){
dev[dimmer_light] += dimmer_increment;
}
dev[“light_”+grow_box+"/Lamp power set"] = dev[dimmer_light];
}
}
});
defineRule(“start_sunset change”, { //название правила
whenChanged: “light_”+grow_box+"/sunsetProcess", //При изменении флага “закат” - установим значения виртуального устройства.
then: function (newValue, devName, cellName) { //выполняй следующие действия
dev[“light_”+grow_box][“dimmer_light”] = 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(“start_day change”, { //название правила
whenChanged: dimmer_light, //При изменении флага “день” - установим значения виртуального устройства.
then: function (newValue, devName, cellName) { //выполняй следующие действия
dev[“light_”+grow_box][“dimmer_light”] = 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 симпатия

Добрый день. Нет, чистятся только самые старые.
Покажите настройки, файл /etc/wb-mqtt-db.conf

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

Проверьте место на контроллере:

df -h