Умный дом на Raspberry Pi · практика · 26 сентября 2026

Как искать аномалии в исторических данных умного дома — и почему пороги вручную тут не работают

Порог «если напряжение ниже 200 В — пиши письмо» ловит только то, что ты и так заметишь. Настоящие проблемы — деградацию проводки, зависший датчик, постепенный рост потребления — видно не в отдельном значении, а в истории. Разбираю, как я это собрал: статистика по окну, четыре типа детекторов, и нейросеть как аналитик, которому данные отдаются уже подготовленными.

1. Почему «просто порог» не работает

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

Что происходит с фиксированным порогом:

Поэтому норма должна считаться по фактическим данным, а «аномально» — это не «вышло за константу», а «отклонилось от того, как обычно бывает в этот период».

2. Четыре детектора, которых хватает почти всегда

Мне хватило четырёх проверок. Они работают на любом числовом показателе без настройки под конкретный датчик.

ДетекторКак определяетсяЧто ловит
Жёсткий предел
limit_low / limit_high
значение ушло ниже/выше заданного минимума или максимума то, что опасно по определению: напряжение вне 207–253 В, ток выше паспортного, температура выше точки кипения аквариума. Ставится вручную там, где есть физический предел
Просадка
dip
ниже нормы больше чем на N устойчивых сигм. Норма — медиана за окно, «сигма» — по MAD постепенное сползание показателя, провалы при включении нагрузки, падение напряжения вечером
Выброс
spike
выше нормы больше чем на те же N сигм кратковременные скачки: искрение, броски тока при старте компрессора, пики пыли при готовке
Пропажа данных
no_data
значение не обновлялось дольше, чем k интервалов съёма зависший датчик, севшая батарейка, отвалившееся устройство. Самая недооценённая проверка: молчащий датчик хуже, чем тревожный

Почему медиана и MAD, а не среднее и стандартное отклонение

Классический подход — считать среднее и сигму, и всё, что дальше трёх сигм, объявлять выбросом. В реальных данных это ломается: один большой выброс раздувает среднее и особенно сигму, из-за чего следующий, не менее серьёзный выброс уже «не аномалия». Классический пример: 99 значений около 219 В и одно 300 В — среднее уходит, а сигма вырастает так, что 250 В выглядит нормально.

Устойчивая оценка: медиана как центр (её не сдвигает один выброс) и MAD — медианное абсолютное отклонение (его не раздувает один выброс). Из MAD получается устойчивая «сигма» умножением на 1.4826. Такая оценка спокойно переживает единичные и даже двойные выбросы и продолжает их замечать.

Отдельный случай, который я словил на своих данных: когда показатель вообще не меняется, MAD равен нулю, и порог «шесть сигм» становится нулевым — тогда выбросом объявляется любое отклонение, включая шум округления. Поэтому при нулевом разбросе порог берётся как 2 % от нормы. На практике это дало правильное поведение: датчик с постоянным значением перестал «дребезжать», но реакция на реальный скачок сохранилась.

Норма по «окну», а не за всё время

Норма считается за последние window_hours часов: по умолчанию сутки, но для медленных процессов (влажность почвы, температура) разумнее неделя, а для быстрых (ток, мощность) — час-два. Это даёт то, что нужно: вчерашний режим не мешает заметить сегодняшнее отклонение. Меняется расписание, приходит осень, меняется нагрузка — норма подстраивается сама, переучивать пороги не нужно.

Защита от спама

Каждый детектор имеет паузу: однотипная аномалия не повторяется чаще, чем cooldown_events секунд. Без этого одна залипшая величина превратится в сотни записей и писем. С паузой — в одну понятную запись.

3. Три уровня системы

УровеньЧто делаетЗадержкаИнструмент
Правила реакция на события: включить свет, закрыть кран, отправить письмо секунды таблица правил + движок, который сравнивает текущие значения
Статистика накопление истории, четыре детектора, журнал аномалий десятки секунд отдельный сервис, который раз в 15 секунд снимает точки и пересчитывает норму
Аналитик объяснить, что происходило за период, найти тенденции, предложить действия минуты, и только по твоему запросу нейросеть, которой отдаётся подготовленная выжимка данных

Ключевая мысль: нейросеть не должна работать с сырыми данными. Розетка, которая пишет точку раз в минуту, за год даёт более полумиллиона значений — это дорого отправить и бессмысленно читать модели. Отдавать надо агрегаты: минимум, максимум, среднее, медиану, устойчивую сигму, разбивку по суткам, список уже найденных аномалий. Модель хорошо видит закономерности в таких выжимках и не тратит контекст на шум.

4. Как это выглядит в интерфейсе

