wecker/wecker.sh
Ratatoskr 05af18857a
Refactor brightness and colortemp_step calculations
- Simplified calculation of brightness_step and colortemp_step for better readability.
- Corrected the calculation of reached final values for brightness and color temperature.
- Introduced sleep_duration variable for improved flexibility in sleep intervals.
- Adjusted the loop to start from 0 to correctly set the initial values.
- Added a comment to clarify the purpose of the loop and its iteration.
- Set the current_brightness and current_colortemp directly to the end values after the loop, ensuring they reach the intended final values.
- Moved the sleep_duration calculation inside the loop for consistency.

This refactoring enhances the script's clarity and ensures accurate calculation of brightness and color temperature steps during the gradual adjustment process. The changes also include improvements in sleep duration handling.
2023-12-30 12:01:12 +01:00

252 lines
8.1 KiB
Bash
Executable File

#!/bin/bash
#
# Alarm script with brightness and color temperature adjustment for ioBroker
#
# This script gradually adjusts the brightness and changes the color temperature from warm white to cool white
# via ioBroker control. It increases brightness from 1 to 100 and changes color temperature from 1600 (warm white)
# to 0 (cool white) within 15 minutes.
#
# After 15 minutes, a color change is triggered.
# Customizable settings:
# - Adjust ioBroker brightness and color temperature commands
set -e # Stop the script on errors
#set -x # Enable debugging # Uncomment for a more detailed log
# Debug
DEBUG=false
SSH_EXECUTED=false # Variable to track SSH command status
while getopts ":d" opt; do
case $opt in
d)
DEBUG=true
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
# Adjust brightness and color temperature in ioBroker
# Colors
red="ff0000"
green="00ff00"
blue="0000ff"
iobroker state set zigbee.0.04cd15fffee03198.state false && sleep 2 &&
iobroker state set zigbee.0.04cd15fffee03198.brightness 1 && sleep 2 &&
iobroker state set zigbee.0.04cd15fffee03198.colortemp 1600 && sleep 2 &&
iobroker state set zigbee.0.04cd15fffee03198.state true && sleep 2 &&
set_brightness() {
local brightness_value=$1
# Replace 'zigbee.0.04cd15fffee03198.brightness' with the actual ioBroker address for brightness
iobroker state set zigbee.0.04cd15fffee03198.brightness "$brightness_value"
echo "Current brightness: $brightness_value"
}
set_colortemp() {
local colortemp_value=$1
# Replace 'zigbee.0.04cd15fffee03198.colortemp' with the actual ioBroker address for color temperature
iobroker state set zigbee.0.04cd15fffee03198.colortemp "$colortemp_value"
echo "Current Colortemp: $colortemp_value"
}
set_color() {
local color_value=$1
# Replace 'zigbee.0.04cd15fffee03198.color' with the actual ioBroker address for color
iobroker state set zigbee.0.04cd15fffee03198.color "$color_value"
}
# Get the IP address of Lisa's iPhone (without ping test)
check_ip() {
mac_address="e4:cd:d1" # Replace this with the MAC address
attempts=10
interval=2
for ((i = 1; i <= $attempts; i++)); do
A72_ip=$(arp-scan -r 3 -v --localnet | grep "$mac_address" | awk '{print $1}')
if [ -n "$A72_ip" ]; then
echo "Found IP: $A72_ip"
return 0 # Success: IP address found
fi
if [ $i -lt $attempts ]; then
echo "Wait $interval seconds before the next attempt."
if [ "$DEBUG" = true ]; then
echo "Debug: Skipping pause"
else
sleep $interval
fi
fi
done
# All attempts unsuccessful
echo "The target could not be reached after $attempts attempts."
iobroker state set zigbee.0.04cd15fffee03198.state false || true
return 1 # Error: IP address not found
}
# Execute the check_ip function.
check_ip
# Check if it's the first brightness change
first_brightness_change=true
# Check if the light was externally turned off
check_external_light_status() {
local light_status=$(iobroker state getValue zigbee.0.04cd15fffee03198.state)
if [ "$light_status" == "false" ]; then
echo "Light is off. Exiting the script." && date
exit
fi
}
# Check if the alarm on the phone has been turned off
check_notification() {
max_attempts=10
wait_time=5
for ((i = 1; i <= $max_attempts; i++)); do
# Execute the SSH command within a timeout
check_ip # Get IP
if [ "$DEBUG" = true ]; then
echo "DEBUG: Bypassing check_notification."
output="com.urbandroid.sleep AlarmKlaxon"
else
output=$(ssh -i /root/.ssh/A72 root@$A72_ip 'dumpsys activity processes | grep com.urbandroid.sleep')
#echo $output
fi
# Check if the result contains the alarm
if [[ $output == *"com.urbandroid.sleep"* && $output == *"AlarmKlaxon"* ]]; then
# Alarm not turned off yet
date && echo "Alarm not turned off yet."
#echo $output
return
elif [[ $output == *"com.urbandroid.sleep"* && $output != *"AlarmKlaxon"* ]]; then
# Alarm turned off
date && echo "Alarm turned off."
echo $output
iobroker state set zigbee.0.04cd15fffee03198.state false || true
return # Exit the function without terminating the entire script
else
# Phone unreachable
echo "Phone unreachable. Waiting $wait_time seconds before the next attempt."
check_ip # Get IP
sleep $wait_time
fi
done
# Phone could not be reached.
echo "Phone could not be reached after $max_attempts attempts."
date && echo "Alarm turned off."
iobroker state set zigbee.0.04cd15fffee03198.state false || true
return
}
# Define starting values for brightness and color temperature
start_brightness=0 # Minimum brightness (0)
start_colortemp=1600 # Warm white (1600)
# Define ending values for brightness and color temperature
end_brightness=100 # Maximum brightness (100)
end_colortemp=0 # Cool white (0)
# Duration of adjustment in seconds (15 minutes)
# Change every 30 seconds
if [ "$DEBUG" = true ]; then
duration_seconds=60
steps=5
echo "DEBUG: Set steps to $steps; and duration to $duration_seconds sec."
else
duration_seconds=900
steps=30 # Change every 30 (27) seconds
fi
# Calculate steps for brightness and color temperature per step
brightness_step=$(( (end_brightness - start_brightness) / steps ))
echo "Brightness difference per step: $brightness_step"
echo "Reached final brightness: $((brightness_step * steps + start_brightness)) from $end_brightness"
colortemp_step=$(( start_colortemp / steps ))
echo "Color temperature difference per step: $colortemp_step"
echo "Reached final colortemp: $((start_colortemp - colortemp_step * steps)) from $end_colortemp"
sleep_duration=$((duration_seconds / steps))
# Gradual adjustment of brightness and color temperature
for ((i = 0; i <= $steps; i++)); do
current_brightness=$(printf "%.0f" $(bc <<< "$start_brightness + ($brightness_step * $i)"))
current_colortemp=$(printf "%.0f" $(bc <<< "$start_colortemp - ($colortemp_step * $i)"))
# Debug
echo "------------------------------------Step: $i------------------------------------"
echo "current brightness= $current_brightness"
echo "current colortemp= $current_colortemp"
if [ "$first_brightness_change" = true ]; then
echo "Variable first_brightness_change = true"
check_external_light_status
else
echo "Variable first_brightness_change = false"
first_brightness_change=false
fi
set_brightness "$current_brightness"
set_colortemp "$current_colortemp"
if [ "$DEBUG" = true ]; then
sleep 12
echo "DEBUG: Wait 12 sec. between steps."
else
sleep $sleep_duration # Changes every 30 seconds
fi
done
# Set to end values.
current_brightness="$end_brightness"
current_colortemp="$end_colortemp"
set_brightness "$end_brightness"
set_colortemp "$end_colortemp"
# Execute the check_ip function.
check_ip
echo "$A72_ip"
# Check if brightness and color temperature have reached their target values
echo "current_brightness: $current_brightness end_brightness: $end_brightness"
echo "current_colortemp: $current_colortemp end_colortemp: $end_colortemp"
ssh_command() { # Function to send a command to A72.
local command=$1
nohup ssh -i /root/.ssh/A72 -f root@$A72_ip "$command" </dev/null &
SSH_EXECUTED=true # Mark that the SSH command has been executed.
}
if [ $current_brightness -eq $end_brightness ] && [ $current_colortemp -eq $end_colortemp ]; then
# Change colors for more concentration
while :; do
# Start the alarm script on the phone if the SSH command has not been executed yet.
if [ "$SSH_EXECUTED" = false ]; then
if [ "$DEBUG" = true ]; then
echo "DEBUG: Alternative ssh command."
ssh_command "cmd media_session volume --set 5 --stream 9 && /data/data/com.termux/files/usr/bin/mpv /product/media/audio/alarms/your-new-morning-alarm.ogg"
else
ssh_command "/data/scripts/morning-alarm.sh > /dev/null"
fi
else
check_external_light_status
set_color "$green"
sleep 5
set_color "$red"
sleep 5
set_color "$blue"
check_notification
fi
done
fi