Domotic and stupid geek stuff

Génération compteur EAU domoticz – détail du script

Voici comment récupérer sur votre raspberry et domoticz les informations de consommation provenant des sites de SUEZ. Pour les détails vous rendre sur la page de présentation ici.

Menu :

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
Quitter la version mobile