2017-02-05 00:41:08 +01:00
|
|
|
#!/bin/bash
|
2017-03-09 17:28:47 +01:00
|
|
|
#
|
2017-03-04 16:03:07 +01:00
|
|
|
TMPFILE_BASE=/tmp/light_state
|
2017-03-04 16:58:02 +01:00
|
|
|
TMPFILE_CUSTOM_BASE=/tmp/light_state_custom
|
2017-03-04 18:27:48 +01:00
|
|
|
TMPFILE_PID_BASE=/tmp/light_state_pid
|
2017-03-04 16:03:07 +01:00
|
|
|
ROOM_NUMBER="$1"
|
|
|
|
COLOR="$2"
|
2017-03-05 05:25:56 +01:00
|
|
|
sign() {
|
|
|
|
[ $1 -lt 0 ] && echo "-1"; [ $1 -eq 0 ] && echo "0"; [ $1 -gt 0 ] && echo "1"
|
|
|
|
}
|
2017-03-04 16:03:07 +01:00
|
|
|
|
|
|
|
ROOM_COUNT=3
|
2020-09-12 21:01:36 +02:00
|
|
|
STATE[0]="a\x00\x03\x00\x00\x00|000000000000000000;\
|
2017-03-13 22:46:52 +01:00
|
|
|
a\x00\x03\x00\x00\x00|000000;\
|
2017-03-11 00:04:46 +01:00
|
|
|
000000000000000000"
|
2020-09-12 21:01:36 +02:00
|
|
|
STATE[1]="a\x00\x03\xff\xff\xff|255255255255255255;\
|
2017-03-13 22:46:52 +01:00
|
|
|
a\x00\x03\xff\xff\xff|FFFFFF;\
|
2017-03-11 00:04:46 +01:00
|
|
|
000000000000000000"
|
2020-09-12 21:01:36 +02:00
|
|
|
STATE[2]="n\x00\x02\x01\x00|!;\
|
2017-03-13 22:46:52 +01:00
|
|
|
n\x00\x02\x01\x00|FFCC11;\
|
2017-03-11 00:04:46 +01:00
|
|
|
000000000000000000"
|
2020-09-12 21:01:36 +02:00
|
|
|
STATE[3]="!/usr/bin/python3 /home/automation/fensterbogenbeleuchtung_animations/animations.py|!;\
|
2017-03-14 00:18:15 +01:00
|
|
|
a\x00\x03\xff\xff\xff|!;\
|
2017-03-11 00:04:46 +01:00
|
|
|
000000000000000000"
|
2017-03-04 16:03:07 +01:00
|
|
|
|
2017-07-03 15:15:56 +02:00
|
|
|
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)
|
|
|
|
|
2020-09-19 18:49:15 +02:00
|
|
|
# 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)"
|
|
|
|
|
2017-03-04 16:03:07 +01:00
|
|
|
get_room_color_string() {
|
|
|
|
case "$ROOM_NUMBER" in
|
2017-11-30 22:09:03 +01:00
|
|
|
0)
|
|
|
|
COLOR="$(echo "$COLOR" | while read -N2 code; do printf "%03d" $((16#$code)); done)"
|
|
|
|
echo "$COLOR$COLOR"
|
|
|
|
;;
|
2017-03-04 16:03:07 +01:00
|
|
|
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)
|
2017-03-11 00:04:46 +01:00
|
|
|
COLOR_A="$(echo "$COLOR" | sed "s/\(..\)\(..\)\(..\)/\\\x\2\\\x\1\\\x\3/g")"
|
2017-03-13 22:59:24 +01:00
|
|
|
echo "a\x00\x03$COLOR_A|$COLOR"
|
2017-03-04 16:03:07 +01:00
|
|
|
;;
|
|
|
|
3)
|
|
|
|
echo ""
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "ERROR: wrong room number, internal problem detected" >&1
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
|
|
|
|
|
|
|
set_room_color() {
|
|
|
|
case "$ROOM_NUMBER" in
|
2017-11-30 22:09:03 +01:00
|
|
|
0)
|
2019-07-08 22:41:30 +02:00
|
|
|
find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_0*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
|
2017-11-30 22:09:03 +01:00
|
|
|
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 ))
|
2019-07-08 22:41:30 +02:00
|
|
|
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
|
2017-11-30 22:09:03 +01:00
|
|
|
DR1=$(sign $(($R1_-$R1))); DG1=$(sign $(($G1_-$G1))); DB1=$(sign $(($B1_-$B1)))
|
|
|
|
DR2=$(sign $(($R2_-$R2))); DG2=$(sign $(($G2_-$G2))); DB2=$(sign $(($B2_-$B2)))
|
2019-07-08 22:41:30 +02:00
|
|
|
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
|
2017-11-30 22:09:03 +01:00
|
|
|
done
|
|
|
|
done
|
|
|
|
) &
|
2019-07-07 00:03:37 +02:00
|
|
|
PID=$!
|
|
|
|
echo $PID > ${TMPFILE_PID_BASE}_0.$PID
|
2017-11-30 22:09:03 +01:00
|
|
|
else
|
2019-07-08 22:41:30 +02:00
|
|
|
for i in {1..5}; do (echo -en "$COLOR" > /dev/udp/172.23.92.19/31302 &); sleep .1; done
|
2017-11-30 22:09:03 +01:00
|
|
|
fi
|
|
|
|
;;
|
2017-03-04 16:03:07 +01:00
|
|
|
1)
|
2017-03-04 21:24:58 +01:00
|
|
|
find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_1_*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
|
2017-03-04 18:27:48 +01:00
|
|
|
COLOR_A="$(echo "$STATE" | cut -d";" -f1 | cut -d"|" -f1)"
|
|
|
|
COLOR_B="$(echo "$STATE" | cut -d";" -f1 | cut -d"|" -f2)"
|
2020-09-19 17:50:22 +02:00
|
|
|
(
|
|
|
|
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
|
|
|
|
) &
|
2017-03-04 21:24:58 +01:00
|
|
|
if [ "${COLOR_B:0:1}" == "!" ]; then
|
|
|
|
(
|
2017-03-05 05:25:56 +01:00
|
|
|
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 ))
|
2019-07-08 22:41:30 +02:00
|
|
|
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
|
2017-03-05 05:25:56 +01:00
|
|
|
DR1=$(sign $(($R1_-$R1))); DG1=$(sign $(($G1_-$G1))); DB1=$(sign $(($B1_-$B1)))
|
|
|
|
DR2=$(sign $(($R2_-$R2))); DG2=$(sign $(($G2_-$G2))); DB2=$(sign $(($B2_-$B2)))
|
2017-11-30 22:09:03 +01:00
|
|
|
R1=$(($R1+$DR1)); G1=$(($G1+$DG1)); B1=$(($B1+$DB1)); R2=$(($R2+$DR2)); G2=$(($G2+$DG2)); B2=$(($B2+$DB2))
|
2019-07-08 22:41:30 +02:00
|
|
|
echo "${GAMMA_LUT[$R1]} ${GAMMA_LUT[$G1]} ${GAMMA_LUT[$B1]} ${GAMMA_LUT[$R2]} ${GAMMA_LUT[$G2]} ${GAMMA_LUT[$B2]}" |\
|
2017-03-05 05:25:56 +01:00
|
|
|
while read code; do printf "%03d" $code; done > /dev/udp/172.23.92.16/31302 &
|
2017-11-30 23:21:26 +01:00
|
|
|
sleep .2
|
2017-03-04 21:24:58 +01:00
|
|
|
done
|
2017-03-05 05:25:56 +01:00
|
|
|
done
|
2017-03-04 21:24:58 +01:00
|
|
|
) &
|
2019-07-07 00:03:37 +02:00
|
|
|
PID=$!
|
|
|
|
echo $PID > ${TMPFILE_PID_BASE}_1_B.$PID
|
2017-03-04 21:24:58 +01:00
|
|
|
else
|
2019-07-08 22:41:30 +02:00
|
|
|
for i in {1..5}; do (echo -en "$COLOR_B" > /dev/udp/172.23.92.16/31302 &); sleep .1; done
|
2017-03-04 21:24:58 +01:00
|
|
|
fi
|
2017-03-04 16:03:07 +01:00
|
|
|
;;
|
|
|
|
2)
|
2017-03-14 00:18:15 +01:00
|
|
|
find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_2_*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
|
2017-03-04 18:27:48 +01:00
|
|
|
# COLOR_A="$(echo "$STATE" | cut -d";" -f2 | cut -d"|" -f1)"
|
2017-03-13 22:46:52 +01:00
|
|
|
COLOR_B="$(echo "$STATE" | cut -d";" -f2 | cut -d"|" -f2)"
|
2017-03-14 00:18:15 +01:00
|
|
|
# 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 ))
|
2019-07-08 22:41:30 +02:00
|
|
|
while [ $R -ne $R_ -a $G -ne $G_ -a $B -ne $B_ ]; do
|
2017-03-14 00:18:15 +01:00
|
|
|
DR=$(sign $(($R_-$R))); DG=$(sign $(($G_-$G))); DB=$(sign $(($B_-$B)))
|
|
|
|
R=$(($R+$DR)); G=$((G+$DG)); B=$(($B+$DB))
|
2019-07-07 00:28:56 +02:00
|
|
|
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
|
2017-07-03 15:15:56 +02:00
|
|
|
kill -9 $PIDS >/dev/null 2>&1
|
2017-03-14 00:18:15 +01:00
|
|
|
done
|
|
|
|
done
|
|
|
|
) &
|
2019-07-07 00:03:37 +02:00
|
|
|
PID=$!
|
|
|
|
echo $PID > ${TMPFILE_PID_BASE}_2_B.$PID
|
2017-03-14 00:18:15 +01:00
|
|
|
else
|
|
|
|
COLOR_B_TMP=$COLOR_B
|
2017-07-03 15:15:56 +02:00
|
|
|
PIDS="$PIDS $!"
|
2017-03-14 00:18:15 +01:00
|
|
|
for i in 5 4 3; do
|
2017-03-16 23:44:08 +01:00
|
|
|
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 &
|
2017-07-03 15:15:56 +02:00
|
|
|
PIDS="$PIDS $!"
|
2017-03-14 00:18:15 +01:00
|
|
|
COLOR_B_TMP="$(echo "$COLOR_B_TMP" | cut -c3-)"
|
|
|
|
done
|
2019-07-07 00:28:56 +02:00
|
|
|
sleep .5
|
2017-07-03 15:15:56 +02:00
|
|
|
kill -9 $PIDS >/dev/null 2>&1
|
2017-03-14 00:18:15 +01:00
|
|
|
fi
|
2017-03-04 16:03:07 +01:00
|
|
|
;;
|
|
|
|
3)
|
2017-03-14 00:18:15 +01:00
|
|
|
# find "$(dirname "$TMPFILE_PID_BASE")" -name "$(basename "${TMPFILE_PID_BASE}_3_*")" -exec sh -c 'cat {} | xargs kill; rm -f {}' \;
|
2017-03-04 18:27:48 +01:00
|
|
|
# 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
|
2017-03-04 16:03:07 +01:00
|
|
|
echo "not implemented" >&1
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
*)
|
|
|
|
echo "ERROR: wrong room number, internal problem detected" >&1
|
|
|
|
exit 1
|
|
|
|
;;
|
|
|
|
esac
|
|
|
|
}
|
2017-02-05 00:41:08 +01:00
|
|
|
|
2017-11-30 22:09:03 +01:00
|
|
|
if ! [[ "$ROOM_NUMBER" =~ ^[0-9]+$ ]] || ! [ "$ROOM_NUMBER" -ge 0 -a "$ROOM_NUMBER" -le "$ROOM_COUNT" ]; then
|
2017-03-04 16:03:07 +01:00
|
|
|
echo "ERROR: please specify a valid room number" >&1
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
touch "${TMPFILE_BASE}_$ROOM_NUMBER"
|
|
|
|
LIGHT_STATE=$(cat "${TMPFILE_BASE}_$ROOM_NUMBER")
|
2020-09-12 21:01:36 +02:00
|
|
|
[ -z "$LIGHT_STATE" ] && LIGHT_STATE=0
|
2017-02-05 00:41:08 +01:00
|
|
|
|
2017-03-04 16:03:07 +01:00
|
|
|
if [ -z "$COLOR" ]; then
|
2017-03-04 16:58:02 +01:00
|
|
|
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
|
2020-09-12 21:01:36 +02:00
|
|
|
[ $LIGHT_STATE -ge ${#STATE[*]} ] && LIGHT_STATE=0
|
|
|
|
STATE=${STATE[$LIGHT_STATE]}
|
2017-02-24 22:07:48 +01:00
|
|
|
else
|
2017-03-04 16:03:07 +01:00
|
|
|
STATE="$(get_room_color_string)"
|
2017-03-04 16:58:02 +01:00
|
|
|
touch "${TMPFILE_CUSTOM_BASE}_$ROOM_NUMBER"
|
2017-02-24 22:07:48 +01:00
|
|
|
fi
|
2017-02-05 00:41:08 +01:00
|
|
|
|
2017-03-04 18:27:48 +01:00
|
|
|
set_room_color
|
2017-02-19 21:14:58 +01:00
|
|
|
|
2017-03-04 16:03:07 +01:00
|
|
|
echo $LIGHT_STATE > "${TMPFILE_BASE}_$ROOM_NUMBER"
|