Reveil matin en bash (c'est moi qui l'ai fait! V. Lemercier)

Iaorana,
je commence en bash mais voila, par manque de temps je dois m’arrêter là. Mon reveil matin semble fonctionnel (enfin sur mon AAO/Lenny en tout cas) mais j’aurai aimé pouvoir le peaufiner, apurer le code et pourquoi pas mettre une interface graphique. Alors voilà je laisse le bidule ici. Si cela intéresse quelqu’un tant mieux sinon c’est pas grave.

Le reveil matin en bash comporte 2 fichiers à installer dans un même dossier :
WakeUpAndLive.sh est le fichier de programmation de la date de sortie d’hibernation du PC portable posé ouvert sur votre table de nuit.
musicReveil.sh est le fichier qui vous permet de choisir de la musique dans la discothèque du disque dur du PC. musicReveil.sh est invoqué par WakeUpAndLive.sh par le biais du démon atd (à installer s’il est absent)
nana.

Contenu du fichier : WakeUpAndLive.sh

[code]#!/bin/bash

#Utilisation d’un portable (non fermé) mis en veille sur disque (pm-hibernate) ou en ram (pm-suspend) comme reveil matin
#Auteur : Douarn
#Licence : GPL
#Recommandation : dans un premier temps, valider le fonctionnement du présent script en parallèle d’un vrai reveil
#Important : je décline toute responsabilité en cas de grasse matinée intempestive ou de reveil à la mauvaise heure
#Dependance : pm-hibernate et/ou pm-suspend fonctionnel, demon atd démarré, mpg123, xterm
#Configuration : autoriser l’user à lancer pm-hibernate et/ou pm-suspend en ajoutant ces commandes au fichier /etc/sudoers (voir ligne ci-dessous)

$USER ALL=NOPASSWD: /usr/sbin/pm-suspend, /usr/sbin/pm-hibernate, /usr/sbin/pm-suspend-hybrid

#Autre : ajouter quelques fichiers mp3 pour se reveiller (wake up and live de Bob Marley est plus que recommandé :wink: de mon point de vue)

HEUREREVEILDEFAUT="07:00"
HEURE=$(date +%R)

#declaration d’entiers
declare -i datePosixJour0heure datePosixDemain0heure datePosixReveilDefaut datePosixChoixDate dateReveilPosix dateReveilHeurePosixUTC heureReveilPosixAt

#NETTOYAGE DU TERMINAL ET AFFICHAGE DU CALENDRIER
clear
echo "Etat de la pile de l’horloge système $(cat /proc/driver/rtc | grep -i batt_status | cut -f2)"
echo "========================================================== "
ncal

#AFFICHAGE DE LA DATE, L’HEURE ET DES MINUTES
datePosixJour0heure=$(date -d $(date +%F) +%s)
dateJour=$(date +%A" “%d” "%B -d @$datePosixJour0heure)
echo "nous sommes le $dateJour, il est $HEURE"
echo "========================================================== "

CALCUL DE LA DATE DU PROCHAIN MATIN

