Actualités | Audio/Vidéo | Evènements | DIY | Domotique | Informatique | Maison | Mobile | Sécurité

Olinuxino + Modem téléinfo de Cartelectronic pour mesurer un compteur EJP

Envoyer Imprimer PDF
Note des utilisateurs: / 28
MauvaisTrès bien 

Récemment, nous avons parlé de la carte Olinuxino. Il s'agit d'une carte dotée d'un processeur ARM qui s'avère intéressante pour toutes sortes d'automatisation. On peut y installer un système linux et la transformer en ordinateur embarqué pour moins de 50 Euros.

Aujourd'hui, Arno vous propose d'utiliser cette carte pour la coupler avec un modem téléinfo et lire les informations de votre compteur électrique ou de votre production photovoltaïque. Un bon cas d'école ...

Bonjour à tous, c'est Arno. Je suis de retour sur TLD pour ce nouvel article. La photo précédente montre la différence de tailles entre la carte Olinuxino et une carte Arduino. Pour les besoins de cet article, j'utilise un modem téléinformation USB de la société cartelectronic.

 

Dans mon cas, je possède un compteur électrique en tarification EJP. J'ai branché ma carte Olinuxino sur le modem USB, et ce dernier a été détecté sans problème. Pour vérifier, il faut utiliser la commande

# dmesg
USB Serial support registered for FTDI USB Serial Device
ftdi_sio 1-1.2:1.0: usb_probe_interface
ftdi_sio 1-1.2:1.0: usb_probe_interface - got id
ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
usb 1-1.2: Detected FT232RL
usb 1-1.2: Number of endpoints 2
usb 1-1.2: Endpoint 1 MaxPacketSize 64
usb 1-1.2: Endpoint 2 MaxPacketSize 64
usb 1-1.2: Setting MaxPacketSize 64
usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB0
#

Par défaut le port USB n'est accessible que par l'utilisateur root. Il faut faire un chmod si vous souhaitez utiliser ce port avec un autre utilisateur. En suivant le forum TLD, on trouve aussi la ligne de commande pour initialiser le modem. On regroupe tout celà dans un shell teleinfo.sh que l'on met dans un répertoire de notre choix.

#vi teleinfo.sh
!/bin/sh
stty -F /dev/ttyUSB0 1200 sane evenp parenb cs7 -crtscts
chmod a+r /dev/ttyUSB0
#

Ensuite, il faut rendre ce fichier exécutable.

chmod a+rx teleinfo.sh

Pour le lancer automatiquement au démarrage de la carte Olinuxino, il faut modifier le fichier /etc/rc.local.

vi /etc/rc.local
# By default this script does nothing.
/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 dev lo
/home/arno/public_html/edf/teleinfo.sh
exit 0

Puis il faut créer un script php pour lire les infos du modem. Dans mon cas, j'ai choisi d'écrire ce script dans le répertoire /home/arno/public_html/edf. On crée un fichier index .php:

<?php
include ("teleinfo.php");
?>
<html>
<head>
<title>TELEINFO</title>
<meta http-equiv="expires" content="0">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache, must-revalidate">
</header>

</head>
<body>
<p>
<?php
$trame = teleinfo();

//$trame_def = mesdef();
//tableau=array();

foreach ($trame as $etiquette=>$valeur) {
//$tableau=$trame_def[$etiquette];
//print_r($tableau);
//echo("$etiquette <strong>$valeur</strong> $tableau['desc']<br/>\n");
echo("$etiquette <strong>$valeur</strong><br/>\n");
}

//print_r($trame_def);

?>
</p>
</body>
</html>

Et un fichier teleinfo.php. Ce dernier fichier est une copie de celui qu'on trouve sur le forum de TLD. Je l'ai amélioré pour traiter le dépassement d'intensité.

<?php
/*
* PHP-Teleinfo

* v.0.2
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* (c) 2008 Radim BADSI <info AT devbay DOT fr>
*/

