chch-power/light.sh

132 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
TMPFILE_BASE=/tmp/light_state
TMPFILE_CUSTOM_BASE=/tmp/light_state_custom
TMPFILE_PID_BASE=/tmp/light_state_pid
ROOM_NUMBER="$1"
COLOR="$2"
ROOM_COUNT=3
DFAULT_LIGHT_STATE=0
STATE_0="a\x00\x03\x00\x00\x00|000000000000000000;\
000000000000000000;\
000000000000000000"
STATE_1="a\x00\x03\xff\xff\xff|255255255255255255;\
000000000000000000;\
000000000000000000"
STATE_2="n\x00\x02\x01\x00|170000070150000050;\
000000000000000000;\
000000000000000000"
STATE_3="!/usr/bin/python3 /home/automation/fensterbogenbeleuchtung_animations/animations.py|!;\
000000000000000000;\
000000000000000000"
get_room_color_string() {
case "$ROOM_NUMBER" in
1)
COLOR_A="$(echo "$COLOR" | sed "s/\(..\)\(..\)\(..\)/\\\x\2\\\x\1\\\x\3/g")"
COLOR_B="$(echo "$COLOR" | while read -N2 code; do printf "%03d" $((16#$code)); done)"
echo "a\x00\x03$COLOR_A|$COLOR_B$COLOR_B"
;;
2)
echo ""
;;
3)
echo ""
;;
*)
echo "ERROR: wrong room number, internal problem detected" >&1
exit 1
;;
esac
}
set_room_color() {
case "$ROOM_NUMBER" in
1)
find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_1_*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
COLOR_A="$(echo "$STATE" | cut -d";" -f1 | cut -d"|" -f1)"
COLOR_B="$(echo "$STATE" | cut -d";" -f1 | cut -d"|" -f2)"
if [ "${COLOR_A:0:1}" == "!" ]; then
${COLOR_A:1} >/dev/null 2>&1 &
echo $! > ${TMPFILE_PID_BASE}_1_A
else
for i in {1..5}; do (echo -en "$COLOR_A" > /dev/udp/172.23.92.15/49152 &); sleep .01; done
fi
if [ "${COLOR_B:0:1}" == "!" ]; then
(
while true; do
echo -en "255204017255204017" > /dev/udp/172.23.92.16/31302 &
sleep .5
done
) &
echo $! > ${TMPFILE_PID_BASE}_1_B
else
for i in {1..5}; do (echo -en "$COLOR_B" > /dev/udp/172.23.92.16/31302 &); sleep .01; done
fi
;;
2)
# COLOR_A="$(echo "$STATE" | cut -d";" -f2 | cut -d"|" -f1)"
# COLOR_B="$(echo "$STATE" | cut -d";" -f2 | cut -d"|" -f2)"
# echo -en "$COLOR_A" > /dev/null
# echo -en "$COLOR_B" > /dev/null
echo "not implemented" >&1
exit 1
;;
3)
# COLOR_A="$(echo "$STATE" | cut -d";" -f3 | cut -d"|" -f1)"
# COLOR_B="$(echo "$STATE" | cut -d";" -f3 | cut -d"|" -f2)"
# echo -en "$COLOR_A" > /dev/null
# echo -en "$COLOR_B" > /dev/null
echo "not implemented" >&1
exit 1
;;
*)
echo "ERROR: wrong room number, internal problem detected" >&1
exit 1
;;
esac
}
if ! [[ "$ROOM_NUMBER" =~ ^[0-9]+$ ]] || ! [ "$ROOM_NUMBER" -gt 0 -a "$ROOM_NUMBER" -le "$ROOM_COUNT" ]; then
echo "ERROR: please specify a valid room number" >&1
exit 1
fi
touch "${TMPFILE_BASE}_$ROOM_NUMBER"
LIGHT_STATE=$(cat "${TMPFILE_BASE}_$ROOM_NUMBER")
[ -z "$LIGHT_STATE" ] && LIGHT_STATE=$DFAULT_LIGHT_STATE
if [ -z "$COLOR" ]; then
if ! [ -f "${TMPFILE_CUSTOM_BASE}_$ROOM_NUMBER" ]; then # restore previous colour
LIGHT_STATE=$(( $LIGHT_STATE+1 ))
else
rm -f "${TMPFILE_CUSTOM_BASE}_$ROOM_NUMBER"
fi
case $LIGHT_STATE in
0)
STATE=$STATE_0
;;
1)
STATE=$STATE_1
;;
2)
STATE=$STATE_2
;;
3)
STATE=$STATE_3
;;
*)
STATE=$STATE_0
LIGHT_STATE=0
;;
esac
else
STATE="$(get_room_color_string)"
touch "${TMPFILE_CUSTOM_BASE}_$ROOM_NUMBER"
fi
set_room_color
echo $LIGHT_STATE > "${TMPFILE_BASE}_$ROOM_NUMBER"