Корзина  (пустая) 0 руб.
Корзина  (пустая) 0 руб.
Корзина  (пустая) 0 руб.
Корзина  (пустая) 0 руб.

+7 495 204-27-80

Умный дом не будет по настоящему умным, если он не знает, кто конкретно из его обитателей в настоящий момент присутствует в доме. Ведь для того, чтобы понять, что есть какое-то движение, достаточно простого датчика, но вот определение наличия конкретного человека намного сложнее. Существует множество решений этой задачи, но я предлагаю остановится на самом простом и не требующем дополнительных затрат. У каждого современного человека есть мобильный телефон, а раз уж он живет в умном доме, то предполагается, что у всех его обитателей телефоны имеет выход в интернет через беспроводную сеть дома (Wi-Fi). Поскольку каждый телефон имеет свой уникальный сетевой идентификатор (MAC-адрес), то можно использовать его для определения наличия или отсутствия человека.

Можно выделить два способа определения наличия телефона в сети: простой способ подразумевает, что за каждым MAC-адресом на маршрутизаторе закрепляется конкретный сетевой адрес. Зная сетевой адрес контроллер умного дома опрашивает его – доступен он сейчас? Если да, то предполагается что владелец телефона также находится дома, если нет, то скорее всего его нет в пределах досягаемости беспроводной сети. Второй, более достоверный способ, подразумевает то, что маршрутизатор сам передает готовую информацию о наличии или отсутствии данного телефона в его сети на контроллер умного дома.

Итогом статьи станет не только актуальная информация о присутствии людей дома, но и получение (в дополнение к уже существующим уведомлениям *1), сообщений по электронной почте следующего вида:

VeraLog - ХХХХХ пришла в 10:12:15, ХХ/01/2015

VeraLog - ХХХХХ ушла в 12:19:57, ХХ/01/2015. Была дома 2.13 часов

VeraLog - ХХХХХ пришел в 13:20:12, ХХ/01/2015

VeraLog - ХХХХХ ушел в 16:11:26, ХХ/01/2015. Был дома 2.85 часов

VeraLog - ХХХХХ пришел в 17:53:46, ХХ/01/2015

VeraLog - ХХХХХ пришла в 18:12:15, ХХ/01/2015

VeraLog - ХХХХХ ушел в 07:53:17, ХХ/01/2015. Был дома 13.99 часов

Рассмотрим конкретную реализацию на базе контроллеров умного дома VeraLite или Vera3 с интерфейсом UI5.

1. Простой способ определения наличия телефона в домашней сети

1.1. Настройка маршрутизатора

Для того, чтобы закрепить статические сетевые адреса за мобильными телефонами настроим маршрутизатор. Для примера настройки возьмем какую-нибудь популярную недорогую модель из топа Яндекса (*2), например, TP-LINK.

Рис. 1. Адресная строка браузера с сетевым адресом роутера Рис. 1. Адресная строка браузера с сетевым адресом роутера

Для начала, как всегда, необходимо зайти в настройки роутера. Используйте адрес 192.168.1.1 или 192.168.0.1 (рис. 1). Логин и пароль, по умолчанию admin и admin, рис. 2 (эти данные указаны снизу маршрутизатора).

Рис. 2. Окно авторизации

Рис. 2. Окно авторизации

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

В настройках переходим на вкладку DHCP — DHCP Clients List (Список клиентов DHCP). Тут мы можем посмотреть все устройства, которые подключены к роутеру. Необходимо скопировать MAC адрес нужного устройства.

Рис. 3. Окно настройки DHCP-сервера

Рис. 3. Окно настройки DHCP-сервера

Если по имени устройства невозможно его определить, то MAC можно посмотреть на самом телефоне в разделе О телефоне / Техническая информация.

Копируем нужный MAC адрес из списка подключенных устройств, затем открываем вкладку DHCP — Address Reservation (Резервирование адресов). Наживаем кнопку «Add New…» и создаем новое правило. В строке MAC Address указываем адрес устройства, за которым мы хотим закрепить IP.

Рис. 4. Новое правило закрепления статического IP адреса

Рис. 4. Новое правило закрепления статического IP адреса

Напротив Reserved IP Address указываем собственно сам IP. Можно указать любой от 192.168.1.100 до 192.168.1.199. Например, 192.168.1.110. Status — оставляем enabled. Сохраняем кнопкой Savе.

Далее вы увидите созданное правило, которое при желании можно изменить, или удалить. Создаем столько правил, сколько необходимо. Учитываем, что все заработает только после перезагрузки роутера.

Рис. 5. Созданное правило для статического IP адреса

Рис. 5. Созданное правило для статического IP адреса

После этого каждый из телефонов без дополнительных настроек на нем, при подключении к домашней сети Wi-Fi автоматически получает статический IP адрес.

