Непрерывный мониторинг энергопотребления в домашних условиях с помощью обученной модели для предупреждения о неожиданном потреблении энергии в определенное время суток. Позвольте моему 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 утра субботнего утра было уведомлением о том, что домохозяйство потребляет существенно меньше электроэнергии, чем ожидалось. Это действительно было правдой - может, мне нужно больше отпуска, чтобы правильно обучить модель!
Готов попробовать
Весь проект просто требует, чтобы докер запускался локально.
Источники и ссылки
- Вдохновение для этого проекта исходит от Кая Вайнера и его проекта Deep Learning UDF for KSQL.
- Система уведомлений была вдохновлена Робином Моффаттом и его блогом Event-Driven Alerting with Slack.
- Pushbullet и их полезное API
- Программа Hass.io Home Assistant
- H2O.ai и очень полезное руководство по началу работы
- Домашний мониторинг мощности с помощью Raspberry Pi