Created
September 22, 2020 19:04
-
-
Save CODeRUS/b4b0997f2d9a9a4c17281dfc73f0fb7a to your computer and use it in GitHub Desktop.
Xiaomi Gateway Light
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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