1.2. Отображение информации в UI5 VeraLite или Vera3

Теперь, когда мы знаем конкретные сетевые адреса для каждого мобильного телефона можно опрашивать их средствами VeraLite. Для этого потребуется воспользоваться утилитой Ping, служащей для проверки соединений в сетях на основе TCP/IP. Ping (пинг) это также время ответа вашего устройства на сетевой запрос. Другими словами, это промежуток времени, за который пакет данных, отосланный от вашего компьютера, проходит до другого устройства и возвращается обратно. В данном случае нас будут интересовать не временные характеристики, а простое наличие – есть ответ устройства или нет.

Поиск в магазине приложений MiOS выдает несколько результатов по запросу слова «ping» (*3). Предлагаю воспользоваться плагином «Ping Sensor», рис. 6, как простым и надежным. После его установки вы можете создать неограниченное количество виртуальных устройств по количеству телефонов.

Рис. 6. Окно плагина «Ping Sensor»

Рис. 6. Окно плагина «Ping Sensor»

Каждое виртуальное устройство представляет собой такой же сенсор безопасности, что и обычный датчик движения, с такими же правилами работы с ним, только привязанный к пингу телефона, рис. 7.

Рис. 7. Окно устройства

Рис. 7. Окно устройства

Для того чтобы плагин корректно работал надо указать настройки – сетевой адрес телефона, рис. 8. Также время опроса (poll) и интервал бездействия (timeout). Для Android телефонов указанные на рис. 8 параметры отлично подходят, если на iOS или на других устройствах эти параметры работают некорректно, измените их на рабочие, подобрав экспериментальным путем или воспользуйтесь «достоверным путём отображения информации в UI5 VeraLite или Vera3» ниже.

Рис. 8. Окно плагина «Ping Sensor»

Рис. 8. Окно плагина «Ping Sensor»

После установки и настройки плагина мы имеем в интерфейсе UI5 такой же «датчик движения» что и обычно, только привязанный к пингу телефона, когда он активен – значит телефон в сети.

Рис. 9. Окно дополнительной настройки плагина «Ping Sensor» с номером устройства

Рис. 9. Окно дополнительной настройки плагина «Ping Sensor» с номером устройства (в данном случае № 43)

После этого если у вас все корректно заработало, переходите сразу к пункту 3 статьи, если нет, то вам на достоверный путь в пункте 2.

2. Достоверный путь отображения информации в UI5 VeraLite или Vera3

Более достоверным способом является не опрос устройства с контроллера Vera, а просмотр информации на самом маршрутизаторе с последующим переключением виртуального триггера в Vera. Но для этого не подойдет всякий маршрутизатор, требуется свободная альтернативная прошивка на беспроводном маршрутизаторе (например, Tomato / DD-WRT / OpenWRT), который будет исполнять bash-скрипт, переключающий триггер наличия или отсутствия телефона на контроллере Vera.

Виртуальным триггером будет плагин из магазина MiOS приложений «MultiSwitch» (*4). Этот виртуальный переключатель не имеет особых настроек, а служит для простого переключения включено или выключено, рис. 10. Через http запрос маршрутизатор сам переключит выключатель в нужное положение, согласно скрипта.

Рис. 10. Виртуальный переключатель на несколько устройств

Рис. 10. Виртуальный переключатель на несколько устройств

Для того, чтобы запустить скрипт опроса телефонов и устройств, например, на DD-WRT, требуются следующие команды:

while [ ! -e "/tmp/occupancy_phone.sh" ]; do

sleep 1 # wait till /tmp/occupancy_phone.sh gets generated

done

/tmp/occupancy_phone.sh &

Ниже приведет сам исполняемый скрипт. Перед вставкой необходимо дополнить его MAC-адресами телефонов и локальных хостов (если есть необходимость), указать номер устройства виртуальных переключателей MultiSwitch:

#!/bin/sh

WATCHDOG_SLEEP_SEC=10

MAC_ADDRESS_1="04:xx:xx:xx:xx:77" # MAC телефона

c1_last_state="0"

MAC_ADDRESS_2="78:xx:xx:xx:xx:0B" # MAC телефона

c2_last_state="0"

HOST_1="htpc-lan.XXXXX.local" # любой локальный хост

h1_last_state="x"

HOST_2="htpc-wlan.XXXXX.local"

h2_last_state="x"

HOST_3="alfa-usb-wlan.XXXXX.local"

h3_last_state="x"

HOST_4="alfa-spoofed.XXXXX.local"

h4_last_state="x"

HOST_5="mackentorsken.XXXXX.local"

h5_last_state="x"

HOST_10="www.z-wave.ru"

h10_last_state="x"

VERAURL="http://192.168.XXX.XX:3480/data_request?id=variableset&DeviceNum=57&serviceId=urn:dcineco-com:serviceId:MSwitch1&Variable="

