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.
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)
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;