Délestage via IPX 800

Objectif

Via un IPX 800 mesurer la puissance consommée sur une période de une minute. Si on dépasse une puissance déterminée délester des charges de type chauffe eau ou chauffage.
Avant de poursuivre consultez cet article afin de prendre connaissance de certaines informations techniques.

A noter que cette fois nous utiliserons directement la sortie PNP de l’ EMDIN02 pour envoyer un signal sur une entrée de l’ IPX800.

Dans ma configuration, un NAS Synology lance un script PHP toutes les minutes via une tâche CRON. Le script PHP lit les  données du fichier status.xml de l’ IPX800 qui  sont rangées dans une table (base MYSQL). Le delta entre la mesure courante et celle l’ayant précédée est calculé et rangé dans la table.
Si ce delta dépasse une valeur prédéfinie on coupe les équipements électriques en mettant les sorties à 0. Une fois la puissance redescendue en dessous d’une certaine valeur on repositionne les sorties à 1.

Le script PHP

<?php
// Connexion BDD
$con = mysqli_connect('localhost', 'root', 'password', 'mybase');
if (!$con) {
    echo "Error: " . mysqli_connect_error();
	exit();
}
// Mémo délestage
	$tag_delestage = 0;
// Requête
	$sql 	= 'SELECT * FROM ma_table ORDER BY id';
	$query 	= mysqli_query($con, $sql);
	$nb_rows = mysqli_num_rows($query);

//On se place sur le dernier enregistrement
	mysqli_data_seek($query, $nb_rows - 1); 

//Il faut le relire
	$row = mysqli_fetch_assoc($query); 

//Lecture des données
	$old= $row["releve"]; //Relevé Electricité	

//Login IPX800
	$username="username";
	$password="password";
	include('function.php'); //Contient la fonction read_xml	

//Lecture du fichier XML
	$xml = read_xml("http://$username:$password@99.188.120.50:80/status.xml","response",array("day","time0","count0","led7"));
	foreach($xml as $row)
		{
		  $day=$row[0]; //Jour
		  $time0=$row[1]; //Heure
		  $elec=$row[2];  //Comptage Elec
		  $out8=$row[3]; //Status sortie 8
		}	
	if ( $out8=='1') {
		$delestage=1;
	}
	if ( $out8=='0') {
		$delestage=0;
	}
	echo $delestage;
	echo "<br>";
//Manips
	$delta=($elec - $old);
	
//Ecriture dans la BDD
	$request="INSERT INTO ma_table(releve,conso) VALUE('$elec','$delta')";	
	mysqli_query($con,$request); 
	
//Si conso supérieure à 5000 watts, enregistrement dans la table 'maxi'
	if ($delta >= 83) {
		$request="INSERT INTO maxi(releve,conso) VALUE('$elec','$delta')";	
		mysqli_query($con,$request); 
	}

if ($delestage == 1) {	
//Si conso >= à 5400 Watts/heure  on déleste Chauffe Eau et Chauffage chambres (led2 et led3)
	if ($delta >= 90) {
		$homepage = file_get_contents('http://username:password@99.188.120.50:80/preset.htm?led2=0');
		$homepage = file_get_contents('http://username:password@99.188.120.50:80/preset.htm?led3=0');
		echo ("Délestage des sorties");
		$tag_delestage = 1;
		$msg = "Délestage Chauffage chambres / Chauffe eau mybase - P > à 5400 Watts";
		mail("patrice.witte@gmail.com","Délestage mybase",$msg);
		} 

		//Si conso <= à 5000 Watts/heure on réalimente le Chauffe Eau et Chauffage chambres (led2 et led3)
	if ($delta < 83 and $delestage == 1) {
		$homepage = file_get_contents('http://username:password@99.188.120.50:80/preset.htm?led2=1');
		$homepage = file_get_contents('http://username:password@99.188.120.50:80/preset.htm?led3=1');
		echo ("Pilotage des sorties");
	} 
	if ($delta < 83  and $tag_delestage ==1) {
		$msg = "Pilotage Chauffage chambres / Chauffe eau mybase - P < à 5000 Watts";
		mail("patrice.witte@gmail.com","Pilotage mybase",$msg);
		$tag_delestage =0 ;
	}
}
//Purge - On ne garde que les 11520 derniers ENR ( 8 jours)
	if ($nb_rows >11520) {
		// On calcule le Nb d' ENR à supprimer
		$purge = $nb_rows - 11520;
		$requete = "delete FROM ma_table ORDER BY id asc limit ".$purge;
		mysqli_query($con,$requete);
	}
// fermeture connexion
	mysqli_close ($con)
?>

La fonction READ_XML

<?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
?>