/* Definition des messages */
function mesdef() {
$trame_def = array();
$trame_def["OPTARIF"] = array(
"size"=>4,
"desc"=>"type d'abonnement",
"unit"=>""
);

$trame_def["ADCO"] = array(
"size"=>12,
"desc"=>"numéro série compteur",
"unit"=>""
);
$trame_def["ISOUSC"] = array(
"size"=>2,
"desc"=>"intensité souscrite",
"unit"=>"A"
);

$trame_def["BASE"] = array(
"size"=>9,
"desc"=>"index (base)",
"unit"=>"Wh"
);

$trame_def["HCHC"] = array(
"size"=>9,
"desc"=>"index (heures creuses)",
"unit"=>"Wh"
);

$trame_def["HCHP"] = array(
"size"=>9,

"desc"=>"index (heures pleines)",
"unit"=>"Wh"
);

$trame_def["EJPHN"] = array(
"size"=>9,
"desc"=>"index (normal EJP)",
"unit"=>"Wh"
);

$trame_def["EJPHPM"] = array(
"size"=>9,
"desc"=>"index (pointe mobile EJP)",
"unit"=>"Wh"
);

$trame_def["BBR HC JB"] = array(
"size"=>9,
"desc"=>"index (heures creuses jours bleus Tempo)",
"unit"=>"Wh"
);

$trame_def["BBR HP JB"] = array(
"size"=>9,
"desc"=>"index (heures pleines jours bleus Tempo)",
"unit"=>"Wh"
);

$trame_def["BBR HC JW"] = array(
"size"=>9,
"desc"=>"index (heures creuses jours blancs Tempo)",
"unit"=>"Wh"
);

$trame_def["BBR HP JW"] = array(
"size"=>9,
"desc"=>"index (heures pleines jours blancs Tempo)",
"unit"=>"Wh"
);

$trame_def["BBR HC JR"] = array(
"size"=>9,
"desc"=>"index (heures creuses jours rouges Tempo)",
"unit"=>"Wh"
);

$trame_def["BBR HP JR"] = array(
"size"=>9,
"desc"=>"index (heures pleines jours rouges Tempo)",
"unit"=>"Wh"
);

$trame_def["PEJP"] = array(

"size"=>2,
"desc"=>"préavis période EJP",
"unit"=>""
);

$trame_def["PTEC"] = array(
"size"=>4,
"desc"=>"période tarifaire en cours",
"unit"=>""
);

$trame_def["DEMAIN"] = array(
"size"=>1,
"desc"=>"couleur du lendemain (Tempo)",
"unit"=>""
);

$trame_def["ADIR1"] = array(
"size"=>3,
"desc"=>"avertissement dépassement ",
"unit"=>"A"
);
$trame_def["ADIR2"] = array(
"size"=>3,
"desc"=>"avertissement dépassement ",
"unit"=>"A"
);
$trame_def["ADIR3"] = array(
"size"=>3,
"desc"=>"avertissement dépassement ",
"unit"=>"A"
);
$trame_def["IINST1"] = array(
"size"=>3,
"desc"=>"intensité instantanée",
"unit"=>"A"
);
$trame_def["IINST2"] = array(
"size"=>3,
"desc"=>"intensité instantanée",
"unit"=>"A"
);
$trame_def["IINST3"] = array(
"size"=>3,
"desc"=>"intensité instantanée",
"unit"=>"A"
);

$trame_def["ADPS"] = array(
"size"=>3,
"desc"=>"avertissement de dépassement de la puissance souscrite",
"unit"=>""

);

$trame_def["IMAX1"] = array(
"size"=>3,
"desc"=>"intensité maximale",
"unit"=>"A"
);
$trame_def["IMAX2"] = array(
"size"=>3,
"desc"=>"intensité maximale",
"unit"=>"A"
);
$trame_def["IMAX3"] = array(
"size"=>3,
"desc"=>"intensité maximale",
"unit"=>"A"
);

$trame_def["PAPP"] = array(
"size"=>5,
"desc"=>"puissance apparente",
"unit"=>"W"
);

$trame_def["HHPHC"] = array(
"size"=>1,
"desc"=>"groupe horaire (Tempo/HC)",
"unit"=>""
);

$trame_def["MOTDETAT"] = array(
"size"=>6,
"desc"=>"mot d'état",
"unit"=>""
);
$trame_def["PMAX"] = array(
"size"=>5,
"desc"=>"puissance maximale tripahsée attentee",
"unit"=>""
);
$trame_def["PPOT"] = array(
"size"=>2,
"desc"=>"presence de potentiel",
"unit"=>""
);
/* Fin definition */
return $trame_def;

}

