Nous avions vu précédemment l’utilisation d’un outil de gestion de base de donnée SQLite
Cette fois ci explorons la base de données Domoticz à la découverte de ses tables, colonnes, liens entre tables…
Bien entendu cette liste n’est pas exhaustive.
La première table à observer est DeviceStatus
DeviceStatus
Cette table contient la liste des périphériques du menu « Dispositifs »
Je ne vais détailler ici que les champs qui me semblent importants :
Nom | Rôle |
Id | C’est le fameux Idx Domoticz |
Name | Le nom que vous avez donné à ce matériel |
Used | 1 si il est utilisé, 0 sinon |
BatteryLevel | Le niveau de batterie |
nValue | la nValue (souvent 0) voir API JSON |
sValue | Les sValue, les valeurs reçues séparées par un ; Voir API JSON |
LastUpdate | La dernière fois que l’on à vu ce matériel AAAA-MM-JJ HH:MM:SS (2016-01-12 08:04:49) |
On y retrouve aussi, le delta de correction de température, le flag de protection ….
Cette table est importante dans la mesure ou elle contient toutes les caractéristiques de nos périphériques tels que les Noms, la date de dernière mise à jour.
Toutes les autres tables ,sont des tables des mesures et ne contiennent que des Idx et les valeurs brutes mesurées ainsi que la date (simplification inside), le mon du matériel n’y figure pas par exemple.
Ce qui signifie que si nous voulons afficher le nom du matériel nous devrons toujours aller le chercher dans la table DeviceStatus par l’intermédiaire de son Idx.
En SQL il s’agit de faire une jointure entre deux tables liées entres elles par un point commun ici le Idx nommé Id dans la table DeviceStatus ( 🙄 )
L’instruction à utiliser est soit un WHERE soit JOIN ON. J’utiliserai ici JOIN ON qui me semble plus compréhensible.
Exemple :
SELECT Name, Value3,Date FROM Multimeter JOIN DeviceStatus ON Multimeter.DeviceRowId=DeviceStatus.id order by Date
Explication : Je vais chercher Value3, Date dans la table Multimeter et je JOIN la table DeviceStatus pour aller chercher ce qui est dedans à savoir Name par intermédiaire du DeviceRowId de Multimeter qui est le même que le id de la table DeviceStatus.
Remarquez que on va chercher la colonne DeviceRowId dans la table Multimeter par un nom_de_la_table.nom_de_la_colonne (Multimeter.DeviceRowID) de même pur Id de DeviceStatus.
Cette requête produit le même résultat de sortie.
SELECT Name, Value3,Date FROM Multimeter, DeviceStatus where DeviceRowId=DeviceStatus.id
N.B Les requêtes SQL sont sensibles à la casse des caractères.
Quelques autres tables
Rôle | Table | Colonnes | Exemple de requête |
Mesures Conso Électrique | Multimeter | DeviceRowId et Value3 | SELECT Name, Value3,Date,LastUpdate FROM Multimeter JOIN DeviceStatus ON Multimeter.DeviceRowId=DeviceStatus.id order by Date |
Température | Temperature | DeviceRowId, Temperature,Humidity, Barometer,DewPoint | SELECT Name,Temperature,Humidity, Barometer,DewPoint FROM Temperature JOIN DeviceStatus ON DeviceRowId=DeviceStatus.id |
Les Pourcentages de la carte Mère | Percentage | DeviceRowId, Percentage | |
Pluie | Rain | DeviceRowId,Total,Rate | |
Matériel : Utile pour afficher le nom du matériel relié au periphérique. | Hardware | Name | SELECT DeviceStatus.Name,Temperature,Humidity, Barometer,DewPoint ,Hardware.Name FROM Temperature ,DeviceStatus,Hardware where DeviceRowId=DeviceStatus.id and DeviceStatus.HardwareID=Hardware.ID |
Changement d’état des Interrupteurs | LightingLog | nValue , sValue, Date,DeviceRowID | SELECT Name,LightingLog .nValue , LightingLog .sValue, LightingLog .Date FROM LightingLog JOIN DeviceStatus ON DeviceRowID=DeviceStatus.id |
Mesures UV | UV | DeviceRowID, Level, Date | |
Mesures Vent | Wind | DeviceRowID, Direction,Speed,Gust, Date |
Remarquez que l’on peut faire 2 jointures sur deux tables comme dans l’exemple ci dessous ou l’on part de la table Temperature pour recuperer le Idx qui nous servira à la fois dans DeviceStatus pour le nom du périphérique puis par un HardwareID pour aller chercher le mon du matériel dans Hardware
SELECT DeviceStatus.Name,Temperature,Humidity, Barometer,DewPoint ,Hardware.Name FROM Temperature ,DeviceStatus,Hardware where DeviceRowId=DeviceStatus.id and DeviceStatus.HardwareID=Hardware.ID
Quelques exemples
- Exporter des valeurs d’une table au format csv destinées à un tableur.
De façon générale, la syntaxe est la suivante :
sqlite3 -header -csv /home/pi/domoticz/domoticz.db "ma requete qui va bien;" > out.csv
Avec « ma requete qui va bien » ,une requete SQL qui produit les résultats dont vous avez besoin.
Illustration
Si je reprends l’exemple du tableau ci-dessus avec les valeurs de température on obtient :
sqlite3 -header -csv /home/pi/domoticz/domoticz.db "SELECT Name,Temperature,Humidity, Barometer,DewPoint FROM Temperature JOIN DeviceStatus ON DeviceRowId=DeviceStatus.id;" > out.csv
- Exporter toute la base dans un fichier.
sqlite3 domoticz.db .dump > base.sql
- Et à la question que vous poserez un jour: Peut on renommer les Idx Domoticz comme bon ne semble la réponse est OUI
Toutefois pensez que cet IDx est présent dans les tables contenant les valeurs (Temperature, Multimeter…) et donc si vous voulez garder un peu d’historique il faudra mettre le nouvel Idx dans ces tables à la place de l’ancien.
Voila pour ce tour d’horizon,non exhaustif, de quelques tables Domoticz.
SELECT * FROM BonneJournee