Initialisation
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
====== Démodulation ASK ======
|
||||
|
||||
Les compteurs électriques de type électronique, fournis par Enedis (anciennement ErDF et EDF), permettent d'effectuer une relevé d'information par liaison informatique. Cette liaison informatique est assimilée à une liaison série, appelée également TTL ou RS232, après un traitement correctif.
|
||||
|
||||
Cette liaison série permet de communiquer avec le compteur et ainsi obtenir des informations tel que la consommation instantanée, la consommation électrique, la puissance maximale autorisée...
|
||||
|
||||
Les infos sont transmises cycliquement sur la ligne, modulées en **ASK à 50kHz**, ce qui correspond en gros à : soit aucune tension présente, soit un signal à 50kHz de 10V CC environ. Le 0V équivaut à un 1 logique, le 50kHz à un 0 logique. Pour être exploitées, ces infos doivent être démodulées pour être aux formats **TTL** ou **RS232**.
|
||||
|
||||
L’accès au circuit de communication se fait via les bornes **I1** et **A**. Ce circuit est mis à disposition des clients pour alimenter un récepteur de télé-information rattaché au compteur.
|
||||
|
||||
Lorsque aucune charge n’est raccordée à la sortie de l’alimentation au circuit de communication, la tension aux bornes de l’alimentation vaut 13 Vrms max.
|
||||
|
||||
En charge, la tension est 6 Vrms ±10% à 50 kHz (12 V pic au maximum tenant compte d’éventuelles déformations du signal). La puissance minimale délivrée est de 130 mW.
|
||||
|
||||
{{ electronique:teleinformation-compteur-electricite:teleinformation-modulee-ask-50-khz.jpg?400 |}}
|
||||
|
||||
Il convient de protéger la sortie contre les court-circuits. La tenue à la tension secteur (230 V 50Hz) est exigée (en cas de branchement intempestif de l’installation client).
|
||||
|
||||
Les spécifications imposées par ERDF pour les compteurs électroniques et intelligents Linky indiquent que la **composante** parallèle **résistive** doit être au **maximum de 2 KΩ** **sur le bornier de sortie** **Téléinfo**.
|
||||
|
||||
Le signal émis par le compteur est de la modulation ASK, c'est une modulation du signal binaire dans une onde de 50Hz.
|
||||
|
||||
Je me suis basé sur un schéma proposé par le site [[http://hallard.me]] pour réaliser le circuit interface entre le bornier Téléinfo et le Rabperry Pi.
|
||||
|
||||
Pour réaliser l'interface entre le bornier TIC et le Raspberry Pi, j'ai acheté :
|
||||
* une plaque pré-percée
|
||||
* 2 résistances
|
||||
* un opto-coupleur
|
||||
* bornier
|
||||
* câbles pour connecter au Raspberry Pi
|
||||
* câble pour relier au bornier TIC - câble réseau
|
||||
|
||||
{{ electronique:teleinformation-compteur-electricite:opto_teleinfo_1.png?direct&600 |}}
|
||||
|
||||
Si vous avez des difficultés, je vous conseille vivement le circuit proposé sur la page [[http://hallard.me/pitinfov12/]]
|
||||
|
||||
|
||||
On va relier le deux conducteurs provenant du **démodulateur** sur les borniers 9 et 10 de la GPIO du RaspberryPi.
|
||||
|
||||
La **bornier 9** étant le **GND** et la **bornier 10** le **RxD**.
|
||||
|
||||
{{ electronique:teleinformation-compteur-electricite:raspberrypi_2_pinout_zoom.png?direct&600 |}}
|
||||
@@ -0,0 +1,267 @@
|
||||
|
||||
===== Coté informatique =====
|
||||
|
||||
Voici le principe de fonctionnement que je voulais faire initialement :
|
||||
- lecteur des informations sur le port série (coté local)
|
||||
- envoie sur serveur de base de données SGBD (coté serveur)
|
||||
|
||||
On y reviendra plus tard.
|
||||
|
||||
Pour l'instant j'installe tout sur le raspberyPi.
|
||||
|
||||
==== Installer PHP ====
|
||||
|
||||
La lecture sur des informations va s'effectuer en PHP. C'est le plus simple pour moi parce que c'est très proche du langage C.
|
||||
Dans un premier temps il faut installer l’interpréteur PHP :
|
||||
|
||||
sudo apt-get install php
|
||||
|
||||
<WRAP group round box>
|
||||
<WRAP half column>
|
||||
On s’aperçoit que l'installation du package PHP intègre d'autres composants.
|
||||
|
||||
On retrouve Apache2 et des fonctions associées à SQLite3, LDAP et JSON.
|
||||
|
||||
Plusieurs fichiers de configuration sont créés :
|
||||
* ''/etc/php/7.0/apache2/php.ini''
|
||||
* ''/etc/php/7.0/cli/php.ini''
|
||||
* fichiers présents dans ''/etc/php/7.0/mods-available/''
|
||||
|
||||
Deux binaires sont accessibles :
|
||||
* ''php''
|
||||
* ''phar''
|
||||
|
||||
</WRAP>
|
||||
|
||||
<WRAP half column>
|
||||
<code>
|
||||
Lecture des listes de paquets... Fait
|
||||
Construction de l'arbre des dépendances
|
||||
Lecture des informations d'état... Fait
|
||||
The following additional packages will be installed:
|
||||
apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php7.0 libapr1 libaprutil1
|
||||
libaprutil1-dbd-sqlite3 libaprutil1-ldap php-common php7.0 php7.0-cli php7.0-common php7.0-json
|
||||
php7.0-opcache php7.0-readline ssl-cert
|
||||
Paquets suggérés :
|
||||
apache2-doc apache2-suexec-pristine | apache2-suexec-custom php-pear openssl-blacklist
|
||||
Les NOUVEAUX paquets suivants seront installés :
|
||||
apache2 apache2-bin apache2-data apache2-utils libapache2-mod-php7.0 libapr1 libaprutil1
|
||||
libaprutil1-dbd-sqlite3 libaprutil1-ldap php php-common php7.0 php7.0-cli php7.0-common php7.0-json
|
||||
php7.0-opcache php7.0-readline ssl-cert
|
||||
0 mis à jour, 18 nouvellement installés, 0 à enlever et 0 non mis à jour.
|
||||
Il est nécessaire de prendre 4 582 ko dans les archives.
|
||||
Après cette opération, 17,0 Mo d'espace disque supplémentaires seront utilisés.
|
||||
Souhaitez-vous continuer ? [O/n]
|
||||
</code>
|
||||
</WRAP>
|
||||
</WRAP>
|
||||
|
||||
==== Installer le SGBD PostgreSQL ====
|
||||
|
||||
<WRAP group round box>
|
||||
<WRAP half column>
|
||||
J'ai installé le SGBD PostgreSQL ainsi que le bibliothèque de connexion PHP.
|
||||
|
||||
Une fois installé, les programmes n'occuperont que 30 Mo. Je n'ai pas l'habitude d'avoir une installation prenant aussi peu de place.
|
||||
</WRAP>
|
||||
|
||||
<WRAP half column>
|
||||
sudo apt-get install php-pgsql postgresql
|
||||
|
||||
Résultat :
|
||||
|
||||
<code>
|
||||
Lecture des listes de paquets... Fait
|
||||
Construction de l'arbre des dépendances
|
||||
Lecture des informations d'état... Fait
|
||||
The following additional packages will be installed:
|
||||
libpq5 php7.0-pgsql postgresql-9.6 postgresql-client-9.6 postgresql-client-common postgresql-common
|
||||
postgresql-contrib-9.6 sysstat
|
||||
Paquets suggérés :
|
||||
postgresql-doc locales-all postgresql-doc-9.6 libdbd-pg-perl isag
|
||||
Les NOUVEAUX paquets suivants seront installés :
|
||||
libpq5 php-pgsql php7.0-pgsql postgresql postgresql-9.6 postgresql-client-9.6
|
||||
postgresql-client-common postgresql-common postgresql-contrib-9.6 sysstat
|
||||
0 mis à jour, 10 nouvellement installés, 0 à enlever et 0 non mis à jour.
|
||||
Il est nécessaire de prendre 6 281 ko dans les archives.
|
||||
Après cette opération, 30,2 Mo d'espace disque supplémentaires seront utilisés.
|
||||
Souhaitez-vous continuer ? [O/n]
|
||||
</code>
|
||||
</WRAP>
|
||||
</WRAP>
|
||||
|
||||
==== Paramétrer le SGBD PostgreSQL ====
|
||||
|
||||
<WRAP center round box>
|
||||
Voilà comment je fais pour me connecter au moteur de SGBD PostgreSQL. J'effectue ces manipulations depuis le compte ''pi''.
|
||||
|
||||
1. Je me connecte avec le compte du SGBD qui se nomme ''postgres'' :
|
||||
sudo su postgres
|
||||
|
||||
2. Je me connecte au SGBD :
|
||||
psql
|
||||
|
||||
Oh joie ! L'invite ''postgres=#'' apparaît.
|
||||
</WRAP>
|
||||
|
||||
==== Créer la base de données ====
|
||||
|
||||
Je vais utiliser les informations suivantes :
|
||||
* base de données : ''ampere''
|
||||
* utilisateur de la base de données (rôle) : ''r_ampere''
|
||||
|
||||
<WRAP group round box>
|
||||
<WRAP half column>
|
||||
Il faut créer l'utilisateur de la base de données. De manière schématique, l'utilisateur de connexion à la base de données s'appelle un ''rôle''.
|
||||
</WRAP>
|
||||
<WRAP half column>
|
||||
Création du rôle ''r_ampere''
|
||||
CREATE ROLE r_ampere PASSWORD 'This1sN0tAnPwd' LOGIN VALID UNTIL 'infinity';
|
||||
</WRAP>
|
||||
</WRAP>
|
||||
|
||||
<WRAP group box round>
|
||||
<WRAP half column>
|
||||
Il faut créer la base de données qui va accueillir les données.
|
||||
|
||||
J'ai choisi d'utiliser l'encodage ''UTF-8'' dans la base de données, et l'utilisation des règles de la langue Française (''fr_FR'').
|
||||
</WRAP>
|
||||
|
||||
<WRAP half column>
|
||||
CREATE DATABASE "ampere"
|
||||
WITH OWNER "r_ampere"
|
||||
ENCODING 'UTF8'
|
||||
LC_COLLATE = 'fr_FR.UTF-8'
|
||||
LC_CTYPE = 'fr_FR.UTF-8';
|
||||
</WRAP>
|
||||
</WRAP>
|
||||
|
||||
<WRAP group box round>
|
||||
<WRAP half column>
|
||||
Il faut autoriser les connexions. Pour cela, le fichier de configuration des clients authentifié doit être adapté. Lors de l'installation du SGBD, il a été créé dans ''/etc/postgresql/9.6/main/pg_hba.conf''
|
||||
|
||||
Il faut l'adapter suivant le schéma suivant :
|
||||
|
||||
host database user address auth-method
|
||||
|
||||
|
||||
</WRAP>
|
||||
|
||||
<WRAP half column>
|
||||
On s'identifie avec l'utilisateur ''postgres'' :
|
||||
pi: $ sudo su - postgres
|
||||
|
||||
On ajoute dans le fichier ''/etc/postgresql/9.6/main/pg_hba.conf'' :
|
||||
local ampere r_ampere trust
|
||||
|
||||
On sort de l'environnement ''postgres'' :
|
||||
postgres: $ exit
|
||||
|
||||
Une fois le paramétrage terminé, il faut redémarrer le SGBD :
|
||||
pi: $ sudo service postgresql reload
|
||||
|
||||
On teste la connexion :
|
||||
pi: $ psql -U r_ampere -W -d ampere
|
||||
|
||||
</WRAP>
|
||||
</WRAP>
|
||||
|
||||
==== Principe de fonctionnement ====
|
||||
|
||||
Un programme doit sans cesse boucler pour effectuer cette action :
|
||||
1. lire une trame sur /dev/ttyAMA0 readTrame
|
||||
2. ajouter un timestamp dans la trame
|
||||
3. mémoriser la trame brute avec timestamp dans une mémoire tampon - saveTrameTampon
|
||||
|
||||
|
||||
saveTrameBdd
|
||||
|
||||
saveTrameCsv
|
||||
|
||||
|
||||
|
||||
==== Insérer une fichier CSV dans une table MySQL ====
|
||||
<code PHP>
|
||||
<?php
|
||||
$databasehost = "localhost";
|
||||
$databasename = "telereleve_elec";
|
||||
$databasetable = "tr_journalier";
|
||||
$databaseusername="Utilisateur";
|
||||
$databasepassword = "motDePasse";
|
||||
$fieldseparator = ",";
|
||||
$lineseparator = "\n";
|
||||
$csvfile = "releves/teleinfo_20181219.csv";
|
||||
|
||||
if(!file_exists($csvfile)) {
|
||||
die("File not found. Make sure you specified the correct path.\n");
|
||||
}
|
||||
|
||||
try {
|
||||
$pdo = new PDO("mysql:host=$databasehost;dbname=$databasename",
|
||||
$databaseusername, $databasepassword,
|
||||
array(
|
||||
PDO::MYSQL_ATTR_LOCAL_INFILE => true,
|
||||
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
|
||||
)
|
||||
);
|
||||
} catch (PDOException $e) {
|
||||
die("database connection failed: ".$e->getMessage());
|
||||
}
|
||||
|
||||
$affectedRows = $pdo->exec("
|
||||
LOAD DATA LOCAL INFILE ".$pdo->quote($csvfile)." INTO TABLE `$databasetable`
|
||||
FIELDS TERMINATED BY ".$pdo->quote($fieldseparator)."
|
||||
LINES TERMINATED BY ".$pdo->quote($lineseparator));
|
||||
|
||||
echo "Loaded a total of $affectedRows records from this csv file.\n";
|
||||
|
||||
?>
|
||||
</code>
|
||||
|
||||
|
||||
==== Transformer une donnée timestamp unix en format date et heure ====
|
||||
|
||||
SELECT FROM_UNIXTIME(`TIMESTAMP`) FROM `tr_journalier`
|
||||
|
||||
==== Bibliothèque PHP ====
|
||||
|
||||
Le programme sera écrit en PHP. On va au maximum utiliser des méthodes afin d'obtenir des informations sur la consommation :
|
||||
* quelle est la consommation Intensité instantannée ? - getIINST
|
||||
* quelle est la valeur du compteur HC ? - getHCHC
|
||||
* quelle est la valeur du compteur HP ? - getHCHP
|
||||
* quelle est la période tarifaire en cours ? - getPTEC
|
||||
* quelle est la puissance apparente ? - getPAPP
|
||||
|
||||
et obtenir des informations sur l'abonnement :
|
||||
* quelle est le N° d’identification du compteur ? - getADCO
|
||||
* quelle est l'Option tarifaire ? - getOPTARIF
|
||||
* quelle est l'Intensité souscrite ? - getISOUSC
|
||||
|
||||
Je pense également à des méthodes d'analyse :
|
||||
* quelle est la consommation HC/HP de la période tarifaire actuelle ? - getConsoPeriodeNow(tarif)
|
||||
* quelle est la consommation HC/HP de la période précédente ? - getConsoPeriodePrev(tarif)
|
||||
* quelle est la consommation HC/HP des 24 dernières heures ? - getConsoPeriode24(tarif)
|
||||
* quelle est la consommation HC/HP d'une période de 7 jours X ? - getConsoPeriode7jours(tarif, dateHeureDebut)
|
||||
* quelle est la consommation HC/HP de la minute X ? - getConsoMinute(tarif, dateHeure)
|
||||
* quelle est la consommation HC/HP de l'heure X ? - getConsoHeure(tarif, dateHeure)
|
||||
* quelle est la consommation HC/HP du jour X ? - getConsoJour(tarif, dateHeure)
|
||||
* quelle est la consommation HC/HP de la semaine X ? - getConsoSemaine(tarif, date)
|
||||
* quelle est la consommation HC/HP du mois X ? - getConsoMois(tarif, date)
|
||||
* quelle est la consommation HC/HP de l'année X ? - getConsoAnnee(tarif, date)
|
||||
|
||||
Et ensuite on pourra partir sur des statistiques :
|
||||
* moyenne
|
||||
* tendance
|
||||
* ...
|
||||
|
||||
=== Projets ===
|
||||
|
||||
http://vesta.homelinux.free.fr/wiki/demodulateur_teleinformation_edf.html
|
||||
|
||||
http://lhuet.github.io/blog/2014/01/montage-teleinfo.html
|
||||
|
||||
Projet de http://www.magdiblog.fr/gpio/teleinfo-edf-suivi-conso-de-votre-compteur-electrique/
|
||||
|
||||
Le relevé d'info compatible http://hallard.me/teleinfo-emoncms/
|
||||
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
====== Télé-information client des compteurs d'électricité ======
|
||||
|
||||
{{ journal_geek:teleinformation_compteur_edf:sagem-s10c4-complet.jpg?75|Compteur électronique SAGEM S10-C4}}
|
||||
|
||||
Dans ce projet, je m'appuie sur un Rasbperry Pi pour réaliser un auto relevé.
|
||||
|
||||
Il s'agit de retrouver un projet autour d'un Raspberry Pi pour **récupérer de manière régulière** et **automatique** les informations d'un compteur électronique d'électricité de votre distributeur d'électricité (alterna, direct energie, happ'e, proxelia, lampiris, engie, planete oui, edf, énergem, enercoop ...). On pourra relever l'**intensité** et la **puissance instantanées**, les **index** et quelques autres informations.
|
||||
|
||||
Les compteurs électroniques, comme les SAGEM S10C1 S10C2 S10C3 et S10C4, possèdent une interface de communication. La réduction en volume et l'augmentation de la puissance de la micro informatique permettent de s'amuser avec ce port de communication, et faire un projet de domotique bien sympathique.
|
||||
|
||||
Je vous invite avec une série d'articles à découvrir mes découvertes et tests.
|
||||
|
||||
====== Table des matières ======
|
||||
|
||||
|
||||
* [[index|Introduction]]
|
||||
* Le compteur électrique
|
||||
* [[electronique:teleinformation-compteur-electricite:le-bornier-teleinformation-d-un-compteur|]]
|
||||
* [[electronique:teleinformation-compteur-electricite:linky|]]
|
||||
* [[electronique:teleinformation-compteur-electricite:protocole-de-communication-du-compteur-electrique|]]
|
||||
* Le démodulateur
|
||||
* [[electronique:teleinformation-compteur-electricite:circuit-de-demodulation-ask|]]
|
||||
* Le Raspberry Pi
|
||||
* [[electronique:teleinformation-compteur-electricite:preparation-du-raspberry-pi|]]
|
||||
* [[electronique:teleinformation-compteur-electricite:installation-programme-raspjson]]
|
||||
* [[electronique:teleinformation-compteur-electricite:traitement-json-tic-edf]]
|
||||
* Le protocole MQTT
|
||||
* [[informatique:linux:applications:mosquitto]]
|
||||
|
||||
* Envoie des fichiers CSV à un service Web
|
||||
* [[.:script_bash_upload]]
|
||||
* [[.:page_upload]]
|
||||
|
||||
|
||||
* [[electronique:teleinformation-compteur-electricite:quelques_liens|]]
|
||||
@@ -0,0 +1,49 @@
|
||||
====== Installer le programme RASPJSON ======
|
||||
{{ :dummy.png?75x75|Nom de la section}}
|
||||
Lorem ipsum dolor sit amet, ...
|
||||
|
||||
|
||||
|
||||
sudo apt install build-essential git-core
|
||||
|
||||
--
|
||||
|
||||
Récupérer le projet
|
||||
|
||||
git clone https://github.com/hallard/LibTeleinfo
|
||||
|
||||
--
|
||||
|
||||
Accéder au dossier
|
||||
|
||||
cd LibTeleinfo/examples/Raspberry_JSON/src
|
||||
|
||||
--
|
||||
|
||||
Modification des infos dans
|
||||
|
||||
nano raspjson.cpp
|
||||
nano LibTeleinfo.h
|
||||
|
||||
pour inclure le chemin
|
||||
|
||||
#include "../../src/LibTeleinfo.h"
|
||||
|
||||
|
||||
--
|
||||
|
||||
Compilation
|
||||
|
||||
sudo make
|
||||
|
||||
--
|
||||
|
||||
Exécution du programme
|
||||
|
||||
./raspjson -d /dev/serial0&
|
||||
|
||||
--
|
||||
|
||||
Exemple de trames reçues
|
||||
|
||||
{"_UPTIME":310146, "ADCO":2147483647, "ISOUSC":60, "PTEC":"HC..", "IINST":24, "IMAX":90, "PAPP":5260, "MOTDETAT":0, "ISOUHHPHC":"A", "HO":2147483647, "HCHC":15205491, "HCHP":4851788, "OPTARIF":"HC..", "HHPHC":"A"}
|
||||
@@ -0,0 +1 @@
|
||||
~~REDIRECT>informatique:applications:mosquitto~~
|
||||
@@ -0,0 +1,38 @@
|
||||
====== Le bornier téléinfo ======
|
||||
|
||||
En France, c'est à la suite à l’arrêté du 6 janvier 1987 relatif à la construction et à l’approbation de types de compteurs d’énergie électrique, fondés sur un principe électronique, qu'est apparu les **compteurs électroniques**. Il permettait la réception et l'interprétation des ordres de télécommande centralisée 175 Hz de réseau de distribution, mais cela ne nous intéresse pas dans ce dossier. La partie intéressante de ces nouveaux compteurs est l'aide à la gestion de la consommation d'énergie, au moyen d'une liaison série de **télé-information client** sur laquelle le compteur **envoie en permanence ses données internes**.
|
||||
|
||||
La télé-information du client est réalisée par une liaison série (modulée en ASK à 50 kHz) qui diffuse en permanence les informations contenues dans les mémoires du compteur.
|
||||
|
||||
{{ electronique:teleinformation-compteur-electricite:teleinformation-modulee-ask-50-khz.jpg?400 |télé-information modulée en ASK à 50 kHz}}
|
||||
|
||||
Les informations qui sont transmises sur une ligne bifilaire avec écran peuvent être utilisées par un dispositif de gestion de l’énergie. Les bornes de cette liaison sont isolées galvaniquement des circuits internes du compteur.
|
||||
Cette liaison doit être configurée (en programmation locale) :
|
||||
* mode **TELEIN** : trames de télé-information transmises
|
||||
* mode **METROL** : émission d’impulsions métrologiques
|
||||
* mode **VEILLE** : trames réduites à l’émission de numéro de série.
|
||||
|
||||
Après démodulation, on retrouve une liaison asynchrone classique :
|
||||
* vitesse de transmission : 1200 bits/s
|
||||
* parité paire
|
||||
* 7 bits par caractère
|
||||
* 1 stop bit.
|
||||
|
||||
{{ electronique:teleinformation-compteur-electricite:teleinfo_compteur_erdf_sagem.jpg?400|}}
|
||||
|
||||
Le Raspberry Pi va se connecter à la sortie **Téléinfo** du compteur. Ce **bornier** est **identifié** **I1** et **I2**. Ce bornier est disponible sur les compteurs suivants :
|
||||
* compteur électronique de marques SAGEM, Landis+Gyr.
|
||||
* compteur intelligent Linky de marques Sagemcom, Landis+Gyr et Itron.
|
||||
|
||||
Les caractéristiques physiques du câble à utiliser entre le RasbperryPi et la sortie télé-information du compteur sont celles d’un câble téléphonique intérieur de type suivant:
|
||||
* paire torsadée simple avec écran (aluminium) et conducteur de drain,
|
||||
* conducteurs monobrins en cuivre étamé de diamètre compris entre 0,5 mm et 0,6 mm,
|
||||
* isolant PVC.
|
||||
|
||||
En utilisation, la longueur du bus mis en œuvre doit est inférieure ou égale à 500m (en topologie quelconque).
|
||||
|
||||
Ce qui n'oblige pas à disposer le RasbperryPi à proximité du compteur.
|
||||
|
||||
biblio : http://www.erdf.fr/sites/default/files/ERDF-NOI-CPT_02E.pdf
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
===== Téléinfo avec Linky ? =====
|
||||
{{ :electronique:teleinformation-compteur-electricite:pasted:20210101-170637.png?75x75|Connexion sur le bornier télé-information Linky}}
|
||||
|
||||
ERDF met a disposition depuis octobre 2014, la nouvelle documentation concernant la mise en œuvre du comptage avec le télé-information.\\
|
||||
Le compteur Linky est officiellement déployé depuis le 1er décembre 2015.
|
||||
|
||||
Concernant la compatibilité antérieure, on peut y noter les points suivants :
|
||||
|
||||
La télé-information client peut fonctionner selon 2 modes différents : historique et standard.\
|
||||
Dans le mode **historique**, le compteur Linky permet de restituer des trames d’information équivalentes à celles des anciens compteurs électroniques résidentiels. Toutefois, pour obtenir les informations optimales dans ce mode d’information, la configuration tarifaire du compteur doit être réalisée dans la même logique des contrats historiques.\\
|
||||
Quant au nouveau mode **standard**, il est apparu avec les compteurs Linky. Il est plus rapide que le mode historique, et comporte des informations différentes, avec un formatage spécifique.
|
||||
|
||||
Les transitions entre les modes se font par ERDF qui doit réaliser une programmation du compteur.\\
|
||||
En sortie d’usine les compteurs Linky sont initialisés en mode historique.
|
||||
|
||||
Les trames sont identiques aux trames des compteurs électroniques antérieurs à Linky. Toutefois, pour que les informations soient les plus complètes possible, le compteur doit être configuré en **contrat historique**.\\
|
||||
Certaines données du mode historique ne sont pas disponibles dans les compteurs Linky. C'est, entre autres, le cas de l'intensité souscrite, des intensités maximales ou de la zone de tarification (A, C, D, E, Y). Dans ces cas, d'autres informations sont utilisées à la place.
|
||||
|
||||
Voici les données reçues par un compteur Linky dans le cadre d'un abonnement EDF **HCHP** :
|
||||
* ADCO
|
||||
* ISOUSC
|
||||
* PTEC
|
||||
* IINST
|
||||
* IMAX
|
||||
* MOTDETAT
|
||||
* ISOUHHPHC
|
||||
* HO
|
||||
* HCHC
|
||||
* PAPP
|
||||
* OPTARIF
|
||||
* HHPHC
|
||||
* HCHP
|
||||
|
||||
{{:electronique:teleinformation-compteur-electricite:pasted:20210101-165044.png}}
|
||||
@@ -0,0 +1,139 @@
|
||||
====== Serveur Web - page upload ======
|
||||
{{ :dummy.png?75x75|}}
|
||||
|
||||
Pour créer une page PHP qui reçoit un fichier envoyé depuis un script Bash, nous pouvons utiliser la méthode HTTP POST. Voici un exemple de code qui vous aidera à démarrer :
|
||||
|
||||
<code PHP>
|
||||
<?php
|
||||
// Afficher les erreurs PHP
|
||||
ini_set('display_errors', 1);
|
||||
ini_set('display_startup_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$allowed_types = array('text/csv');
|
||||
|
||||
// Spécifiez le répertoire de destination
|
||||
$target_dir = "imports";
|
||||
|
||||
// Créer le répertoire de destination s'il n'existe pas
|
||||
if (!file_exists($target_dir)) {
|
||||
if (mkdir($target_dir, 0777, true)) {
|
||||
echo "Le répertoire de destination a été créé avec succès.\n";
|
||||
} else {
|
||||
echo "Impossible de créer le répertoire de destination '$target_dir'.\n";
|
||||
exit();
|
||||
}
|
||||
}
|
||||
if (!isset($_FILES['file'])) {
|
||||
echo "Aucun fichier présenté.\n";
|
||||
exit();
|
||||
}
|
||||
|
||||
if (in_array($_FILES['file']['type'], $allowed_types)) {
|
||||
echo "Le type MIME du fichier n'est pas accepté.\n";
|
||||
exit();
|
||||
}
|
||||
|
||||
if ($_FILES['file']['error'] !== UPLOAD_ERR_OK) {
|
||||
switch ($_FILES['file']['error']) {
|
||||
case UPLOAD_ERR_INI_SIZE:
|
||||
echo 'La taille du fichier dépasse la limite autorisée.\n';
|
||||
break;
|
||||
case UPLOAD_ERR_FORM_SIZE:
|
||||
echo 'La taille du fichier dépasse la limite autorisée par le formulaire.\n';
|
||||
break;
|
||||
case UPLOAD_ERR_PARTIAL:
|
||||
echo 'Le fichier n\'a été que partiellement téléchargé.\n';
|
||||
break;
|
||||
case UPLOAD_ERR_NO_FILE:
|
||||
echo 'Aucun fichier n\'a été téléchargé.\n';
|
||||
break;
|
||||
case UPLOAD_ERR_NO_TMP_DIR:
|
||||
echo 'Le dossier temporaire est manquant.\n';
|
||||
break;
|
||||
case UPLOAD_ERR_CANT_WRITE:
|
||||
echo 'Impossible d\'écrire le fichier sur le disque.\n';
|
||||
break;
|
||||
case UPLOAD_ERR_EXTENSION:
|
||||
echo 'Une extension PHP a empêché le téléchargement du fichier.\n';
|
||||
break;
|
||||
default:
|
||||
echo 'Une erreur s\'est produite lors du téléchargement du fichier.\n';
|
||||
}
|
||||
echo "\n";
|
||||
exit();
|
||||
}
|
||||
|
||||
|
||||
// Vérifie si le fichier a été correctement envoyé
|
||||
if (isset($_FILES['file']) && $_FILES['file']['error'] == 0) {
|
||||
// Spécifiez le chemin de destination pour enregistrer le fichier
|
||||
$destination = $target_dir . '/' . $_FILES['file']['name'];
|
||||
|
||||
// Si le fichier existe déjà, le supprimer
|
||||
if (file_exists($destination)) {
|
||||
unlink($destination);
|
||||
}
|
||||
|
||||
// Déplacez le fichier du répertoire temporaire vers le répertoire de destination
|
||||
if (move_uploaded_file($_FILES['file']['tmp_name'], $destination)) {
|
||||
if (file_exists($destination)) {
|
||||
$crc = hash_file('sha1', $destination);
|
||||
echo $crc;
|
||||
} else {
|
||||
echo "Une erreur s'est produite lors du téléchargement du fichier.\n";
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
echo "Une erreur s'est produite lors du téléchargement du fichier.\n";
|
||||
exit;
|
||||
}
|
||||
} else {
|
||||
echo "Une erreur s'est produite lors de l'envoi du fichier.\n";
|
||||
}
|
||||
?>
|
||||
|
||||
</code>
|
||||
|
||||
Le code ci-dessus vérifie si un fichier a été envoyé via la méthode POST et utilise la fonction PHP **move_uploaded_file** pour déplacer le fichier du répertoire temporaire vers un répertoire de destination sur votre serveur.
|
||||
|
||||
--
|
||||
|
||||
La création du répertoire de destination ''imports'' avec la fonction **mkdir** si celui-ci n'existe pas crée récursivement le répertoire de destination, en accordant les autorisations de lecture, d'écriture et d'exécution à tous les utilisateurs.
|
||||
Sauf qu'il est peut-être nécessaire de créer ce dossier en ligne de commande dans le dossier public du site : ''mkdir imports''
|
||||
Le dossier ''imports'' a été créé avec un complément de droit dans le Terminal ''chmod g+w imports''.
|
||||
|
||||
--
|
||||
|
||||
Si le fichier de destination existe déjà avec la fonction **file_exists**, nous utilisons la fonction **unlink** pour le supprimer avant de déplacer le nouveau fichier avec la fonction **move_uploaded_file**. Ainsi, le fichier existant sera remplacé par la nouvelle version.
|
||||
|
||||
--
|
||||
|
||||
La fonction **is_dir** permet de vérifier si le répertoire de destination n'existe pas, alors nous utilisons la fonction **mkdir** pour le créer, puis nous vérifions si le répertoire a été créé avec succès avant de continuer le traitement du fichier téléchargé.
|
||||
|
||||
Si le répertoire est créé avec succès, nous continuons avec la vérification et le traitement du fichier téléchargé, sinon nous affichons un message d'erreur et sortons du script avec la fonction **exit**.
|
||||
|
||||
--
|
||||
|
||||
Nous avons utilisé une structure conditionnelle pour vérifier la valeur de ''$_FILES['file']['error']''. Si la valeur n'est pas **UPLOAD_ERR_OK**, nous affichons un message d'erreur correspondant à la valeur d'erreur spécifique. Les constantes **UPLOAD_ERR_INI_SIZE**, **UPLOAD_ERR_FORM_SIZE**, **UPLOAD_ERR_PARTIAL**, **UPLOAD_ERR_NO_FILE**, **UPLOAD_ERR_NO_TMP_DIR**, **UPLOAD_ERR_CANT_WRITE**, **UPLOAD_ERR_EXTENSION** sont des constantes prédéfinies en PHP qui indiquent les différentes erreurs de téléchargement de fichier possibles.
|
||||
|
||||
En utilisant ce code, nous pouvons afficher un message d'erreur plus précis pour aider à résoudre le problème de téléchargement de fichier.
|
||||
|
||||
|
||||
--
|
||||
|
||||
Un contrôle du CRC sur un fichier téléchargé et renvoyé. Nous utilisons la fonction **hash_file** pour calculer la valeur SHA1 du fichier. La fonction **hash_file** calcule le hash d'un fichier donné à l'aide de l'algorithme de hachage spécifié. Dans notre cas, nous allons utiliser l'algorithme de hachage SHA1 pour calculer la valeur CRC du fichier.
|
||||
|
||||
--
|
||||
|
||||
Nous devons également vérifier le paramétrage de PHP.
|
||||
|
||||
* La directive **post_max_size** est définie dans un fichier de configuration différent. Nous pouvons utiliser la fonction phpinfo pour vérifier le fichier de configuration utilisé par PHP. Cherchez la ligne "Loaded Configuration File" pour trouver le fichier utilisé. La directive **post_max_size** est définie dans un niveau supérieur de la hiérarchie de configuration et ne peut pas être modifiée par la fonction **ini_set**. Par exemple, si la directive est définie dans le fichier **php.ini** global, elle ne peut pas être modifiée par **ini_set** dans un script PHP.
|
||||
La modification de la directive **post_max_size** nécessite un redémarrage du serveur web pour prendre effet. Assurez-vous que le serveur web a été redémarré après avoir modifié la valeur de **post_max_size** dans le fichier **php.ini**.
|
||||
|
||||
* Nous avons également modifié la directive ''upload_max_filesize''.
|
||||
|
||||
|
||||
--- //[[user:cedricabonnel]]//
|
||||
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
====== Décoder les infos de la TIC et les communiquer ======
|
||||
{{ :dummy.png?75x75|Raspberry Pi communique avec un compteur Linky}}
|
||||
|
||||
===== Choix du Raspberry Pi =====
|
||||
|
||||
Un Raspberry Pi pour récupérer de manière régulière et automatique les informations d'un compteur. Ces informations seront communiquées à l’extérieur du Raspberry Pi.
|
||||
|
||||
De ce fait le Raspberry Pi doit avoir :
|
||||
* une connexion réseau - pour communiquer avec quelqu'un ou quelque chose
|
||||
* un espace de stockage - pour l'OS, les logiciels et les valeurs lues
|
||||
* une connexion série - pour lire les informations dans le compteur électrique
|
||||
|
||||
Pour l'instant j'ai arrêté mon choix sur un **Raspberry Pi 3**, qui me permet de remplir les conditions posées précédemment. L'**espace de stockage** est assuré par une carte SD et la **connexion série** est réalisée par le port GPIO. Concernant la **connexion réseau**, j'ai de la chance de disposer de l'armoire de brassage de la maison à une encablure du compteur électrique.
|
||||
|
||||
Le système d'exploitation (OS) conseillé par défaut est **Raspberry Pi OS**, anciennement nommé **Raspbian**. Il offre l'avantage d'être un système GNU Liunx offrant toutes les possibilités d'une distribution Debian. Dans notre cas elle permet la gestion du réseau TCP/IP, la connexion à distance via SSH, synchronisation horaire avec un serveur NTP, gestion de base de données, de serveur Web, interprétation de langage évolué comme PHP ou Python...
|
||||
|
||||
===== Installation de l'OS =====
|
||||
|
||||
L'article [[informatique:se:raspberrypi-os:installer_raspbian]] détaille comment déployer le système d'exploitation. On veillera bien à activer le service **SSH**.
|
||||
|
||||
Au lancement du Raspberry Pi, on utilisera la commande **nmap** pour **identifier l'adresse IP** de la carte.
|
||||
|
||||
<code>
|
||||
nmap -sn 192.168.1.254/24
|
||||
</code>
|
||||
|
||||
Puis on pourra se connecter avec le compte ''pi'' et le mot de passe ''raspberry'' :
|
||||
|
||||
<code>
|
||||
ssh pi@192.168.1.68
|
||||
</code>
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
====== Protocole de communication ======
|
||||
{{ :dummy.png?75x75|Protocole de communication du compteur électrique}}
|
||||
|
||||
Le [[electronique:teleinformation-compteur-electricite:le-bornier-teleinformation-d-un-compteur|bornier de communication du compteur électrique]], après [[electronique:teleinformation-compteur-electricite:circuit-de-demodulation-ask|démodulation ASK]], est une liaison série qui délivre des caractères ASCII suivant le protocole suivant :
|
||||
* 1200 bits/s
|
||||
* 7 bits/caractères
|
||||
* 1 bit de stop
|
||||
* parité paire
|
||||
|
||||
Un groupe de messages complet constitue une trame qui débute par le caractère **STX** (code ASCII **02xF**), et se termine par **ETX** (**03xF**).
|
||||
|
||||
Chaque message composant la trame comprend :
|
||||
|
||||
* un caractère **LF** (**0AxF**)
|
||||
* une étiquette de 4 à 8 caractères
|
||||
* un espace **SP** (**20xF**)
|
||||
* des données de 1 à 12 caractères
|
||||
* un espace **SP** (**20xF**)
|
||||
* un caractère de contrôle
|
||||
* un caractère **CR** (**0DxF**)
|
||||
|
||||
Ces différents messages donnent les indications suivantes en fonction de l'abonnement souscrit
|
||||
|
||||
^ designation ^ option ^ code ^ nb caractères ^ unité ^
|
||||
| n° d'identification du compteur, étiquette | | **ADCO** | 12 |
|
||||
| option tarifaire (type d'abonnement) | | **OPTARIF** | 4 |
|
||||
| intensité souscrite | | **ISOUSC** | 2 | ampères |
|
||||
| index | base | **BASE** | 9 | Wh |
|
||||
| index heures creuses | heures creuses | **HC HC** | 9 | Wh |
|
||||
| index heures pleines | heures creuses | **HC HP** | 9 | Wh |
|
||||
| index heures normales | EJP | **EJP HN** | 9 | Wh |
|
||||
| index heures de pointe mobile | EJP | **EJP PM** | 9 | Wh |
|
||||
| index heures creuses jours bleus | tempo | **BBR HC JB** | 9 | Wh |
|
||||
| index heures pleines jours bleus | tempo | **BBR HP JB** | 9 | Wh |
|
||||
| index heures creuses jours blancs | tempo | **BBR HC JW** | 9 | Wh |
|
||||
| index heures pleines jours blancs | tempo | **BBR HP JW** | 9 | Wh |
|
||||
| index heures creuses jours rouges | tempo | **BBR HC JR** | 9 | Wh |
|
||||
| index heures pleines jours rouges | tempo | **BBR HP JR** | 9 | Wh |
|
||||
| préavis EJP \\ 30mn avant période EJP | EJP | **PEJP** | 2 |
|
||||
| période tarifaire en cours | | **PTEC** | 4 |
|
||||
| couleur du lendemain | tempo | **DEMAIN** |
|
||||
| intensité instantanée | | **IINST** | 3 | ampères |
|
||||
| avertissement de dépassement de puissance souscrite\\ message émis uniquement en cas de dépassement effectif, dans ce cas il est immédiat | | **ADPS** | 3 | ampères |
|
||||
| intensité maximale | | **IMAX** | 3 | ampères |
|
||||
| puissance apparente | | **PAPP** | 5 | volt ampères |
|
||||
| groupe horaire | heures creuses ou\\ tempo | **HHPHC** | 1 |
|
||||
| mot d’état (autocontrôle) | | **MOTDETAT** | 6 |
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
====== Quelques liens ======
|
||||
|
||||
* [[linux:raspberry-pi:teleinformation_compteur_edf:linky]]
|
||||
* [[https://domoticz.com/]]
|
||||
* [[http://www.euvrard.net/teleinfo/]]
|
||||
* [[https://thingspeak.com/pages/how_to]]
|
||||
* [[https://github.com/nodemcu/nodemcu-firmware/issues/466]]
|
||||
* [[http://hallard.me/demystifier-la-teleinfo/]] Optocoupleur LTV-814 : non seulement cet optocoupleur est moins cher, mais en plus il fonctionne mieux pour notre cas, à même courant d’entrée il commute bien mieux et son signal de sortie est bien plus propre.
|
||||
* [[http://hallard.me/libteleinfo/]]
|
||||
* [[http://hallard.me/pitinfo/]]
|
||||
* [[http://hallard.me/teleinfo-emoncms/]]
|
||||
* [[https://hallard.me/wifinfo/]]
|
||||
* [[http://forum.hardware.fr/hfr/electroniquedomotiquediy/domotique_maisonconnectee/esp8266-internet-object-sujet_236_3.htm]] - ecrire dans un fichier avec l'ESP8266
|
||||
* [[http://www.arduinesp.com/thingspeak]] - communication entre un ESP8266 (ESP01) et ThingSpeak
|
||||
* [[http://www.instructables.com/id/Send-sensor-data-DHT11-BMP180-to-ThingSpeak-with-a/]] - autre exemple de communication entre un ESP8266 et ThingSpeak
|
||||
|
||||
* [[https://particulier.edf.fr/content/dam/2-Actifs/Documents/Offres/Grille_prix_Tarif_Bleu.pdf|Prix EDF Tarif Bleu Particulier]] - {{ :electronique:teleinformation-compteur-electricite:grille_prix_tarif_bleu.pdf |PDF au 01/02/2021}}
|
||||
* [[https://particulier.edf.fr/content/dam/2-Actifs/Documents/Offres/grille-prix-vert-electrique.pdf|Prix EDF Tarif Vert Particulier]] - {{ :electronique:teleinformation-compteur-electricite:grille-prix-vert-electrique.pdf | PDF au 01/01/2021}}
|
||||
@@ -0,0 +1,68 @@
|
||||
====== Lecture du port série ======
|
||||
|
||||
====== Pour le ''Raspberry Pi 2'' ======
|
||||
|
||||
Le Raspberry Pi 2 propose plusieurs protocoles de communication, dont l'**UART**. Il est connu sous le nom de **ttyAMA0**. Il sera exploité avec le chemin ''/dev/ttyAMA0''.
|
||||
|
||||
===== Désactiver console sur ttyAMA0 =====
|
||||
|
||||
<WRAP group round box>
|
||||
<WRAP half column>
|
||||
Au démarrage, le noyau propose un **terminal** par le liaison série. Il va falloir le désactiver.
|
||||
|
||||
Pour supprimer l’utilisation de l’UART au démarrage par le noyau, il faut éditer le fichier ''/boot/cmdline.txt'', supprimer les options ''console=ttyAMA0,115200 kgdboc=ttyAMA0,115200''.
|
||||
|
||||
<WRAP center round help>
|
||||
Dans la version de Raspbian que j'ai, l'option ''kgdboc=ttyAMA0,115200'' n'était pas présent dans le fichier ''/boot/cmdline.txt''.\\
|
||||
On notera également que l'action suivante n'était pas nécessaire. En effet, le fichier ''/etc/inittab'' n'était pas présent.
|
||||
</WRAP>
|
||||
|
||||
</WRAP>
|
||||
|
||||
<WRAP half column>
|
||||
|
||||
</WRAP>
|
||||
</WRAP>
|
||||
|
||||
Pour désactiver la console sur l'UART, il faut commenter les lignes suivantes dans le fichier ''/etc/inittab'' :
|
||||
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
|
||||
|
||||
**Configurer la liaison UART**
|
||||
|
||||
La liaison ''/dev/ttyAMA0'' est configurée pour vous renvoyer un écho de ce qu’elle reçoit. La liaison se configure avec ''stty'' :
|
||||
<code>
|
||||
stty -F /dev/ttyAMA0 1200 sane evenp parenb cs7 -crtscts
|
||||
</code>
|
||||
|
||||
Il sera judicieux d'effectuer cette commande à chaque fois que le Raspberry Pi démarrera.
|
||||
|
||||
|
||||
====== Pour le ''Raspberry Pi 3'' ======
|
||||
|
||||
Ajouter dans le fichier ''/boot/config.txt'' l'option :
|
||||
<code>
|
||||
dtoverlay=pi3-disable-bt
|
||||
</code>
|
||||
|
||||
====== Visualiser les premières trames ======
|
||||
|
||||
<code>
|
||||
cat /dev/ttyAMA0
|
||||
</code>
|
||||
|
||||
et le résultat est
|
||||
|
||||
<code>
|
||||
ADCO 020122037669 =
|
||||
OPTARIF HC.. <
|
||||
ISOUSC 45 ?
|
||||
HCHC 118261467 *
|
||||
HCHP 069574256 ?
|
||||
PTEC HP..
|
||||
IINST 007 ^
|
||||
IMAX 045 H
|
||||
PAPP 01570 .
|
||||
HHPHC C .
|
||||
MOTDETAT 000000 B
|
||||
</code>
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
====== Script Bash pour upload de CSV ======
|
||||
{{ :dummy.png?75x75|}}
|
||||
|
||||
Dans le script Bash, la commande "curl" permet d'envoyer le fichier vers la page PHP d'upload.
|
||||
|
||||
Voici un exemple de code Bash qui télécharge tous les fichiers CSV dans un répertoire, à l'exception de celui qui a été modifié le jour même.
|
||||
|
||||
Pour exclure le fichier CSV modifié le jour même de l'envoi, on a utilisé la commande **find** pour localiser tous les fichiers CSV dans le répertoire spécifié qui ne sont pas modifiés aujourd'hui. Ensuite, on boucle sur cette liste de fichiers et exécuter le code d'envoi de fichier pour chaque fichier trouvé. Pour chaque fichier, nous avons calculé le **SHA-1** localement, envoyé le fichier au script PHP, récupéré le **SHA-1** calculé par le script PHP et comparé les deux valeurs de hachage.
|
||||
|
||||
Si les valeurs de hachage sont identiques, nous avons affiché un message de confirmation et déplacé le fichier CSV dans le dossier ''done/''. Si les valeurs de hachage ne sont pas identiques, nous avons affiché un message d'erreur.
|
||||
|
||||
<code BASH>
|
||||
#!/bin/bash
|
||||
|
||||
# Chemin vers le répertoire contenant les fichiers CSV
|
||||
csv_dir="."
|
||||
|
||||
# Exclure le fichier CSV modifié le jour même
|
||||
exclude_today="-not -newermt $(date +%Y-%m-%d)"
|
||||
|
||||
# Trouver tous les fichiers CSV dans le répertoire, à l'exception de celui modifié le jour même
|
||||
csv_files=$(find "$csv_dir" -maxdepth 1 -type f -iname '*.csv' $exclude_today)
|
||||
|
||||
# URL du script PHP qui gère les fichiers CSV
|
||||
php_script="http://ampere.rpiluc001.acegrp.lan/upload.php"
|
||||
|
||||
# Vérifier si le dossier "done/" existe
|
||||
if [ ! -d "$csv_dir/done" ]
|
||||
then
|
||||
# Créer le dossier "done/"
|
||||
mkdir "$csv_dir/done"
|
||||
fi
|
||||
|
||||
# Parcourir le répertoire des fichiers CSV
|
||||
for file in $csv_files
|
||||
do
|
||||
# Calculer le CRC du fichier
|
||||
crc=$(sha1sum "$file" | awk '{print $1}')
|
||||
|
||||
# Envoyer le fichier CSV et le CRC au script PHP via cURL
|
||||
output=$(curl -F "file=@$file" $php_script)
|
||||
|
||||
# Vérifier la réponse du script PHP
|
||||
if [ "$output" = "$crc" ]
|
||||
then
|
||||
# Déplacer le fichier CSV dans le dossier "done/"
|
||||
mv "$file" "$csv_dir/done/"
|
||||
echo "Le fichier $file a été correctement traité."
|
||||
else
|
||||
echo "Une erreur s'est produite lors du traitement du fichier $file."
|
||||
fi
|
||||
done
|
||||
|
||||
</code>
|
||||
|
||||
--- //[[user:cedricabonnel]]//
|
||||
@@ -0,0 +1,6 @@
|
||||
{{ journal_geek:teleinformation_compteur_edf:sagem-s10c4-complet.jpg?75|Télé relevé personnel du compteur Linky}}
|
||||
<WRAP clear/>
|
||||
|
||||
{{page>index#table-des-matieres}}
|
||||
~~NOCACHE~~
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
====== Envoyer la sortie de RASPJSON vers une unité de traitement ======
|
||||
|
||||
La [[electronique:teleinformation-compteur-electricite:le-bornier-teleinformation-d-un-compteur|TIC du compteur électrique]] reliée à un [[electronique:teleinformation-compteur-electricite:cote_informatique|démodulateur ASK]] nous fournit des **trames JSON** par le biais du [[electronique:teleinformation-compteur-electricite:installation-programme-raspjson|programme raspjson]].
|
||||
|
||||
{{:electronique:teleinformation-compteur-electricite:pasted:20210101-232411.png}}
|
||||
|
||||
Ces informations **JSON** doivent être communiquer à l'unité de traitement principale. Il faut s'attendre aux pires :
|
||||
* quantité de trames lues trop importante par rapport au nombre pouvant être traitée par l'unité de traitement dans un même laps de temps
|
||||
* temps de réponse de l'unité de traitement très long
|
||||
* unité de traitement injoignable
|
||||
|
||||
Dans ces cas, il faut continuer à réceptionner les informations et les mémoriser.
|
||||
|
||||
<code>
|
||||
|
||||
raspjson > fichier unique
|
||||
traitementJSON&
|
||||
|
||||
</code>
|
||||
|
||||
--
|
||||
|
||||
Lecture du fichier **buffer**
|
||||
|
||||
<code BASH>
|
||||
#!/bin/bash
|
||||
fifo_name="/tmp/edf_20210101.json"
|
||||
while true
|
||||
do
|
||||
if read line; then
|
||||
curl -v http://127.0.0.1/compteurTIC/trame -H 'Content-Type: application.json' -d "`echo $line`"
|
||||
if [ $? eq 0 ], then
|
||||
sed "1,$n d" "$fifo_name"
|
||||
fi
|
||||
fi
|
||||
done <"$fifo_name"
|
||||
</code>
|
||||
Reference in New Issue
Block a user