This is the old SliTaz forum - Please use the main forum.slitaz.org

[Utilitaire][Script] Timer.sh : Alarme / compte-à-rebours
  • babaorumbabaorum October 2009
    Bonjour, depuis que j'utilise Slitaz comme distribution principale, il me manque une fonctionnalité essentielle: **une alarme** !
    Et bien oui, j'ai plein de choses à faire et, compte-tenu de l'attraction formidable de l'ordinateur sur mes petits neurones, j'ai besoin de me rappeler régulièrement telle ou telle basse contingence du monde non numérique. :p

    Alors le plus simple est bien entendu de taper ce "one-liner" dans mon terminal de ligne de commande:

    > sleep 3600 && mplayer [le-son-qui-va-bien-me-réveiller-de-ma-torpeur-numérique]

    Simple et efficace.
    Sauf qu'il s'agit d'un bête compte-à-rebours et que, si j'en ai l'usage (dans 10 minutes, la pizza est cuite), j'ai aussi besoin d'une alarme (je dois partir de chez moi à 10h30 précise).

    J'ai donc commencé à écrire un petit script me permettant de prendre en charge les deux situations, l'utilisation est archi-simple: un premier paramètre qui est une option précisant un compte-à-rebours ou une alarme. Un deuxième paramètre: la partie heure du compte-à-rebours ou de l'alarme. Un troisième paramètre: la partie minute du compte-à-rebours ou de l'alarme.

    Et puis comme le script fonctionnait bien, je me suis dit qu'une fonctionnalité aussi basique et essentielle pourrait faire l'affaire d'autres personnes et je me suis mis dans la peau du débutant sur Slitaz: la ligne de commande... hmm... pas idéal.
    J'ai donc ajouté un second mode, graphique, utilisant l'excellent GTK-Dialog.

    Voici donc un script pouvant à la fois être utilisé en ligne de commande (usage tout de même plus rapide, c'est certain) et en mode GUI.

    S'il est démarré sans argument, le script recherche l'existence de GTK-Dialog: s'il le trouve, démarrage en mode GUI, l'utilisateur rentre les paramètres par l'interface graphique; sinon message d'aide classique en ligne de commande.
    Si des paramètres sont trouvés, démarrage en ligne de commande avec utilisation de ces paramètres.

    Paramètre en question:
    1) mode alarme ou compte-à-rebours
    2) heures
    3) minutes
    4) éventuellement un message, qui s'affichera en mode GUI ou en mode de ligne de commande selon le cas.

    Même en mode graphique, un décompte est fait toutes les minutes jusqu'à écoulement du temps dans le terminal originel qui a lancé le dialogue GTK-Dialog.
  • babaorumbabaorum October 2009
    Voici le code (désolé pour l'indentation que le forum a mise à plat :-/ ):

    #!/bin/sh
    #timer.sh - chronomètre silencieux avec alarme

    # Settings internals vars and temp files
    SOUND="/mnt/data/Sons/alarme.wav"
    export MAIN_DIALOG='
    <window title="'`basename $0`'">
    <vbox>
    <frame Help>
    <text use-markup="true">
    <input file>timer.tmp</input>
    </text>
    </frame>
    <frame Current time>
    <text>
    <input>date</input>
    </text>
    </frame>
    <frame Options>
    <hbox>
    <checkbox>
    <variable>ALARM_MODE</variable>
    <label>Alarme</label>
    </checkbox>
    <text use-markup="true" wrap="true" width-chars="40">
    <label>"<i>(countdown option is default in GUI mode).</i>"</label>
    </text>
    </hbox>
    </frame>
    <frame Parameters>
    <hbox>
    <text>
    <label>Hours</label>
    </text>
    <entry max-length="2">
    <variable>HOURS</variable>
    </entry>
    <text>
    <label>Minutes</label>
    </text>
    <entry max-length="2">
    <variable>MINUTES</variable>
    </entry>
    </hbox>
    <text>
    <label>Short message to display (you can omit this one)</label>
    </text>
    <entry>
    <variable>ALARM_MSG</variable>
    </entry>
    </frame>
    <hbox>
    <button ok></button>
    <button cancel></button>
    </hbox>
    </vbox>
    </window>'
    cat <<EOT1 >timer.tmp
    Command-line usage: <b>`basename $0` [-ca] hours:minutes</b>

    <u>Options</u> :
    -c countdown
    -a alarm
    EOT1

    # Help
    help() {
    cat <<EOT2
    Usage: `basename $0` [-ca] hours:minutes
    Options: -c : countdown (need time to pass)
    -a : alarm (need time to reach on watch)

    `basename $0` (for GUI usage w/ GTK-dialog)
    EOT2
    }

    # Usage : countdown minutes
    countdown() {
    i=$1
    echo " "
    while [[ $i -gt 0 ]]
    do
    echo -e "\r "$i" minutes left \c"
    sleep 60
    i=$(expr $i - 1)
    done
    echo " - "
    }

    # Checking arguments
    if [ $# -eq 0 ]; then
    if [ -z `which gtkdialog` ]; then
    help
    rm -f timer.tmp
    exit 0
    else
    VARIABLES=`gtkdialog --program=MAIN_DIALOG`
    rm -f timer.tmp
    eval $VARIABLES
    [ "$EXIT" = "Cancel" -o "$EXIT" = "abort" ] && exit 1
    fi
    else
    if [ "$1" = "-h" -o "$1" = "--help" ]; then
    help
    rm -f timer.tmp
    exit 0
    elif [ "$1" != "-c" -a "$1" != "-a" ]; then
    echo "Error: first arg must be a '-c' or '-a' option. See help by typing \"`basename $0`\"."
    rm -f timer.tmp
    exit 1
    else
    HOURS=`echo $2 | cut -d ":" -f 1 | sed 's/^0//'`
    MINUTES=`echo $2 | cut -d ":" -f 2 | sed 's/^0//'`
    fi
    fi
    INTERVALLE_MINUTES=`echo $(( ($HOURS * 60) + $MINUTES ))`
    if [ "$1" = "-a" -o $ALARM_MODE = "true" ]; then
    NOW=`date | cut -d " " -f 4`
    TIMEH=`echo $NOW | cut -d ":" -f 1 | sed 's/^0//'`
    [ $TIMEH -gt $HOURS ] && TIMEH=`echo $(( $TIMEH - 24 ))`
    TIMEM=`echo $NOW | cut -d ":" -f 2 | sed 's/^0//'`
    NOW_MINUTES=`echo $(( ($TIMEH * 60) + $TIMEM ))`
    INTERVALLE_MINUTES=`echo $(( $INTERVALLE_MINUTES - $NOW_MINUTES ))`
    fi
    echo "L'alarme sonnera dans $INTERVALLE_MINUTES minutes."
    # calling countdown
    countdown $INTERVALLE_MINUTES
    # sound alarm
    mplayer $SOUND 2>/dev/null | grep -v "."
    # message if specified
    shift; shift
    [ -n "$*" -a -z $ALARM_MSG ] && ALARM_MSG="$*"
    if [ "$ALARM_MSG" != "" ]; then
    [ -n `which gtkdialog` ] && export MSG_DIALOG='<hbox><text><label>'`echo $ALARM_MSG`'</label></text></hbox>' && gtkdialog --program=MSG_DIALOG
    else
    echo $ALARM_MSG
    fi
    # final file cleaning
    rm -f timer.tmp
  • babaorumbabaorum December 2009
    New version: tout en ligne de commandes, plus simple, code plus structuré.

    #!/bin/sh
    # Timer2 - 07.12.2009
    DEPENDENCIES="grep sed mplayer"
    SOUND="/mnt/data/Sons/alarme.wav"
    SCRIPT=`basename "$0"`
    E_BADSWITCH="10 You need to use either \"-a\" or \"-c\" switch as first argument"
    E_MISSINGDEPENDENCY="11 Missing dependency: "
    E_NOTIME="12 No time specified"
    E_NODATEIFCOUNTDOWN="13 Date must not be specified in countdown mode"
    E_NOSOUND="14 No $SOUND sound file found"
    E_NEGATIVETIMEOUT="15 Timeout is anterior to current time with specified date and/or time"
    help()
    {
    echo -e "\033[1mUsage :\033[0m $SCRIPT {-a|c} [YYYY-MM-DD] HH:MM[:SS]"
    echo
    echo -e "\033[1mSwitches :\033[0m -a : alarm mode"
    echo " -c : countdown mode"
    echo "You have one and only one mandatory switch to use between these two."
    echo
    echo -e "\033[1mParameters :\033[0m YYYY : year (4 numbers; i.e.: 2001)"
    echo " MM : month (2 numbers, 01=January, 12=December)"
    echo " DD : day of the month (2 numbers; beginning with 01)"
    echo " HH : hours (2 numbers; i.e.: 00=midnight)"
    echo " MM : minutes (2 numbers)"
    echo " SS : seconds (2 numbers)"
    echo "The whole group \"YYYY-MM-DD\" and the other symbol \"SS\" are"
    echo "both facultative. The \"YYYY-MM-DD\" group must not be used in"
    echo "countdown mode (only hours, minutes & secondes)."
    }
    echo_error()
    {
    echo -n "Error ! " >&2
    echo `echo "$*" | sed 's/^[0-9][0-9] //'` >&2
    echo "Type \"$SCRIPT -h\" or \"$SCRIPT --help\" for help screen"
    exit `echo "$*" | sed 's/^\([0-9][0-9]\).*$/\1/'`
    }
  • babaorumbabaorum December 2009
    Suite (le forum ne permet pas de poster de longs messages):


    [ "$1" = "" -o "$1" = "-h" -o "$1" = "--help" ] && help && exit 0
    for dep in $DEPENDENCIES; do
    which "$dep" 1>/dev/null 2>&1; [ $? -ne 0 ] && echo_error "$E_MISSINGDEPENDENCY $dep"
    done
    [ ! -f "$SOUND" ] && echo_error "$E_NOSOUND"
    [ "$1" != "-a" -a "$1" != "-c" ] && echo_error "$E_BADSWITCH"
    [ "$2" = "" ] && echo_error "$E_NOTIME"
    if [ "$1" = "-c" ]; then
    shift
    echo "$*" | grep "^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]" 1>/dev/null 2>&1; [ $? -eq 0 ] && echo_error "$E_NODATEIFCOUNTDOWN"
    echo "$*" | grep -E "^[0-9][0-9]:[0-9][0-9](:[0-9][0-9])?$" 1>/dev/null 2>&1; [ $? -ne 0 ] && echo_error "$E_NOTIME"
    countdown_time=`echo "$*" | sed 's/0\([1-9]\)/\1/g'`
    hours=`echo "$countdown_time" | cut -d ":" -f 1`
    minutes=`echo "$countdown_time" | cut -d ":" -f 2`
    seconds=`echo "$countdown_time" | cut -d ":" -f 3`
    [ "$seconds" = "" ] && seconds=0
    echo -n "Countdown"
    delay_seconds=$(( ($hours * 60 + $minutes) * 60 + $seconds ))
    elif [ "$1" = "-a" ]; then
    shift
    alarm_seconds=`date -d "$*" "+%s"`
    now_seconds=`date "+%s"`
    seconds=$(( ($alarm_seconds - $now_seconds) ))
    minutes=0
    hours=0
    [ $seconds -lt 1 ] && echo_error "$E_NEGATIVETIMEOUT"
    if [ $seconds -ge 60 ]; then
    minutes=$(( $seconds / 60 ))
    seconds=$(( $seconds % 60 ))
    if [ $minutes -ge 60 ]; then
    hours=$(( $minutes / 60 ))
    minutes=$(( ($hours % 60) + $minutes ))
    fi
    fi
    echo -n "Alarm"
    delay_seconds=$(( ((($hours * 60) + $minutes) * 60) + $seconds ))
    fi
    echo " starting: timeout in $hours hours $minutes minutes $seconds seconds"
    sleep $delay_seconds && mplayer "$SOUND"
    exit 0

  • babaorumbabaorum February 2011
    Nouvelle version plus simple (enfin j'espère), avec mode "tout console" et mode graphique, sur le modèle des utilitaires gtkdialog internes de slitaz : timer et timerbox. Par ailleurs la fonction alarme est découplée, de la même manière: alarm et alarmbox.
    L'intérêt des "box" est d'avoir une interface graphique simple (pas forcément en gtkdialog, la preuve ici j'ai plutôt choisi dialog) et indépendante de la ligne de console, pour pouvoir être lancée depuis une commande graphique, par exemple en les incorporant au menu Slitaz de lxpanel. Au final les "box" ne font qu'appeler les scripts "non-box" avec certains paramètres particuliers.

    Comme toujours, il faut configurer deux ou trois choses, dont le son à jouer (je ne sais pas trop pourquoi j'ai choisi de ne configurer que le son dans timer, et le son et le lecteur du son dans alarm, mais ça se trouve facilement).

    Voici les code-sources respectifs:
    timer:
    #!/bin/sh

    #scalars
    SCRIPT=`basename "$0"`
    HOURS=0
    MINUTES=0
    SECONDS=0
    BEEP_LAST='false'
    BEEP_DURATION=5 #seconds
    BOX='false'
    SOUND="/media/Elements/data/Sons/alarme.mp3"

    #functions
    help() {
    cat <<EOT<br />Usage : $SCRIPT [--beep] hours minutes seconds
    $SCRIPT --box
    EOT
    }
    leadzero() {
    [ $1 -lt 10 ] && echo '0'$1 || echo $1
    }

    #check script parameters
    [ "$1" = "" -o "$1" = "-h" -o "$1" = "--help" ] && help && exit 0
    while [ $# -ne 0 ]; do
    case $1 in
    --beep )
    BEEP_LAST="true"
    shift
    ;;
    --box )
    BOX="true"
    shift
    ;;
    *)
    break
    ;;
    esac
    done

    if [ "$BOX" = "true" ]; then
    TMP=$(mktemp)
    dialog --inputbox 'Hours' 8 70 2>$TMP
    [ $? -eq 0 ] && HOURS=$(cat $TMP)
    dialog --inputbox 'Minutes' 8 70 2>$TMP
    [ $? -eq 0 ] && MINUTES=$(cat $TMP)
    dialog --inputbox 'Seconds' 8 70 2>$TMP
    [ $? -eq 0 ] && SECONDS=$(cat $TMP)
    [ -f $TMP ] && rm -f $TMP
    else
    HOURS=$1
    MINUTES=$2
    SECONDS=$3
    fi
    echo "$HOURS$MINUTES$SECONDS" | grep -q -E '^[0-9][0-9]*$'
    [ $? -ne 0 ] && echo 'Error: parameters are not numbers' >&2 && exit 1
    TOTAL_SECONDS=$(( HOURS * 3600 + MINUTES * 60 + SECONDS ))
    [ $TOTAL_SECONDS -eq 0 ] && echo 'Error: total timer should be greater than zero' >&2 && exit 1

    if [ "$BOX" = "true" ]; then
    dialog --pause "Time remaining from $(leadzero $HOURS):$(leadzero $MINUTES):$(leadzero $SECONDS)" 8 70 "$TOTAL_SECONDS"
    RET_VAL=$?
    else
    echo -en "\nRemaining :\n\n\t$(leadzero $HOURS):$(leadzero $MINUTES):$(leadzero $SECONDS)"
    while [ $TOTAL_SECONDS -gt 0 ]; do
    sleep 1
    TOTAL_SECONDS=$((TOTAL_SECONDS - 1))
    S=$(( TOTAL_SECONDS % 60 ))
    TM=$(( (TOTAL_SECONDS - S) / 60 ))
    M=$(( TM % 60 ))
    H=$(( (TM - M) / 60 ))
    COUNTDOWN="$(leadzero $H):$(leadzero $M):$(leadzero $S)"
    echo -en "\r\t$COUNTDOWN"
    [ "$BEEP_LAST" = "true" -a $TOTAL_SECONDS -le $BEEP_DURATION ] && echo -en "\a"
    done
    sleep 1
    echo -e "\r\tTerminé !\n"
    RET_VAL=0
    fi
    [ $RET_VAL -eq 0 ] && mplayer "$SOUND" 1>/dev/null 2>&1
    exit 0

    timerbox
    #!/bin/sh

    xterm -title "Timer" -T "Timer" -geometry "70x8" -e "timer --box"

    alarm
    #!/bin/sh

    SCRIPT=$(basename "$0")
    TOMORROW="false"
    BOX="false"
    SOUND_COMMAND="mplayer /media/Elements/data/Sons/alarme.mp3 >/dev/null 2>&1"

    help() {
    cat <<EOT<br />Usage : $SCRIPT [options] HH MM SS

    Options :
    --tomorrow | -t : specify that the given time concerns the
    next day; useful when you are late in the
    day and wanting to set an alarm in a few
    hours, past midnight

    Parameters :
    'HH', 'MM' and 'SS' *must* be filled with their respective
    values ; add a leading zero if the number is lesser than 10
    (HH, MM and SS must have 2 numbers)
    As an example : '$SCRIPT 14 05 03'
    for an alarm at 14:05:03 in same day
    EOT
    }
    short_help() {
    echo "Usage : $SCRIPT [-t] hours minutes seconds"
    echo "Type \"$SCRIPT -h\" or \"$SCRIPT --help\" for complete help screen"
    }
    err_exit() {
    echo "Error: $* !" >&2
    short_help
    exit 1
    }
    [ $# -eq 0 ] && short_help && exit 0
    while [ $# -ne 0 ]; do
    case $1 in
    -h|--help)
    help
    exit 0
    ;;
    -t|--tomorrow)
    TOMORROW="true"
    shift
    ;;
    --box)
    BOX="true"
    TMP=$(mktemp)
    dialog --max-input 8 --inputbox "Alarm time (input format: HH MM SS)\n(current time is : $(date +%H:%M:%S)" 8 40 2>$TMP
    A_TIMESTRING=$(cat $TMP)
    [ -f $TMP ] && rm -f $TMP
    echo "$A_TIMESTRING" | grep -q -E '^[0-9][0-9] [0-9][0-9] [0-9][0-9]$'
    [ $? -ne 0 ] && dialog --msgbox "Error: \"$A_TIMESTRING\" is a wrong time format !" 8 70 && exit 1
    A_HOURS=$(echo $A_TIMESTRING | cut -d " " -f 1)
    A_MIN=$(echo $A_TIMESTRING | cut -d " " -f 2)
    A_SEC=$(echo $A_TIMESTRING | cut -d " " -f 3)
    break
    ;;
    *)
    [ $# -ne 3 ] && err_exit "3 parameters needed"
    echo "$1$2$3" | grep -q -E '^[0-9][0-9][0-9][0-9][0-9][0-9]$'
    [ $? -ne 0 ] && err_exit "all time parameters are not 2-digit numbers"
    A_HOURS=$1
    A_MIN=$2
    A_SEC=$3
    break
    ;;
    esac
    done

    A_TIME=$(date -d $A_HOURS:$A_MIN:$A_SEC +%s)
    [ "$TOMORROW" = "true" ] && A_TIME=$(( A_TIME + 24 * 3600 ))
    N_TIME=$(date +%s)
    [ $A_TIME -le $N_TIME ] && err_exit "Alarm time cannot be anterior or same as current time"
    D_TIME=$(( A_TIME - N_TIME ))
    #D_SEC=$(( D_TIME % 60 ))
    #D_MIN=$(( ((D_TIME - D_SEC) / 60) % 60 ))
    #D_HOURS=$(( (D_TIME - D_MIN - D_SEC) / 3600 ))

    if [ "$BOX" = "false" ]; then
    echo -e "\n\t\033[1mAlarm time\033[0m $A_HOURS:$A_MIN:$A_SEC"
    while [ $D_TIME -ne 0 ]; do
    echo -en "\t\033[1mCurrent time\033[0m $(date +%H:%M:%S)"
    sleep 1
    D_TIME=$(( D_TIME - 1 ))
    echo -en "\b\r"
    done
    echo -e "\t\033[1;33mTerminé !\033[0;37m \n"
    eval "$SOUND_COMMAND"
    else
    while [ $D_TIME -ne 0 ]; do
    dialog --clear --timeout 1 --backtitle "Alarm" --msgbox "Alarm set at : $A_HOURS:$A_MIN:$A_SEC\nCurrent time is : $(date +%H:%M:%S)" 8 40
    D_TIME=$(( D_TIME - 1 ))
    done
    eval "$SOUND_COMMAND"
    dialog --clear --msgbox "Time is out ! Alarm has finished" 8 40
    fi

    alarmbox
    #!/bin/sh

    xterm -title "Alarm" -T "Alarm" -geometry "40x8" -e "alarm --box"

Howdy, Stranger!

It looks like you're new here. If you want to get involved, click one of these buttons!

Sign In Apply for Membership

SliTaz Social