[Bash] YASFSH - Un autre script pour les congés scolaires

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

[Bash] YASFSH - Un autre script pour les congés scolaires

Message par Chrominator »

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. :shock:


Mais j'avais envie d'utiliser cette source, qui semble être de confiance ! :D
Et puis ça peut servir de base pour décoder un autre calendrier au format ICAL.
Screenshot-2018-1-1 Le calendrier scolaire - Data gouv fr.png
Screenshot-2018-1-1 Le calendrier scolaire - Data gouv fr.png (66.73 Kio) Consulté 4060 fois
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.
Prérequis :

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.sh
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.
Capture6.PNG
Capture6.PNG (5.87 Kio) Consulté 4060 fois
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.
Capture7.PNG
Capture7.PNG (6.27 Kio) Consulté 4060 fois
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.sh
Et enfin l'exécuter :

Code : Tout sélectionner

./vacances_scolaires.sh
Le script va vous demander la première fois de quelle zone académique vous dépendez :
Capture.PNG
Capture.PNG (9.42 Kio) Consulté 4060 fois
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.
Capture1.PNG
Capture1.PNG (5.91 Kio) Consulté 4060 fois
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 -e
Ajouter l'entrée suivante, qui va déclencher le script chaque jour de l'année à 00:07 :

Code : Tout sélectionner

7 0 * * *       /home/pi/domoticz/scripts/vacances_scolaires.sh
Capture3.PNG
Capture3.PNG (4.21 Kio) Consulté 4060 fois
C'est presque terminé.

Pour vérifier que tout fonctionne, vous pouvez lancer le script manuellement :

Code : Tout sélectionner

./vacances_scolaires.sh
Il y a quelques affichages parasites, mais la phrase indiquant si on est dans une période de congés peut apparaître.
Capture4.PNG
Capture4.PNG (17.98 Kio) Consulté 4060 fois
Dans le log de Domoticz, vous devriez voir la trace de la création des variables et la récupération du calendrier.
Capture5.PNG
Capture5.PNG (3.81 Kio) Consulté 4060 fois
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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=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&param=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
Et son compagnon voir_les_logs.sh:

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&param=addlogmessage&message=`$JQ -s -R -r @uri <<< $msg`"
}
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 :
Tu te souviens que tes enfants ont des congés scolaires décalés par rapport aux zones des académies ?
:?

:o

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 ! :lol:
Dernière modification par Chrominator le 02 avr. 2018, 05:34, modifié 3 fois.
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Chrominator
Messages : 1042
Inscription : 19 déc. 2015, 07:29
Localisation : France

Re: [bash] YASFSH - Un autre script pour les congés scolaires

Message par Chrominator »

Et bien si, finalement mon script me sert !

J'ai créé un calendrier des vacances scolaires spécifiques de mes enfants avec mon client de messagerie (Thunderbird, d'autres conviendraient aussi) et je l'ai exporté au format ICAL (.ics).
Je l'ai ensuite copié dans un répertoire de l'arborescence web de Domoticz (dans /home/pi/domoticz/www/calendar/ pour moi).
Je n'ai eu ensuite qu'à modifier la variable Vacances_Scolaires_Source de domoticz pour qu'elle pointe vers ce calendrier.

Le script fonctionne impec sans modif.

Bonus ; il est très simple d'importer ce calendrier dans n'importe quel smartphone ou ordinateur, il suffit d'utiliser le lien http qu'on a mis dans la variable Vacances_Scolaires_Source.
Un bon frein vaut mieux que deux sparadraps.

Ubuntu 24.04.3 LTS - Domoticz 2025.1 (build 16782)
Pentium G3220T 2.6GHz - 4Go DDR3
RFXtrx433 USB Ver Pro1/1043
Z-Stick GEN5 Version: 1.6-1136-g07ea22bb
Rtl433 RTL-SDR receiver
RFLink Gateway
Zigbee SLZB-06
Répondre