chch-power/light.sh

203 lines
8.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"
sign() {
[ $1 -lt 0 ] && echo "-1"; [ $1 -eq 0 ] && echo "0"; [ $1 -gt 0 ] && echo "1"
}
ROOM_COUNT=3
STATE[0]="a\x00\x03\x00\x00\x00|000000000000000000;\
a\x00\x03\x00\x00\x00|000000;\
000000000000000000"
STATE[1]="a\x00\x03\xff\xff\xff|255255255255255255;\
a\x00\x03\xff\xff\xff|FFFFFF;\
000000000000000000"
STATE[2]="n\x00\x02\x01\x00|!;\
n\x00\x02\x01\x00|FFCC11;\
000000000000000000"
STATE[3]="!/usr/bin/python3 /home/automation/fensterbogenbeleuchtung_animations/animations.py|!;\
a\x00\x03\xff\xff\xff|!;\
000000000000000000"
GAMMA_LUT=(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 4 4 4 4 4 5 5 5 5 6 6 6 6 7 7 7 7 8 8 8 9 9 9 10 10 10 11 11 11 12 12 13 13 13 14 14 15 15 16 16 17 17 18 18 19 19 20 20 21 21 22 22 23 24 24 25 25 26 27 27 28 29 29 30 31 32 32 33 34 35 35 36 37 38 39 39 40 41 42 43 44 45 46 47 48 49 50 50 51 52 54 55 56 57 58 59 60 61 62 63 64 66 67 68 69 70 72 73 74 75 77 78 79 81 82 83 85 86 87 89 90 92 93 95 96 98 99 101 102 104 105 107 109 110 112 114 115 117 119 120 122 124 126 127 129 131 133 135 137 138 140 142 144 146 148 150 152 154 156 158 160 162 164 167 169 171 173 175 177 180 182 184 186 189 191 193 196 198 200 203 205 208 210 213 215 218 220 223 225 228 231 233 236 239 241 244 247 249 252 255)
# COLOR="$(echo "$COLOR" | sed -e "s/\(..\)\(..\)\(..\)/0\x\1 0\x\2 0\x\3 /g" | while read -d " " i; do printf '%02x' ${GAMMA_LUT[ $(printf '%d' $i) ]}; done)"
get_room_color_string() {
case "$ROOM_NUMBER" in
0)
COLOR="$(echo "$COLOR" | while read -N2 code; do printf "%03d" $((16#$code)); done)"
echo "$COLOR$COLOR"
;;
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)
COLOR_A="$(echo "$COLOR" | sed "s/\(..\)\(..\)\(..\)/\\\x\2\\\x\1\\\x\3/g")"
echo "a\x00\x03$COLOR_A|$COLOR"
;;
3)
echo ""
;;
*)
echo "ERROR: wrong room number, internal problem detected" >&1
exit 1
;;
esac
}
set_room_color() {
case "$ROOM_NUMBER" in
0)
find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_0*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
COLOR="$(echo "$STATE" | cut -d";" -f1 | cut -d"|" -f2)"
if [ "${COLOR:0:1}" == "!" ]; then
(
R1=$(( RANDOM % 256 )); G1=$(( RANDOM % 256 )); B1=$(( RANDOM % 256 ))
R2=$(( RANDOM % 256 )); G2=$(( RANDOM % 256 )); B2=$(( RANDOM % 256 ))
while true; do
R1_=$(( RANDOM % 256 )); G1_=$(( RANDOM % 256 )); B1_=$(( RANDOM % 256 ))
R2_=$(( RANDOM % 256 )); G2_=$(( RANDOM % 256 )); B2_=$(( RANDOM % 256 ))
while [ $R1 -ne $R1_ -a $G1 -ne $G1_ -a $B1 -ne $B1_ -a $R2 -ne $R2_ -a $G2 -ne $G2_ -a $B2 -ne $B2_ ]; do
DR1=$(sign $(($R1_-$R1))); DG1=$(sign $(($G1_-$G1))); DB1=$(sign $(($B1_-$B1)))
DR2=$(sign $(($R2_-$R2))); DG2=$(sign $(($G2_-$G2))); DB2=$(sign $(($B2_-$B2)))
R1=$(($R1+$DR1)); G1=$(($G1+$DG1)); B1=$(($B1+$DB1)); R2=$(($R2+$DR2)); G2=$(($G2+$DG2)); B2=$(($B2+$DB2))
echo "${GAMMA_LUT[$R1]} ${GAMMA_LUT[$G1]} ${GAMMA_LUT[$B1]} ${GAMMA_LUT[$R2]} ${GAMMA_LUT[$G2]} ${GAMMA_LUT[$B2]}" |\
while read code; do printf "%03d" $code; done > /dev/udp/172.23.92.19/31302 &
sleep .2
done
done
) &
PID=$!
echo $PID > ${TMPFILE_PID_BASE}_0.$PID
else
for i in {1..5}; do (echo -en "$COLOR" > /dev/udp/172.23.92.19/31302 &); sleep .1; done
fi
;;
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 &
PID=$!
echo $PID > ${TMPFILE_PID_BASE}_1_A.$PID
else
for i in {1..5}; do (echo -en "$COLOR_A" > /dev/udp/172.23.92.15/49152 &); sleep .1; done
fi
) &
if [ "${COLOR_B:0:1}" == "!" ]; then
(
R1=$(( RANDOM % 256 )); G1=$(( RANDOM % 256 )); B1=$(( RANDOM % 256 ))
R2=$(( RANDOM % 256 )); G2=$(( RANDOM % 256 )); B2=$(( RANDOM % 256 ))
while true; do
R1_=$(( RANDOM % 256 )); G1_=$(( RANDOM % 256 )); B1_=$(( RANDOM % 256 ))
R2_=$(( RANDOM % 256 )); G2_=$(( RANDOM % 256 )); B2_=$(( RANDOM % 256 ))
while [ $R1 -ne $R1_ -a $G1 -ne $G1_ -a $B1 -ne $B1_ -a $R2 -ne $R2_ -a $G2 -ne $G2_ -a $B2 -ne $B2_ ]; do
DR1=$(sign $(($R1_-$R1))); DG1=$(sign $(($G1_-$G1))); DB1=$(sign $(($B1_-$B1)))
DR2=$(sign $(($R2_-$R2))); DG2=$(sign $(($G2_-$G2))); DB2=$(sign $(($B2_-$B2)))
R1=$(($R1+$DR1)); G1=$(($G1+$DG1)); B1=$(($B1+$DB1)); R2=$(($R2+$DR2)); G2=$(($G2+$DG2)); B2=$(($B2+$DB2))
echo "${GAMMA_LUT[$R1]} ${GAMMA_LUT[$G1]} ${GAMMA_LUT[$B1]} ${GAMMA_LUT[$R2]} ${GAMMA_LUT[$G2]} ${GAMMA_LUT[$B2]}" |\
while read code; do printf "%03d" $code; done > /dev/udp/172.23.92.16/31302 &
sleep .2
done
done
) &
PID=$!
echo $PID > ${TMPFILE_PID_BASE}_1_B.$PID
else
for i in {1..5}; do (echo -en "$COLOR_B" > /dev/udp/172.23.92.16/31302 &); sleep .1; done
fi
;;
2)
find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_2_*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
# COLOR_A="$(echo "$STATE" | cut -d";" -f2 | cut -d"|" -f1)"
COLOR_B="$(echo "$STATE" | cut -d";" -f2 | cut -d"|" -f2)"
# if [ "${COLOR_B:0:1}" == "!" ]; then
#
# else
# echo -en "$COLOR_A" > /dev/udp/172.23.92.18/49152 &
# fi
if [ "${COLOR_B:0:1}" == "!" ]; then
(
R=$(( RANDOM % 256 )); G=$(( RANDOM % 256 )); B=$(( RANDOM % 256 ))
while true; do
R_=$(( RANDOM % 256 )); G_=$(( RANDOM % 256 )); B_=$(( RANDOM % 256 ))
while [ $R -ne $R_ -a $G -ne $G_ -a $B -ne $B_ ]; do
DR=$(sign $(($R_-$R))); DG=$(sign $(($G_-$G))); DB=$(sign $(($B_-$B)))
R=$(($R+$DR)); G=$((G+$DG)); B=$(($B+$DB))
wget -q --timeout 3 -O- --input-file <(
for i in 5:${GAMMA_LUT[$R]} 4:${GAMMA_LUT[$G]} 3:${GAMMA_LUT[$B]}; do
echo "http://172.23.92.5/ecmd?channel%20$(echo $i | cut -d: -f1)%20$(echo $i | cut -d: -f2)"
COLOR_B_TMP="$(echo "$COLOR_B_TMP" | cut -c3-)"
done
) > /dev/null 2>&1 &
PID=$!
sleep .2
kill -9 $PIDS >/dev/null 2>&1
done
done
) &
PID=$!
echo $PID > ${TMPFILE_PID_BASE}_2_B.$PID
else
COLOR_B_TMP=$COLOR_B
PIDS="$PIDS $!"
for i in 5 4 3; do
wget -q --timeout 3 -O- http://172.23.92.5/ecmd?channel%20$i%20$(printf "%d" "0x${COLOR_B_TMP:0:2}") > /dev/null 2>&1 &
PIDS="$PIDS $!"
COLOR_B_TMP="$(echo "$COLOR_B_TMP" | cut -c3-)"
done
sleep .5
kill -9 $PIDS >/dev/null 2>&1
fi
;;
3)
# find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_3_*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
# 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" -ge 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=0
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
[ $LIGHT_STATE -ge ${#STATE[*]} ] && LIGHT_STATE=0
STATE=${STATE[$LIGHT_STATE]}
else
STATE="$(get_room_color_string)"
touch "${TMPFILE_CUSTOM_BASE}_$ROOM_NUMBER"
fi
set_room_color
echo $LIGHT_STATE > "${TMPFILE_BASE}_$ROOM_NUMBER"