Menu :
- Présentation
- Etape 1 – Récupérer votre ID sur le site
- Etape 2 – Création du Compteur dans domoticz
- Etape 3 – Script
- Etape 4 – Pour aller plus loin
- Liste des sites testés.
Détail du script
L’installation de ce script et sa configuration se trouvent ici : Présentation.
Le code fonctionne pour plusieurs sites (SDEI, SOGEST, … ) la liste des sites a été ajoutée ici.
Explication en détail du script :
PART 0 initialisation des variables
Explication : Dans cette partie du script on initialise les informations nécessaires. Comme votre adresse email, votre mot de passe personnel pour accéder à votre compte sur le site et le code que vous avez récupéré à l’étape 1. On indique également où ce trouve votre base de données.
[Edit mars 2016 : cette partie a été modifiée pour intégrer un questionnaire pour ne pas avoir à éditer le fichier manuellement]
####################################### # # PART 0 Common variables # ###################################### # Date setup (if not set = today) if [ $1 != '' ] && [ $2 != '' ] && [[ $1 == +([0-9]) ]] && [[ $2 == +([0-9]) ]] then dateY=$1 dateM=$2 else dateY=`date "+%Y"` dateM=`date "+%m"` fi # SQL Files setup for temporary and final file sqlfinalfile=/home/pi/SDEI/only_new_generated.$dateY-$dateM.sql sqlpreviousfile=/home/pi/SDEI/previous.generated.$dateY-$dateM.sql sqltmpfile=/home/pi/SDEI/temps.generated.$dateY-$dateM.sql #SDEI PERSONAL CODE ( see https://domotique.web2diz.net/?p=137) SDEI_CODE= # put your code here ex: SDEI_CODE=PLOLKIKU SDEI_EMAIL= # put your email here ex: SDEI_EMAIL=toto@tata.com SDEI_PASSWD= # put your password here ex: SDEI_PASSWD=totolabrico42 # Database file setup #dbfile=/home/pi/SDEI/domoticz.db # Only for test purpose dbfile=/home/pi/domoticz/domoticz.db # Your virtual device ID in domoticz (see step2 here https://domotique.web2diz.net/?p=138 ) devicerowid= # put your devices idx here ex : devicerowid=123
PART 1 Récupération des données brutes
Explication : A l’aide de la commande curl avec l’utilisation de cookies on se connecte une première fois sur la page de login en récupérant le cookie qui nous permettra ensuite de se connecter sur la page qui contient les données. Une fois les donnes téléchargées on supprime le cookie.
####################################### # # PART 1 get the data # ###################################### echo -e "\n - PART 1 Get the data from $PROVIDER for $dateY-$dateM" if [[ $PROVIDER == 'SDEI' ]] then loginpage="https://www.lyonnaise-des-eaux.fr/mon-compte-en-ligne/connexion/validation" datapage="https://www.lyonnaise-des-eaux.fr/mon-compte-en-ligne/statJData/$dateY/$dateM/$SDEI_CODE" elif [[ $PROVIDER == 'SOGEST' ]] then loginpage="https://www.sogest.info/mon-compte-en-ligne/connexion/validation" datapage="https://www.sogest.info/mon-compte-en-ligne/statJData/$dateY/$dateM/$SDEI_CODE" fi export_file=/home/pi/SDEI/$dateY-$dateM.dat # This first cmd will allow to connect to the site and get the cookiefile curl -s $loginpage -c /home/pi/SDEI/cookiefile -d "input_mail=$SDEI_EMAIL&input_password=$SDEI_PASSWD" > /dev/null # This second cmd will download the data curl -s $datapage -b /home/pi/SDEI/cookiefile > $export_file echo -e "\n $export_file generated " rm /home/pi/SDEI/cookiefile
PART 2 On adapte le fichier de données brutes pour qu’il soit plus facile à traiter
Explication : On supprime tout ce qui n’est pas utile dans le fichier brut et on organise les données.
####################################### # PART 2 set the file to be usable # ###################################### echo -e "\n - PART 2 Update .dat file " sed -e 's/\\//g' $export_file > file1 sed -e 's/\],\[/\n/g' file1 > file2 sed -e 's/\[\[/\n/g' file2 > file3 sed -e 's/\"//g' file3 |grep -v ",0,0" |grep -e '^$' -v |grep -v ERR > $export_file rm file1 file2 file3 echo -e "\n $export_file Updated "
PART 3 Génération des scripts SQL
Explication : cette partie est la plus délicate car en fonction des données contenu dans le fichier généré dans la partie 2 on va généré les requettes sql qui vont venir alimenter la base de données. Le script va également garder en mémoire dans un fichier sql les commandes passées pour ne pas qu’elle soient rejoué lors d’une prochaine exécution. Pour avoir une double protection et éviter les doublons une commande « DELETE » est exécutée avant la commande « INSERT ». Le fichier $sqlfinalfile est généré seulement si le fichier généré lors de la précédente exécution ($sqlpreviousfile) est différent.
####################################### # # PART 3 Generate SQL # ###################################### echo -e "\n - PART 3 Generate SQL" # create the previous file is does not exits if [ ! -f "$sqlpreviousfile" ] ; then touch $sqlpreviousfile ; fi IFS=, while read date val val2 ; do #### DATE #### dd=`echo $date |awk -F/ '{print $1}'` mm=`echo $date |awk -F/ '{print $2}'` yy=`echo $date |awk -F/ '{print $3}'` hh=`date | awk '{print $4}'` #### VAL1 #### val1=$(( $val * 100)) if [[ $val -eq 0 ]]; then float val1=$((100 * ($val2-$prevVal2))) fi prevVal2=$val2 ### Generation ### echo "DELETE FROM \`Meter_Calendar\` WHERE devicerowid=$devicerowid and date = '$yy-$mm-$dd'; INSERT INTO \`Meter_Calendar\` VALUES ('$devicerowid'," \'$val1\', \'$val2\', \'$yy-$mm-$dd\' ");" >> $sqltmpfile done < $export_file # GENERATE SQL FOR UPDATE DEVICE STATUS DEVICESTATUS1="update DeviceStatus set lastupdate = '$yy-$mm-$dd $hh' where id = $devicerowid;" ### prepare and compare fromm previous run #### comm -3 $sqltmpfile $sqlpreviousfile > $sqlfinalfile cat $sqlfinalfile echo $DEVICESTATUS1 mv $sqltmpfile $sqlpreviousfile
PART 4 Exécution des commandes sql générés (si besoin) et FIN (enfin 🙂 )
Explication : si le fichier $sqlfinalfile existe, c’est qu’il y a des nouvelles données à intégrer dans la base de données. Seulement dans ce cas, on arrête domoticz, on exécute les commande sql puis on redémarrer domoticz. Cela permet de garder une intégrité des données et de ne pas essayer d’écrire en même temps que le process domoticz dans le base de donnée.
####################################### # PART 4 Update the db # ###################################### #exit to be used for test purpose only echo -e "\n - PART 4 Update the db " if [ -s $sqlfinalfile ] then echo -e "\nFile size is NOT zero -> DB update needed" echo " Stoping Domoticz ! " sudo /etc/init.d/domoticz.sh stop echo " Domoticz stopped" echo Update DB START echo Update Values sudo cat $sqlfinalfile |sqlite3 $dbfile echo Update Status sudo echo $DEVICESTATUS1 |sqlite3 $dbfile echo Update DB END echo " Starting Domoticz !" sudo /etc/init.d/domoticz.sh start echo " Domoticz started " else echo -e "\nFile size is zero -> DB update NOT needed" fi