Alors voici quelques nouvelles.
Comme je le disais, je n'ai pas terminé, mais ça fonctionne déjà mieux comme ça.
J'ai modifié la table principale qui contient les données. La table prend moins de place dans la base, et les requêtes sont plus rapides :
CREATE TABLE IF NOT EXISTS `domotique_data` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`device` mediumint(9) DEFAULT NULL,
`value` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `device` (`device`,`time`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Maintenant la table qui contient les devices. On note l'ajout des champs active et room_id :
CREATE TABLE IF NOT EXISTS `domotique_device` (
`id` mediumint(9) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`type` varchar(50) DEFAULT NULL,
`active` tinyint(1) NOT NULL DEFAULT '1',
`room_id` mediumint(9) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `type` (`type`,`active`,`room_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
En effet, toutes mes sondes de températures se nomment "Thermomètre" dans la Home Center 2. Donc dans les graphs, la légende était illisible.
Ce champs room_id pointe vers une nouvelle table domotique_room que j'ai créé :
CREATE TABLE IF NOT EXISTS `domotique_room` (
`room_id` mediumint(9) NOT NULL,
`name` varchar(32) DEFAULT NULL,
`section_id` mediumint(9) DEFAULT NULL,
PRIMARY KEY (`room_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Pour remplir cette table, j'ai utilisé l'outil HC2 Toolkit App de Krikroff afin d'extraire les informations sur les pièces définies dans mon HC2.
Ensuite, pour afficher les informations correctes sur les graphes, j'ai modifié la requête du fichier device_get.php comme suit :
$reponse = $bdd->prepare('SELECT domotique_device.id, domotique_device.name AS device_name, domotique_room.name AS room_name FROM domotique_device, domotique_room WHERE domotique_device.room_id=domotique_room.room_id AND domotique_device.type = :type AND domotique_device.active=1');
On note la condition active=1 en lien avec le champs correspondant de la table domotique_device qui permet de masquer certains devices indésirables sur les graphes.
Dans le même fichier, il faut aussi modifier la ligne qui crée le label qui sera affiché dans la légende du graph :
$day_array = array($donnees['id'], $donnees['device_name'].' '.$donnees['room_name']);
Ca donne des courbes du style "Thermomètre Salon", "Thermomètre Chambre", etc...
Pour finir, une nouvelle table domotique_data_day qui permet de synthétiser les données par jour, pour une conservation longue durée :
CREATE TABLE IF NOT EXISTS `domotique_data_day` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` date NOT NULL,
`device_id` mediumint(9) NOT NULL,
`min_value` decimal(10,2) DEFAULT NULL,
`avg_value` decimal(10,2) DEFAULT NULL,
`max_value` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Pour remplir la table domotique_data_day à partir de la table domotique_data, on utilise la requête suivante :
INSERT INTO domotique_data_day (date, device_id, min_value, avg_value, max_value)
SELECT
DATE(time) AS date,
device as device_id,
MIN(value) AS min_value,
AVG(value) AS avg_value,
MAX(value) AS max_value
FROM
domotique_data
WHERE
DATE(time) > ( SELECT COALESCE(MAX(`date`), '0001-01-01') FROM domotique_data_day )
AND DATE(time) < CURDATE()
GROUP BY
date,
device
Cette requête est à exécuter tous les jours, par exemple à 00:05, juste après le commencement d'une nouvelle journée. Si on a plusieurs jours de retard, ce n'est pas grave, la requête recalculera tous les jours manquants, donc rien n'est perdu. Pour le moment je stocke mes données chez OVH donc je n'ai pas de scheduleur à disposition, mais quand je migrerai vers mon NAS, je pourrai mettre ça dans la crontab.
Puis on purge les anciennes données afin que la table domotique_data ne grossisse pas trop, par exemple après 21 jours :
DELETE FROM domotique_data WHERE DATE(time) < SUBDATE(CURDATE(), 21)
OPTIMIZE TABLE domotique_data
Notez que sur des hébergeurs mutualisés, comme OVH avec un compte Perso, la requête Optimize Table ne passe pas bien, car elle consomme beaucoup de mémoire. La première fois ça m'a crashé par table ! Donc depuis je ne l'exécute plus. Mais sur un NAS dédié, il ne devrait pas y avoir de problème.
Reste à faire :
les graphes permettant d'exploiter les données à long terme de la table domotique_data_day.
ajouter un champs color à la table domotique_device pour forcer des couleurs personnalisées à chaque courbe.
d'autres optimisations du code existant ?!?