ФОРУМ КУПИТЬ

Последние статьи

ВСЕ СТАТЬИ

Использование Wi-Fi точек UniFi в качестве датчика присутствия

07/01/2017 20:02:47

В своем доме я использую точки доступа UniFi, которые обеспечивают надежное покрытие всей площади жилища и уверенный прием в огороде. Всего у меня четыре таких точки - по одной на каждом этаже и точка за пределами дома. Мобильные устройства автоматически и незаметно переподключаются ближайшей точке, что всегда гарантирует высокую скорость доступа в Сеть. Web-приложение UniFi Controller позволяет полностью контролировать работу системы, настраивать точки доступа, видеть какие мобильные гаджеты подключены к сети и к каким именно точкам.

И тут я задался вопросом, а можно ли использовать эту информацию? В самом деле, в современном мире мобильный телефон не просто постоянный спутник человека, а пожалуй уже часть его тела. "Без телефона, как без рук" - говорим мы все чаще и испытываем сильный дискомфорт и тоску, когда любимый гаджет выключается из-за разряженной батареи. Стало быть, регистрация мобильного девайса в Wi-Fi сети с большой долей вероятности говорит и о наличии человека в доме. И, соответственно, наоборот - отсутствие устройства в сети означает, что в доме скорее всего нет и его владельца.

Как это можно использовать. Несколько примеров из реальной жизни.
1. Системы безопасности и охраны. Система Умного Дома может самостоятельно включать режим "охрана", когда в доме нет зарегистрированных устройств. В отличие от человека, она не забудет это сделать, и ей не будет "лень". Одновременно с этим система в зависимости от настроек может выключить свет, закрыть краны, снизить температуру.
2. Если в доме никого нет, а люди сидят в саду / на заднем дворе, и в калитку позвонили (а у меня SIP-домофон), система сможет автоматически "просигнализировать" не в доме, а в саду или даже прислать SMS.
3. Когда мобильные устройства после долгого отсутствия регистрируются в сети, соединяясь с точкой, расположенной рядом с центральным входом, система может поприветствовать всех домочадцев по имени (а у меня для этих целей в прихожей установлена Raspberry Pi с колонками) и в зависимости от того, кто именно пришел, заранее включить свет в нужных комнатах.
4. Работая совмесно с ИК-извещателями, система с высокой долей вероятности сможет определять местоположение людей в доме, автоматически управляя освещением.
5. В отсутствии людей можно запускать сервисные функции системы водоподготовки: обратная промывка засыпных фильтров, регенерация каталитических наполнителей.
6. Запуск в работу роботов-пылесосов

Можно придумать массу других интересных решений, которые сделают пребывание в доме комфортнее и веселее.

Главный вопрос, как получить нужные данные от контроллера UniFi. Очень просто.
Следующий shell-скрипт будет соединяться с контроллером, считывать данные в формате JSON и сохранять их в указанном файле.

#!/bin/bash
username=user
password=password
baseurl=https://192.168.0.250:8443
cookie=/tmp/unifi_cookie
curl_cmd="curl --silent --cookie ${cookie} --cookie-jar ${cookie} --insecure "
#login
${curl_cmd} --data "{'username':'$username', 'password':'$password'}" $baseurl/api/login > /dev/null 2>&1
${curl_cmd} $baseurl/api/s/default/stat/sta > /var/www/scripts/unifi-users.json
#logout
${curl_cmd} $baseurl/logout > /dev/null 2>&1

Разумеется username, password и baseurl нужно указать свои.
Данный скрипт можно вызывать из cron каждые 1-2 минуты.
В файле unifi-users.json у нас будут сохраняться следующие данные: устройства, их MAC-адреса, время пребывания в сети, адреса точек, которым подключены устройства и другая полезная информация.

Теперь остается только использовать эту информацию там, где это необходимо.
Для наглядности я приведу пример PHP-скрипта, который выводит информацию о присутствующих в Web-интерфейсе Умного Дома.

<?
// Точки доступа и их наименования
$aps = array (
"24:a4:1c:de:03:5c" => "Подвал",
"24:a4:1c:da:8a:17" => "1 этаж",
"24:a4:1c:de:03:6a" => "2 этаж",
"04:12:d6:9e:f1:23" => "Сад",
);