let datePosixDemain0heure=datePosixJour0heure+86400
if [ $(date +%k) -le 12 ]; then
dateReveil=$(date +%A" “%d” “%B -d @$datePosixJour0heure)
let datePosixReveilDefaut=datePosixJour0heure
else
dateReveil=$(date +%A” “%d” "%B -d @$datePosixDemain0heure)
let datePosixReveilDefaut=datePosixDemain0heure
fi

SAISIE DE LA DATE ET DE L’HEURE DE REVEIL

echo "Je vous propose de vous reveiller le $dateReveil"
echo "sinon saisissez une autre date (AA-M-J)“
read reponse
if [[ $reponse != “” ]]; then
datePosixChoixDate=$(date -d $(date +%F -d “$reponse”) +%s)
dateReveilPosix=$datePosixChoixDate
#echo “datePosixChoixDate= $datePosixChoixDate et datePosixReveilDefaut= $datePosixReveilDefaut"
if (( $datePosixChoixDate >= $datePosixReveilDefaut )); then
dateReveil=”$(date +%A” “%d” "%B -d @$datePosixChoixDate)"
dateReveilPosix=$datePosixChoixDate
#echo "choixDate: $dateReveil soit $datePosixChoixDate (posix time)"
else
echo "ERREUR : date de reveil saisie antérieure à la date actuelle !"
echo "Veuillez recommencer la procédure"
exit 1
fi
else
echo "je vous reveil donc le $dateReveil"
dateReveilPosix=$datePosixReveilDefaut
fi

echo "A quelle heure désirez vous vous reveiller (defaut= 07:00)"
echo "sinon saisissez une autre heure (format 24-heures hh:mm)?"
read heureReveil

if [[ $heureReveil == “” ]]; then
heureReveil=$HEUREREVEILDEFAUT
fi

dateReveilHeurePosix=$(date -d “$(date +%F -d @$dateReveilPosix) $heureReveil” “+%s”)

if (( $dateReveilHeurePosix <= $(date +%s) )); then
echo "ERREUR, l’heure saisie est antérieure à l’heure courrante !!"
echo "veuillez recommancer la procédure"
exit 1
fi

#AFFICHAGE DE LA DATE ET DE L’HEURE DE REVEIL
echo “vous désirez vous reveiller le $dateReveil à $heureReveil ?”

#Programmation de la sortie de suspend to disk du PC
if [ -e /sys/class/rtc/rtc0/wakealarm ]; then
echo 0 > /sys/class/rtc/rtc0/wakealarm
echo $dateReveilHeurePosix > /sys/class/rtc/rtc0/wakealarm
else
echo "ERREUR, /sys/class/rtc/rtc0/wakealarm manquant !!"
exit 1
fi

echo "La programmation du reveil s’est elle correctement réalisée ?"
echo “mise en route de l’alarme $(cat /proc/driver/rtc | grep -i alarm_IRQ|cut -f2), le$(cat /proc/driver/rtc | grep -i alrm_date|cut -f2), à$(cat /proc/driver/rtc | grep -i alrm_time|cut -f2) heure UTC”

Programmation de la mise en action du lecteur de fichier mp3 pour le reveil

on ajoute 90 secondes pour laisser le temps au PC de sortir de sa veille avant de lancer la musique de reveil

let heureReveilPosixAt=$dateReveilHeurePosix+90
dateAT="$(date +%R" “%D -d @$heureReveilPosixAt)”
#echo “Date donnée à at en paramètre $dateAT”
#ligne suivante à décommenter pour activer le demon en charge de la lecture de la musique de reveil
#at -f ./musicReveil.sh -v $dateAT

#on se laisse 10 seconde pour lire si la programmation du reveil s’est bien effectuée
sleep 10
#mise en veillle sur disque du pc (Attention : autoriser le user à lancer pm-hibernate)
#ligne suivante à décommenter pour activer l’hibernation sur disque
#sudo /usr/sbin/pm-hibernate
#ligne suivante à décommenter pour activer l’hibernation en ram
#sudo /usr/sbin/pm-suspend
[/code]

Contenu du fichier : musicReveil.sh

#!/usr/bin xterm -display :0.0 -e mpg123 -CZ /Le/chemin/vers/votre/discothèque/*.mp3

très intéréssant ton script
je le test des que je peux

Merci pour ta contribution :smiley:

Juste une petite idée, je n’ai pas regardé tout le code mais tu peux jouer avec aumix pour avoir un fondu sur le volume au démarrage. C’est toujours agréable.

Merci Bobzer, mais je tiens à préciser qu’étant débutant je suis sûr que le script tel que je l’ai pondu devrait faire crier un puriste du bash.

C’est sûr que se réveiller avec une crise cardiaque c’est un truc a retourner direct au lit :laughing: et être en retard au boulot par la même occasion… :violence-hammer:

Mais comme je le disait je vais vraiment avoir du mal à faire évoluer le script. S’il y en a ici qui veulent apporter leur pierre à ce petit édifice il ne faut pas hésiter…

Ce matin mon pu******* de téléphone a trouvé bon d’oublier de sonner, je voudrais pas acheter un réveil à la va vite, donc je vais voir si je peux me servir de tes scripts au passage. Je les ai pas encore testés, je le ferais ce soir. J’apporterais des petites modif’ parce que je suis incapable de récupérer un script sans y toucher (en plus moi j’utilise xmms2 pour écouter de la musique).

pas de souci, je le répète il y a pas mal de tests à effectuer. J’attire ton attention sur le point suivant : tu as vu qu’à la fin de WakeUpAndLive.sh tu dois décommenter l’une des options en fonction de ton choix de mise en veille de ton pc.

.... #on se laisse 10 seconde pour lire si la programmation du reveil s'est bien effectuée sleep 10 #mise en veillle sur disque du pc (Attention : autoriser le user à lancer pm-hibernate) #ligne suivante à décommenter pour activer l'hibernation sur disque #sudo /usr/sbin/pm-hibernate #ligne suivante à décommenter pour activer l'hibernation en ram #sudo /usr/sbin/pm-suspend

Ce matin je me suis levé à l’heure :041

J’ai fais pleins de tests hier et j’ai retouché ton script (à peine, uniquement des trucs parce que je suis névrosé :laughing: ). Mon portable ignore l’interuption quand je fais une hibernation, mais se réveil comme il faut avec un “suspend to ram”.

J’ai pas utilisé ton second script parce qu’il me semble inutile. J’ai préféré rajouter les 3 lignes de lecture à la fin du script principal :

nyxmms2 clear nyxmms2 add "/chemin/qu/il/faut/*.ogg" nyxmms2 play
Ça marche bien quand on se sert du script pour arrêter le PC en même temps que configurer le réveille.

Ça marche nickel et je trouve que ça simplifie le truc.

J’avais des problèmes de droit pour écrire dans /sys/machin…, du coup j’ai remplacé ces instructions par :

sudo sh -c 'echo 0 > /sys/class/rtc/rtc0/wakealarm' sudo sh -c "echo $dateReveilHeurePosix > /sys/class/rtc/rtc0/wakealarm"

Autres remarques :
[ul]
[li]ton script ne réveille que le matin, si je ne me trompe pas :slightly_smiling: [/li]
[li]ce serais cool de pouvoir s’en servir pour simplement supprimer le réveille[/li][/ul]

bon ben cool !! et merci pour les modifications/retour d’expérience

Non je crois pas :017 , j’ai voulu qu’il puisse sortir le pc d’un suspend/hibernate à n’importe quelle date+heure pourvu qu’elle soit postérieure à la date+heure à laquelle la programmation est faite.

L’idée que j’avais au début (contrairement au titre du fil), c’était de ne pas faire forcément qu’un réveil, mais de pouvoir programmer des trucs à plus ou moins long terme nécessitant la mise en hibernation du pc du style pense-bête, lancer un enregistrement d’une émission sur un site de tv en rediffusion pendant que je suis au boulot pour le visionner ensuite … Je voyais un truc “modulaire”. Ainsi musicReveil.sh est un petit script très simple pour jouer de la musique à la sortie du pm-hibernate pour le reveil mais les dieux du bash (et les autres :045 ) peuvent aisément ajouter d’autres scripts en parallèle. Selon moi, WakeUpAndLive.sh ne devrait servir qu’à la programmation de la date+heure de sortie de suspend/hibernate et au lancement d’un script particulier réalisant une tache définie en décommentant juste la ligne correspondante. Il n’y aurait ainsi pas de risque d’alourdir ce script outre mesure au fur et à mesure de son adaptation à d’autres tâches.
Bon voilà c’était l’idée de base, je suis juste content que cela t’ai servi.
nana

L’idée que j’avais au début (contrairement au titre du fil), c’était de ne pas faire forcément qu’un réveil, mais de pouvoir programmer des trucs à plus ou moins long terme nécessitant la mise en hibernation du pc du style pense-bête, lancer un enregistrement d’une émission sur un site de tv en rediffusion pendant que je suis au boulot pour le visionner ensuite … Je voyais un truc “modulaire”. Ainsi musicReveil.sh est un petit script très simple pour jouer de la musique à la sortie du pm-hibernate pour le reveil mais les dieux du bash (et les autres :045 ) peuvent aisément ajouter d’autres scripts en parallèle. Selon moi, WakeUpAndLive.sh ne devrait servir qu’à la programmation de la date+heure de sortie de suspend/hibernate et au lancement d’un script particulier réalisant une tache définie en décommentant juste la ligne correspondante. Il n’y aurait ainsi pas de risque d’alourdir ce script outre mesure au fur et à mesure de son adaptation à d’autres tâches.
Bon voilà c’était l’idée de base, je suis juste content que cela t’ai servi.
nana[/quote]
Je comprends bien, mais si tu passe de ça :

[code]# Programmation de la mise en action du lecteur de fichier mp3 pour le reveil

on ajoute 90 secondes pour laisser le temps au PC de sortir de sa veille avant de lancer la musique de reveil

let heureReveilPosixAt=$dateReveilHeurePosix+90
dateAT="$(date +%R" “%D -d @$heureReveilPosixAt)”
#echo “Date donnée à at en paramètre $dateAT”
#ligne suivante à décommenter pour activer le demon en charge de la lecture de la musique de reveil
#at -f ./musicReveil.sh -v $dateAT

#on se laisse 10 seconde pour lire si la programmation du reveil s’est bien effectuée
sleep 10
#mise en veillle sur disque du pc (Attention : autoriser le user à lancer pm-hibernate)
#ligne suivante à décommenter pour activer l’hibernation sur disque
#sudo /usr/sbin/pm-hibernate
#ligne suivante à décommenter pour activer l’hibernation en ram
#sudo /usr/sbin/pm-suspend[/code]
à ça :

[code]#on se laisse 10 seconde pour lire si la programmation du reveil s’est bien effectuée
sleep 10
#mise en veillle sur disque du pc (Attention : autoriser le user à lancer pm-hibernate)
#ligne suivante à décommenter pour activer l’hibernation sur disque
#sudo /usr/sbin/pm-hibernate
#ligne suivante à décommenter pour activer l’hibernation en ram
#sudo /usr/sbin/pm-suspend

./musicReveil.sh

ou

exec ./musicReveil.sh[/code]

Tu as le même niveau de modularité.

Ce qui me gène c’est que tu calcul deux fois quand l’action se produiras, une fois pour le réveil et une fois pour at, ça rend la maintenance plus difficile. C’est vrai que potentiellement tu peut découpler complètement at du réveil, mais je pense qu’il vaut mieux ajouter cette possibilité au moment ou on en a besoin. Ce n’est qu’un avis. :slightly_smiling:

Quel film ?
:text-nocomment: :blush: :arrow_right:

Quel film ?
:text-nocomment: :blush: :arrow_right: [/quote]
Je te pris de discuter dans la section " Programmation " :angry:
[size=50]Surtout quand c’est pour relever l’une de mes fautes d’orthographe !!! :013 :013 :013 [/size]

Le double calcul est lié au fait qu’il me semble nécessaire de laisser le temps au pc de sortir totalement de sa mise en veille :015 (90sec) avant de lancer la tâche (la musique de réveil en l’occurance). J’ai juste essayé de faire au mieux avec mes petits moyens de débutant bash :auto-swerve: et je vous remercie pour tout conseil utile.
Au fait Misterfreeze, pourrais tu faire un diagnostic du problème lié au reveil du pc consécutif à un pm-hibernate en regardant la date de reveil cat /sys/class/rtc/rtc0/wakealarm. Je me demande s’il n’y aurait pas un pb car j’avais cru voir qu’il se pouvait que la date soit parfois décalée de 24 heures dans l’avenir.

Le double calcul est lié au fait qu’il me semble nécessaire de laisser le temps au pc de sortir totalement de sa mise en veille :015 (90sec) avant de lancer la tâche (la musique de réveil en l’occurance). J’ai juste essayé de faire au mieux avec mes petits moyens de débutant bash :auto-swerve: et je vous remercie pour tout conseil utile.[/quote]
En executant l’autre script l’autre script après le retour de pm-suspend ou pm-hibernate, tu es sûr qu’il a eu le temps de tout restaurer aussi.

J’en prends note, je le ferrais, mais je sais pas quand.

et bien disons que j’espère que 90 sec suffisent pour cela…

merci :038