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

sdei2Voici 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ésentationunix

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 http://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 http://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

2 réflexions au sujet de « Génération compteur EAU domoticz – détail du script »

  1. LEFEVRE Joël

    Bonjour, j’ai posté un commentaire sur un problème lié au compteur d’eau, la remontée des données n’était pas correcte et le compteur affichait « 0 » imperturbablement dans domoticz, alors que les données sont bien rapatriés du site de « La lyonnaise des eaux » et des valeurs sont présente dans la base de données du répertoire « EAU ». Après plusieurs essais infructueux, en ouvrant la base de données exportées de domoticz, je viens de constater que les données « date » et « Counter » sont inversées, la date est dans « Counter » et la valeur dans « Date » ?! Visiblement il y a une mauvaise assignation de valeurs quelque part, je ne sais pas comment en trouver l’origine.
    Un peu d’aide serait bien venue!
    Merci d’avance à toutes propositions pertinentes.

    Répondre
  2. LEFEVRE Joël

    Bonjour, solution trouvée pour ce couac. Dans le fichier updateConsoEau.sh il faut aller dans la partie 3, dans « Generation » il faut permuter la position de \’$val2\’ avec celle de \’$yy-$mm-$dd\’ . Ensuite il faut effacer tout les fichier générés auparavant et relancer la commande updateConsoEau.sh pour tous les mois souhaités.
    Un bon nettoyage de la base de données est quand utile avant la nouvelle récupération des données.

    Bon courage à Tous.
    J’espère que cela aidera ceux qui sont dans la même galère que moi.
    Reste à savoir si l’auteur de ce très pratique script pourra tenir compte de tout ceci, merci a lui pour son excellent travail.

    Répondre

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *