#!/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 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|!;\ 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 ( 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_ -o $G1 -ne $G1_ -o $B1 -ne $B1_ -o $R2 -ne $R2_ -o $G2 -ne $G2_ -o $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 "$R1 $G1 $B1 $R2 $G2 $B2" |\ while read code; do printf "%03d" $code; done > /dev/udp/172.23.92.16/31302 & # echo -en "255204017255204017" > /dev/udp/172.23.92.16/31302 & sleep .1 done 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"