44

Teleinfo Broadcast comptatible avec Emoncms

Dans un précédent billet je présentais un petit programme que j’avais écrit pour envoyer les informations reçues via la téléinformation vers une base mySQL ou en diffusion sur le réseau. Un autre post détaillait la procédure pour faire fonctionner le tout sur un Raspberry PI.

Nouveautés

J’ai modifié le programme et y ai ajouté quelques fonctionnalités intéressantes décrites ci dessous :

  • la possibilité de remonter les informations reçues vers une passerelle emoncms (locale ou distante)
  • Utilisation d’un fichier de config pour éviter les lignes de commande à rallonge
  • Remonté sur Emoncms uniquement les données modifiées afin d’optimiser la base Emoncms
  • Utilisation massives de statistiques par le daemon, affichable via l’envoi d’un signal

Installation

L’installation nécessite certains packages en fonction de si vous souhaitez avoir ou non la publication des données dans une base mySQL et/ou emoncms. Prenez la main sur votre machine linux (j’ai fait ce tutoriel sur un raspberry Pi avec la dernière raspbian, en fonction de votre système le nom des packages peut changer).

Installation des dépendences :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git-core libmysqlclient-dev libcurl4-openssl-dev

Récupération des sources et compilation

cd
git clone https://github.com/hallard/teleinfo/
cd teleinfo
make
sudo make install

Par défaut le programme se trouve maintenant dans /usr/local/bin avec les fonctions mySQL et emoncms disponibles. Vous pouvez changer cela dans le fichier Makefile, la procédure est commenté dans le fichier.

Si c’est votre 1ere installation veuillez copier le fichier de configuration dans /etc/

sudo cp teleinfo.conf /etc/

 Utilisation du programme

La configuration du programme peut se faire directement en le lancant avec les bons arguments sur la ligne de commande, mais vu tous les paramètres cela peut vite devenir contraignant donc j’ai ajouté la possibilité d’utiliser le fichier de configuration.

Le fichier de configuration contient les valeurs par défaut, mais celles-ci peuvent être modifiées par la ligne de commande. En effet la configuration passée par la ligne de commande est toujours prioritaire sur le fichier de configuration.

Lorsque le programme teleinfo est lancé il va chercher sa configuration dans le fichier de configuration, donc lors de votre 1ere installation veuillez editer le fichier /etc/teleinfo.conf

Voici un exemple de configuration

# teleinfo.conf
# configuration file for teleinfo program 
# Purpose : send/recevice teleinformation from severals devices then can 
#          - write to MySql
#          - write to Emoncms
#          - send UDP frame over network
#
# Author  : (c) Charles-Henri Hallard
#           http://hallard.me
# 15/04/2014 : Creation


# teleinfo mode 
# mode : send, receive or test
#   receive : receive teleinfo frame from network (need another daemon in send mode)
#   send    : read from serial and send the teleinfo frame to network
# 	          (preconized mode for daemon)
#   test : display teleinfo data received from serial
mode = receive

# tty serial device for reading teleinfo
tty = /dev/ttyS0

# Set verbose to 1 enable teleinfo program to be more verbose
verbose = 0

# get only this label value and display it
# valid with read mode only
# get = PAPP

# Set this value to 1 disable the lockfile creation
nolock = 0

# Set this value to 1 to deamonize the teleinfo process
# process will then run continuously 
daemon = 0 

# network where to send broadcast frame
network = 192.168.1.255

# net port used to send frame
port = 1200

# mySQL parameters
# teleinfo should have been compiled with defined USE_MYSQL (see Makefile)
# ========================================================================
# set mysql = 0 disable mySQL
# but, calling teleinfo with -q on command line activate mysql 
# with the following parameters
mysql = 0
server = localhost
user = root
password = yourpassword
database = databasename
table = DbiTeleinfo
mysql_port = 3306

# EmonCMS parameters
# teleinfo should have been compiled with defined USE_EMONCMS (see Makefile)
# ==========================================================================
# set emoncms = 0 ignore this feature but keep parameters
# so calling teleinfo with -e on command line activate emoncms
# with the following parameters
# node = nodeID is used for sending data to a specific node ID to emoncms
emoncms = 0
url = http://emoncms.org/input/post.json
apikey = YourApiKey
#node = 19

