J’ai déjà abordé la récupération des températures dans un graphique munin.
J’ai également abordé la récupération de ces mêmes valeurs en PHP.
Et maintenant, place à la récupération des valeurs pour l’insertion dans une base de données MySQL.
Le but étant de passer par le cron, d’avoir une table avec les sondes, une table avec les valeurs.
J’ai réalisé ce premier ensemble de scripts regroupant pas mal de require, c’est plus difficile à partager pour la compréhension et les explications mais j’espère que ce script restera sous cette forme pour mon usine à gaz définitive.
Structure de la base
Une première table avec les sondes, voici son squelette :
CREATE TABLE IF NOT EXISTS `1wire_sensor` ( `1wire_sensor_id` int(3) NOT NULL AUTO_INCREMENT, `1wire_sensor_enable` enum('true','false') NOT NULL, `1wire_sensor_type` enum('temperature','presence','sensed.A') NOT NULL, `1wire_sensor_family` tinytext NOT NULL, `1wire_sensor_idaddress` tinytext NOT NULL, `1wire_sensor_comment` text NOT NULL, PRIMARY KEY (`1wire_sensor_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Une seconde table avec les valeurs, son squelette :
CREATE TABLE IF NOT EXISTS `1wire_data` ( `1wire_data_id` int(11) NOT NULL AUTO_INCREMENT, `1wire_data_sensor_id` int(3) NOT NULL, `1wire_data_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `1wire_data_value` text NOT NULL, PRIMARY KEY (`1wire_data_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Le script automatique
Comme expliqué plus haut, difficile de partager un script complexe pour un besoin simple.
Je fais un « require » pour appeler un fichier de config, un autre pour la connexion MySQL, un dernier pour mes fonctions 1-wire.
Ce qui donne cet ensemble :
<?php $pathconfig = "/var/www/domy"; require_once($pathconfig."/require/main.inc.php"); require_once(PATH."/require/database.inc.php"); require_once(PATH."/require/function-1wire.inc.php"); // Recup des données des sondes depuis la BDD $req_sensor = "SELECT * FROM 1wire_sensor WHERE 1wire_sensor_enable IS TRUE"; $qur_sensor = mysql_query($req_sensor); while($dat_sensor = mysql_fetch_array($qur_sensor)) { // Pour chaque sonde on constitue son adresse : $onewire_address = $dat_sensor['1wire_sensor_family'].".".$dat_sensor['1wire_sensor_idaddress']; // On teste sa présence sur le bus if(onewire_presence($onewire_address)) { debug("OUI ! ".$onewire_address." est présent sur le bus","cli"); if ($dat_sensor['1wire_sensor_type'] == "presence") { debug("Seul sa presence sur le bus est nécessaire","cli"); // on ecris dans la BDD qu'il est présent et on s'arrete là $value = 1; } elseif ($dat_sensor['1wire_sensor_type'] == "temperature" || $dat_sensor['1wire_sensor_type'] == "sensed.A") { // on récupère sa valeur, que ca soit la température ou l'état du PIO (DS2406) $value = onewire_read($onewire_address,$dat_sensor['1wire_sensor_type']); } } else { // Composant absent du bus debug ("NON ! ".$onewire_address." n'est pas présent sur le bus","cli"); $value = 0; } // on écris le resultat dans la BDD $req_insdata = "INSERT INTO 1wire_data SET 1wire_data_sensor_id = ".$dat_sensor['1wire_sensor_id'].", 1wire_data_value = '".$value."'"; mysql_query($req_insdata) or die ("Erreur à l'insertion des données 1-wire : ".mysql_error()); } ?>
J’espère que le principe de ce script php reste compréhensible avec les commentaires.
L’ensemble des fichiers sont disponible à la fin de l’article.
Le contenu de la base
Une fois la structure de la base établie ainsi que le script chargé de consulter les élements 1-wire, il reste à saisir les informations liés aux éléments 1-wire.
Pour cela, en plus d’avoir identifiant chaque sonde au moment de son câblage, je me sert de owhttpd pour récupérer l’ID des sondes. ( http://ipduserveur:2121/ )
J’ai descidé de spliter en deux l’ID des sondes 1-wire.
Par exemple, pour 28.7B2DB5030000 :
– Famille : 28.
– ID : 7B2DB5030000.
Et j’utilise phpmyadmin pour inserer la 1re sonde de température ( 28.7B2DB5030000 ) afin d’obtenir ceci :
Ainsi de suite pour chaque sonde désirée, 1wire_sensor_id étant la clée primaire en AUTO_INCREMENT.
A terme, le but étant de créer une interface pour gérer l’ajout, l’édition et la supression de sonde plus facilement via une page développée dans ce sens.
Idem pour chaque famille de sonde : température / présence / PIO.
Execution
On peut faire un simple test :
# php fetch-1wire.php
Vous devriez obtenir les valeurs de température.
Si vous obtenez le message :
PHP Notice: Can’t create socket [ow://127.0.0.1:4304], errno: 111, error: Connection refused in /var/www/1-wire/require/ownet.php on line 205
PHP Notice: Can’t connect get#1 in /var/www/1-wire/require/ownet.php on line 388
Modifiez le /etc/owfs.conf pour remplacer :
server: port = localhost:4304
Par :
server: port = 4304
Redemarrez owserver et refaite le test.
Si tout est ok, l’execution se fait via le cron, tout simplement :
*/5 * * * * root /usr/bin/php -q /var/www/1-wire/cron/fetch-1wire.php
Au bout de quelques heures :
Télécharger
A adapter, bidouiller, comprendre, améliorer, etc…
Et bientôt la génération de beaux graphs à partir de ces valeurs.
Pingback: Suvi de la consommation d'eau avec des compteurs à impulsions en 1-wire | Domolio, la domotique et pas que…