Настраиваем "датчик присутствия" по MAC-адресу в домотикз
Потребуется роутер который умеет запускать bash скрипты и у которого есть cron.
Схема следующая: на роутере запускается по расписанию скрипт, который проверяет наличие MAC-адреса в таблице подключенных клиентов.
В зависимости от результатов поиска, скрипт переключает в домотикзе виртуальный переключатель в состояние On или Off.
Приблизительно так-же работает плагин для домотикза Domoticz_iDetect: https://github.com/d-EScape/Domoticz_iDetect
У меня этот плагин не заработал. Ошибку "No usable commandline to check presence. Trying again to detect router capabilities" победить не удалось, и по совету разработчика этого плагина, я его отключил и удалил.
Используемый метод обсуждался на форуме домотикза: https://www.domoticz.com/forum/viewtopic.php?f=61&t=15531
Но тот скрипт на моём роутере тоже не заработал (ошибка: wl command not found).
Пришлось скрипт допиливать до работоспособного состояния.
В наличии имеется роутер TP-Link TL-WR1043N/ND v1 (версия прошивки: OpenWrt Chaos Calmer 15.05.1)
Его и будем настраивать.
Схема следующая: на роутере запускается по расписанию скрипт, который проверяет наличие MAC-адреса в таблице подключенных клиентов.
В зависимости от результатов поиска, скрипт переключает в домотикзе виртуальный переключатель в состояние On или Off.
Приблизительно так-же работает плагин для домотикза Domoticz_iDetect: https://github.com/d-EScape/Domoticz_iDetect
У меня этот плагин не заработал. Ошибку "No usable commandline to check presence. Trying again to detect router capabilities" победить не удалось, и по совету разработчика этого плагина, я его отключил и удалил.
Используемый метод обсуждался на форуме домотикза: https://www.domoticz.com/forum/viewtopic.php?f=61&t=15531
Но тот скрипт на моём роутере тоже не заработал (ошибка: wl command not found).
Пришлось скрипт допиливать до работоспособного состояния.
В наличии имеется роутер TP-Link TL-WR1043N/ND v1 (версия прошивки: OpenWrt Chaos Calmer 15.05.1)
Его и будем настраивать.
Внимание! Если curl не работает или нет желания его устанавливать, то можно его и не ставить и вообще попробовать обойтись без него. Обновленную версия скрипта из 4 шага см. в конце.
1. В домотикзе создаем виртуальное (DUMMY) устройство с типом "переключатель" (switch) с любым именем и запоминаем его IDX. Больше в домотикзе ничего настраивать не требуется.
2. Заходим на роутер по SSH и устанавливаем необходимые компоненты:
opkg update
opkg install curl
opkg install iwinfo
3. В корне файловой системы создаем папку myscripts
4. В этой папке создаем файл скрипта "presence_detection" со следующим содержимым:
1. В домотикзе создаем виртуальное (DUMMY) устройство с типом "переключатель" (switch) с любым именем и запоминаем его IDX. Больше в домотикзе ничего настраивать не требуется.
2. Заходим на роутер по SSH и устанавливаем необходимые компоненты:
opkg update
opkg install curl
opkg install iwinfo
3. В корне файловой системы создаем папку myscripts
4. В этой папке создаем файл скрипта "presence_detection" со следующим содержимым:
Внимание! Если curl не работает или не вы его не стали устанавливать, обновленная версия скрипта из этого шага см. в конце.
#!/bin/sh
# INSERT YOUR DOMOTICZ SETTINGS THERE:
dzIpAddress="192.168.0.130:8080" # ipAddress:port
dzUser="vasyapupkin"
dzPassword="12345678"
# ----------------------------------------------------------------------------#
# PLEASE, DO NOT TOUCH ANYTHING AFTER THIS LINE IF YOU DO NOT UNDERSTAND THIS #
# ----------------------------------------------------------------------------#
# get parameters
mac=`echo $1 | tr '[a-z]' '[A-Z]'`
idx=$2
# prepare variables
device_present=Off
dzUrl="http://$dzUser:$dzPassword@$dzIpAddress/json.htm"
if [ -z $dzUser]; then
dzUrl="http://$dzIpAddress/json.htm"
fi
# get all WiFi interface names
for iface in $(iwinfo | grep ESSID | cut -f 1 -s -d" ")
do
#enumerate MAC address - try find
for mac_client in $(iwinfo $iface assoclist | grep dBm | cut -f 1 -s -d" " | tr 'a-z' 'A-Z')
do
if [ "$mac" = "$mac_client" ]; then
device_present=On
fi
done
done
# get current status
domoticz_status=`curl -s "$dzUrl?type=devices&rid=$idx" | grep Status | awk '{print $3}' | sed 's/[",]//g'`
# tell domoticz the new device status
if [ $domoticz_status != $device_present ]; then
if [ $device_present = "On" ]; then
echo "SetState=On"
curl -s "$dzUrl?type=command¶m=switchlight&idx=$idx&switchcmd=On" > /dev/null
else
echo "SetState=Off"
curl -s "$dzUrl?type=command¶m=switchlight&idx=$idx&switchcmd=Off" > /dev/null
fi
fi
|
dzIpAddress="192.168.0.130:8080" - указываем адрес и порт домотикза
dzUser="vasyapupkin" - если необходимо прописываем логин
dzPassword="12345678" - если указали логин, то обязательно указываем и пароль
5. В свойствах файла включаем разрешение на запуск.
6. Проверяем работоспособность:
вместо MAC_ADDRESS подставляем мак адрес устройства присутствие которого необходимо отслеживать,
вместо DEVICE_IDX подставляем IDX dummy устройства
/myscripts/presence_detection MAC_ADDRESS DEVICE_IDX
Например:
/myscripts/presence_detection AA:BB:CC:DD:EE:FF 123
7. Если всё прошло без ошибок, настраиваем в cron-е запуск раз в минуту: в веб интерфейсе переходим в "Система => Запланированные задания"
И добавляем в самый конец (не забываем подставить правильные мак-адрес и IDX устройства):
* * * * * /myscripts/presence_detection MAC_ADDRESS DEVICE_IDX
(Если нужно отслеживать несколько устройств, то для каждого надо создать в домотикзе по датчику и в кроне добавить по строке для каждого устройства.)
8. Всё! Идем в домотикз и проверяем работоспособность включая/отключая wifi на телефоне.
Вот так работает встроенная в домотикз пинговалка (System Alive Checker (Ping)) :
Телефон постоянно пропадает/появляется, хотя никто его даже не трогал.
А вот так работает датчик присутствия по мак-адресу (за тот же период ни одного "отвала")
UPD: 2021-01-23
После перепрошивки роутера оказалось что curl почему-то не работает и выдает ошибку:
curl: can't load library 'libmbedtls.so.9'
искать причины такой ошибки в только-что установленной прошивке нет особого желания.
Итого, если нет желания устанавливать curl и тратить драгоценное место в памяти роутера, то можно попробовать обойтись и без него.
Скрипт из четвёртого шага (версия 2.0) :
#!/bin/sh # INSERT YOUR DOMOTICZ SETTINGS THERE: dzIpAddress="192.168.0.130:8080" # ipAddress:port dzUser="vasyapupkin" dzPassword="12345678" # ----------------------------------------------------------------------------# # PLEASE, DO NOT TOUCH ANYTHING AFTER THIS LINE IF YOU DO NOT UNDERSTAND THIS # # ----------------------------------------------------------------------------# # get parameters mac=`echo $1 | tr '[a-z]' '[A-Z]'` idx=$2 if [ "$mac" = "" ]; then exit fi if [ "$idx" = "" ]; then exit fi # prepare variables device_present="Off" dzUrl="http://$dzUser:$dzPassword@$dzIpAddress/json.htm" if [ -z $dzUser]; then dzUrl="http://$dzIpAddress/json.htm" fi # get all WiFi interface names for iface in $(iwinfo | grep ESSID | cut -f 1 -s -d" ") do #enumerate MAC address - try find for mac_client in $(iwinfo $iface assoclist | grep dBm | cut -f 1 -s -d" " | tr 'a-z' 'A-Z') do if [ "$mac" = "$mac_client" ]; then device_present="On" fi done done # get current status . /usr/share/libubox/jshn.sh DomoticzResult=$(wget "$dzUrl?type=devices&rid=$idx" -O - -q) json_load "$DomoticzResult" json_select result json_select "1" json_get_var domoticz_status Status # tell domoticz the new device status if [ "$domoticz_status" != "$device_present" ]; then if [ $device_present = "On" ]; then #echo "SetState=On" DomoticzResult=$(wget "$dzUrl?type=command¶m=switchlight&idx=$idx&switchcmd=On" -O - -q) else #echo "SetState=Off" DomoticzResult=$(wget "$dzUrl?type=command¶m=switchlight&idx=$idx&switchcmd=Off" -O - -q) fi fi |
dzIpAddress="192.168.0.130:8080" - указываем адрес и порт домотикза
dzUser="vasyapupkin" - если необходимо прописываем логин
dzPassword="12345678" - если указали логин, то обязательно указываем и пароль
Комментарии
Отправить комментарий