x=0

y=0

while sleep $WATCHDOG_SLEEP_SEC

do

if [ "$x" == 180 ]; then

# Every 30 minutes or so we do them all again, just in case Vera missed something

x=0
c1_last_state="0"
c2_last_state="0"
h1_last_state="x"
h2_last_state="x"
h3_last_state="x"
h4_last_state="x" 
h10_last_state="x" 

fi

x=$(( $x + 1 ))

c1_new_state=`wl -a wl0.1 assoclist | grep $MAC_ADDRESS_1`

if [ "$c1_new_state" == "$c1_last_state" ] ; then

sleep 0
else
c1_last_state="$c1_new_state"
if [ "$c1_new_state" == "assoclist $MAC_ADDRESS_1" ]; then
wget -qs "${VERAURL}Status1&Value=1"
else
wget -qs "${VERAURL}Status1&Value=0"
fi
fi

c2_new_state=`wl -a wl0.1 assoclist | grep $MAC_ADDRESS_2`
if [ "$c2_new_state" == "$c2_last_state" ] ; then
sleep 0
else
c2_last_state="$c2_new_state"
if [ "$c2_new_state" == "assoclist $MAC_ADDRESS_2" ]; then
wget -qs "${VERAURL}Status2&Value=1"
else
wget -qs "${VERAURL}Status2&Value=0"
fi
fi

# Ping LAN hosts
h1_new_state=`ping -w 1 -c 1 $HOST_1 | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}'`
if [ "$h1_new_state" == "$h1_last_state" ] ; then
sleep 0
else
h1_last_state="$h1_new_state"
if [ "$h1_new_state" == 1 ]; then
wget -qs "${VERAURL}Status4&Value=1"
else
wget -qs "${VERAURL}Status4&Value=0"
fi
fi

h3_new_state=`ping -w 1 -c 1 $HOST_3 | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}'`
if [ "$h3_new_state" == "$h3_last_state" ] ; then
sleep 0
else
h3_last_state="$h3_new_state"
if [ "$h3_new_state" == "1" ]; then
wget -qs "${VERAURL}Status6&Value=1"
else
wget -qs "${VERAURL}Status6&Value=0"
fi
fi

h4_new_state=`ping -w 1 -c 1 $HOST_4 | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}'`
if [ "$h4_new_state" == "$h4_last_state" ] ; then
sleep 0
else
h4_last_state="$h4_new_state"
if [ "$h4_new_state" == "1" ]; then
wget -qs "${VERAURL}Status5&Value=1"
else
wget -qs "${VERAURL}Status5&Value=0"
fi
fi

h5_new_state=`ping -w 1 -c 1 $HOST_5 | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}'`
if [ "$h5_new_state" == "$h5_last_state" ] ; then
sleep 0
else
h5_last_state="$h5_new_state"
if [ "$h5_new_state" == "1" ]; then
wget -qs "${VERAURL}Status3&Value=1"
else
wget -qs "${VERAURL}Status3&Value=0"
fi
fi

if [ "$y" == 11 ]; then
# We dont want to ping an external site so often, might be considered as abuse
y=0
fi
y=$(( $y + 1 ))

if [ "$y" == 1 ] ; then
h10_new_state=`ping -w 5 -c 1 $HOST_10 | grep 'received' | awk -F',' '{ print $2}' | awk '{ print $1}'`
if [ "$h10_new_state" == "$h10_last_state" ] ; then
sleep 0
else
h10_last_state="$h10_new_state"
if [ "$h10_new_state" == "1" ]; then
wget -qs "${VERAURL}Status8&Value=1"
else
wget -qs "${VERAURL}Status8&Value=0"
fi
fi
fi

done

# основано на коде farang, silencery и Damian R http://forum.micasaverde.com
# z-wave.ru, Михаил Шардин

Результат достоверного пути такой же, как и у простого – переключатель, если включен – значит телефон в сети, если выключен – значит нет.

3. Настройка уведомлений

Переходим к самой интересной части: уведомлении о появлении и уходе людей из дома. Предполагается, что у вас уже работает аналогичная (*1) система уведомлений и данное уведомление о людях будет дополнением к уже существующей системе оповещений. Для этого требуется только дополнительный плагин «eMail Notification» из магазина приложение MiOS, в который вписываются данные почтового ящика отправляющего уведомления.

Рис. 11. Дополнительное окно настройки «eMail Notification» с номером устройства

Рис. 11. Дополнительное окно настройки «eMail Notification» с номером устройства, в данном случае это номер 30

Уведомления создаются не в окне уведомлений, связанном с устройством, а с помощью новой сцены на вкладке «Автоматизация». Для каждого из уведомлений создается отдельная сцена.

3.1. VeraLog - ХХХХХ пришел в 13:20:12, ХХ/01/2015

