- Enabled debugging mode to provide a more detailed log when needed. - Modified the interval in the check_ip function to 5 seconds for better accuracy in IP retrieval attempts. - Refactored the sleep_duration calculation to ensure it accurately reflects the intended duration between adjustments. - Adjusted the loop in gradual adjustment to start from 1, ensuring the initial values are set correctly. - Replaced multiple consecutive '&& sleep' statements with separate lines for improved readability. - Simplified the error handling in check_ip and check_notification functions for clarity. - Removed unnecessary '|| true' statements in error handling. - Added echo statements to print the light status when it is off in check_external_light_status. - Improved comments for better script understanding. These changes enhance the script's execution, improve debugging capabilities, and make the code more readable and maintainable.
253 lines
8.0 KiB
Bash
Executable File
253 lines
8.0 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
|
|
iobroker state set zigbee.0.04cd15fffee03198.brightness 1
|
|
iobroker state set zigbee.0.04cd15fffee03198.colortemp 1600
|
|
iobroker state set zigbee.0.04cd15fffee03198.state true
|
|
|
|
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=5
|
|
|
|
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
|
|
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
|
|
echo $light_status
|
|
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
|
|
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
|
|
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 = 1; 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
|