Каждое наблюдение — карточка. Ты выбираешь топик, задаёшь интервал съёма, окно нормы и пределы, пишешь промпт. Сервис собирает данные сам. Кнопка «Проанализировать» отправляет запрос и кладёт ответ в карточку. Карточек можно добавлять сколько угодно — они независимы.

🔍 Электросеть: напряжение, В сбор идёт 📧 it@example.com новых аномалий: 1
Топик: zigbee2mqtt/fish_light/voltage · съём раз в 60 с · норма за 24 ч · пределы 198 … 253 V · последняя точка 17:11:28
62точек всего
62в окне нормы
215.00минимум
217.87среднее
222.00максимум
20точек до анализа
🤖 Проанализировать нейросетью ↻ Начать сбор заново ✓ Отметить просмотренными ⏸ Приостановить сбор
▾ Журнал аномалий (последние 3)
КогдаЧтоЗначениеНормаПояснение
26.09 17:06🟠 просадка warning211.00218.40просадка: 211.00 при норме 218.40 (сигма 0.812)
26.09 16:41🟠 выброс вверх warning226.00218.20выброс вверх: 226.00 при норме 218.20 (норма без разброса, порог 2 %)
26.09 15:30⚪ нет данных——данные не поступают 12 мин
Данные в таблице — пример оформления журнала.

Так выглядит реальная панель (тёмная тема, меню, адаптивная вёрстка — как остальные страницы системы). Ниже — то, что карточка отдаёт аналитику.

0:006:0012:0018:0024:00205210215220225230Впредел ГОСТ 207 Втревожный уровень 215 Ввыброс 226 Впросадка 211 В
Схематический график суток: видно вечернюю просадку при росте нагрузки, утренний спад и два события, которые детекторы отметили сами. Оформление — как на странице аномалий. Данные для иллюстрации.

5. Самый дешёвый пример: одна умная розетка и год истории

Всё, что нужно для самого простого стенда поиска аномалий, — одна розетка с мониторингом мощности. Это самый доступный датчик с реальной пользой: большинство таких розеток умеют Zigbee и отдают не только включена/выключена, но и напряжение, ток, активную мощность и накопленную энергию.

Что нужно

КомпонентЗачемПорядок цены
Умная розетка с измерением мощности (Zigbee)источник напряжения, тока, мощности и счётчика энергии1–2 тыс. руб.
Координатор Zigbee + этот же одноплатникмост между розеткой и системойесли дом уже есть — 0
Любая база (MariaDB/PostgreSQL) на том же железеистория измерений0
Скрипт-сборщик и база для аномалийнакопление, детекторы, промпты0

Никаких «умных счётчиков за 30 тысяч» и облачных подписок. Одна розетка в прихожей или на кухне — и через год у тебя есть история фактического состояния сети в квартире.

Сколько данных получится за год

Интервал съёмаТочек за годОбъём в базе (примерно)Что видно
каждые 5 минут105 120~4 МБсуточный профиль, сезонность, недельные тенденции
каждую минуту525 600~18 МБто же + короткие просадки при включении нагрузки
каждые 10 секунд3 153 600~110 МБброски тока при старте компрессоров и насосов

Для контроля качества сети за год хватает минутного интервала: восемнадцати мегабайт база даже не заметит. Десятисекундный нужен, только если охотишься за короткими пусковыми бросками.

Важный практический момент, который легко упустить. В моей системе история хранится «катящимся окном»: на каждый показатель остаётся последние 10 000 точек, старое удаляется. Для суток-двух это нормально, но для года этого мало — данные молча «уезжают». Чтобы собрать год, нужно либо поднять лимит, либо, что правильнее, писать агрегированную историю в отдельную таблицу: сырые минутки за ближайший месяц, дальше — часовые и суточные средние, минимумы и максимумы. Тогда год укладывается в копейки по объёму, а детали остаются на месте. Проверь это ДО того, как накапливать год, иначе получишь красивый график за две недели и пустоту за остальное время.

Шаг 1. Собираем данные

Отдельная карточка наблюдения на нужный топик: включаем сбор, ставим интервал съёма (для года — 60 секунд), окно нормы (например сутки). Пределы по напряжению имеет смысл задать по ГОСТ: 230 В плюс-минус 10 %, то есть 207–253 В. Это не «настройка аномалий», а физическая граница, за которой приборы страдают.

Карточка:      Электросеть за год
Топик:         zigbee2mqtt/socket/voltage
Единица:       V
Интервал:      60 сек
Окно нормы:    24 ч
Пределы:       207 … 253 V
Письмо:        при важности «предупреждение» и выше

Шаг 2. Пишем промпт

Промпт — самое важное. Плохой промпт: «проанализируй данные». Хороший — задаёт роль, период, что именно искать, в каком виде ответить и какие выводы нужны. Вот рабочий вариант для годового отчёта по сети:

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

