Статьи

розумний будинок | Блог ІТшніка

Average Rating 0 out of 5 stars. 0 votes.

Завдання визначення господарів будинку вже більш менш вирішена. Підключивши майже будь-який пристрій до Majordomo через модуль "Прості пристрої" можна виставити настройку "Зміна означає активність в приміщенні".

Що б активність спрацьовувала, потрібно вибрати приміщення де працює девайс. Це робиться в випадаючому списку «Позиціонування».

Але ми ж хочемо наблизиться що б у нас була не домашня автоматизація, а розумний будинок. Але будинок дійсно буде розумним коли навчиться елементарно відрізняти вас від іншого члена сім'ї. Для людини це досить просте завдання, а ось з машину все трохи складніше. Я спробував вирішити це питання, хто і де саме з користувачів "розумного будинку" знаходиться в даний момент. Вирішивши цю задачу можна буде зробити сценарії більш інтелектуальними.

Отже, що нам може допомогти на ранньому етапі вирішити цю задачу? Перше ніж можна скористатися це індикатор підключення особистого телефону до домашньої мережі. Як правило роутери привласнюють один і той же IP адреса одному і тому ж пристрою в момент з'єднання по WI-FI. Якщо це не так у вашому середовищі, то погуглити як переконфигурировать ваш роутер. Що б заробила ця схема йдемо в розділ "Пристрої Online" і додаємо туди все особисті пристрої та їх IP адреси.

Далі в розділі "Об'єкти" знаходимо клас "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

Тепер нам потрібно обробляти цей 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%)

Ще один спосіб визначати знаходження користувача по GPS, але він так сильно садить батарею що я відмовився від нього. Але ви можете його додати в якості додатково способу визначення. Єдина проблема з GPS в тому що ви зможете досить приблизно визначати будинку той чи інший користувач чи ні. Зате з його допомогою можна визначати знаходження користувачів поза домом. Але це вже зовсім інша задача.

І заключний четвертий і найкрутіший спосіб визначати користувача - це за допомогою нейронної мережі. Про це способі я знімав демонстраційний ролик . Поки у мене всього одна камера і вона може визначати користувача тільки в одному місці. Якщо ви хочете що б мажордомом змогло визначати ваше перебування у всіх приміщеннях, то вам знадобиться стільки камер, скільки у вас приміщень. Я купив ще одну камеру, чекаю доставки і буду пробувати інтегрувати її в свою логіку.
Алгоритм визначення користувача наступний. Додаю IP камеру через "Прості пристрої", так само додаємо будь-датчик руху або якщо можливо використовувати вбудований датчик руху в камеру. Як тільки спрацював датчик, робимо снепшот, зберігаємо його на файлової системи, запусків нейронну мережу і скармливаем їй фото. Результати роботи мережі відправляються в мажордомом в відео певного числа. Залежно від значення приймається рішення хто на фото. Якщо на фото є людина, яка є користувачем системи, то виставляємо властивості "Location", "atHome" і "LocateUpdated" як в прикладі з NFC. Великий мінус визначення особи в тому що він вимагає процесорний час і на малинку таку штуку особливо не інтегруєшся. До того ж мій спосіб використовує пітон, а це теж вимагає установки додаткового інтерпретатора.

Буду радий вислухати будь-які ваші пропозиції щодо вдосконалення і виправлення можливих помилок.

Average Rating 0 out of 5 stars. 0 votes.Отже, що нам може допомогти на ранньому етапі вирішити цю задачу?
Objects/?

Новости