[Bash] YASFSH - Un autre script pour les congés scolaires
Publié : 01 janv. 2018, 19:30
Yes Another Script For School Holidays !
Pompeux comme nom !
Rien d'original, des scripts sur ce sujet on en trouve plusieurs ici ou là.
Et en plus celui-ci ne fonctionne que pour les scolaires français.
Mais j'avais envie d'utiliser cette source, qui semble être de confiance !
Et puis ça peut servir de base pour décoder un autre calendrier au format ICAL.
Principe du script :
Après son initialisation manuelle sur un terminal, le script va chercher le calendrier ICAL des congés scolaires et détermine si aujourd'hui appartient à une période de ce calendrier.
Les variables Domoticz suivantes seront valorisés :
cURL est requis, mais en général il fait partie des distributions linux.
Dans ce script j'utilise un outil bien pratique pour décoder les sorties de Domoticz au format JSON : https://github.com/stedolan/jq
Je l'ai trouvé dans mes dépôts, ils est possible qu'il soit aussi dans d'autres distributions.
Si ce n'est pas le cas, vous pourrez l'installer via git.
Initialisation :
La seule chose à faire est de placer le script dans le répertoire des scripts de domoticz, dans /home/pi/domoticz/scripts par exemple.
Si vous êtes novice et sous linux, connectez-vous à un terminal et tapez ce qui suit :
Une fois dans nano, collez le script qui est un peu plus bas dans ce message (TOUT SÉLECTIONNER - copier - coller dans nano).
Vérifiez que la ligne 31 est conforme à l'adresse et au port de votre système Domoticz.
Profitez-en pour vérifier que les exécutables curl et jq sont bien dans ces répertoires désignés lignes 71 et 72.
Pour sauvegarder dans nano, faites crtl-X puis Y puis Entrée.
Rendre le script exécutable :
Et enfin l'exécuter :
Le script va vous demander la première fois de quelle zone académique vous dépendez :
En répondant par la lettre qui correspond à votre zone, le script crée les variables et alimente celle qui contient la source du calendrier.
Si vous vous être trompé en répondant, le plus simple est de supprimer dans Domoticz la variable Vacances_Scolaires_Source et de relancer le script.
Ensuite il ne reste qu'a ajouter une entrée dans la crontab (j'utilise la crontab de root et vi comme éditeur) :
Ajouter l'entrée suivante, qui va déclencher le script chaque jour de l'année à 00:07 :
C'est presque terminé.
Pour vérifier que tout fonctionne, vous pouvez lancer le script manuellement :
Il y a quelques affichages parasites, mais la phrase indiquant si on est dans une période de congés peut apparaître.
Dans le log de Domoticz, vous devriez voir la trace de la création des variables et la récupération du calendrier.
Libre à vous ensuite d'utiliser la variable Vacances_Scolaires_ON dans vos scripts Domoticz pour déclencher les actions qui vous conviennent.
Le script bash :
Et son compagnon voir_les_logs.sh:
Allez, si vous êtes encore là, une petite anecdote :
J'ai expliqué à ma moitié ce que j'étais en train de bricoler aujourd'hui.
Patiemment, elle m'a laissé terminer mon explication.
Et puis elle m'a posée une question :
C'était une bonne remarque ;
l'établissement qu'ils fréquentent est limitrophe entre 2 académies de zones différentes, et a des scolaires de ces deux zones ; du coup il adopte souvent des congés en prenant une semaine à une zone et une autre semaine à l'autre zone.
Mon script ne va pas beaucoup me servir !
Pompeux comme nom !
Rien d'original, des scripts sur ce sujet on en trouve plusieurs ici ou là.
Et en plus celui-ci ne fonctionne que pour les scolaires français.
Mais j'avais envie d'utiliser cette source, qui semble être de confiance !
Et puis ça peut servir de base pour décoder un autre calendrier au format ICAL.
Principe du script :
Après son initialisation manuelle sur un terminal, le script va chercher le calendrier ICAL des congés scolaires et détermine si aujourd'hui appartient à une période de ce calendrier.
Les variables Domoticz suivantes seront valorisés :
- Vacances_Scolaires_Source : chemin d'accès vers le calendier ICAL des congés scolaires sur la page OpenData du gouvernement français.
- Vacances_Scolaires_ON : Contient soit O si on est en période de congés, ou N sinon.
- Vacances_Scolaires_Name : Contient le nom de la période de vacances, ou blanc sinon.
cURL est requis, mais en général il fait partie des distributions linux.
Dans ce script j'utilise un outil bien pratique pour décoder les sorties de Domoticz au format JSON : https://github.com/stedolan/jq
Je l'ai trouvé dans mes dépôts, ils est possible qu'il soit aussi dans d'autres distributions.
Si ce n'est pas le cas, vous pourrez l'installer via git.
Initialisation :
La seule chose à faire est de placer le script dans le répertoire des scripts de domoticz, dans /home/pi/domoticz/scripts par exemple.
Si vous êtes novice et sous linux, connectez-vous à un terminal et tapez ce qui suit :
Code : Tout sélectionner
cd /home/pi/domoticz/scripts
nano vacances_scolaires.shVérifiez que la ligne 31 est conforme à l'adresse et au port de votre système Domoticz.
Profitez-en pour vérifier que les exécutables curl et jq sont bien dans ces répertoires désignés lignes 71 et 72.
Pour sauvegarder dans nano, faites crtl-X puis Y puis Entrée.
Rendre le script exécutable :
Code : Tout sélectionner
chmod +x vacances_scolaires.shCode : Tout sélectionner
./vacances_scolaires.shEn répondant par la lettre qui correspond à votre zone, le script crée les variables et alimente celle qui contient la source du calendrier.
Si vous vous être trompé en répondant, le plus simple est de supprimer dans Domoticz la variable Vacances_Scolaires_Source et de relancer le script.
Ensuite il ne reste qu'a ajouter une entrée dans la crontab (j'utilise la crontab de root et vi comme éditeur) :
Code : Tout sélectionner
sudo -H crontab -eCode : Tout sélectionner
7 0 * * * /home/pi/domoticz/scripts/vacances_scolaires.shPour vérifier que tout fonctionne, vous pouvez lancer le script manuellement :
Code : Tout sélectionner
./vacances_scolaires.shDans le log de Domoticz, vous devriez voir la trace de la création des variables et la récupération du calendrier.
Libre à vous ensuite d'utiliser la variable Vacances_Scolaires_ON dans vos scripts Domoticz pour déclencher les actions qui vous conviennent.
Le script bash :
Code : Tout sélectionner
#!/bin/bash
#-------------------------------------------------
# Positionne une variable dans Domoticz
# pour savoir si on est en période de vacances scolaires ou pas.
#
# Chrominator@free.fr
#
# 2018-01-01 : Version initiale
#
#-------------------------------------------------
# Principe :
# Récupération du fichier officiel des vacances scolaires
# sur le site du gouvernement français
# https://www.data.gouv.fr/fr/datasets/le-calendrier-scolaire/#_
#
# Le nom du fichier à télécharger est dans la variable domoticz
# Vacances_Scolaires_Source.
# Si la variable n'existe pas, la zone de l'académie est demandée par
# ce script puis la variable stockée dans domoticz.
#
# La variable résultante indiquant si on est en période
# scolaire est Vacances_Scolaires_ON de type char
# valant soit O pour oui ou N pour non
# Accessoirement est valorisé le nom de période de vacances dans
#la variable Vacances_Scolaires_Name
#-------------------------------------------------
#
# Définition des variables propres à l'installation
#
#-------------------------------------------------
DOMOTICZ_SERVER="127.0.0.1:8080"
#-------------------------------------------------
#
# Import de la fonction de traçage
#
#-------------------------------------------------
source /home/pi/domoticz/scripts/voir_les_logs.sh
#-------------------------------------------------
test_vacances() {
AUJOURDHUI=`date +%Y%m%d`
if [ ! -z ${VACANCES["DTEND"]} ]; then
if [ $AUJOURDHUI -gt ${VACANCES["DTSTART"]} ] && [ $AUJOURDHUI -lt ${VACANCES["DTEND"]} ]; then
voir_les_logs "Nous sommes actuellement en ${VACANCES["SUMMARY"]}"
JSONDATA=`$cURL -s -H "Accept: application/json" \
"http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=updateuservariable&vname=Vacances_Scolaires_ON&vtype=2&vvalue=O"`
if [ ! `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
voir_les_logs "Erreur lors de la mise à jour de la variable Vacances_Scolaires_ON."
fi
JSONDATA=`$cURL -s -H "Accept: application/json" \
"http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=updateuservariable&vname=Vacances_Scolaires_Name&vtype=2&vvalue=$($JQ -s -R -r @uri <<< ${VACANCES['SUMMARY']})"`
if [ ! `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
voir_les_logs "Erreur lors de la mise à jour de la variable Vacances_Scolaires_Name."
fi
fi
fi
}
#
#-------------------------------------------------
# Définition des commandes externes utilisées
#
# A installer si inexistantes par sudo apt install ...
#-------------------------------------------------
cURL="/usr/bin/curl"
JQ="/usr/bin/jq"
#-------------------------------------------------
#
# Vérification de l'existence de la variable
# Vacances_Scolaires_Source
#
#-------------------------------------------------
JSONDATA=`$cURL -s -H "Accept: application/json" "http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=getuservariables"`
VACANCES_SCOLAIRES_SOURCE=`$JQ -r '.result[] | select(.Name=="Vacances_Scolaires_Source") | .idx' <<< $JSONDATA`
VACANCES_SCOLAIRES_ON=`$JQ -r '.result[] | select(.Name=="Vacances_Scolaires_ON") | .idx' <<< $JSONDATA`
VACANCES_SCOLAIRES_NAME=`$JQ -r '.result[] | select(.Name=="Vacances_Scolaires_Name") | .idx' <<< $JSONDATA`
if [ ! -z $VACANCES_SCOLAIRES_SOURCE ] && [ ! -z $VACANCES_SCOLAIRES_NAME ] && [ ! -z $VACANCES_SCOLAIRES_ON ]; then
echo "Index $VACANCES_SCOLAIRES_SOURCE de la variable Vacances_Scolaires_Source trouvé."
# Effacement des variables issues de précédentes exécution dans Domoticz
# JSONDATA=`$cURL -s -H "Accept: application/json" \
# "http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=updateuservariable&vname=Vacances_Scolaires_ON&vtype=2&vvalue=N"`
# if [ ! `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
# voir_les_logs "Erreur lors de la mise à jour de la variable Vacances_Scolaires_ON."
# fi
JSONDATA=`$cURL -s -H "Accept: application/json" \
"http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=updateuservariable&vname=Vacances_Scolaires_Name&vtype=2&vvalue=$($JQ -s -R -r @uri <<< ' ')"`
if [ ! `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
voir_les_logs "Erreur lors de la mise à jour de la variable Vacances_Scolaires_Name."
fi
JSONDATA=`$cURL -s -H "Accept: application/json" "http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=getuservariable&idx=$VACANCES_SCOLAIRES_SOURCE"`
if [ `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
voir_les_logs "Récupération du calendrier des vacances scolaires."
URI=`$JQ -r '.result[] | .Value' <<< $JSONDATA`
ICALDATA=`$cURL -s -H "Accept: application/json" "$URI"`
declare -A VACANCES=( ) # définition du tableau
while IFS=":" read -r KEY VALUE; do # Chargement du calendrier ICAL dans le tableau
VALUE=${VALUE%$'\r'} # remove DOS newlines
if [[ $KEY = END && $VALUE = VEVENT ]]; then
test_vacances # Vérifie si nous sommes en période de vacances
VACANCES=( )
else
VACANCES[${KEY%%";"*}]=$VALUE
fi
done <<< "$ICALDATA"
else
voir_les_logs "Problème lors de la lecture de la variable Vacances_Scolaires_Source."
fi
else
if [ -z $VACANCES_SCOLAIRES_NAME ]; then
JSONDATA=`$cURL -s -H "Accept: application/json" "http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=saveuservariable&vname=Vacances_Scolaires_Name&vtype=2&vvalue=nil"`
if [ `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
echo -e "Variable Vacances_Scolaires_Name initialisée."
fi
fi
if [ -z $VACANCES_SCOLAIRES_ON ]; then
JSONDATA=`$cURL -s -H "Accept: application/json" "http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=saveuservariable&vname=Vacances_Scolaires_ON&vtype=2&vvalue=nil"`
if [ `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
echo -e "Variable Vacances_Scolaires_ON initialisée."
fi
fi
if [ -z $VACANCES_SCOLAIRES_SOURCE ]; then
echo "Index de la variable Vacances_Scolaires_Source non trouvé."
if [ -t 0 ] ; then
echo -e "On est sur un terminal.\nCréation de la variable Vacances_Scolaires_Source."
while read -n1 -r -p "De quelle zone académique dépendez vous [A],[B] ou [C]) ?" ZONE; do
case ${ZONE^^} in
A) echo -e "\nZone A. Ok"; break;;
B) echo -e "\nZone B. Ok"; break;;
C) echo -e "\nZone C. Ok"; break;;
*) echo -e "\nPardon ?\nRépondez par les lettres [A],[B] ou [C]";;
esac
done
JSONDATA=`$cURL -s -H "Accept: application/json" "http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=saveuservariable&vname=Vacances_Scolaires_Source&vtype=2&vvalue=http://www.education.gouv.fr/download.php?file=http://cache.media.education.gouv.fr/ics/Calendrier_Scolaire_Zone_${ZONE^^}.ics"`
if [ `$JQ -r '.status' <<< $JSONDATA` = 'OK' ]; then
echo -e "Variable Vacances_Scolaires_Source initialisée pour la Zone $ZONE."
echo -e "Vous pouvez ajouter ce script à la crontab pour l'exécuter une fois par jour peu après minuit."
else
echo -e "Problème lors de la création de la variable dans domonticz.\nCréez la variable Vacances_Scolaires_Source manuellement."
fi
else
voir_les_logs "on est en batch.\nExécutez ce script sur un terminal une fois pour initialiser les variables."
fi
fi
fi
Code : Tout sélectionner
# Fonction permettant d'afficher un texte sur tty
# et dans les logs de Domoticz
#
# Chrominator@free.free
#
# 2017-12-31 : Version initiale
#
#
cURL="/usr/bin/curl"
JQ="/usr/bin/jq"
couleur="#801ee1"
voir_les_logs () {
msg="$0: $1"
echo $msg
msg="<font color='$couleur'>"$msg"</font>"
$cURL -i -H "Accept: application/json" "http://${DOMOTICZ_SERVER}/json.htm?type=command¶m=addlogmessage&message=`$JQ -s -R -r @uri <<< $msg`"
}J'ai expliqué à ma moitié ce que j'étais en train de bricoler aujourd'hui.
Patiemment, elle m'a laissé terminer mon explication.
Et puis elle m'a posée une question :
Tu te souviens que tes enfants ont des congés scolaires décalés par rapport aux zones des académies ?
C'était une bonne remarque ;
l'établissement qu'ils fréquentent est limitrophe entre 2 académies de zones différentes, et a des scolaires de ces deux zones ; du coup il adopte souvent des congés en prenant une semaine à une zone et une autre semaine à l'autre zone.
Mon script ne va pas beaucoup me servir !