/* Verifie le checksum d'un message */
function checksum ($etiquette, $valeur) {
$sum = 32; // Somme des codes ASCII du message+un espace

for ($i=0;$i<strlen($etiquette);$i++) {
$sum = $sum + ord($etiquette[$i]);
}
for ($i=0;$i<strlen($valeur);$i++) {
$sum = $sum + ord($valeur[$i]);
}
$sum = ($sum & 63) + 32;
return (chr($sum));

}

/* Verifie la taille des messages */
function messize($etiquette) {
$trame_def = mesdef();
/* Renvoyer la taille d'une valeur valide */
return $trame_def[$etiquette]["size"];
}

/* Ecrire la liste des etiquettes valides */
function etiqlist() {
$trame_def = mesdef();
foreach ($trame_def as $etiquette => $definition) {
echo("<strong>$etiquette</strong> " .
$definition["desc"] . "<br/>\n");
}
}

/* Recuperer une trame valide */
//function teleinfo ($port = "/dev/teleinfo") {
function teleinfo ($port = "/dev/ttyUSB0") {
// Resultat : liste etiquette=>valeur
$trame_array = array();
$Arno="";

// Ouvrir le port en lecture
$handle = fopen ($port, "r");

if ($handle)
{
$Arno="OK";
}
else
{
return $trame_array;
}

$long_ = 0;
$i=0;

# arno trame
do {
$char = "";

$contents = "";
while (fread($handle, 1) != chr(2));

do {
$char = fread($handle, 1);
if ($char != chr(2)) $contents .= $char;
} while ($char != chr(2));
$i++;
$long_ = strlen($contents);
} while (($long_ < 230) && ($i<30 )) ;

#echo " $long_ $contents <br>";

// Fermer le port
fclose ($handle);

// Supprimer les caracteres debut/fin de trame
$trame = substr($contents,1,-1);

// Separer les messages
$trame = explode(chr(10).chr(10), $trame);

// Verifier les checksum et supprimer les trames incorrectes
foreach ($trame as $key=>$message) {

// Separer l'etiquette, la valeur et le checksum
$message = explode (chr(32), $message, 3);
list ($etiquette, $valeur, $checksum) = $message;

// Supprimer le message si incomplet ou incorrect (checksum invalide)
if (count($message)<3 ||
checksum($etiquette, $valeur) != $checksum ||
messize($etiquette) != strlen($valeur)
){
unset($trame[$key]);
} else {
// Enregistrer le message dans la liste trame_array
$trame_array[$etiquette] = $valeur;
}

}

return $trame_array;

}
?>

Un petit reboot de la carte Olinuxino et on peut maintenant accéder aux infos du modem via le serveur de la carte : http://olimex/~arno/edf/

A partir de cet article, on peut imaginer d'autres améliorations : push des données, sortie xml, sortie json, ... On ajoute quelques scripts php et c'est joué ..

 

En conclusion

Voilà donc pour une première utilisation de cette carte. On voit assez vite que celà se programme facilement grâce à l'utilisation du système Linux. La carte est très stable, pas besoin de la redémarrer régulièrement. Elle consomme peu. Couplée à mon modem teleinfo, celà me permet d'avoir une solution autonome.

Je vais continuer mes tests d'Olinuxino, je m'intéresse maintenant à elle pour en faire un firewall à l'entrée de mon réseau. Une solution simple pour ne plus dépendre d'OpenWRT ou DD-WRT ...

 

Cet article vous est proposé par Arno : Linuxiens de naissance, Arno travaille dans le domaine de l'informatique. Il s'intéresse à tous les domaines : informatique, électronique, mécanique et bricolage en tout genre. Arno est un source d'inspiration constante.

 

Mise à jour le Dimanche, 21 Octobre 2012 14:20  

Ajouter un Commentaire


Code de sécurité
Rafraîchir

Recherche

Les Flux RSS de TLD
Instagram

Produits Partenaires

GCE Electronics est partenaire de Touteladomotique.com RFXCOM.com est partenaire de Touteladomotique.com



Liens Utiles

Boutiques Partenaires

Liens Utiles

Un don pour TLD ?

Pourquoi faire un don ?

Publicité

Espaces publicitaires à louer
Contactez-nous

Connexion