Настраиваем "датчик присутствия" по 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)
Его и будем настраивать.

Внимание! Если curl не работает или нет желания его устанавливать, то можно его и не ставить и вообще попробовать обойтись без него. Обновленную версия скрипта из 4 шага см. в конце.

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&param=switchlight&idx=$idx&switchcmd=On" > /dev/null
else
echo "SetState=Off"
curl -s "$dzUrl?type=command&param=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&param=switchlight&idx=$idx&switchcmd=On" -O - -q)
else
#echo "SetState=Off"
DomoticzResult=$(wget "$dzUrl?type=command&param=switchlight&idx=$idx&switchcmd=Off" -O - -q)
fi
fi
и не забываем изменить параметры в начале скрипта (выделено красным):

dzIpAddress="192.168.0.130:8080" - указываем адрес и порт домотикза
dzUser="vasyapupkin" - если необходимо прописываем логин
dzPassword="12345678" - если указали логин, то обязательно указываем и пароль

Комментарии

Популярные сообщения