Refactor wecker.sh script for better readability and functionality

- Updated comments for better clarity and documentation
- Introduced a DEBUG variable to toggle debugging information
- Utilized set -e to stop the script on errors for better error handling
- Corrected the script flow to ensure proper execution of color changes
- Introduced a new ssh_command function for executing SSH commands
- Improved check_ip function for finding the IP address more reliably
- Added DEBUG checks to bypass certain functions for debugging purposes
- Fixed issues with sleep intervals during script execution
- Improved logging by adding echo statements for important steps
- Adjusted variable names for better readability
- Removed unnecessary comments and debug statements
- Added set -e for better error handling
- Introduced command-line option -d for enabling DEBUG mode
- Improved formatting and indentation for better code readability
This commit is contained in:
Ratatoskr 2023-12-29 21:55:49 +01:00
parent aa04b75e41
commit 3d2605a8f8
Signed by: Ratatoskr
GPG Key ID: 28B77439A6D78F4E

249
wecker.sh
View File

@ -1,187 +1,242 @@
#!/bin/bash
#bin/bash
#
# Wecker-Skript mit Helligkeits- und Farbtemperaturanpassung für ioBroker
# Alarm script with brightness and color temperature adjustment for ioBroker
#
# Dieses Skript passt die Helligkeit schrittweise an und ändert die Farbtemperatur von warmweiß zu kaltweiß
# über die ioBroker-Steuerung. Es erhöht die Helligkeit von 1 auf 100 und ändert die Farbtemperatur von 1600 (warmweiß)
# auf 0 (kaltweiß) innerhalb von 15 Minuten.
# 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.
#
# Nach den 15 Minuten wird ein Farbwechsel erstellt.
# Anpassbare Einstellungen:
# - ioBroker-Helligkeits- und Farbtemperatur-Befehle anpassen
# 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
# Helligkeit und Farbtemperatur an ioBroker anpassen
while getopts ":d" opt; do
case $opt in
d)
DEBUG=true
;;
\?)
echo "Invalid option: -$OPTARG" >&2
exit 1
;;
esac
done
# Farben
rot="ff0000"
gruen="00ff00"
blau="0000ff"
# Adjust brightness and color temperature in ioBroker
iobroker state set zigbee.0.04cd15fffee03198.state false
iobroker state set zigbee.0.04cd15fffee03198.brightness 0
iobroker state set zigbee.0.04cd15fffee03198.colortemp 1600
# 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
# Ersetze 'zigbee.0.04cd15fffee03198.brightness' durch die tatsächliche ioBroker-Adresse für die Helligkeit
# 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
# Ersetze 'zigbee.0.04cd15fffee03198.colortemp' durch die tatsächliche ioBroker-Adresse für die Farbtemperatur
# 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
# Ersetze 'zigbee.0.04cd15fffee03198.color' durch die tatsächliche ioBroker-Adresse für die Farbe
# Replace 'zigbee.0.04cd15fffee03198.color' with the actual ioBroker address for color
iobroker state set zigbee.0.04cd15fffee03198.color "$color_value"
}
# Die IP-Adresse von Lisas-IPhone holen (ohne Ping-Test)
# Get the IP address of Lisa's iPhone (without ping test)
check_ip() {
mac_address="e4:cd:d1" # Ersetze dies durch die MAC-Adresse
mac_address="e4:cd:d1" # Replace this with the MAC address
attempts=10
interval=5
interval=2
for ((i = 1; i <= $attempts; i++)); do
A72_ip=$(arp-scan -r 5 -v --localnet | grep "$mac_address" | awk '{print $1}')
A72_ip=$(arp-scan -r 3 -v --localnet | grep "$mac_address" | awk '{print $1}')
if [ -n "$A72_ip" ]; then
echo "Gefundene IP: $A72_ip"
return 0 # Erfolg: IP-Adresse gefunden
echo "Found IP: $A72_ip"
return 0 # Success: IP address found
fi
if [ $i -lt $attempts ]; then
echo "Warte $interval Sekunden, bevor der nächste Versuch gestartet wird."
echo "Wait $interval seconds before the next attempt."
if [ "$DEBUG" = true ]; then
echo "Debug: Skipping pause"
else
sleep $interval
fi
fi
done
# Alle Versuche erfolglos
echo "Das Ziel konnte nach $attempts Versuchen nicht erreicht werden."
iobroker state set zigbee.0.04cd15fffee03198.state false
return 1 # Fehler: IP-Adresse nicht gefunden
# 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
}
# check_ip -Funktion ausführen.
# Execute the check_ip function.
check_ip
iobroker state set zigbee.0.04cd15fffee03198.state true
# Überprüfung, ob es die erste Änderung der Helligkeit ist
# Check if it's the first brightness change
first_brightness_change=true
# Überprüfung, ob das Licht extern ausgeschaltet wurde
# 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 "Licht ist aus. Das Skript wird beendet." && date
echo "Light is off. Exiting the script." && date
exit
fi
}
# Checkt, ob der Wecker am Handy ausgeschaltet wurde.
# 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
# Führe den SSH-Befehl innerhalb eines Timeout aus
check_ip # IP holen
# 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
# Überprüfen, ob das Ergebnis den Wecker enthält
# Check if the result contains the alarm
if [[ $output == *"com.urbandroid.sleep"* && $output == *"AlarmKlaxon"* ]]; then
# Wecker noch nicht beendet.
date && echo "Wecker noch nicht beendet."
# Alarm not turned off yet
date && echo "Alarm not turned off yet."
#echo $output
sleep $wait_time # Wartezeit von 10 Sekunden
return
elif [[ $output == *"com.urbandroid.sleep"* && $output != *"AlarmKlaxon"* ]]; then
# Wecker beendet.
date && echo "Wecker beendet."
# Alarm turned off
date && echo "Alarm turned off."
echo $output
iobroker state set zigbee.0.04cd15fffee03198.state false
return # Die Funktion verlassen, ohne das gesamte Skript zu beenden
iobroker state set zigbee.0.04cd15fffee03198.state false || true
return # Exit the function without terminating the entire script
else
# Handy nicht erreichbar
echo "Handy nicht erreichbar. Warte $wait_time Sekunden, bevor der nächste Versuch gestartet wird."
check_ip # IP holen
# Phone unreachable
echo "Phone unreachable. Waiting $wait_time seconds before the next attempt."
check_ip # Get IP
sleep $wait_time
fi
done
# Handy konnte nicht erreicht werden.
echo "Handy konnte nach $max_attempts Versuchen nicht erreicht werden."
date && echo "Wecker beendet."
iobroker state set zigbee.0.04cd15fffee03198.state false
exit
# 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
}
# Startwerte für Helligkeit und Farbtemperatur definieren
start_brightness=1 # Mindesthelligkeit (1)
start_colortemp=1600 # Warmweiß (1600)
# Define starting values for brightness and color temperature
start_brightness=0 # Minimum brightness (0)
start_colortemp=1600 # Warm white (1600)
# Endwerte für Helligkeit und Farbtemperatur definieren
end_brightness=100 # Höchste Helligkeit (100)
end_colortemp=0 # Kaltweiß (0)
# Define ending values for brightness and color temperature
end_brightness=100 # Maximum brightness (100)
end_colortemp=0 # Cool white (0)
# Dauer der Anpassung in Sekunden (15 Minuten)
duration_seconds=900
# Duration of adjustment in seconds (15 minutes)
# Alle 30 Sekunden Änderung
steps=30 # Alle 30 Sekunden einen Schritt
# 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
# Berechne die Schritte für Helligkeit und Farbtemperatur pro Schritt
# Calculate steps for brightness and color temperature per step
brightness_step=$(bc <<< "($end_brightness - $start_brightness) / $steps")
echo "Brightness difference per step: $brightness_step"
echo "Reached final brightness: $((brightness_step * steps)) from $end_brightness"
colortemp_step=$(bc <<< "$start_colortemp / $steps")
echo "Color temperature difference per step: $colortemp_step"
echo "Reached final colortemp: $((start_colortemp - (colortemp_step * steps))) from $end_colortemp"
# 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)"))
# Schrittweise Anpassung von Helligkeit und Farbtemperatur
for ((i = 1; i < $steps; i++)); do
current_brightness=$(bc <<< "$start_brightness + ($brightness_step * $i)")
current_colortemp=$(bc <<< "$start_colortemp - ($colortemp_step * $i)")
# Debugg
echo "Step: $i"
# Debug
echo "------------------------------------Step: $i------------------------------------"
echo "current brightness= $current_brightness"
echo "current colortemp= $current_colortemp"
if [ "$first_brightness_change" = false ]; then
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"
sleep 27 # Änderungen alle 30 (27) Sekunden
done
# check_ip -Funktion ausführen.
check_ip
echo "$A72_ip"
# Starten des Alarm-Scripts auf dem Handy.
echo "Starten des morning-alarm.sh Scripts am Ziel: $A72_ip"
nohup ssh -i /root/.ssh/A72 root@$A72_ip "/data/scripts/morning-alarm.sh > /dev/null" &
# Farben ändern für mehr konzentration
while :; do
if [ "$first_brightness_change" = false ]; then
check_external_light_status
if [ "$DEBUG" = true ]; then
sleep 12
echo "DEBUG: Wait 12 sec. between steps."
else
first_brightness_change=false
set_color "$gruen"
sleep 5
set_color "$rot"
sleep 5
set_color "$blau"
check_notification
sleep 27 # Changes every 30 (27) seconds
fi
done
# 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