ЗАДАЧА — оценить, насколько перегружена сеть, и какие тенденции видны.

Разбери по пунктам:
1. Уровень напряжения. Насколько оно далеко от номинальных 230 В по ГОСТ 32144-2013
   (допустимо 207-253 В)? Есть ли систематический сдвиг вниз или вверх?
2. Просадки. Когда напряжение падает: в какие часы, дни недели, месяцы?
   Совпадают ли просадки с ростом потребления? Насколько глубоко и как часто?
3. Сезонность и тенденция. Менялось ли напряжение от месяца к месяцу?
   Есть ли медленное ухудшение (признак деградации контактов, износа проводки)?
4. Перегрузка. Если по мощности/току видно пиковое потребление — превышает ли оно
   разумное для одной линии? Какая доля времени линия загружена близко к пределу?
5. Опасные события. Выдели то, что требует внимания в первую очередь,
   с датой и значением из данных.

ТРЕБОВАНИЯ К ОТВЕТУ:
- Опирайся только на приведённые числа, не выдумывай отсутствующее.
- Отдельно перечисли, каких данных не хватает для точных выводов.
- Если данных достаточно для вывода — сформулируй его прямо, без «возможно» и «вероятно».
- Сравнивай с нормативами и давай конкретные пороги: сколько вольт, сколько минут, сколько раз.
- В конце — 3-5 конкретных действий по приоритету, что проверить физически
  (контакты, автомат, отдельная линия, стабилизатор).
- По-русски, кратко, без общих слов и без рассуждений о методике.

Что здесь делает промпт правильным:

Шаг 3. Что подставляется в запрос автоматически

К промпту система добавляет выжимку по данным — не сырые точки, а статистику. Так выглядит то, что уходит в запрос (реальные цифры из моего дома, где окно пока сутки, но структура такая же и для года):

Карточка: Электросеть: напряжение, В
Топик: zigbee2mqtt/fish_light/voltage
Единица: V
Период: 25.09.2026 16:12 — 26.09.2026 16:12 (24 ч)
Точек собрано: 62 (интервал съёма 60 с)

=== Статистика ===
минимум:  215.00
максимум: 222.00
среднее:  217.87
медиана:  217.90
сигма (MAD): 0.812
размах:   7.00
пределы карточки: 198.000 … 253.000

=== По суткам (мин / среднее / макс) ===
2026-09-26: 215.00 / 217.87 / 222.00  (точек 62)

=== Автоматически найденные аномалии: 1 ===
26.09 17:06  dip (warning)  значение 211.0  норма 218.4  просадка: 211.00 при норме 218.40

За год в этот текст добавится разбивка по месяцам — и модель сможет говорить о тенденциях, а не только о текущем состоянии. Именно поэтому агрегаты надо считать в SQL, а не «отдавать как есть»: модель получает готовую картину, а не миллион строк.

Шаг 4. Что вернёт нейросеть

Форма ответа примерно такая (содержание зависит от твоих данных — здесь показан пример оформления, чтобы было понятно, чего ждать):

1. Уровень напряжения
Среднее за период 217.9 В — это на 12.1 В ниже номинала 230 В, в пределах
допуска ГОСТ (207-253 В), но систематически в нижней половине диапазона.
Доля времени ниже 215 В — 1.7 % (171 точка из 10 000).

2. Просадки
Просадки приходятся на 17:00-20:00 — совпадают с вечерним пиком потребления
и с включением обогревателя (мощность растёт с 19 до 60+ Вт). Минимум 211 В,
ниже предела ГОСТ не опускалось ни разу. За сутки 2 события глубже 2 % от нормы.

3. Сезонность и тенденция
За наблюдаемый период систематического ухудшения не видно: минимум по месяцу
стабилен (211-215 В). Для вывода о деградации нужен минимум 3 месяца данных.

4. Перегрузка
Пиковое потребление по этой линии 20 Вт против типичного 19 Вт — линия загружена
на единицы процентов от бытового предела. Перегрузки нет.

5. Опасные события
- 26.09 17:06 — просадка до 211 В при вечернем включении нагрузки.
  Одиночное событие, к действиям не обязывает, но при повторении 3+ раз
  за неделю — проверить контакт в розетке.

Чего не хватает для точных выводов:
- нет тока и мощности за тот же период в этой выжимке (есть в отдельных карточках);
- для оценки деградации нужно не менее года наблюдений;
- неизвестна нагрузка соседних линий и состояние самого автомата.

Действия по приоритету:
1. Ничего срочного: все значения в допуске ГОСТ.
2. Продолжать накопление — для вывода о тенденции нужен год.
3. При повторяющихся вечерних просадках глубже 210 В — проверить контакт
   в розетке и затяжку в автомате.