Создаем новую сцену на вкладке «Автоматизация», в разделе «Триггеры» отмечаем «переключатель», включающий сцену, когда датчик сообщает от том, что телефон появился в сети, рис. 12.

Рис. 12. Создание триггера для сцены оповещения о приходе

Рис. 12. Создание триггера для сцены оповещения о приходе

Дальше самое важное – во вкладке «LUUP» данной сцены необходимо вставить код, который будет отправлять уведомления через плагин на почту. В коде необходимо изменить номер устройства «30» (в моем случае) на ваш номер устройства, который можно посмотреть в дополнительном окне настройки «eMail Notification», рис. 11.

--уведомление о приходе ХХХХХ

local currentTimeSMS=os.date('%H:%M:%S, %d/%m/%Y')

luup.call_action("urn:upnp-org:serviceId:SmtpNotification1", "SendEmail", { Recipient_Name="Mikhail",

Recipient_eMail="ХХХХХ@gmail.com", Subject= "VeraLog - ХХХХХ пришел в " .. currentTimeSMS, Message=" " }, 30) --оповещение

luup.call_action("urn:upnp-org:serviceId:SmtpNotification1", "ResetCount",{}, 30) --сброс счетчика оповещения

После этого всё необходимо сохранить: «Сохранить Lua», «Подтвердить изменения», «СОХРАНИТЬ», рис. 13.

Рис. 13. Окно кода сцены

Рис. 13. Окно кода сцены

3.2. VeraLog - ХХХХХ ушел в 16:11:26, ХХ/01/2015. Был дома 2.85 часов

А вот это немного сложнее. Создайте новую сцену с триггером, противоположным вышесозданному, рис. 12.

Рис. 14. Создание триггера для сцены оповещения об уходе

Рис. 14. Создание триггера для сцены оповещения об уходе

Дальше на вкладку LUUP вставляем нижеследующий код, в котором надо исправить «43» номер устройства пинга (рис. 9) на ваш собственный. Также не забудьте поменять номер устройства с «30» на ваш в коде.

HUMAN.LUA --уведомление об уходе ХХХХХ

local currentTimeSMS=os.date('%H:%M:%S, %d/%m/%Y')

local now = os.time()

now = tonumber(now)

local LastTripPhoneM = luup.variable_get ("urn:micasaverde-com:serviceId:SecuritySensor1", "LastTrip", 43) or os.time() --время последнего срабатывания LastTripPhoneM = tonumber (LastTripPhoneM) LastTripPhoneM = os.difftime (now, LastTripPhoneM)/3600

function math_round( roundIn , roundDig ) -- первый аргумент - число которое надо округлить, второй аргумент - количество символов после запятой.

local mul = math.pow( 10, roundDig )

return ( math.floor( ( roundIn * mul ) + 0.5 )/mul )

end

luup.call_action("urn:upnp-org:serviceId:SmtpNotification1", "SendEmail", { Recipient_Name="Mikhail", Recipient_eMail="ХХХХХ@gmail.com", Subject= "VeraLog - ХХХХХ ушел в " .. currentTimeSMS .. ". Был дома " .. math_round (LastTripPhoneM,2) .. " часов", Message=" " }, 30) --оповещение luup.call_action("urn:upnp-org:serviceId:SmtpNotification1", "ResetCount",{}, 30) --сброс счетчика оповещения

После этого всё необходимо сохранить: «Сохранить Lua», «Подтвердить изменения», «СОХРАНИТЬ».

Скачать скрипты отдельными файлами: human.zipoccupancy_phone.zip

4. Выводы

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

Ссылки, упоминаемые в статье:

*1. http://z-wave.ru/obzory/259-sozdanie-prostykh-i-ponyatnykh-uvedomlenij-v-ui5-vera.html

*2. http://market.yandex.ru/guru.xml?CMD=-RR%3D9%2C0%2C0%2C0-VIS%3D8070-CAT_ID%3D651524-EXC%3D1-PG%3D10&hid=723087

*3. http://apps.mios.com/search.php?key=ping

*4. https://apps.mios.com/plugin.php?id=5836

Информация актуальна на дату написания статьи: январь 2015 года.

Автор: Михаил Шардин 

 

Способы доставки

Самовывоз

Самовывоз заказов осуществляется из ПВЗ СДЭК.

Доставка по Москве

Стоимость курьерской доставки по Москве в пределах МКАД составляет 350 руб.

Доставка по России

В другие города мы отправляем товар компаниями «СДЭК», «EMS» после поступления оплаты заказа.

Подробнее о способах доставки...

 

 

 

Контакты

  • +7 495 204-27-80
  • Пн.-Пт.: с 1000 до 1900
  • Этот адрес электронной почты защищен от спам-ботов. У вас должен быть включен JavaScript для просмотра.
  • Реквизиты организации