mirror of
https://github.com/brmlab/brmdoor.git
synced 2025-06-07 11:14:01 +02:00
236 lines
5.4 KiB
Bash
Executable file
236 lines
5.4 KiB
Bash
Executable file
#!/bin/bash
|
|
WD=$(dirname $(readlink -f $0))
|
|
if [ -e $WD/brmdoor.conf ]; then
|
|
echo "Loading config file $WD/brmdoor.conf..."
|
|
. $WD/brmdoor.conf
|
|
else
|
|
echo "ERROR: Config file not found. Please create brmdoor.conf in the same directory as brmdoor-rpi.sh."
|
|
exit 1
|
|
fi
|
|
|
|
# WARNING - OPEN/DOOR are stored as GPIO values. Since we have pullups and switches that grounds these pins, values are inverted (ie. 1 means "CLOSED")
|
|
OPEN=1
|
|
DOOR=1
|
|
UNLOCKED=0
|
|
|
|
LOCK_TIMEOUT=3s
|
|
|
|
IGNORE_ALARM_SET=50
|
|
|
|
IGNORE_ALARM=0
|
|
|
|
export LD_LIBRARY_PATH=/usr/local/lib
|
|
|
|
clean_gpio() {
|
|
for i in $GPIO_LOCK $GPIO_LED $GPIO_BEEP $GPIO_SWITCH $GPIO_MAGSWITCH; do
|
|
echo in > /sys/class/gpio/gpio${i}/direction
|
|
echo $i > /sys/class/gpio/unexport
|
|
done
|
|
}
|
|
|
|
|
|
beep_invalid() {
|
|
for i in `seq 1 2`; do
|
|
echo 1 > /sys/class/gpio/gpio${GPIO_BEEP}/value
|
|
sleep 0.05s
|
|
echo 0 > /sys/class/gpio/gpio${GPIO_BEEP}/value
|
|
sleep 0.05s
|
|
done
|
|
}
|
|
|
|
beep_unlocked() {
|
|
for i in `seq 1 3`; do
|
|
echo 1 > /sys/class/gpio/gpio${GPIO_BEEP}/value
|
|
sleep 0.05s
|
|
echo 0 > /sys/class/gpio/gpio${GPIO_BEEP}/value
|
|
sleep 0.05s
|
|
done
|
|
}
|
|
|
|
|
|
beep_alarm() {
|
|
for i in `seq 1 10`; do
|
|
echo 1 > /sys/class/gpio/gpio${GPIO_BEEP}/value
|
|
sleep 0.5s
|
|
echo 0 > /sys/class/gpio/gpio${GPIO_BEEP}/value
|
|
sleep 0.5s
|
|
done
|
|
}
|
|
|
|
irc_message() {
|
|
if [ ! -p "$IRSSIFIFO" ]; then
|
|
echo "irssi fifo '$IRSSIFIFO' does not exist!"
|
|
return
|
|
fi
|
|
for chan in ${IRCCHANS[*]}; do
|
|
echo "MSG $chan $1" > "$IRSSIFIFO"
|
|
done
|
|
}
|
|
|
|
irc_status() {
|
|
if [ ! -p "$IRSSIFIFO" ]; then
|
|
echo "irssi fifo '$IRSSIFIFO' does not exist!"
|
|
return
|
|
fi
|
|
echo "TINFO" > "$IRSSIFIFO"
|
|
sleep 5s
|
|
for chan in ${IRCCHANS[*]}; do
|
|
echo "chan: $chan"
|
|
T=`cat "${IRSSITOPICS}/${chan}"`
|
|
NT=`echo "$T"|sed "s/$ROOM OPEN\|$ROOM CLOSED/$ROOM $1/"`
|
|
echo "t: $T"
|
|
echo "nt: $NT"
|
|
echo "sed: s/$ROOM OPEN\|$ROOM CLOSED/$ROOM $1/"
|
|
if [ "$NT" = "$T" ]; then
|
|
continue;
|
|
fi
|
|
echo "TOPIC $chan $NT" > "$IRSSIFIFO"
|
|
done
|
|
|
|
}
|
|
|
|
log_message() {
|
|
echo "`date "+%Y-%m-%d %T"` $1" >> ~/brmdoor.log
|
|
}
|
|
|
|
updateSpaceApi() {
|
|
local open=$1
|
|
local changestamp=$2
|
|
if [ -z $SPACEAPI_DST ] || [ ! -f $SPACEAPI_TPL ]; then
|
|
return
|
|
fi
|
|
|
|
cat "$SPACEAPI_TPL"| sed "s/##OPEN##/$open/g;s/##LASTCHANGE##/$changestamp/g" > $SPACEAPI_DST
|
|
}
|
|
|
|
trap clean_gpio EXIT
|
|
|
|
|
|
for i in $GPIO_LOCK $GPIO_LED $GPIO_BEEP $GPIO_SWITCH $GPIO_MAGSWITCH; do
|
|
echo $i > /sys/class/gpio/export
|
|
done
|
|
|
|
sleep 1 # do not remove unless running as root... few ms after exporting the GPIO the file is owned by root:root
|
|
|
|
for i in $GPIO_LOCK $GPIO_LED $GPIO_BEEP; do
|
|
echo "out" > /sys/class/gpio/gpio${i}/direction
|
|
done
|
|
|
|
for i in $GPIO_SWITCH $GPIO_MAGSWITCH; do
|
|
echo "in" > /sys/class/gpio/gpio${i}/direction
|
|
done
|
|
|
|
|
|
LOOP=0
|
|
|
|
NFC_FAILED=1
|
|
|
|
CURRENT_OPEN=`cat /sys/class/gpio/gpio${GPIO_SWITCH}/value`
|
|
LASTCHANGE=`date +%s`
|
|
|
|
if [ $CURRENT_OPEN -eq 1 ]; then
|
|
irc_status "CLOSED" &
|
|
updateSpaceApi false $LASTCHANGE
|
|
else
|
|
irc_status "OPEN" &
|
|
updateSpaceApi true $LASTCHANGE
|
|
fi
|
|
|
|
while true; do
|
|
CARD=`$NFC_BINARY`
|
|
RET=$?
|
|
if [ $RET -ne 0 ] && [ $NFC_FAILED -eq 1 ] ; then
|
|
NFC_FAILED=0
|
|
log_message "NFC_FAILURE"
|
|
logger -p user.error "[$IDENTITY] NFC failure"
|
|
# irc_message "[$IDENTITY] NFC error! Might be out of order!"
|
|
sleep 1s
|
|
continue
|
|
elif [ $RET -eq 0 ] && [ $NFC_FAILED -eq 0 ]; then
|
|
NFC_FAILED=1
|
|
log_message "NFC_BACK"
|
|
logger -p user.error "[$IDENTITY] NFC back"
|
|
# irc_message "[$IDENTITY] NFC communication is back!"
|
|
fi
|
|
|
|
if [ $IGNORE_ALARM -gt 0 ]; then
|
|
let IGNORE_ALARM=$IGNORE_ALARM-1
|
|
fi
|
|
|
|
if [ -n "$CARD" ]; then # we have a card
|
|
NAME=`grep -i "^[0-9a-zA-Z_-\.]* ${CARD}$" "$ALLOWED_LIST"| cut -d ' ' -f 1`
|
|
if [ -z "$NAME" ]; then
|
|
log_message "UNKNOWN_CARD $CARD" &
|
|
logger "[$IDENTITY] unauthorized access denied for card $CARD" &
|
|
irc_message "[$IDENTITY] unauthorized access denied" &
|
|
beep_invalid
|
|
else
|
|
log_message "DOOR_UNLOCKED $NAME $CARD" &
|
|
logger "[$IDENTITY] unlocked by $NAME $CARD" &
|
|
irc_message "[$IDENTITY] door unlocked" &
|
|
echo 1 > /sys/class/gpio/gpio${GPIO_LOCK}/value
|
|
beep_unlocked &
|
|
sleep $LOCK_TIMEOUT
|
|
echo 0 > /sys/class/gpio/gpio${GPIO_LOCK}/value
|
|
IGNORE_ALARM=$IGNORE_ALARM_SET
|
|
fi
|
|
fi
|
|
|
|
# check open/closed status
|
|
CURRENT_OPEN=`cat /sys/class/gpio/gpio${GPIO_SWITCH}/value`
|
|
if [ $CURRENT_OPEN -eq 1 -a $OPEN -eq 0 ]; then
|
|
log_message "STATUS_CLOSED" &
|
|
irc_message "[${STATUS}] update: CLOSED" &
|
|
irc_status "CLOSED" &
|
|
LASTCHANGE=`date +%s`
|
|
updateSpaceApi false $LASTCHANGE
|
|
IGNORE_ALARM=$IGNORE_ALARM_SET
|
|
if [ -n $IMAGE_DST ]; then
|
|
cp $IMAGE_CLOSED $IMAGE_DST
|
|
fi
|
|
fi
|
|
if [ $CURRENT_OPEN -eq 0 -a $OPEN -eq 1 ]; then
|
|
log_message "STATUS_OPEN" &
|
|
irc_message "[${STATUS}] update: OPEN" &
|
|
irc_status "OPEN" &
|
|
LASTCHANGE=`date +%s`
|
|
updateSpaceApi true $LASTCHANGE
|
|
if [ -n $IMAGE_DST ]; then
|
|
cp $IMAGE_OPEN $IMAGE_DST
|
|
fi
|
|
fi
|
|
|
|
CURRENT_DOOR=`cat /sys/class/gpio/gpio${GPIO_MAGSWITCH}/value`
|
|
|
|
OPEN=$CURRENT_OPEN
|
|
|
|
if [ $CURRENT_DOOR -eq 1 ] && [ $DOOR -eq 0 ] && [ $OPEN -eq 1 ] && [ $IGNORE_ALARM -eq 0 ]; then
|
|
log_message "DOOR_ALARM" &
|
|
irc_message "[$IDENTITY] alarm! (status closed, door opened, not unlocked)" &
|
|
beep_alarm
|
|
fi
|
|
|
|
DOOR=$CURRENT_DOOR
|
|
|
|
|
|
# just the led blinking stuff
|
|
if [ $LOOP -le 1 ]; then
|
|
if [ $OPEN -eq 1 ]; then
|
|
echo 0 > /sys/class/gpio/gpio${GPIO_LED}/value
|
|
else
|
|
echo 1 > /sys/class/gpio/gpio${GPIO_LED}/value
|
|
fi
|
|
fi
|
|
|
|
if [ $LOOP -gt 10 ]; then
|
|
LOOP=0
|
|
if [ $OPEN -eq 1 ]; then
|
|
echo 1 > /sys/class/gpio/gpio${GPIO_LED}/value
|
|
else
|
|
echo 0 > /sys/class/gpio/gpio${GPIO_LED}/value
|
|
fi
|
|
fi
|
|
|
|
let LOOP=$LOOP+1
|
|
sleep 1
|
|
done
|