// Устройства, которые мы отслеживаем.
// Здесь мы указываем персональные устройства, так как помимо мобильных телефонов
// в системе могут быть зарегистрированы блоки автоматики, планшеты
// и другие устройства, отслеживание которых не имеет практического смысла.
$clients = array (
"f0:db:f2:b4:79:11" => "Наташа",
"90:fd:62:0c:ce:9c" => "Элен",
"08:70:42:2d:7d:41" => "Мари",
"28:ed:6b:a2:c7:52" => "Пьер"
"28:e2:11:d6:a4:31" => "Андрей"
);

$users_file = "/var/www/scripts/unifi-users.json";
$users = fopen($users_file, "r");
$users_json = fread($users, filesize($users_file));
fclose($users);

echo "<h3>Кто дома?</h3>";

$users_a = json_decode($users_json, TRUE);
for ( $i = 0; $i < count($users_a['data']); $i++ )
{
    if (array_key_exists($users_a['data'][$i]['mac'], $clients))
    {
        $uptime = gmdate("j", $users_a['data'][$i]['uptime']) - 1;
        if ( $uptime == 0 ) $uptime = ""; else $uptime .= " день ";
        $uptime .= gmdate("H:i:s", $users_a['data'][$i]['uptime']);
        echo $clients[$users_a['data'][$i]['mac']]." (".$aps[$users_a['data'][$i]['ap_mac']].") [$uptime]<br>";
    }
}
?>

Выглядеть это может примерно так. Отображается пользователь, его местоположение, а также время, в течение которого он находится дома.

Можно написать отдельный скрипт, который, вызываясь из cron, фиксировал бы в базе данных другую полезную информацию: когда пользователь последний раз уходил из дома, с какого времени находится дома. Алгоритмы, примеры которых я привел в начале статьи, имеют большой потенциал для использования в системах домашней автоматизации. А этот потенциал, как вы понимаете, ограничен только фантазией администратора системы и стоящими перед ним задачами.

Таким образом W-Fi точки доступа могут быть интегрированы в общую систему - не только выполнять функцию раздачи беспроводного Интернета, но и стать частью Умного Дома.

 

Автор: Andrey_B
Любое использование материалов сайта возможно только с разрешения автора и с обязательным указанием источника.



Добавить комментарий:

(необязательно, не отображается на сайте)


Сортировка комментариев: Последние сверху | Первые сверху

2017-02-28 21:51:43 | FlyRouter
Данные по пользователям в формате JSON можно вытащить одной командой через SSH.

sshpass -p ubnt ssh ubntl@192.168.1.20 'wstalist'


2017-03-24 11:53:32 | Владимир
А как это сделать для windows?, как я понял это для линекс.


2017-03-24 17:32:22 | Andrey_B
Владимир, да, собственно, также.
curl, PHP - все это есть и для Windows.


2017-03-30 20:20:17 | Ivan
Андрей, вы как всегда радуете хорошими новостями. Подскажите как вам удается найти подобные сведения? может подскажите где поискать аналогичные запросы для других роутеров, например TP-LINK, в веб интерфейсе эта информация есть, а как это вытащить для своих нужд, это для меня вопрос...


2017-03-31 17:27:41 | Andrey_B
Ivan, ну, кто ищет тот найдет. В каждом конкретном случае реализация может немного отличаться, но если в Web-интерфейсе информация присутствует, высока вероятность, что ее оттуда можно тем или иным способом считать. Но готового решения для вашего роутера у меня нет.


2018-02-07 01:14:16 | Олег
Мобильные устройства экономят энергию и периодически уходят в оффлайн переставая пинговаться. Не могу придумать как это обойти.


2018-02-07 15:07:45 | Andrey_B
Олег, а какие устройства вы имеете ввиду? За своими "айфонами" такого не замечал. Система вроде бы всегда работает корректно.


2018-02-07 15:32:19 | Олег
Телефоны oneplus и iphone7. На обоих примерно одинаковая картина. Только разные интервалы ухода в оффлайн. Но я использую именно пинг. Может UniFi применяет какую-то другую технологию.


2018-07-14 17:19:21 | Павел Гладилов
Андрей, а зачем опрашивать точки доступа? Достаточно просканировать домашнюю сеть (или её сегмент) на предмет живых/ответивших MAC-адресов. Я дома делаю приблизительно так: (специально для вас статью в блоге написал, т. к. не удобно в комментах простыни писать)
https:/gladilov.org.ru/blog/all/script-for-getting-devices-in-home-network/


2020-11-27 05:40:56 | Алексей
Ну идея далеко не нова я уже замахнулся даже на то чтоб производить триангуляцию устройств как зарегистрированных так и не зарегистрированных в сети устройств.