From 3d2605a8f842a5e803ec96aabfb198dbca6cb0bf Mon Sep 17 00:00:00 2001 From: Ratatoskr Date: Fri, 29 Dec 2023 21:55:49 +0100 Subject: [PATCH] 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 --- wecker.sh | 277 ++++++++++++++++++++++++++++++++---------------------- 1 file changed, 166 insertions(+), 111 deletions(-) diff --git a/wecker.sh b/wecker.sh index b04db9e..5e12212 100755 --- a/wecker.sh +++ b/wecker.sh @@ -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." - sleep $interval + 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 - output=$(ssh -i /root/.ssh/A72 root@$A72_ip 'dumpsys activity processes | grep com.urbandroid.sleep') - #echo $output + # Execute the SSH command within a timeout + check_ip # Get IP - # Überprüfen, ob das Ergebnis den Wecker enthält - if [[ $output == *"com.urbandroid.sleep"* && $output == *"AlarmKlaxon"* ]]; then - # Wecker noch nicht beendet. - date && echo "Wecker noch nicht beendet." - #echo $output - sleep $wait_time # Wartezeit von 10 Sekunden - elif [[ $output == *"com.urbandroid.sleep"* && $output != *"AlarmKlaxon"* ]]; then - # Wecker beendet. - date && echo "Wecker beendet." - echo $output - iobroker state set zigbee.0.04cd15fffee03198.state false - return # Die Funktion verlassen, ohne das gesamte Skript zu beenden + if [ "$DEBUG" = true ]; then + echo "DEBUG: Bypassing check_notification." + output="com.urbandroid.sleep AlarmKlaxon" else - # Handy nicht erreichbar - echo "Handy nicht erreichbar. Warte $wait_time Sekunden, bevor der nächste Versuch gestartet wird." - check_ip # IP holen + 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 - # 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" - echo "current brightness= $current_brightness" - echo "current colortemp= $current_colortemp" + # Debug + echo "------------------------------------Step: $i------------------------------------" + echo "current brightness= $current_brightness" + echo "current colortemp= $current_colortemp" - if [ "$first_brightness_change" = false ]; then - check_external_light_status - else - first_brightness_change=false - fi + 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 + set_brightness "$current_brightness" + set_colortemp "$current_colortemp" + + if [ "$DEBUG" = true ]; then + sleep 12 + echo "DEBUG: Wait 12 sec. between steps." + else + sleep 27 # Changes every 30 (27) seconds + fi done -# check_ip -Funktion ausführen. +# Execute the check_ip function. 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" & +# 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" -# Farben ändern für mehr konzentration -while :; do - if [ "$first_brightness_change" = false ]; then +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" + fi + else check_external_light_status - else - first_brightness_change=false - set_color "$gruen" - sleep 5 - set_color "$rot" - sleep 5 - set_color "$blau" - - check_notification - fi -done - - + set_color "$green" + sleep 5 + set_color "$red" + sleep 5 + set_color "$blue" + check_notification + fi + done +fi