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

Что это, черт возьми?

Энергопотребление в домашних условиях колеблется в течение дня. Однако образец использования электроэнергии следует типичной кривой и становится предсказуемым после достаточного количества наблюдений. Вас удивит, что ночью, когда все спят, потребляется очень мало энергии? Вероятно, нет - но внезапный скачок напряжения в 4 часа ночи, это стоит проверить с помощью предупреждения на моем телефоне.

Готовы к модным словам? Сбор данных через Raspberry Pi через Apache Kafka. Обработка в реальном времени с использованием потокового движка KSQL, дополненного обученной моделью. События об использовании энергии в непредвиденное время суток отправляются через мобильные уведомления на мой телефон вместе с голосовым сообщением через домашний динамик.

Вдохновение для этого проекта исходит от Кая Вайнера и его проекта Deep Learning UDF for KSQL. Система уведомлений была вдохновлена ​​Робином Моффаттом и его блогом Event-Driven Alerting with Slack.

Весь проект легко запустить, и для его локальной демонстрации просто требуется докер.

Мне скучно - можно мне видео?

Конечно

Обучение и сбор данных

Имея данные за 3 месяца моего эксперимента Мониторинг электропитания дома с использованием Raspberry Pi, у меня был набор данных, позволяющих определить, как потребление энергии в домашнем хозяйстве выглядело в течение среднего дня.

Потребляемая мощность измеряется в «Вт / час - ватт-часах». Диапазон энергопотребления за 24 часа в августе показан ниже. Область, заштрихованная зеленым цветом, показывает диапазон от минимального значения для этого часа до максимального потребления. Короче говоря, значения в зеленой области нормальные, а красная - неожиданная.

Используя H2O.ai (пакет машинного обучения с открытым исходным кодом) и очень полезное руководство по началу работы, я смог создать функцию, которая возвращает оценку аномалий на основе дня, часа и энергопотребления. . То есть после прохождения дня месяца, часа дня и потребления энергии функция возвращает оценку аномалии.

AnomalyScore = AnomalyFunction (день, час, энергопотребление)

Потребление 1500 Вт / час в 9 часов утра - это нормально, однако потребляемая мощность 1500 Вт / час в 4 часа утра является поводом для беспокойства, поскольку это на 500% больше, чем ожидалось. Короче говоря, показатель аномалии выше 1,0 означает потребление энергии сверх того, что ранее исторически измерялось в то время и в тот день.

Пользовательская функция - и KSQL

KSQL - это движок потокового SQL с открытым исходным кодом, который позволяет обрабатывать данные в реальном времени с помощью Apache Kafka. KSQL поддерживает создание определяемых пользователем скалярных функций (UDF) с помощью пользовательских jar-файлов, которые загружаются в каталог ext / установки KSQL. То есть моя скомпилированная функция оценки аномалий может быть представлена ​​на сервере KSQL и запущена против потока Kafka.

TL; Резюме DR - скомпилируйте немного Java и поместите в правильный каталог, запустите ksql сервер и убедитесь, что функция там ...

ksql> list functions;
 Function Name           | Type
-------------------------------------
  . . .
 ANOMOLY_POWER           | SCALAR   <--- I need this one
 ANOMOLY_WATER           | SCALAR

Сначала создается поток («raw_power_stream»), чтобы показать энергопотребление в реальном времени из темы kafka с энергопотреблением в реальном времени.

В приведенных ниже сценариях показаны шаги по созданию последней темы kafka «anomaly_power», которая будет потоком событий, в котором функция аномалии («anomaly_power») обнаружила значительно необычное значение. То есть тема «anomaly_power» должна молчать, если только не произошло необычное событие.

create stream raw_power_stream with (kafka_topic='raw_power', value_format='avro');

create stream  power_stream_rekeyed as \
select rowtime, hour, kwh, anomoly_power(hour, kwh) as fn \
from raw_power_stream partition by rowtime;

create stream anomoly_power with (value_format='JSON') as \
select rowtime as event_ts, hour, kwh, fn \
from power_stream_rekeyed where fn>1.0;

Бить тревогу

Непрерывная обработка потока в реальном времени бесполезна, если у нас нет способа подать сигнал тревоги, когда произошло что-то странное. Я хотел, чтобы уведомления появлялись на моем мобильном телефоне и о них сообщалось через нашу умную колонку Google Home. Зачем беспокоиться только один раз, если я могу раздражаться дважды?

Уведомление мобильного устройства через Pushbullet

Pushbullet - отличный сервисный мост, который предоставляет простой API для отправки push-уведомлений на устройства iOS и Android.

Часть кода python использует тему ANOMOLY_POWER и вызывает pushbullet. Установлен потребитель, и обработчик событий вызывает службу уведомлений при получении новых событий Kafka. Каждое сообщение генерирует новое push-уведомление.

Преобразование текста в речь (TTS) Google Home через Home Assistant

Я запускаю программу Hass.io Home Assistant локально для управления задачами домашней автоматизации. Одной из приятных функций является простой API для отправки текстовых сообщений в виде голосовых команд прямо на умный динамик Google Home. То есть создайте строку - и она будет звучать (довольно громко) через Google Home.

Что я узнал?

Первый серьезный сигнал тревоги, который я получил, был, когда я был в отпуске. Уведомление в 9 утра субботнего утра было уведомлением о том, что домохозяйство потребляет существенно меньше электроэнергии, чем ожидалось. Это действительно было правдой - может, мне нужно больше отпуска, чтобы правильно обучить модель!

Готов попробовать

Весь проект просто требует, чтобы докер запускался локально.

Источники и ссылки