Термостат регулирует точку, а не комнату
Комнатный термостат держит одно значение в одном месте — там, где оказался установлен его датчик. Все остальные квадратные метры получают свою температуру как следствие, и никто не проверяет, насколько это следствие хорошее.
В небольшой квадратной комнате с одной наружной стеной это нормально: разница температур по ней — доли градуса, и допущение работает. Добавьте остеклённый фасад, тёплый пол и дверь на лестничную клетку — и допущение незаметно перестаёт быть верным.
Откуда берётся погрешность
Ничего экзотического — обычная физика современного дома, которая действует вся сразу:
- Остекление и солнечные теплопоступления: полоса вдоль окна ночью холоднее, а во второй половине дня жарче, чем любое другое место в комнате.
- Сквозняки из прихожих и с лестничных клеток, которые гонят холодный воздух по полу.
- Тепло от техники и людей: шкаф с мультимедийным оборудованием или обеденный стол, за которым собрались люди, — это постоянная тепловая нагрузка.
- Температурное расслоение по высоте: у потолка и на уровне щиколоток — с точки зрения тепла это разные комнаты.
- Инерция тёплого пола: пол продолжает отдавать тепло ещё долго после того, как контур закрылся.
- Близость отопительного стояка или распределительного коллектора, которые греют стену, где закреплён датчик.
Насколько велика погрешность на практике
В комнате площадью 40 м² с остеклённым фасадом разброс между точками достигает нескольких градусов. Термостат на внутренней стене — обычное место, потому что туда был проложен кабель, — оказывается в самой тёплой части комнаты и сообщает, что в ней теплее, чем на самом деле.
Зона — это набор датчиков, а не один датчик
Решение — перестать принимать одно показание за температуру комнаты. Зона объединяет от одного до четырёх датчиков, сводит их показания в одно репрезентативное значение и передаёт его в контур регулирования. Сам контур не меняется вообще: он по-прежнему получает одно число, просто теперь это число описывает комнату, а не точку на стене.
То, что агрегация вынесена в отдельный модуль, важнее, чем кажется. Контур регулирования остаётся настолько простым, что его можно прочитать за один подход, а задача измерения решается один раз для всех зон, а не изобретается заново для каждой комнаты.
Отказавший датчик — простой случай
Отказавший датчик обычно отдаёт null или пустую строку. Его исключают из выборки, и зона работает на оставшихся: три датчика вместо четырёх всё равно описывают комнату гораздо лучше, чем единственный датчик, на который полагается большинство систем.
Если корректных показаний не осталось, значение не обновляется вовсе. Держать последнее известное значение безопаснее, чем управлять контуром отопления по мусорным данным.
cfg.sensors.forEach(function (control) {
var value = dev[control];
// A failed sensor typically reports null or an empty string.
if (typeof value === 'number' && isFinite(value)) {
readings.push(value);
}
});
if (readings.length === 0) {
log.warning('temperature_zone_{}: no valid sensors, value not updated', id);
return;
}Зависший датчик — сложный случай
Усреднение решает проблему разброса по комнате. Но не решает проблему датчика, который выдаёт правдоподобное, но неверное число. Проверка типа его не поймает: 25,4 °C — совершенно корректное число с плавающей точкой. Оно просто тянет среднее за собой, и контур начинает работать на уставку с незаметным смещением.
Его ловит сравнение каждого показания с медианой группы. Медиана, в отличие от среднего, не сдвигается от одного выброса, поэтому служит стабильной опорой для оценки отклонения. Показания, которые отстоят от неё дальше порога, отбрасываются и записываются в лог. Если показаний меньше трёх, большинства, с которым можно сравнивать, нет, поэтому проверка отключается, а не гадает.
Как выбрать количество датчиков, их размещение и порог
- В небольшой квадратной комнате с одной наружной стеной и без тёплого пола одного датчика действительно достаточно. Не добавляйте оборудование ради принципа.
- От двух до четырёх датчиков — если у комнаты остеклённый фасад, её площадь больше примерно 30 м² или в ней сочетаются разные тепловые условия: кухня-столовая открытой планировки с точки зрения тепла — это две комнаты.
- Размещайте их на рабочей высоте, распределяя по зонам комнаты с разными тепловыми условиями, а не группируя на одной стене.
- Не ставьте их над источником тепла, под прямым солнцем, рядом с отопительным стояком или вплотную к двери в неотапливаемое помещение: такие точки описывают искажение, а не комнату.
- Задавайте порог отклонения шире реального разброса, который вы ожидаете между точками, иначе проверка будет отбрасывать настоящий перепад температур. Отталкивайтесь от разброса, который датчики фактически показывают за неделю обычной эксплуатации.
Что это не решает
Проверка по медиане работает, только если большинство показаний верны. Если два датчика из четырёх зависнут на близких неверных значениях, медиана сместится вместе с ними, и проверка не поймает неисправность, а подтвердит её.
Кроме того, она не отличает неисправность от реального перепада температур. Открытое зимой окно даёт ровно ту же картину, что и зависший датчик, — одно показание далеко от остальных, — и правило отбросит совершенно корректное значение.
Оба ограничения растут из одного корня: проверка смотрит на один момент времени. Чтобы отличить сломанный датчик от реального события, нужна история показаний и скорость их изменения, а не единичный срез. Это другой модуль, и мы его пока не написали.
Модуль и где он работает
Весь модуль — около ста строк, он читается за пять минут. Он опубликован под лицензией MIT: берите, замените имена контролов на имена из своей системы — и он заработает на wb-rules 2.0 как есть.
temperature-zone.js — MITОбъект на 350 м², где работает этот модульКак зона использует это значение: зона нечувствительности, сезонная блокировкаУслуга: программирование KNX