4. Если в доме есть мощные потребители — вынести их на отдельную линию.
Обрати внимание на структуру ответа: он опирается на числа из выжимки, отдельно называет то, чего не хватает, и заканчивается действиями. Такой ответ можно читать и использовать. Ответ вида «сеть работает нормально, но стоит следить за состоянием» бесполезен — и именно поэтому в промпте прописан формат.

Что можно вытащить из такого года истории

Живой пример из моих данных. Датчик CO₂ в истории показывает 10 000 точек со значением ровно 368 ppm — без единого колебания. Человек этого не замечает: графики ровные, значения «в норме». А это классический признак зависшего датчика: реальный CO₂ в комнате всегда дышит. Такую вещь ловит не порог, а проверка «дисперсия нулевая там, где должна быть» — и это отличный кандидат в промпт: «посмотри, какие показатели вообще не меняются».

6. Промпты для других задач

Схема одна: роль → данные и период → что искать по пунктам → формат ответа → чего не хватает. Меняется только содержание.

Микроклимат за год

Ты специалист по микроклимату помещений. Ниже статистика по температуре и влажности
спальни за год и найденные аномалии.

Оцени: 1) выход за комфортный диапазон (18-24 °C, 40-60 %) — сколько времени
и в какие периоды; 2) связь с сезоном и с отоплением; 3) признаки конденсата
и риска плесени (влажность выше 65 % при холодных стенах); 4) ночные значения —
не слишком ли холодно/жарко для сна; 5) тренд за год.

Только по приведённым числам. Отдельно — каких данных не хватает.
В конце — что проверить и что перенастроить (проветривание, увлажнитель, отопление).

Полив и влажность почвы

Ты агроном. Ниже история влажности почвы в горшке и работы крана за период.

Разбери: 1) как быстро сохнет земля (скорость падения влажности после полива);
2) достаточно ли текущего порога полива или растение пересыхает между циклами;
3) нет ли признаков перелива (долго держится высокая влажность);
4) есть ли циклы, когда кран открывался, но влажность не росла — признак,
что вода не доходит (засор, перекрытый вентиль, кран не тот);
5) как меняется картина с сезоном.

Отдельно: чего в данных не хватает. В конце — конкретная настройка порогов полива.

Потребление энергии

Ты энергоаудитор. Ниже месячные показатели потребления и пиковой мощности за год.

Ответь: 1) как менялось потребление по месяцам и есть ли тренд роста;
2) какие приборы дают основной вклад (по времени работы и мощности);
3) сколько стоит самый дорогой режим и что можно перенести в дешёвые часы;
4) есть ли аномальные всплески, не объяснимые расписанием;
5) прогноз на следующий месяц по текущей тенденции.

Считай только по приведённым данным, доли и проценты — явно. В конце — план экономии.

7. Правила, без которых получится ерунда

ПравилоПочему
Агрегаты вместо сырых точекгод минутных данных — это сотни тысяч строк. Модель в них утонет, а запрос станет дорогим. Считай min/max/среднее/медиану/сигму и разбивку по суткам в SQL
Период указывать явнобез периода модель не понимает, о чём вывод: о вчерашнем дне или о годе. Период должен быть и в промпте, и в данных
Требовать «чего не хватает»это главный приём против выдумывания. Модель, которую прямо просят назвать пробелы, честно называет их вместо того, чтобы достроить картину
Задавать формат ответаиначе получишь общие слова. Пункты, числа, пороги, список действий — то, что можно проверить и применить
Сначала статистика, потом модельсвои детекторы находят события дешево и точно; нейросеть нужна для объяснения и тенденций, а не для поиска «глазами по таблице»
Проверять выводы на данныхлюбое утверждение модели проверяется одним SQL-запросом. «Просадок стало больше» — считаешь по месяцам и убеждаешься сам
Свой сервер, если данные личныелокальная модель (например через ollama с OpenAI-совместимым API) убирает вопрос «куда уходят данные о моём доме»

8. Итог

Рабочая связка выглядит так:

  1. Один дешёвый датчик с историей (умная розетка — идеальный старт).
  2. Сбор точек в базу и агрегированная история, чтобы год действительно накапливался.
  3. Четыре детектора на устойчивой статистике (медиана и MAD) с окном нормы и паузой от спама.
  4. Журнал аномалий, который человек реально смотрит, и письмо только при важном.
  5. Нейросеть — по кнопке и с правильным промптом: объяснить период, найти тенденции, предложить действия.

Самое ценное здесь то, что детекторы не надо переучивать: норма считается по фактическим данным и подстраивается сама. А нейросеть занимается тем, что у неё получается лучше всего — разбором и объяснением подготовленной выжимки. Никаких «умных порогов из головы», никаких облачных подписок: розетка, одноплатник, база и промпт.