Skip to content

Instantly share code, notes, and snippets.

@CODeRUS
Created September 22, 2020 19:04
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save CODeRUS/b4b0997f2d9a9a4c17281dfc73f0fb7a to your computer and use it in GitHub Desktop.
Save CODeRUS/b4b0997f2d9a9a4c17281dfc73f0fb7a to your computer and use it in GitHub Desktop.
Xiaomi Gateway Light
#!/bin/bash
# usage:
#
# ./light.sh $RED $GREEN $BLUE $TRANSITION_TIME_MS $STEP_SIZE
#
# colors are 0-100, transition time in milliseconds, step size means how much
# fade can step between color values in each iteration
#
# example:
#
# ./light.sh 12 34 56 2000 1
#
# yes it is swapped
r_addr="/sys/class/backlight/lumi_b/brightness"
g_addr="/sys/class/backlight/lumi_g/brightness"
b_addr="/sys/class/backlight/lumi_r/brightness"
start_r=$(cat "$r_addr")
start_g=$(cat "$g_addr")
start_b=$(cat "$b_addr")
set_color () {
# because it blinks on 43
if [ "$1" != 43 ]; then
echo "$1" > "$r_addr"
fi
if [ "$2" != 43 ]; then
echo "$2" > "$g_addr"
fi
if [ "$3" != 43 ]; then
echo "$3" > "$b_addr"
fi
}
abs () {
if [ $1 -lt 0 ]
then
echo "$(($1 * -1))"
else
echo "$1"
fi
}
max () {
local arg max=0
for arg
do
if [ "$arg" -gt "$max" ]
then
max=$arg
fi
done
echo "$max"
}
fade () {
local step=$1 transition=$2
local start_red=$3 start_green=$4 start_blue=$5
local end_red=$6 end_green=$7 end_blue=$8
local delta_red=$(abs $(($end_red - $start_red)) )
local delta_green=$(abs $(($end_green - $start_green)) )
local delta_blue=$(abs $(($end_blue - $start_blue)) )
local i=0
local max=$(max "$delta_red" "$delta_green" "$delta_blue")
if [ "$delta_red" = 0 ] && [ "$delta_green" = 0 ] && [ "$delta_blue" = 0 ]
then
return
fi
if [ "$step" -lt 1 ]
then
step=1
fi
local sleep=$(echo "scale=3; $transition/$max/1000/1.8" | bc)
while [ "$i" -le "$max" ]
do
red=$(( $start_red + ($end_red - $start_red) * $i / $max ))
green=$(( $start_green + ($end_green - $start_green) * $i / $max ))
blue=$(( $start_blue + ($end_blue - $start_blue) * $i / $max))
set_color "$red" "$green" "$blue" &
sleep $sleep
i=$(($i + $step))
done
}
in_transition="${4:-2000}"
in_step="${5:-1}"
fade "$in_step" "$in_transition" "$start_r" "$start_g" "$start_b" "$1" "$2" "$3"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment