#!/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"