Martin Sebald
7 years ago
commit
d42317e342
6 changed files with 218 additions and 0 deletions
@ -0,0 +1,4 @@ |
|||
Switch Smartphone1_DDWRT1 "Smartphone 1 [MAP(presence.map):%s]" |
|||
Switch Smartphone1_DDWRT2 "Smartphone 1 [MAP(presence.map):%s]" |
|||
Switch Smartphone2_DDWRT1 "Smartphone 2 [MAP(presence.map):%s]" |
|||
Switch Smartphone2_DDWRT2 "Smartphone 2 [MAP(presence.map):%s]" |
@ -0,0 +1,145 @@ |
|||
############################################################### |
|||
# |
|||
# Proximity detection |
|||
# |
|||
# A script designed to run on a router running DD-WRT to detect certain devices connected to the router. |
|||
# It runs at startup and runs continually, checking for a specific list of devices (phones/laptop, etc) |
|||
# that connect wirelessly to the router. Once a device is connected, the OpenHAB status will |
|||
# be updated with either an ON or OFF. Make sure you set up a switch item in OpenHAB for each device |
|||
# you want to track. |
|||
# |
|||
# The searching frequency can be adjusted to be slower/faster depending on your requirements. Searching too fast |
|||
# could burden your router. Too slow might not update the status as necessary for the application. |
|||
# |
|||
|
|||
# Make changes below |
|||
# MAC address of each device to watch. Don't leave blank. |
|||
# For security purposes, if your router requires a password, even if someone could clone the MAC of your |
|||
# phone, they would still require the password of your network to link to your router. |
|||
macdevice1="00:11:22:33:44:55" #Smartphone 1 |
|||
macdevice2="11:22:33:44:55:66" #Smartphone 2 |
|||
macdevice3="22:33:44:55:66:77" #Smartphone 3 |
|||
macdevice4="33:44:55:66:77:88" #Smartphone 4 |
|||
|
|||
#OpenHAB IP Address and port |
|||
IPAddr="1.2.3.4" |
|||
port="8080" |
|||
|
|||
# OpenHAB switch items to be updated for each tracked MAC |
|||
item1="Smartphone1_DDWRT1" |
|||
item2="Smartphone2_DDWRT1" |
|||
item3="Smartphone3_DDWRT1" |
|||
item4="Smartphone4_DDWRT1" |
|||
|
|||
# Occupied and unoccupied delay in seconds to check status |
|||
# Adjust for shorter/longer wait times. For instance, when one device is already |
|||
# connected, you might want to check less frequently. This could also delay the |
|||
# notification of a disconnect. |
|||
delay_occupied=4 |
|||
delay_unoccupied=2 |
|||
|
|||
# initial testing loop count - uncomment the counter near the bottom of the script for testing only. |
|||
limit=120 |
|||
|
|||
############################################### |
|||
# do not change below here |
|||
############################################### |
|||
|
|||
sleep |
|||
#initialize internal variables |
|||
|
|||
# status of each MAC. 0=disconnected. 1=connected. -1 initially forces isy update first loop |
|||
macconnected1=-1 |
|||
macconnected2=-1 |
|||
macconnected3=-1 |
|||
macconnected4=-1 |
|||
connected=-1 |
|||
# total number of currently conencted devices. |
|||
currentconnected=0 |
|||
counter=1 |
|||
|
|||
# Initial testing loop. Will run continually after testing is complete |
|||
while [ $counter -lt $limit ]; do |
|||
|
|||
#maclist stored mac listing in router from status screen |
|||
maclist=$(wl_atheros assoclist | cut -d" " -f2) |
|||
|
|||
#reset current status. Two variables are used for each device. The past known status and the current |
|||
# status. Only a change is reported to the ISY. Otherwise, it would constantly be updating the ISY with |
|||
# the current status creating unnecessary traffic for both the router and the ISY |
|||
maccurrent1=0; |
|||
maccurrent2=0; |
|||
maccurrent3=0; |
|||
maccurrent4=0; |
|||
|
|||
|
|||
# compare each device that is currently connected to the MAC devices we want to watch. |
|||
for mac in $maclist; do |
|||
case $mac in |
|||
"$macdevice1") maccurrent1=1;; |
|||
"$macdevice2") maccurrent2=1;; |
|||
"$macdevice3") maccurrent3=1;; |
|||
"$macdevice4") maccurrent4=1;; |
|||
esac |
|||
done |
|||
|
|||
# Look for a change in status from the old known to the current status. |
|||
# If it changed, update the ISY. Otherwise it leaves it as is. |
|||
if [ $macconnected1 -ne $maccurrent1 ]; then |
|||
if [ $maccurrent1 -eq 1 ]; then |
|||
macstatus1="ON"; |
|||
else |
|||
macstatus1="OFF"; |
|||
fi |
|||
curl -X POST -d $macstatus1 -H "Content-Type: text/plain" -i http://$IPAddr:$port/rest/items/$item1 |
|||
fi |
|||
|
|||
if [ $macconnected2 -ne $maccurrent2 ]; then |
|||
if [ $maccurrent2 -eq 1 ]; then |
|||
macstatus2="ON"; |
|||
else |
|||
macstatus2="OFF"; |
|||
fi |
|||
curl -X POST -d $macstatus2 -H "Content-Type: text/plain" -i http://$IPAddr:$port/rest/items/$item2 |
|||
fi |
|||
|
|||
if [ $macconnected3 -ne $maccurrent3 ]; then |
|||
if [ $maccurrent3 -eq 1 ]; then |
|||
macstatus3="ON"; |
|||
else |
|||
macstatus3="OFF"; |
|||
fi |
|||
curl -X POST -d $macstatus3 -H "Content-Type: text/plain" -i http://$IPAddr:$port/rest/items/$item3 |
|||
fi |
|||
|
|||
if [ $macconnected4 -ne $maccurrent4 ]; then |
|||
if [ $maccurrent4 -eq 1 ]; then |
|||
macstatus4="ON"; |
|||
else |
|||
macstatus4="OFF"; |
|||
fi |
|||
curl -X POST -d $macstatus4 -H "Content-Type: text/plain" -i http://$IPAddr:$port/rest/items/$item4 |
|||
fi |
|||
|
|||
# Update the known status from the current. Ready for the next loop. |
|||
macconnected1=$maccurrent1; |
|||
macconnected2=$maccurrent2; |
|||
macconnected3=$maccurrent3; |
|||
macconnected4=$maccurrent4; |
|||
|
|||
# Total up the number of devices connected. |
|||
let currentconnected=$macconnected1+$macconnected2+$macconnected3+$macconnected4 |
|||
|
|||
connected=$currentconnected |
|||
|
|||
# Delay (sleep) depending on the connection status. |
|||
# No devices connected could delay less. Once a device is connected, it could delay longer. |
|||
if [ $connected -gt 0 ]; then |
|||
sleep $delay_occupied |
|||
else |
|||
sleep $delay_occupied |
|||
fi |
|||
|
|||
#for testing only - uncomment to have the looping stop at X loops defined in variable: limit. |
|||
#let counter=$counter+1 |
|||
done |
@ -0,0 +1,2 @@ |
|||
Switch Smartphone1_Fritzbox "Smartphone 1 [MAP(presence.map):%s]" { fritzboxtr064="maconline:00-11-22-33-44-55" } |
|||
Switch Smartphone2_Fritzbox "Smartphone 2 [MAP(presence.map):%s]" { fritzboxtr064="maconline:11-22-33-44-55-66" } |
@ -0,0 +1,3 @@ |
|||
Switch Presence_Person1 "Person 1 anwesend [MAP(presence.map):%s]" |
|||
Switch Presence_Person2 "Person 2 anwesend [MAP(presence.map):%s]" |
|||
Switch Presence_Overall "Irgendjemand anwesend [MAP(presence.map):%s]" |
@ -0,0 +1,5 @@ |
|||
ON=Online |
|||
OFF=Offline |
|||
NULL=unbekannt |
|||
undefined=unbekannt |
|||
-=unbekannt |
@ -0,0 +1,59 @@ |
|||
rule "Presence Person1 online" |
|||
when |
|||
Item Smartphone1_Fritzbox received command ON or |
|||
Item Smartphone1_DDWRT1 received command ON or |
|||
Item Smartphone1_DDWRT2 received command ON |
|||
then |
|||
postUpdate(Presence_Person1, ON) |
|||
end |
|||
|
|||
rule "Presence Person1 offline" |
|||
when |
|||
Item Smartphone1_Fritzbox received command OFF or |
|||
Item Smartphone1_DDWRT1 received command OFF or |
|||
Item Smartphone1_DDWRT2 received command OFF |
|||
then |
|||
Thread::sleep(180000) // Warte 3 Minuten |
|||
if (Smartphone1_Fritzbox.state==OFF && Smartphone1_DDWRT1.state==OFF && Smartphone1_DDWRT2.state==OFF) { |
|||
postUpdate(Presence_Person1, OFF) |
|||
} |
|||
end |
|||
|
|||
rule "Presence Person2 online" |
|||
when |
|||
Item Smartphone2_Fritzbox received command ON or |
|||
Item Smartphone2_DDWRT1 received command ON or |
|||
Item Smartphone2_DDWRT2 received command ON |
|||
then |
|||
postUpdate(Presence_Person2, ON) |
|||
end |
|||
|
|||
rule "Presence Person2 offline" |
|||
when |
|||
Item Smartphone2_Fritzbox received command OFF or |
|||
Item Smartphone2_DDWRT1 received command OFF or |
|||
Item Smartphone2_DDWRT2 received command OFF |
|||
then |
|||
Thread::sleep(180000) // wait for 3 minutes |
|||
if (Smartphone2_Fritzbox.state==OFF && Smartphone2_DDWRT1.state==OFF && Smartphone2_DDWRT2.state==OFF) { |
|||
postUpdate(Presence_Person2, OFF) |
|||
} |
|||
end |
|||
|
|||
rule "Presence Overall online" |
|||
when |
|||
Item Presence_Person1 changed to ON or |
|||
Item Presence_Person2 changed to ON |
|||
then |
|||
postUpdate(Presence_Overall, ON) |
|||
end |
|||
|
|||
rule "Presence Overall offline" |
|||
when |
|||
Item Presence_Person1 changed to OFF or |
|||
Item Presence_Person2 changed to OFF |
|||
then |
|||
if (Presence_Person1.state==OFF && Presence_Person2.state==OFF) { |
|||
postUpdate(Presence_Overall, OFF) |
|||
} |
|||
end |
Loading…
Reference in new issue