Serveur Ethernet

Forum décrivant la mise en place d'une base de donnée afin d'enregistrer les données provenant de divers stations et capteurs

Serveur Ethernet

Message par Stéphane » 08 Juin 2013, 21:56

Le serveur Ethernet utilisé est le serveur IPX800 V3.00 de GCE Electronics (http://www.gce-electronics.com/57-ipx800-v3.html).
L'appareil est utilisé pour récupérer les impulsions du compteur d'eau ainsi que la température de la pièce ou il se trouve.
Image
Les impulsions du compteur d'eau sont récupérées par le compteur COUNTER1 et la température de la pièce par An.1.
---------------------------------------------------------------------------------------------------------------------------------------------------
Capteur de température:
Le capteur de température utilisé est le capteur TC-4012 de GCE Electronics (http://www.gce-electronics.com/capteurs ... -4012.html). Aucune documentation techniques n'est fournis avec le capteur.
Le fils bleu du capteur est relié au 3.3v de la partie Analog Input de l'IPX800 V3.00, le fils blanc sur l'entrée A1 et le fils nu sur Gnd.
Les données du capteur sont récupérées à partir du fichier status.xml disponible à l'adresse http://<adresse IP de l'IPX800 V3.00>/status.xml et enregistrée dans la base de donnée.
Structure de la table pour l'enregistrement des données issues du capteur:
Image

L'enregistrement des données s'effectue en langage PHP avec le programme suivant:
Code : Tout sélectionner
<?php
include('authentication.php');
include(
'connexionDB.php');
include(
'function.php');
//
$ipx800v3='<nom de la table précédemment créée>'; //Table
//
//Lecture du fichier XML (micrologiciel 3.01.06 de l'IPX)
$xml = read_xml("http://$usernameIPX:$passwordIPX@<adresse IP de l'IPX>/status.xml","response",array("day","time0","firmware_version","an1"));
foreach(
$xml as $row)
{
  $day=$row[0];
  $time0=$row[1];
  //changement en heure locale:
  $time0=date('H:i:s',gmmktime($time0));
  $firmware_version=$row[2];
  $an1=$row[3];
}
$date=date("Y-m-d");
//
mysql_connect($host,$user,$passwd) or die("erreur de connexion au serveur $host");
mysql_select_db($db) or die("erreur de connexion à la base de données");
//
//Transfert des données de l'IPX800 V3 dans la BDD
//------------------------------------------------
$parameter='an1';
$last_date=explode('-',$date); 
$last_time
=explode(':',$time0);
$dateXML=mktime($last_time[0],$last_time[1],0,$last_date[1],$last_date[2],$last_date[0]);
//Date du dernier enregistrement sur les entrées analogiques dans la BDD
$request="SELECT id,date,time,parameter FROM $ipx800v3 ORDER BY id DESC LIMIT 1";
$mysql_query=mysql_query($request) or die ('Erreur SQL ! '.$request.'<br/>'.mysql_error());
$last_record=mysql_fetch_array($mysql_query);
$dateDB=explode('-',$last_record[1]);
$timeDB=explode(':',$last_record[2]);
$update=9; //Mise à jour de la base toutes les 10 minutes
$date_recordDB=mktime($timeDB[0],$timeDB[1]+$update,0,$dateDB[1],$dateDB[2],$dateDB[0]);
if ($dateXML>$date_recordDB)
{
  //Ecriture dans la BDD
  $request="INSERT INTO $ipx800v3 VALUE('','$date','$time0','$firmware_version','$parameter','$an1')";
  mysql_query($request) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
}
mysql_close();
?>

Le fichier authentication.php:
Code : Tout sélectionner
<?php
$usernameIPX
="<nom de l'administrateur pour configurer l'IPX800 V3.00>";
$passwordIPX="<mot de passe de l'administrateur>";
?>

Le fichier connexionDB.php:
Code : Tout sélectionner
<?php
$user 
="<nom de l'administrateur de la base de donnée>";
$passwd ="<mot de passe de l'administrateur>";
$host = "<nom du serveur de la base de données>";
$db ="<nom de la base de donnée>";
?>

Le fichier function.php:
Code : Tout sélectionner
<?php
function read_xml
($fichier,$item,$champs)
{
  if($chaine = @implode("",@file($fichier)))
  {
    $tmp = preg_split("/<\/?".$item.">/",$chaine);
    for($i=1;$i<sizeof($tmp)-1;$i+=2)
      foreach($champs as $champ)
      {
        $tmp2 = preg_split("/<\/?".$champ.">/",$tmp[$i]);
        $tmp3[$i-1][] = @$tmp2[1];
      }
      return $tmp3;
  }
}
//source: http://www.phpsources.org/scripts172-PHP.htm
function day_number($date)
{
  list($annee, $mois, $jour) = explode ("-", $date);
  $timestamp = mktime(0,0,0, date($mois), date($jour), date($annee));
  $njour = date("N",$timestamp);
  return $njour; 
}
//source: http://www.developpez.net/forums/d592351/php/langage/fonctions/dates-recuperer-jour-date/
?>


Pour lire les données de la base de donnée et tracer un graphe (la bibliothèque http://jpgraph.net/ doit être installée):
Code : Tout sélectionner
<?php // content="text/plain; charset=utf-8"
//
include('graph.php');
include(
'connexionDB.php');
//Table
$ipx800v3='<nom de la table ou sont enregistrées les données du capteur de température>';
//
$date=date("Y-m-d");
// 
//IPX800V3(an1)
mysql_connect($host,$user,$passwd) or die("erreur de connexion au serveur $host");
mysql_select_db($db) or die("erreur de connexion à la base de données");
$request="SELECT date,time,parameter,value FROM $ipx800v3 WHERE date='$date' and parameter='an1'";
$query=mysql_query($request) or die ('Erreur SQL ! '.$request.'<br/>'.mysql_error());
//
$i=0;
while ($lineDB=mysql_fetch_array($query))    
{
  $dateDB[$i]=$lineDB['date'];
  $timeDB[$i]=$lineDB['time'];
  $codeDB[$i]=$lineDB['value'];
  $tempDB[$i]=sprintf("%.1f",($codeDB[$i]-155.135)/3.1027);  //conversion du code en °C
  $gtime[$i]=strtotime($timeDB[$i]); //pour le graphe
  $i++;
}
mysql_close();
graph('an1',$gtime,$tempDB,'#FF8000','&#0176;C');
//Affichage du graphe
echo "<img src='gan1.png'>";
?>

Le fichier graph.php:
Code : Tout sélectionner
<?php
require_once 
("/<chemin du repertoire de jpgraph>/src/jpgraph.php");
require_once ("/<chemin du repertoire de jpgraph>/src/jpgraph_date.php");
require_once ("/<chemin du repertoire de jpgraph>/src/jpgraph_line.php");
function graph($title,$time,$datay1,$color1,$texty1,$datay2=null,$color2=null,$texty2=null)
{
  $graph = new Graph(275,150);
  $graph->SetMargin(40,40,0,0);
  $graph->SetMarginColor('white');
  $today=mktime(0,0,0,date("m"),date("d"),date("y"));
  $tomorrow=mktime(0,0,0,date("m"),date("d")+1,date("y"));
  $graph->SetScale('datlin',auto,auto,$today,$tomorrow);
  $graph->img->SetAntiAliasing();
  $graph->title->Set($title);
  $graph->SetBox(false);
  //$graph->yaxis->HideZeroLabel();
  $graph->yaxis->HideTicks(false,false);
  $graph->yaxis->title->Set($texty1);
  $graph->xaxis->SetLabelAngle(90);
  $graph->xaxis->title->Set('h');
  $p1=new LinePlot($datay1,$time);
  $graph->Add($p1);
  $p1->SetColor($color1);
  $graph->yaxis->SetColor('darkgray');
  if (isset($datay2)&&isset($color2)&&isset($texty2))
  {   
    $graph
->SetYScale(0,'lin');
    $graph->ynaxis[0]->title->Set($texty2);
   
    $graph
->ynaxis[0]->SetTickSide(SIDE_RIGHT);   
    $p2
=new LinePlot($datay2,$time);
    $graph->AddY(0,$p2);
   
    $p2
->SetColor($color2);
    $graph->ynaxis[0]->SetColor('darkgray');
    $graph->ynaxis[0]->title->SetColor($color2);
  }
  $graph->yaxis->title->SetColor($color1);
  @unlink("g$title.png"); //suppression du graphe precedent
  $graph->Stroke("g$title.png");
}
?>


Résultat:
Image
---------------------------------------------------------------------------------------------------------------------------------------------------
Compteur d'eau
Le compteur d'eau utilisé est le compteur d'eau froide USLF/20 avec sortie à impulsion (1i=0.25l) de G.GIOANOLA (http://www.gioanola.it/en/schede/limp.htm disponible à la vente en France à l'adresse http://www.planete-domotique.com/compte ... lsion.html).

(Pour configurer l'IPX800 V3.00: http://jouin.eu/mediawiki/index.php?title=IPX800_V3.00)
Stéphane
Administrateur
 
Message(s) : 13
Inscription : 08 Juin 2013, 21:26

Retour vers phpDomotics

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 0 invité(s)

cron