Une fois le fichier renseigné, passons au 1er test. Attention, il faut être sur la machine sur laquelle est connectée la téléinfo en liaison série pour ce test. Dans les exemples suivants, mySQL et emoncms sont désactivés dans le fichier de config (mySQL=0 et emoncms=0) mais les paramètres associés correctement renseignés.

N’hésitez pas à lancer l’aide en ligne (enfin aide est un bien grand mot dans le cas présent)

teleinfo --help

 

teleinfo 1.08
Usage is: teleinfo --mode s|r|t [options]
  --<m>mode  :  s (=send) | r (=receive) | t (=test)
                send    : read from serial and send the teleinfo frame to network
                          preconized mode for daemon
                receive : receive teleinfo frame from network
                          need another daemon in send mode
                test    : display teleinfo data received from serial
Options are:
  --tt<y> dev  : open serial dev name
  --no<l>ock   : do not create serial lock file
  --<v>erbose  : speak more to user
  --<p>ort n   : send/receive on network port n (and n+1 on send mode)
  --<d>aemon   : daemonize the process
  --<g>et LABEL: get LABEL value from teleinfo (only possible with mode receive
  --mys<q>l    : send data to MySQL database
  --<u>ser     : mysql user login
  --pass<w>ord : mysql user password
  --<s>erver   : mysql server
  --data<b>ase : mysql database
  --<t>able    : mysql table
  --<e>moncms  : send data to emoncms
  --u<r>l      : emoncms url
  --api<k>ey   : emoncms apikey
  --<n>ode     : emoncms node
  --<h>elp
<?> indicates the equivalent short option.
Short options are prefixed by "-" instead of by "--".
Example :
teleinfo -m s -d -y /dev/teleinfo
        start teleinfo as a daemon to continuously send over the network the frame received on port /dev/teleinfo

teleinfo -m s -y /dev/teleinfo
        start teleinfo display the frame received from serial port /dev/teleinfo

teleinfo -m r -v
        start teleinfo to wait for a network frame, then display it and exit
teleinfo -m r -g ADCO
        start teleinfo to wait for a frame, then display ADCO field value and exit
teleinfo -m r -q -v
        start teleinfo to wait for a network frame, then display SQL Query and execute it and exit
teleinfo -m e -v
        start teleinfo to wait for a network frame, then display EMONCMS post URL, execute it and exit

 

Lancez la commande suivante

teleinfo -m test

Vous devriez voir alors ce qui arrive par la liaison série comme ci dessous

APP 00660 -
HHPHC H 3
MOTDETAT 000000 B
ADCO 030522024356 7
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 045606799 4
HCHP 064162635 4
PTEC HP..
IINST 003 Z
IMAX 025 F
TENSION 239 >
PAPP 00660 -
HHPHC H 3
==========================
Teleinfo Frame of 185 char
Thu, 15 May 2014 20:23:21
==========================
ADCO 030522024356 7
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 045606799 4
HCHP 064162635 4
PTEC HP..
IINST 003 Z
IMAX 025 F
TENSION 239 >
PAPP 00660 -
HHPHC H 3
MOTDETAT 000000 B

ADCO 030522024356 7
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 045606799 4
HCHP 064162635 4
PTEC HP..

Pressez Ctrl-c pour quitter (cela peut prendre 1 à 2 seconde), vous allez alors voir les statistiques

^C
teleinfo 1.08 Statistics
==========================
Total Frames        : 1
Frames OK           : 1
Checksum errors     : 0
Frame format Errors : 0
Frame size Errors   : 0
MySQL init OK       : 0
MySQL init errors   : 0
MySQL connect OK    : 0
MySQL connect errors: 0
MySQL queries OK    : 0
MySQL queries errors: 0
EmonCMS total post  : 0
EmonCMS post OK     : 0
EmonCMS post errors : 0
EmonCMS timeout     : 0
--------------------------

Bon, c’est bien joli, çà fonctionne mais ne fait pas grand chose, nous allons donc lancer le mode send (sans deamon) ultra simple mais avec affichage. Il va lire sur la liaison série et envoyer les informations sur le réseau.

teleinfo -m s -v

 

teleinfo v1.08
-- Serial Stuff --
tty device     : /dev/teleinfo
flowcontrol    : none
baudrate is    : 1200
parity is      : even
databits are   : 7
-- Other Stuff --
network is     : 192.168.1.255
udp port is    : 1200
mode is        : send
fetch value is :
nolock is      : no
verbose is     : yes

Opened Socket
Curl Initialized
'/dev/teleinfo' opened.
Broadcast routing enabled
Inits succeded, entering Main loop
Sending frame size 185 to network
Sending frame size 185 to network
^C
Received SIGINT
Program terminated

teleinfo 1.08 Statistics
==========================
Frames Sent         : 2
Frames checked      : 0
Frames OK           : 0
Checksum errors     : 0
Frame format Errors : 0
Frame size Errors   : 0
MySQL init OK       : 0
MySQL init errors   : 0
MySQL connect OK    : 0
MySQL connect errors: 0
MySQL queries OK    : 0
MySQL queries errors: 0
EmonCMS total post  : 0
EmonCMS post OK     : 0
EmonCMS post errors : 0
EmonCMS timeout     : 0
--------------------------
Succeded to do my job

Ok çà fonctionne, mais comment ? les stats sont fausses ? Non c’est normal comme dans ce mode il ne fait rien, aucune vérification sur les trames reçues n’est effectuée, elle arrive sur le port série elle repart sur le réseau. C’est le client réseau qui se chargera du décodage. Si nous avions activé par exemple emoncms, les stats auraient été plus complètes.

Maintenant, la même chose en mode daemon, c’est la dernière fois qu’on le lance dans ces exemples. Tous les suivants s’appuieront sur celui-ci qui tourne maintenant en mode serveur.

teleinfo -m s -d

Et voila on retrouve la main, mais marche-t-il vraiment ? Ok on va vérifier cela en demandant l’affichage des stats. Pour celà nous allons envoyer le signal SIGUSR1 au daemon comme ci dessous :

kill -s SIGUSR1 `pidof teleinfo`
teleinfo 1.08 Statistics
==========================
Frames Sent         : 4
Frames checked      : 0
Frames OK           : 0
Checksum errors     : 0
Frame format Errors : 0
Frame size Errors   : 0
MySQL init OK       : 0
MySQL init errors   : 0
MySQL connect OK    : 0
MySQL connect errors: 0
MySQL queries OK    : 0
MySQL queries errors: 0
EmonCMS total post  : 0
EmonCMS post OK     : 0
EmonCMS post errors : 0
EmonCMS timeout     : 0
--------------------------

PS : Attention si vous fermez la console entre temps, l’affichage des stats ne se fera plus dans le terminal, vous verrez les informations dans le syslog (et bien d’autres) en faisant un

cat /var/log/syslog | grep teleinfo

Reprenons, le serveur envoi bien des trames, et si nous testions le client ?

Tiens si je mettais un script toutes les 5 minutes attendant une trame et m’envoyant les données dans une base mySQL puis se finisse tout seul ? Ok, on teste la commande déjà (et le fichier de config bien renseigné sur la partie mySQL). Avec un -v (verbose) pour voir ce qui se passe pour tester et enfin le switch -q pour envoyer vers mySQL

teleinfo -m r -q -v

 

teleinfo v1.08
-- Serial Stuff --
tty device     : /dev/teleinfo
flowcontrol    : none
baudrate is    : 1200
parity is      : even
databits are   : 7
-- MySql Stuff --
mySQL insert   : Enabled
Server is      : localhost:3306
Database is    : yourdatabase
Login is       : yourusername
Password is    : yourpassword
Table is       : DbiTeleinfo
-- Other Stuff --
network is     : 192.168.1.255
udp port is    : 1200
mode is        : receive
fetch value is :
nolock is      : no
verbose is     : yes

Opened Socket
Curl Initialized
Binded on port 1200
Inits succeded, waiting network frame
------------------- Received 185 char Frame.
ADCO 030522024356 7
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 045606799 4
HCHP 064163121 +
PTEC HP..
IINST 003 Z
IMAX 025 F
TENSION 241 7
PAPP 00660 -
HHPHC H 3
MOTDETAT 000000 B
-------------------Frame OK
INSERT INTO DbiTeleinfo
  (DATE,ADCO,OPTARIF,ISOUSC,HCHC,HCHP,PTEC,IINST1,IMAX1,TENSION,PAPP,HHPHC,MOTDETAT)
VALUES
  (NOW(),'030522024356','HC..','45','045606799','064163121','HP..','003','025','241','00660','H','000000');

teleinfo 1.08 Statistics
==========================
Frames Sent         : 0
Frames checked      : 1
Frames OK           : 1
Checksum errors     : 0
Frame format Errors : 0
Frame size Errors   : 0
MySQL init OK       : 1
MySQL init errors   : 0
MySQL connect OK    : 1
MySQL connect errors: 0
MySQL queries OK    : 1
MySQL queries errors: 0
EmonCMS total post  : 0
EmonCMS post OK     : 0
EmonCMS post errors : 0
EmonCMS timeout     : 0
--------------------------
Succeded to do my job

Et voilà parfait çà fonctionne, on le voit dans les stats, bon maintenant essayons la même chose avec emoncms. Le switch -q est donc remplacé par le -e

teleinfo -m r -e -v

 

teleinfo v1.08
-- Serial Stuff --
tty device     : /dev/teleinfo
flowcontrol    : none
baudrate is    : 1200
parity is      : even
databits are   : 7
-- Emoncms    --
Emoncms post   : Enabled
Server url is  : http://emoncms.com/input/post.json
APIKEY is      : lfjlsdfjlsdjflwxdjfljsdlfj
Node is        : 19
-- Other Stuff --
network is     : 192.168.1.255
udp port is    : 1200
mode is        : receive
fetch value is :
nolock is      : no
verbose is     : yes

Opened Socket
Curl Initialized
Binded on port 1201
Inits succeded, waiting network frame
------------------- Received 185 char Frame.
ADCO 030522024356 7
OPTARIF HC.. <
ISOUSC 45 ?
HCHC 045606799 4
HCHP 064163181 1
PTEC HP..
IINST 003 Z
IMAX 025 F
TENSION 237 <
PAPP 00650 ,
HHPHC H 3
MOTDETAT 000000 B
-------------------Frame OK
http_post http://emoncms.com/input/post.json?node=19&apikey=mqdkqmsdkmqskdmqskdmkqsmsdk&json={ADCO:030522024356,OPTARIF:2,ISOUSC:45,HCHC:045606799,HCHP:064163181,PTEC:3,IINST1:003,IMAX1:025,TENSION:237,PAPP:00650,HHPHC:72,MOTDETAT:000000} ==> 'ok'

teleinfo 1.08 Statistics
==========================
Frames Sent         : 0
Frames checked      : 1
Frames OK           : 1
Checksum errors     : 0
Frame format Errors : 0
Frame size Errors   : 0
MySQL init OK       : 0
MySQL init errors   : 0
MySQL connect OK    : 0
MySQL connect errors: 0
MySQL queries OK    : 0
MySQL queries errors: 0
EmonCMS total post  : 1
EmonCMS post OK     : 1
EmonCMS post errors : 0
EmonCMS timeout     : 0
--------------------------
Succeded to do my job

çà fonctionne, les stats indiquent bien le post OK sur emoncms. Mais je veux que sur emoncms ce soit en temps réel, donc deux choix s’offre à moi, ajouter le switch -e (emoncms) au lancement du 1er daemon (celui qui écoute sur la serial et broadcast sur le réseau) mais je n’ai pas retenu cette solution pour un choix tout à fait personnel et arbitraire. J’ai lancé sur une autre machine la commande de l’exemple précédent en y ajoutant de switch -d (daemon).

Voilà, les exemples décris ici sont vraiment donnés à titre indicatif pour vous permettre de voir un peu comment le programme fonctionne mais les nombreuses possibilités font que vous devriez pouvoir vous sortir de n’importe quelles contraintes avec ce programme. N’oubliez pas le switch –help qui vous donnera un peu d’aide.

Applications

Les applications possibles sont très nombreuses, je laisse votre imagination faire. Personnellement, j’ai un daemon sur un Raspberry PI + une carte ArduiPi près du compteur EDF qui tourne et qui envoi les trames sur le réseau. Sur la même machine, toutes les 5 minutes j’envoi les données vers une base mySQL à l’aide d’un crontab.

Avec cette configuration, sur une machine distante, un autre daemon écoute et envoi les données reçues vers une passerelle emoncms. Pourquoi 2 daemon sur 2 machines, très simple, je voulais tester la nouvelle version de mon programme sans interférer avec l’ancienne. çà tourne depuis avril 2014 sans le moindre soucis. De plus celà me permet de laisser la machine qui gère la liaison série a ses petites affaires et je peux tester de n’importe ou sans rien “casser”, même vérifier si tout fonctionne correctement. Je trouve cette solution vraiment efficace et simple.

Voilà ce que ca donne au niveau d’Emoncms lors de la remonté d’information, on voit bien que seules les données modifiées sont rafraîchies.

Données Teleinfo sur Emoncms

Données Teleinfo sur Emoncms

Enfin histoire de faire quelques autres tests, sur une autre machine distante, je fais tourner un node-red qui écoute sur le réseau les trames UDP envoyée par le 1er daemon pour les afficher dans le serial debug (souvenez vous, le port 1200 est le port UDP sur lequelles sont envoyées les trames réseaux)

Données Teleinfo avec Node-Red

Données Teleinfo avec Node-Red

J’adore Node-Red et je crois que je vais m’y mettre très sérieusement, c’est tellement simple de gérer les Objets de l’Internet avec.

Je savais qu’un jour broadcaster les données de téléinfo sur mon réseau local me permettrait de le récupérer depuis n’importe quelle machine pour en faire ce dont j’ai besoin. D’ailleurs, je pense que mes sondes de températures vont suivre le même chemin, bien qu’elles soient déjà sur Emoncms par un autre biais (fhem)

Si vous souhaitez avoir de l’aide ou des information concernant le programme teleinfo broadcast, n’hésitez pas à laisser un commentaire.

 Références

  • Le code source est disponible sur mon github dans le repository teleinfo
  • Site très intéressant de Play With Free
  • Vesta Home Linux, site de ma première source d’inspiration quand j’ai écrit la 1ere version. Le modèle de la base de données DbiTeleinfo provient de là mais curieusement je n’ai pas trouvé sur le net le script de création de la base, je vous donne le mien (attention version monophasée)
CREATE TABLE IF NOT EXISTS `DbiTeleinfo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `DATE` datetime DEFAULT NULL,
  `ADCO` varchar(12) DEFAULT NULL,
  `OPTARIF` varchar(4) DEFAULT NULL,
  `ISOUSC` decimal(2,0) DEFAULT NULL,
  `BASE` decimal(9,0) DEFAULT NULL,
  `HCHC` decimal(9,0) DEFAULT NULL,
  `HCHP` decimal(9,0) DEFAULT NULL,
  `BBRHCJB` decimal(9,0) DEFAULT NULL,
  `BBRHPJB` decimal(9,0) DEFAULT NULL,
  `BBRHCJW` decimal(9,0) DEFAULT NULL,
  `BBRHPJW` decimal(9,0) DEFAULT NULL,
  `BBRHCJR` decimal(9,0) DEFAULT NULL,
  `BBRHPJR` decimal(9,0) DEFAULT NULL,
  `DEMAIN` varchar(4) DEFAULT NULL,
  `EJPHN` decimal(9,0) DEFAULT NULL,
  `EJPHPM` decimal(9,0) DEFAULT NULL,
  `PEJP` varchar(2) DEFAULT NULL,
  `PTEC` varchar(4) DEFAULT NULL,
  `IINST1` decimal(3,0) DEFAULT NULL,
  `IINST2` decimal(3,0) DEFAULT NULL,
  `IINST3` decimal(3,0) DEFAULT NULL,
  `IMAX1` decimal(3,0) DEFAULT NULL,
  `IMAX2` decimal(3,0) DEFAULT NULL,
  `IMAX3` decimal(3,0) DEFAULT NULL,
  `HHPHC` varchar(1) DEFAULT NULL,
  `PMAX` decimal(5,0) DEFAULT NULL,
  `PAPP` decimal(5,0) DEFAULT NULL,
  `ADPS` decimal(3,0) DEFAULT NULL,
  `MOTDETAT` varchar(6) DEFAULT NULL,
  `TENSION` decimal(3,0) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `SEARCH_INDEX` (`ADCO`,`DATE`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 

 

Charles

You can discuss about this article or other project using the community forum