Здравствуйте. Продолжаю изучать wb-rules, взял термостат из примеров правил термостат
Для меня примеры из вики - это образец, как делать нужно, на что ориентироваться новичкам. Однако в этом примере логика работы термостата сделана, мягко говоря, через седалищный нерв. Термостат там работает только в одном случае:
whenChanged: temp,
то есть, если я пришел зимой в замерзший до -20 дом, и включил термостат, то пока я не надышу хотя бы до -19,9 - термостат не запустится
если я включил термостат и передвинул желаемую температуру с 0 до +30 градусов - термостат не запустится, пока не изменится температура пола
то есть вся логика начинает работать только после того, как произойдет изменение температуры на датчике. Я вот сейчас поигрался с разными параметрами - иногда приходится ждать по 2-3 минуты, пока температура дрогнет на эти 0,1 градуса и логика термостата возбудится.
Считаю такой пример очень фиговым, ибо он учит как делать не надо изначально. А спросить, как делать правильно, мне не у кого.
Поэтому, прошу дать оценку моему быдло-кодингу.
Я добавил два правила
- При изменении статуса термостата ВКЛ проверяется температура датчика и желаемая. Если температура датчика ниже - включается реле. Если выше - реле не включается.
При изменении статуса термостата ВЫКЛ реле выключается - При изменении бегунка желаемой температуры так же сравнивается температура датчика и новая желаемая. Если она выше - включается реле. Ниже - выключается
и только потом уже идет проверка при изменении температуры пола и работает вся логика из примера.
Буду сильно благодарен за конструктивную критику, потому что образец для подражания в вики - атстой.
defineVirtualDevice("Termostat", {
title: "Termostat",
cells: {
// =============== Прихожая теплый пол
"R01-TS16-1-mode": {//режим 0-ручной 1-по расписанию
type: "switch",
value: false,
},
"R01-TS16-1-setpoint": {//уставка
type: "range",
value: 25,
max: 35,
readonly: false
},
"R01-TS16-1-lock": {//блокировка в визуализации 0-снята 1-заблокирована
type: "switch",
value: false,
},
"R01-TS16-1-onoff": {//активация термостата 0-выкл 1-включен
type: "switch",
value: false,
},
}
})
var hysteresis = 0.1;
function Termostat(name, temp, setpoint, TS, TS_onoff) {
//правило при включении термостата
defineRule("On_start",{ //Проверка при включении: температура ниже setpoint - включить реле, выше setpiont- не включать
//При выключении - выключить реле
whenChanged: TS_onoff,
then: function () {
if (dev[TS_onoff]) {
if ( dev[temp] < dev[setpoint] - hysteresis) { //если температура датчика меньше уставки - гистерезис
dev[TS] = true;
}
if ( dev[temp] > dev[setpoint] + hysteresis) { //если температура датчика больше виртуальной уставки + гистерезис
dev[TS] = false;
}
}
else dev[TS] = false;
}
});
//правило при изменении желаемой температуры
defineRule("On_setpoint_change",{ //Проверка при изменении setpoint: температура ниже setpoint - включить реле, выше setpiont- не включать
//При выключении - выключить реле
whenChanged: setpoint,
then: function () {
if (dev[TS_onoff]) {
if ( dev[temp] < dev[setpoint] - hysteresis) { //если температура датчика меньше уставки - гистерезис
dev[TS] = true;
}
if ( dev[temp] > dev[setpoint] + hysteresis) { //если температура датчика больше виртуальной уставки + гистерезис
dev[TS] = false;
}
}
else dev[TS] = false;
}
});
// правило при изменении показаний датчика
defineRule(name, {
whenChanged: temp, //при изменении состояния датчика
then: function (newValue, devName, cellName) { //выполняй следующие действия
if (dev[TS_onoff]) {
if ( newValue < dev[setpoint] - hysteresis) { //если температура датчика меньше уставки - гистерезис
dev[TS] = true;
}
if ( newValue > dev[setpoint] + hysteresis) { //если температура датчика больше виртуальной уставки + гистерезис
dev[TS] = false;
}
}
else dev[TS] = false;
}
});
}
Termostat("R01-TS16-1", "wb-mai6_92/IN 3 N Temperature", "Termostat/R01-TS16-1-setpoint", "wb-mr6cu_99/K5", "Termostat/R01-TS16-1-onoff"); // Прихожая теплый пол