Inital commit
This commit is contained in:
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
config/*.cfg
|
||||||
|
!config/Pinger.cfg
|
||||||
49
AddPinger.sh
Normal file
49
AddPinger.sh
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
#!/bin/ash
|
||||||
|
|
||||||
|
###############################################################
|
||||||
|
# @scriptname: AddPinger #
|
||||||
|
# @description: #
|
||||||
|
# Creates configuration and service files #
|
||||||
|
# #
|
||||||
|
# @project: SmartPinger #
|
||||||
|
# @author: Bram Prieshof #
|
||||||
|
###############################################################
|
||||||
|
|
||||||
|
#Goto ProjectRoot
|
||||||
|
cd "$( dirname "$0" )"
|
||||||
|
|
||||||
|
#Request argument for type of new pinger
|
||||||
|
case $1 in
|
||||||
|
|
||||||
|
-s|--smart)
|
||||||
|
NewPingerType=Smart
|
||||||
|
;;
|
||||||
|
|
||||||
|
-b|-bt|--bt|--bluetooth)
|
||||||
|
NewPingerType=Bt
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
echo "Pinger type missing or incorrect."
|
||||||
|
echo "Use '-s' or '--smart' for a smart pinger"
|
||||||
|
echo "or use '-b', '--bt' or '--bluetooth' for a bluetooth pinger."
|
||||||
|
exit 10
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
#Ask for name for new pinger
|
||||||
|
read -p "Enter name of pinger to be added: " NewPingerName
|
||||||
|
|
||||||
|
#Create service file
|
||||||
|
cp ./templates/"$NewPingerType"Ping.service.template /etc/init.d/$NewPingerType'Ping'$NewPingerName
|
||||||
|
chmod +x /etc/init.d/$NewPingerType'Ping'$NewPingerName
|
||||||
|
sed -i -e "/PingerName=/c\PingerName=$NewPingerName" /etc/init.d/$NewPingerType'Ping'$NewPingerName
|
||||||
|
|
||||||
|
#Create config file
|
||||||
|
cp ./templates/"$NewPingerType"Ping.cfg.template ./config/$NewPingerType'Ping_'$NewPingerName.cfg
|
||||||
|
|
||||||
|
#Instructions
|
||||||
|
echo "Before stating pinger edit the following config $(pwd)/config/"$NewPingerType"Ping_"$NewPingerName".cfg"
|
||||||
|
echo "Start pinger using 'service "$NewPingerType'Ping'$NewPingerName" start'"
|
||||||
|
echo "Enable pinger on boot using 'rc-update add "$NewPingerType'Ping'$NewPingerName" '"
|
||||||
|
echo "also don't forget 'lbu commit'"
|
||||||
20
README.md
Normal file
20
README.md
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Smart and BT pinger
|
||||||
|
## Support for Domoticz or Mqtt
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
General requirements: `fping bluez`.
|
||||||
|
Requirements Domoticz communication: `curl`.
|
||||||
|
Requirements mqtt communication: `mosquitto-clients`.
|
||||||
|
Expected installation directory `/opt/Pinger`.
|
||||||
|
Setup permissions using `chmod +x /opt/Pinger/bin/*`.
|
||||||
|
|
||||||
|
## Configuration
|
||||||
|
Use 'AddPinger.sh' to setup the pinger.
|
||||||
|
|
||||||
|
## Enable Bluetooth on raspberry pi's running alpine linux
|
||||||
|
Source: https://wiki.alpinelinux.org/wiki/Raspberry_Pi_3_-_Setting_Up_Bluetooth
|
||||||
|
* By default the UART Bluetooth controller is not automatically discovered,
|
||||||
|
enable it by uncommenting the line after `rpi bluetooth` in `/etc/mdev.conf`.
|
||||||
|
* Enable the bluetooth service on boot `rc-update add bluetooth`.
|
||||||
|
* Set `AutoEnable` to `true` under Policy in /etc/bluetooth/main.conf.
|
||||||
|
* Then tun'lbu commit' and reboot.
|
||||||
91
bin/BtPing.sh
Normal file
91
bin/BtPing.sh
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
#!/bin/ash
|
||||||
|
|
||||||
|
###############################################################
|
||||||
|
# @scriptname: BtPinger #
|
||||||
|
# @description: #
|
||||||
|
# Checks if device is nearby using Bluetooth #
|
||||||
|
# and reports status to Home automation system #
|
||||||
|
# #
|
||||||
|
# @project: SmartPinger #
|
||||||
|
# @author: Bram Prieshof #
|
||||||
|
# @author: Branco van de Waal #
|
||||||
|
###############################################################
|
||||||
|
|
||||||
|
. $( dirname "$0" )/../config/BtPing_"$1".cfg
|
||||||
|
. $( dirname "$0" )/../config/Pinger.cfg
|
||||||
|
|
||||||
|
#Default disable log
|
||||||
|
: ${LogFile:="/dev/null"}
|
||||||
|
|
||||||
|
sendDomoticz() {
|
||||||
|
#Set messages to send to Domoticz
|
||||||
|
if [ "$DeviceStatus" = Online ]; then
|
||||||
|
DomoSendMSG=On
|
||||||
|
elif [ "$DeviceStatus" = Offline ]; then
|
||||||
|
DomoSendMSG=On
|
||||||
|
else
|
||||||
|
echo "WARN: device status is unset" | tee -a $LogFile
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check Online / Offline state of Domoticz device
|
||||||
|
if [ "$DomoSendMSG" != "$(curl -s "http://"$DomoticzAddr"/json.htm?type=devices&rid="$DomoticzIDX"" | grep '"Data" :' | awk '{ print $3 }' | sed 's/[!@#\$%",^&*()]//g')" ] ; then
|
||||||
|
echo "Updating Domoticz device" | tee -a $LogFile
|
||||||
|
curl -s "http://"$DomoticzAddr"/json.htm?type=command¶m=switchlight&idx="$DomoticzIDX"&switchcmd="$DomoSendMSG"" 2>&1 1>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Clean up
|
||||||
|
unset DomoSendMSG
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMqtt() {
|
||||||
|
#Send MQTT device status message
|
||||||
|
mosquitto_pub -h $MqttIP -u $MqttUser -p $MqttPassword -r -q 1 -t $MqttBaseTopic/$DeviceName/Status -m "$(eval echo \$Mqtt"$Status"Msg)"
|
||||||
|
mosquitto_pub -h $MqttIP -u $MqttUser -p $MqttPassword -r -q 1 -t $MqttBaseTopic/$DeviceName/Technology -m "$Technology"
|
||||||
|
}
|
||||||
|
|
||||||
|
while [ 1 ]
|
||||||
|
do
|
||||||
|
#Prepair for run
|
||||||
|
DeviceStatus=Offline
|
||||||
|
|
||||||
|
# First bluetooth ping attempt
|
||||||
|
if [ $DeviceStatus = Offline ]; then
|
||||||
|
if [[ "$(l2ping -c5 -s32 -t1000 "$DeviceBTMac" > /dev/null 2>&1 && echo "On" || echo "Off")" == 'On' ]]; then
|
||||||
|
DeviceStatus="Online"
|
||||||
|
Technology="Bluetooth"
|
||||||
|
Attempt="1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Second bluetooth ping attempt
|
||||||
|
if [ $DeviceStatus = Offline ]; then
|
||||||
|
if [[ "$(l2ping -c5 -s32 -t1000 "$DeviceBTMac" > /dev/null 2>&1 && echo "On" || echo "Off")" == 'On' ]]; then
|
||||||
|
DeviceStatus="Online"
|
||||||
|
Technology="Bluetooth"
|
||||||
|
Attempt="2"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If the device is still offline, set Technology and Attempt to None
|
||||||
|
if [ $DeviceStatus = Offline ]; then
|
||||||
|
Technology="N/A"
|
||||||
|
Attempt="N/A"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Report Current status
|
||||||
|
echo "$(date '+%d/%m/%Y %H:%M') | Device: $DeviceName | Status: $DeviceStatus | Technology: $Technology | Attempt: $Attempt |" | tee -a $LogFile
|
||||||
|
#SendMsg to automation system
|
||||||
|
if [[ "$DeviceStatus" != "$PreviousDeviceStatus" ]]; then
|
||||||
|
send$MsgProtocol
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Wait for next run if device is online
|
||||||
|
if [ "$DeviceStatus" = Online ]; then
|
||||||
|
echo "Online, Waiting"
|
||||||
|
sleep 20
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Save current status and clean up for next run
|
||||||
|
PreviousDeviceStatus=$DeviceStatus
|
||||||
|
unset DeviceStatus Technology Attempt
|
||||||
|
done
|
||||||
111
bin/SmartPing.sh
Normal file
111
bin/SmartPing.sh
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
#!/bin/ash
|
||||||
|
|
||||||
|
###############################################################
|
||||||
|
# @scriptname: SmartPinger #
|
||||||
|
# @description: #
|
||||||
|
# Checks if device is nearby first using WiFi, #
|
||||||
|
# if not it will check using Bluetooth #
|
||||||
|
# and reports status to Home automation system #
|
||||||
|
# #
|
||||||
|
# @project: SmartPinger #
|
||||||
|
# @author: Bram Prieshof #
|
||||||
|
# @author: Branco van de Waal #
|
||||||
|
###############################################################
|
||||||
|
|
||||||
|
. $( dirname "$0" )/../config/SmartPing_"$1".cfg
|
||||||
|
. $( dirname "$0" )/../config/Pinger.cfg
|
||||||
|
unset $1
|
||||||
|
|
||||||
|
#Default disable log
|
||||||
|
: ${LogFile:="/dev/null"}
|
||||||
|
|
||||||
|
sendDomoticz() {
|
||||||
|
#Set messages to send to Domoticz
|
||||||
|
if [ "$DeviceStatus" = Online ]; then
|
||||||
|
DomoSendMSG=On
|
||||||
|
elif [ "$DeviceStatus" = Offline ]; then
|
||||||
|
DomoSendMSG=Off
|
||||||
|
else
|
||||||
|
echo "WARN: device status is unset" | tee -a $LogFile
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check Online / Offline state of Domoticz device
|
||||||
|
if [ "$DomoSendMSG" != "$(curl -s "http://"$DomoticzIP"/json.htm?type=devices&rid="$DomoticzIDX"" | grep '"Data" :' | awk '{ print $3 }' | sed 's/[!@#\$%",^&*()]//g')" ] ; then
|
||||||
|
echo "Updating Domoticz device" | tee -a $LogFile
|
||||||
|
curl -s "http://"$DomoticzIP"/json.htm?type=command¶m=switchlight&idx="$DomoticzIDX"&switchcmd="$DomoSendMSG"" 2>&1 1>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Clean up
|
||||||
|
unset DomoSendMSG
|
||||||
|
}
|
||||||
|
|
||||||
|
sendMqtt() {
|
||||||
|
#Send MQTT device status message
|
||||||
|
mosquitto_pub -h $MqttIP -u $MqttUser -p $MqttPassword -r -q 1 -t $MqttBaseTopic/$DeviceName/Status -m "$(eval echo \$Mqtt"$Status"Msg)"
|
||||||
|
mosquitto_pub -h $MqttIP -u $MqttUser -p $MqttPassword -r -q 1 -t $MqttBaseTopic/$DeviceName/Technology -m "$Technology"
|
||||||
|
}
|
||||||
|
|
||||||
|
while [ 1 ]
|
||||||
|
do
|
||||||
|
#Prepair for run
|
||||||
|
DeviceStatus=Offline
|
||||||
|
|
||||||
|
# First network ping attempt
|
||||||
|
fping -c5 -b 32 -t1000 $DeviceIP > /dev/null 2>&1
|
||||||
|
if [ "$?" = 0 ] ; then
|
||||||
|
DeviceStatus="Online"
|
||||||
|
Technology="Wifi"
|
||||||
|
Attempt="1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# First bluetooth ping attempt
|
||||||
|
if [ $DeviceStatus = Offline ]; then
|
||||||
|
if [[ "$(l2ping -c5 -s32 -t1000 "$DeviceBTMac" > /dev/null 2>&1 && echo "On" || echo "Off")" == 'On' ]]; then
|
||||||
|
DeviceStatus="Online"
|
||||||
|
Technology="Bluetooth"
|
||||||
|
Attempt="1"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Second network ping attempt
|
||||||
|
if [ $DeviceStatus = Offline ]; then
|
||||||
|
fping -c5 -b 32 -t1000 $DeviceIP > /dev/null 2>&1
|
||||||
|
if [ "$?" = 0 ] ; then
|
||||||
|
DeviceStatus="Online"
|
||||||
|
Technology="Wifi"
|
||||||
|
Attempt="2"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Second bluetooth ping attempt
|
||||||
|
if [ $DeviceStatus = Offline ]; then
|
||||||
|
if [[ "$(l2ping -c5 -s32 -t1000 "$DeviceBTMac" > /dev/null 2>&1 && echo "On" || echo "Off")" == 'On' ]]; then
|
||||||
|
DeviceStatus="Online"
|
||||||
|
Technology="Bluetooth"
|
||||||
|
Attempt="2"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
# If the device is still offline, set Technology and Attempt to None
|
||||||
|
if [ $DeviceStatus = Offline ]; then
|
||||||
|
Technology="N/A"
|
||||||
|
Attempt="N/A"
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Report Current status
|
||||||
|
echo "$(date '+%d/%m/%Y %H:%M') | Device: $DeviceName | Status: $DeviceStatus | Technology: $Technology | Attempt: $Attempt |" | tee -a $LogFile
|
||||||
|
#SendMsg to automation system
|
||||||
|
if [[ "$DeviceStatus" != "$PreviousDeviceStatus" ]]; then
|
||||||
|
send$MsgProtocol
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Wait for next run if device is online
|
||||||
|
if [ "$DeviceStatus" = Online ]; then
|
||||||
|
echo "Online, Waiting"
|
||||||
|
sleep 60
|
||||||
|
fi
|
||||||
|
|
||||||
|
#Save current status and clean up for next run
|
||||||
|
PreviousDeviceStatus=$DeviceStatus
|
||||||
|
unset DeviceStatus Technology Attempt
|
||||||
|
done
|
||||||
21
config/Pinger.cfg
Normal file
21
config/Pinger.cfg
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#Smart/BT Pinger general configuration
|
||||||
|
|
||||||
|
##Message Protocol
|
||||||
|
### Set to Mqtt or Domoticz
|
||||||
|
MsgProtocol=Mqtt
|
||||||
|
|
||||||
|
##Mqtt connection settings
|
||||||
|
MqttIP="127.0.0.1"
|
||||||
|
MqttUser=""
|
||||||
|
MqttPassword=""
|
||||||
|
|
||||||
|
##Mqtt message settings
|
||||||
|
MqttBaseTopic="PingPi"
|
||||||
|
MqttOnlineMsg="home"
|
||||||
|
MqttOfflineMsg="not_home"
|
||||||
|
|
||||||
|
##Domoticz connection settings
|
||||||
|
DomoticzAddr='127.0.0.1:8080'
|
||||||
|
|
||||||
|
##Uncomment/Comment to Enable/Disable logging
|
||||||
|
#LogFile=/opt/out.log
|
||||||
5
templates/BtPing.cfg.template
Normal file
5
templates/BtPing.cfg.template
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Set device parameters
|
||||||
|
DeviceName=''
|
||||||
|
DeviceBTMac=''
|
||||||
|
#Domoticz settings(Leave empty if using mqtt)
|
||||||
|
DomoticzIDX=''
|
||||||
13
templates/BtPing.service.template
Normal file
13
templates/BtPing.service.template
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/sbin/openrc-run
|
||||||
|
PingerName=<NAME>
|
||||||
|
|
||||||
|
name=$RC_SVCNAME
|
||||||
|
description="Smartpinger ${PingerName}"
|
||||||
|
supervisor="supervise-daemon"
|
||||||
|
command="/opt/Pinger/bin/BtPing.sh"
|
||||||
|
command_args="${PingerName}"
|
||||||
|
command_user="root"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
after net bluetooth
|
||||||
|
}
|
||||||
6
templates/SmartPing.cfg.template
Normal file
6
templates/SmartPing.cfg.template
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Set device parameters
|
||||||
|
DeviceName=''
|
||||||
|
DeviceIP=''
|
||||||
|
DeviceBTMac=''
|
||||||
|
#Domoticz settings(Leave empty if using mqtt)
|
||||||
|
DomoticzIDX=''
|
||||||
13
templates/SmartPing.service.template
Normal file
13
templates/SmartPing.service.template
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#!/sbin/openrc-run
|
||||||
|
PingerName=<NAME>
|
||||||
|
|
||||||
|
name=$RC_SVCNAME
|
||||||
|
description="Smartpinger ${PingerName}"
|
||||||
|
supervisor="supervise-daemon"
|
||||||
|
command="/opt/Pinger/bin/SmartPing.sh"
|
||||||
|
command_args="${PingerName}"
|
||||||
|
command_user="root"
|
||||||
|
|
||||||
|
depend() {
|
||||||
|
after net bluetooth
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user