Учим Мажордомо определять конкретного пользователя умного дома для создания более интеллектуальных персонализированных сценариев

Average Rating
0 out of 5 stars. 0 votes.

Задача определения хозяев дома уже более менее решена. Подключив почти любое устройство к Majordomo через модуль “Простые устройства” можно выставить настройку “Изменение означает активность в помещении”.
Изменение означает активность в помещении
Что бы активность срабатывала, нужно выбрать помещение где работает девайс. Это делается в выпадающем списке “Местоположение”.
Местоположение Majoedomo
Но мы же хотим приблизится что бы у нас была не домашняя автоматизация, а умный дом. Но дом действительно будет умным когда научится элементарно отличать вас от другого члена семьи. Для человека это достаточно простая задача, а вот с машину всё чуть-чуть сложней. Я попытался решить этот вопрос, кто и где именно из пользователей “умного дома” находится в данный момент. Решив эту задачу можно будет сделать сценарии более интеллектуальными.

Итак, что нам может помочь на раннем этапе решить эту задачу? Первое чем можно воспользоваться это индикатор подключения личного телефона к домашней сети. Как правило роутеры присваивают один и тот же IP адрес одному и тому же устройству в момент соединения по WI-FI. Если это не так в вашей среде, то погуглите как переконфигурировать ваш роутер. Что бы заработала эта схема идём в раздел “Устройства Online” и добавляем туда все личные устройства и их IP адреса.
Устройства Online

Далее в разделе “Объекты” находим класс “Users” и добавляем туда всех членов семьи. У всех будет автоматически создано свойство “atHome”. Если оно равно “1”, то Majoedomo считает что пользователь находится дома. Поэтому возвращаемся в раздел “Устройства Online” выбираем телефон, выбираем “Код” для пункта “Действие при переходе в Online” и вставляем туда команду:

sg("admin.atHome",1);
Для “Действие при переходе в Offline”, вставляем:

sg("admin.atHome",0);
Такую же процедуру проделываем со всеми устройствами, не забывая заменить “admin” на имя пользователя из класса “Users”.

Далее я советую поставить модуль “Статусы системы”. В разделе “Устройства” вы увидите все ваши добавленные телефоны. Для каждого из них выбираете желтый статус и вписываете текст, который будет отображаться в левом верхнем углу главной страницы. В моём случае если моё устройство будет офлайн, то будет отображаться текст “Телефон Алекс вне сети”.

У этого способа есть недостаток. Если батарея телефона сядет, то для системы я буду вне дома. Но зато это достаточно простой и быстрый способ рассказать системе что я дома. Он может использоваться в комбинации с другими методами, о которых я ниже расскажу.

Второе что мне пришло на ум это NFC метки. Что это такое и как работает я рассказывать не буду. Ютуб в помощь. Расскажу лишь применение этой технологии для решения моей задачи. Я подразумеваю что у всех кто пользуется “умным домом” есть телефон с модулем NFC. Устанавливаем любое приложение, которое умеет отправлять HTTP запросы при сопряжении с NFC меткой. Например “Trigger writer” под Android. Далее приклеиваете на двухсторонний скотч NFC метки везде где вы часто оставляете телефон. У меня в наличии было 2 метки и я одну приклеил под рабочий стол, а вторую на прикроватную тумбочку. Затем в приложении создал 2 NFC события. Что бы при срабатывании на каждую метку в Мажордомо отправлялся HTTP запрос, который говорит кто и где находится. Вот пример запроса для пользователя admin, который находится в спальне:

http://192.168.1.101:80/objects/?op=set&object=Bedroom&p=User&v=admin

NFC application

Теперь нам нужно обрабатывать этот HTTP запрос. В классе “User” добавляем свойства: “Location” и “LocateUpdated”, а в классе “Rooms” добавляем метод “CheckUser”, потом добавляем свойство: “User” и выставляем настройку запускать метод “CheckUser” на изменение свойства “User”. В исходный код метода “CheckUser” вставляем:

$objectsRooms=getObjectsByClass("Rooms");
$time=date('H:i');
foreach($objectsRooms as $obj) {
$user = getGlobal($obj['TITLE'].".User");
$location = getGlobal($obj['TITLE'].".Title");
if ($user == "admin"){
sg("admin.Location",$location);
sg("admin.LocateUpdated",$time);
cm($obj['TITLE'].".onActivity");
sg($obj['TITLE'].".User","");
SetTimeOut("ClearAdminLocation","sg('admin.Location','');", 10*60);
SetTimeOut("ClearAdminLocateUpdated","sg('admin.LocateUpdated','');", 10*60);
}
else if ($user == "Vika"){
sg("Vika.Location",$location);
sg("Vika.LocateUpdated",$time);
cm($obj['TITLE'].".onActivity");
sg($obj['TITLE'].".User","");
SetTimeOut("ClearVikaLocation","sg('Vika.Location','');", 10*60);
SetTimeOut("ClearVikaLocateUpdated","sg('Vika.LocateUpdated','');", 10*60);
}
}

Добавляете столько блоков “else if”, сколько у вас пользователей, ну и замените имена в блоке сравнения. Имена должны совпадать с теми, которые вы передаёте в HTTP запросе из мобильного приложения и те что у вас в классе “User”.
В результате, после того как сработает коннект с NFC меткой заполняется свойство “admin.Location” и “admin.LocateUpdated”. Тем самым Мажордомо понимает кто и где и когда находится. Такую информацию можно выводить в “State” (левый верхний угол). Это можно делать например вот так:

%admin.fullName% -- %Admin.Location% (%admin.LocateUpdated%)
Мажордомо state

 

Ещё один способ определять нахождение пользователя по GPS, но он так сильно садит батарею что я отказался от него. Но вы можете его добавить в качестве дополнительно способа определения. Единственная проблема с GPS в том что вы сможете достаточно приблизительно определять дома тот или иной пользователь или нет. Зато с его помощью можно определять нахождение пользователей вне дома. Но это уже совсем другая задача.

И заключительный четвёртый и самый крутой способ определять пользователя – это с помощью нейронной сети. Об этом способе я снимал демонстрационный ролик. Пока у меня всего одна камера и она может определять пользователя только в одном месте. Если вы хотите что бы Мажордомо смогло определять ваше нахождение во всех помещениях, то вам понадобится столько камер, сколько у вас помещений. Я купил ещё одну камеру, жду доставки и буду пробовать интегрировать её в свою логику.
Алгоритм определения пользователя следующий. Добавляю IP камеру через “Простые устройства”, так же добавляем любой датчик движения либо если возможно использовать встроенный датчик движения в камеру. Как только сработал датчик, делаем снепшот, сохраняем его на файловой системе, запускам нейронную сеть и скармливаем ей фото. Результаты работы сети отправляются в Мажордомо в видео определённого числа. В зависимости от значения принимается решение кто на фото. Если на фото есть человек, который является пользователем системы, то выставляем свойства “Location”, “atHome” и “LocateUpdated” как в примере с NFC. Большой минус определения лица в том что он требует процессорное время и на малинку такую штуку особо не интегрируешь. К тому же мой способ использует питон, а это тоже требует установки дополнительного интерпретатора.

Буду рад выслушивать любые ваши предложения по усовершенствованию и исправлению возможных ошибок.

Average Rating
0 out of 5 stars. 0 votes.

One thought on “Учим Мажордомо определять конкретного пользователя умного дома для создания более интеллектуальных персонализированных сценариев”

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>