TUTOS.EU

Corriger des données erronées dans Domoticz - à compléter

Modifier des données fausses dans la base de données de Domoticz

Il arrive que suite à des évènements les données de Domoticz partent en sucette.
Par exemple ci-dessous suite à une coupure de courant le total du compteur de courant est revenu à zéro et le compteur d'utilisation a repris un chiffre totalement faux (à priori au moins une partie du compteur)

Corriger le problème est expliqué au moins en partie sur cet article :
http://framboiseaupotager.blogspot.com/2017/11/acces-direct-la-base-de-donnees-de.html

Il est indiqué que domoticz utilise une base de données SQLite.

Mon Domoticz est installé sur un Raspberry pi.
Du coup on peut lire et modifier les données de la BDD de Domiticz avec le client sqlite3 que l'on peut installer sous Linux avec cette commande

sudo apt-get install sqlite3
Lien vers le fichier : cliquez ici

La base de données de domoticz se nomme domoticz.db
Sur le site framboiseaupotager il est dit qu'elle est dans /home/domoticz

Sur mon installation elle est sous /home/pi/domoticz

 

Il faut aller dans le répertoire qui contient la base de données avec une commande du type

cd /home/pi/domoticz
Lien vers le fichier : cliquez ici

Ensuite, lancer le client sqlite3 avec ..

sqlite3
Lien vers le fichier : cliquez ici

Ensuite ouvrir la base de données domoticz.db sous forme de colonnes avec les commandes

.open domoticz.db
.headers on 
.mode column
Lien vers le fichier : cliquez ici

On peut afficher les tables avec

.tables
Lien vers le fichier : cliquez ici

Maintenant il faut trouver la table qui contient les données à corriger.
Dans Domoticz il faut relever l'idx du compteur à corriger.
Dans mon cas c'est le 166

Pour mon cas j'ai trouvé les données dans la table Meter
J'ai pu afficher les différents devices contenus dans cette table Meter via cette commande

select distinct DeviceRowId from Meter order by DeviceRowId;
Lien vers le fichier : cliquez ici

Par contre, pour mon device 166, je me suis rendu compte avec cette commande que la table Meter ne contient que 2 jours de données

select * from Meter where DeviceRowId=166 order by Date Desc;
Lien vers le fichier : cliquez ici

La table Meter_Calendar elle contient toutes les données (concaténé je crois bien), chose que j'ai pu constater avec la commande

select * from Meter_Calendar where DeviceRowId=166 order by Date Desc;
Lien vers le fichier : cliquez ici

En temps normal, pour une date donnée, dans la base, le champ Value donne le total de la conso de la journée et Counter correspond à la conso de cette journée additionnée avec le total (champ Counter) de la date N-1
Dans l'interface de Domoticz la valeur du champ Counter est affiché à la date N+1

Quand cela déconne le champ Value prend une valeur aberrante

La date qui me pose problème s'affiche à la date du 9 janvier dans Domoticz.
Pour afficher toutes les valeurs entre 2 dates on peut utiliser une requête du type

select * from Meter_Calendar where DeviceRowId=166 and Date BETWEEN "2021-01-07" AND "2021-01-11" order by Date;
Lien vers le fichier : cliquez ici

Je n'ai pas consommé 556241 watts en une journée, c'est une aberration.
et ici je ne peux pas déduire la valeur de la consommation électrique car mon module a planté.
Je suis allé voir sur le site d'Enedis ma consommation sur ce jour là et elle a été de 42900. Pour injecter cette valeur j'ai utilisé cette requête :

update Meter_Calendar set Value=42900 where date ="2021-01-09" and DeviceRowId = 166;
Lien vers le fichier : cliquez ici

Cela a bien corrigé la valeur de la consommation sur la date du 9 mais pas le total de la conso (champ Counter) sur les jours suivants

En date du 9 le total à mettre dans le champ Counter c'est la consommation de la journée (que j'avais récupéré chez Enedis) + la valeur du champ Counter à la date N-1, cad le 8.
Cela donne 42900 + 531123 = 574023

Pour injecter ces 574023 la requête sera

update Meter_Calendar set Counter=574023 where date ="2021-01-09" and DeviceRowId = 166;
Lien vers le fichier : cliquez ici

C'est super j'ai corrigé la date du 9 mais il faut que je corrige le total de la conso sur tous les autres jours, et là ...

Il faudrait que j'arrive à faire un script qui traite chaque date mais comment ?

J'ai pensé à faire une procédure stockée mais ce n'est pas supporté par sqllite.

sqllite supporte les triggers mais pas les variables dans les triggers.

 

Du coup j'ai fait une technique un peu bourrin, cad que j'ai fait une copie des valeurs que j'ai collé dans un tableau Excel.

J'ai ensuite ajouté une première colonne qui recalcule le bon total de la conso, en prennant la conso du jour + le total de la veille,

puis j'ai ajouté une dernière colonne qui sert à créer la requete SQL de mise à jour de la valeur.

Enfin j'ai copié ces requêtes de mise à jour que j'ai collé dans la console de sqllite3 pour  qu'elle les exécute.

En bas de l'article j'ai mis la copie du fichier excel que j'ai fait, avec les formules utilisées. Cela sera a adapter à votre cas (modification de l'idx etc )

 

Téléchargement(s)

NomSite Web d origineDescription
4601Domoticz_formule_corr... Fichier excel avec un exemple de formule pour corrigier le cumul de Domoticz