vide en ligne depuis 02.10.1998

Détail des trames " télé-information "

trame

Voici le premier post concernant la réalisation d'un petit montage électronique qui sera utilisé pour relever la production de capteurs photovoltaïques.

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.

C'est donc 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 = 02), et se termine par ETX (03).

Détail de la trame :

- un caractère LF (code ASCII = 0A hexa)
- une étiquette de 4 à 8 caractères
- un espace SP (20 hexa)
- des données de 1 à 12 caractères
- un espace SP(20 hexa)
- un caractère de contrôle
- un caractère CR (0D hexa)

Ces différents messages donnent les indications suivantes en fonction de l'abonnement souscrit :

numéro d'identification du compteur, étiquette: ADCO (12 caractères)
option tarifaire (type d'abonnement) : OPTARIF (4 car.)
intensité souscrite : ISOUSC ( 2 car. unité = ampères)
index si option = base : BASE ( 9 car. unité = Wh)
index heures creuses si option = heures creuses : HCHC ( 9 car. unité = Wh)
index heures pleines si option = heures creuses : HCHP ( 9 car. unité = Wh)
index heures normales si option = EJP : EJP HN ( 9 car. unité = Wh)
index heures de pointe mobile si option = EJP : EJP HPM ( 9 car. unité = Wh)
index heures creuses jours bleus si option = tempo : BBR HC JB ( 9 car. unité = Wh)
index heures pleines jours bleus si option = tempo : BBR HP JB ( 9 car. unité = Wh)
index heures creuses jours blancs si option = tempo : BBR HC JW ( 9 car. unité = Wh)
index heures pleines jours blancs si option = tempo : BBR HP JW ( 9 car. unité = Wh)
index heures creuses jours rouges si option = tempo : BBR HC JR ( 9 car. unité = Wh)
index heures pleines jours rouges si option = tempo : BBR HP JR ( 9 car. unité = Wh)
préavis EJP si option = EJP : PEJP ( 2 car.) 30mn avant période EJP
période tarifaire en cours : PTEC ( 4 car.)
couleur du lendemain si option = tempo : DEMAIN
intensité instantanée : IINST ( 3 car. unité = ampères)
avertissement de dépassement de puissance souscrite : ADPS ( 3 car. unité = ampères) (message émis uniquement en cas de dépassement effectif, dans ce cas il est immédiat)
intensité maximale : IMAX ( 3 car. unité = ampères)
Puissance apparente : PAPP ( 5 car. unité = Volt.ampères)
groupe horaire si option = heures creuses ou tempo : HHPHC (1 car.)
mot d'état (autocontrôle) : MOTDETAT (6 car.)

Le bornier télé-information est situé en bas, à droite du compteur électronique.

La liaison vers l'utilisation se fait par un câble 2 conducteurs avec écran relié à la terre.

Nota : le compteur doit être paramétrer par EDF pour que la prise " téléinfo " du compteur fonctionne.
Cliquez sur ce lien pour consulter les spécifications du nouveau compteur Linky



L'électronique de Téléinfo - version 1...

domov1

Principe de la téléinformation

Les compteurs EDF de type électronique possèdent deux bornes (I1 et I2) qui permettent à des équipements externes de dialoguer avec le compteur.

Il est donc possible de lire l'énergie instantanée consommée, la puissance maximum autorisée, le dépassement de cette puissance maximum et ce qui nous intéresse tout particulièrement, la production de notre installation photovoltaïque...

Les informations sont transmises de manière cyclique avec un protocole particulier. Mais il est possible de lire ces informations sur un ordinateur en utilisant le montage électronique ci-dessous.

La sortie de télé-information du compteur électronique d'EDF peut être raccordée à un système de gestion d'énergie ou à un petit montage électronique au moyen d'une liaison filaire appelée " bus de télé-information client ".

Ce bus sera un câble ayant une paire torsadée blindé suivant la distance entre le compteur et l'interface de lecture.

Le protocole d'encodage de la sortie télé-information

Le signal sur les bornes I1/I2 est un signal modulé à 50kHz.

La présence de modulation correspond à un 0 logique, et l'absence à un 1 logique.

Ces informations sont émises cycliquement sous forme de messages composés d'une étiquette d'identification suivie généralement d'une valeur.

Voici le principe des données émises sur le bus :

Il est donc nécessaire de démoduler ce signal. Après quoi on obtient une suite de caractères ASCII émise à 1200 bits/s, 7 bits/caractères, parité paire, 1 bit de stop.

modulation


Pour la démodulation, il suffit de quelques composants électroniques qui vont permettre de filtrer la porteuse du signal et d'en extraire les données.

Le schéma :

tele-schema


Le PCB

tele-pcb


La carte équipée

tele-montage



L'électronique de Téléinfo - version 2...

domov2

Bon, là, difficile de faire plus simple...

Montage vu à l'adresse http://www.chaleurterre.com/forum/viewtopic.php?p=51607#51607

opto schema


opto prise



Relevés de température avec un RPI - version GPIO

Le bus 1-wire est basé sur une architecture maître-esclave. Le maître est l'équipement qui contrôle le bus, interroge les périphériques, ou leur envoie des ordres.

Tous les capteurs sont branchés en parallèle sur le bus et c'est en mettant (ou pas) leur sortie à la masse qu'ils envoient les données au maître.
Le maître initialise le bus en forçant un zéro pendant plus de 480 μs. Les esclaves lui répondent en mettant eux aussi leur sortie à zéro pendant un certain temps, indiquant ainsi leur présence.

Le maître déclenche une lecture dite " ROM " et l'esclave renvoie son identifiant unique, gravé lors de la fabrication. Chaque identifiant a une longueur de 48 bits (8 octets) encadrés par un octet indiquant le type de matériel (ici le type est : sonde de température = 28h) et un octet de CRC qui permet au maître de vérifier qu'il a correctement reçu les informations d'identification du composant. Les 48 bits permettent d'individualiser à peu près 280 000 milliards de composants...

Dans les faits, il existe une limite logiciel sur le bus 1-wire (GPIO4) de Raspbian et il semble que la solution soit de créer un fichier wire.conf dans /etc/modprobe.d/ en y insérant la ligne ci-dessous.

options wire max_slave_count=20

Après reboot, la limite passe à 20...

Lorsque le bus est au niveau 1, un condensateur interne au composant esclave est chargé, et c'est lui qui assurera l'alimentation du composant pendant que le niveau du bus sera bas.

Dans le mode parasite, l'esclave est connecté en reliant ses broches d'alimentation ensemble et en les reliant à la masse. Il n'y a plus besoin dans ce cas que de deux fils pour assurer la liaison avec les esclaves connectés au bus 1-wire.

Le DS18B20 a une plage de mesure qui s'étend de -55 °C à +125 °C. Il transmet sa mesure directement en degrés Celsius, codée sur 16 bits. Sa précision est de ±0,5 °C entre -10 °C et +85 °C.

Dans ce tuto, nous utiliserons ce composant en mode parasite.

MAP mémoire du DS18B20

byte 0     Température LSB (50h)
byte 1     Température MSB (05h)
byte 2     T H inscrire
byte 3     T L inscrire
byte 4     Configuration inscrire
byte 5     Réservé (FFH)
byte 6     Réservé
byte 7     Réservé (10h)
byte 8     CRC

C'est la patte 7 (GPIO 4) du Raspberry qui joue le rôle de maître. Voici donc le branchement à réaliser pour connecter la sonde.

Le chaînage de plusieurs capteurs se fait de la manière suivante


On prendra soin de télécharger la dernière version de Digitemp qui à mon goût est plus abordable intellectuellement que d'autres solutions...

Il suffira ensuite de compiler ce code source, en prenant bien soin de faire la compilation pour l'adaptateur choisi (tapez make dans le répertoire source pour voir les options de compilation).

Pour terminer, on suivra les indications fournies pour configurer le logiciel d'acquisition. Ceci ne se fait qu'une fois au début, ou par la suite lors du changement de capteurs ou du port série utilisé.

Exécuter la commande suivante (en se plaçant dans le répertoire où se trouve le logiciel Digitemp) pour le port série 1 (ttyS1 -i pour le port série 2)

$ ./digitemp_DS9097 -i -s /dev/ttyS0

Digitemp répondra avec le message suivant si le ou les capteurs ont été trouvés

DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
..
Searching the 1-Wire LAN
2801DDDF00000000 : DS18B20 Temperature Sensor
28958B3E01000009 : DS18B20 Temperature Sensor
2892C2DF000000FB : DS18B20 Temperature Sensor
2805DEDA000000E3 : DS18B20 Temperature Sensor
ROM #0 : 2801DDDF00000000
ROM #1 : 28958B3E01000009
ROM #3 : 2892C2DF000000FB
ROM #4 : 2805DEDA000000E3
Wrote .digitemprc

Nous remarquons que le logiciel a détecté 4 capteurs et qu'un fichier .digitemprc a été créé dans le répertoire courant. Il contient les données des capteurs, l'interface et le format de sortie.

Voici un cat de .digitemprc

TTY /dev/ttyS0
READ_TIME 1000
LOG_TYPE 1
LOG_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F"
CNT_FORMAT "%b %d %H:%M:%S Sensor %s #%n %C"
HUM_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F H: %h%%"
SENSORS 4
ROM 0 0x28 0x92 0xC2 0xDF 0x00 0x00 0x00 0xFB
ROM 1 0x28 0x01 0xDD 0xDF 0x00 0x00 0x00 0x00
ROM 2 0x28 0x72 0xCC 0xDF 0x00 0x00 0x00 0xE3
ROM 3 0x28 0x31 0xDF 0xDF 0x00 0x00 0x00 0x09

Puis on saisit cette commande pour afficher les valeurs mesurées de tous les capteurs

$ ./digitemp_DS9097 -a

Ce qui devrait nous donner cela pour 4 capteurs

DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
May 21 12:56:36 Sensor 0 C: 23.38 F: 74.08
May 21 12:56:37 Sensor 1 C: 18.44 F: 65.19
May 21 12:56:36 Sensor 2 C: 29.81 F: 85.66
May 21 12:56:37 Sensor 3 C: 18.62 F: 65.53

Il ne reste plus qu'à enregistrer les données dans une base SQL dont la structure serait celle-ci

CREATE TABLE IF NOT EXISTS `digitemp` (
`timestamp` BIGINT(10) NOT NULL DEFAULT '0',
`rec_date` DATE NOT NULL DEFAULT '0000-00-00',
`rec_time` TIME NOT NULL DEFAULT '00:00:00',
`s1` FLOAT NOT NULL DEFAULT 0,
`s2` FLOAT NOT NULL DEFAULT 0,
`s3` FLOAT NOT NULL DEFAULT 0,
`s4` FLOAT NOT NULL DEFAULT 0,
UNIQUE KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

La ligne à ajouter à votre script d'acquisition des Dallas vers mysql ressemblera à ceci

$REP/digitemp_DS9097 -a -q -c $REP/.digitemprc -o 2 | $REP/digi2mysql -v $HOST -w $BD -x $TABLE -y $LOGIN -z $PWD



Relevés de température avec un RPI - version USB-série

Dans un article précédent, nous avons vu comment mesurer une température à l'aide d'un composant spécialisé et de notre Raspberry en utilisant son port GPIO.

Dans cet article, nous allons réaliser le même exploit mais cette fois, en utilisant un des ports USB du RPI et un peu de matériel...
Faites de la place sur votre bureau et faites chauffer votre fer à souder !

Pour cet exemple, nous utiliserons encore le DS18B20 en mode parasite.

MAP mémoire du DS18B20

byte 0     Température LSB (50h)
byte 1     Température MSB (05h)
byte 2     T H inscrire
byte 3     T L inscrire
byte 4     Configuration inscrire
byte 5     Réservé (FFH)
byte 6     Réservé
byte 7     Réservé (10h)
byte 8     CRC

Le chaînage de plusieurs capteurs se fait de la manière suivante

Un adaptateur USB vers série va nous être nécessaire afin de connecter la partie électronique au RPI, mon choix s'est porté sur l'adaptateur model UC-232A de chez ATEN.

Faites attention lors de l'achat que votre convertisseur soit reconnu par Linux. En général, ces adaptateurs comprennent la puce Prolific PL2303 qui ne pose pas de problème.

Lorsque vous branchez l'adaptateur USB vers série à un port USB sur le Raspberry Pi, il devrait apparaître dans le journal du système, les messages suivants :

$ dmesg

[ 7.870850] usbcore: registered new interface driver usbserial
[ 7.873016] usbcore: registered new interface driver usbserial_generic
[ 7.875042] usbserial: USB Serial support registered for generic
[ 8.074424] usbcore: registered new interface driver pl2303
[ 8.076584] usbserial: USB Serial support registered for pl2303
[ 8.193784] pl2303 1-1.3:1.0: pl2303 converter detected
[ 8.271193] usb 1-1.3: pl2303 converter now attached to ttyUSB0

Il est temps de s'attaquer à l'interface électronique...

Nous aurons besoin de ces composants pour cette réalisation

Une diode Zener 6,2V
Une diode Zener 3.9V
Deux diodes Schottky 1N5818(
Une résistance de 1,5 kQ
Un connecteur 9 broches 1 D-Sub pour la connexion au convertisseur USB / série

C'est bon ? Vous avez tout vérifié ?
Vous avez branché votre bidouille sur le RPI et rien n'a cramé ?
Parfait ! Installons le logiciel d'acquisition...

On prendra soin de télécharger la dernière version de Digitemp qui à mon goût est plus abordable intellectuellement que d'autres solutions...

Il suffira ensuite de compiler ce code source, en prenant bien soin de faire la compilation pour l'adaptateur choisi (tapez make dans le répertoire source pour voir les options de compilation).

Pour terminer, on suivra les indications fournies pour configurer le logiciel d'acquisition. Ceci ne se fait qu'une fois au début, ou par la suite lors du changement de capteurs ou du port série utilisé.

Exécuter la commande suivante (en se plaçant dans le répertoire où se trouve le logiciel Digitemp) pour le port série 1 (ttyUSB1 -i pour le port USB 2)

$ ./digitemp_DS9097 -i -s /dev/ttyUSB0

Digitemp répondra avec le message suivant si le ou les capteurs ont été trouvés

DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
Turning off all DS2409 Couplers
..
Searching the 1-Wire LAN
2801DDDF00000000 : DS18B20 Temperature Sensor
28958B3E01000009 : DS18B20 Temperature Sensor
2892C2DF000000FB : DS18B20 Temperature Sensor
2805DEDA000000E3 : DS18B20 Temperature Sensor
ROM #0 : 2801DDDF00000000
ROM #1 : 28958B3E01000009
ROM #3 : 2892C2DF000000FB
ROM #4 : 2805DEDA000000E3
Wrote .digitemprc

Nous remarquons que le logiciel a détecté 4 capteurs et qu'un fichier .digitemprc a été créé dans le répertoire courant. Il contient les données des capteurs, l'interface et le format de sortie.

Voici un cat de .digitemprc

TTY /dev/ttyUSB0
READ_TIME 1000
LOG_TYPE 1
LOG_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F"
CNT_FORMAT "%b %d %H:%M:%S Sensor %s #%n %C"
HUM_FORMAT "%b %d %H:%M:%S Sensor %s C: %.2C F: %.2F H: %h%%"
SENSORS 4
ROM 0 0x28 0x92 0xC2 0xDF 0x00 0x00 0x00 0xFB
ROM 1 0x28 0x01 0xDD 0xDF 0x00 0x00 0x00 0x00
ROM 2 0x28 0x72 0xCC 0xDF 0x00 0x00 0x00 0xE3
ROM 3 0x28 0x31 0xDF 0xDF 0x00 0x00 0x00 0x09

Puis on saisit cette commande pour afficher les valeurs mesurées de tous les capteurs

$ ./digitemp_DS9097 -a

Ce qui devrait nous donner cela pour 4 capteurs

DigiTemp v3.5.0 Copyright 1996-2007 by Brian C. Lane
GNU Public License v2.0 - http://www.digitemp.com
May 21 12:56:36 Sensor 0 C: 23.38 F: 74.08
May 21 12:56:37 Sensor 1 C: 18.44 F: 65.19
May 21 12:56:36 Sensor 2 C: 29.81 F: 85.66
May 21 12:56:37 Sensor 3 C: 18.62 F: 65.53

Il ne reste plus qu'à enregistrer les données dans une base SQL dont la structure serait celle-ci

CREATE TABLE IF NOT EXISTS `digitemp` (
`timestamp` BIGINT(10) NOT NULL DEFAULT '0',
`rec_date` DATE NOT NULL DEFAULT '0000-00-00',
`rec_time` TIME NOT NULL DEFAULT '00:00:00',
`s1` FLOAT NOT NULL DEFAULT 0,
`s2` FLOAT NOT NULL DEFAULT 0,
`s3` FLOAT NOT NULL DEFAULT 0,
`s4` FLOAT NOT NULL DEFAULT 0,
UNIQUE KEY `timestamp` (`timestamp`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

La ligne à ajouter à votre script d'acquisition des Dallas vers mysql ressemblera à ceci

$REP/digitemp_DS9097 -a -q -c $REP/.digitemprc -o 2 | $REP/digi2mysql -v $HOST -w $BD -x $TABLE -y $LOGIN -z $PWD



Installation et configuration de Raspbian "stretch" sur Raspberry PI v3

Après plus de 10 ans de bons et loyaux services, mon serveur domotique, fièrement installé sur un Raspberry Pi modèle 2 embarquant LAMP et moult autres softs des plus utiles va enfin prendre sa retraite et rejoindre le royaume des machines oubliées...

Nous allons dans le présent article, remplacer cette machine par le tout nouveau Raspberry Pi 3B et LEMP, qui, je l'espère, apportera de meilleurs temps de réponses et donc, une expérience utilisateur plus confortable...

LEMP ! C'est quoi donc ?
LinuxEngineXMariaDBPHP est l’une des stacks les plus populaires pour faire fonctionner un site internet, possédant de très bonnes performances et des fonctionnalités récentes. C’est un pack d’outils incluant un serveur web, une base de données, et un langage de programmation, le tout fonctionnant nativement avec chaque distribution Linux.

LAMP vs LEMP
  - Nginx est plus récent et plus rapide qu’Apache ! Il est aussi généralement plus performant et ne requére pas d’optimisations spécifiques.
  - MariaDB est entièrement compatible avec Mysql et semble plus performant !

Télécharger le fichier image de Raspbian et graver son contenu sur une carte SD.

Le Raspberry est démarré et vous êtes connecté avec l'utilisateur pi ? Parfait, on va pouvoir commencer...

Lancer RASPI-CONFIG, nous allons configurer la bête...

$ sudo raspi-config

Sélectionner l'option N°2 (Network Options)
Donner un nom à la machine.


Sélectionner l'option N°4 (Localisation Options)

  - Modifier le « Change Locale »
  - Modifier le « Change Timezone »
  - Modifier le « Change Keyboard Layout »

Sélectionner l'option N°5 (Interfacing Options)

  - Désactiver la caméra
  - Activer SSH
  - Désactiver Serial


Sélectionner l'option N°7 (Advanced Options)

  - Expand Filesystem
  - Mettre 16 pour « Memory Split »

Sélectionner l'option N°8 (Update)

  - mettre à jour « Raspi-config »

Rebooter lorsque le système vous y invite

Connectez vous en SSH et comme toujours, ça doit devenir une habitude, mettez à jour votre machine :

$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade

Nous allons supprimer le compte "pi" car nous n'en avons pas besoin et ça évitera quelques soucis de sécurité...

Donner un mot de passe à root

$ sudo passwd root

Par défaut, les connexions SSH avec un compte root ne sont pas permises, il faudra modifier le fichier de configuration /etc/ssh/sshd_config en ajoutant :

	PermitRootLogin yes
	

On redémarre la machine afin de se connecter en root !
Supprimons le compte utilisateur "pi", ses droits et tous les fichiers lui appartenant !

# deluser --remove-all-files pi

Nous pouvons maintenant entrer dans le vif du sujet et installer la stack LEMP.

Commençons par installer nginx

# apt-get install nginx

Pour vérifier que tout fonctionne, ouvrer à l’aide de votre butineur favori l'IP de votre serveur. Vous devriez voir cette page :


Installons maintenant PHP-FPM (PHP 7.0)

# apt-get install php-fpm

Nous allons devoir relier le module PHP-FPM à nginx pour qu'ils puissent fonctionner ensemble.

# nano /etc/php/7.0/fpm/pool.d/www.conf

Rendez-vous à la ligne listen, et remplacez-là comme ceci :

	listen = 127.0.0.1:9000
	


On continu avec l'installation de MariaDB


# apt-get install mariadb-server

Et on exécute le script de sécurisation :

# mysql_secure_installation

Quand on vous demande un mot de passe, vous en créez un, quand il vous pose des questions, vous répondez Y

Maintenant que MariaDB est correctement initialisé, nous allons créer un utilisateur ayant tous les privilèges :

# mysql -u root -p

Faites entrer et saisissez le mot de passe que vous avez préalablement créé.
Il vous reste à créer une base de données avec un utilisateur et un mot de passe avec tous les privilèges :

	CREATE DATABASE domotique;
	GRANT ALL ON domotique.* TO root@localhost IDENTIFIED BY 'MotDePasse';
	EXIT
	


Site de test

Nous allons maintenant créer notre "premier site" et l'ajouter à nginx.
Comme sous Apache, il faut déclarer les paramètres de notre site que nous voulons héberger dans un fichier. Nous allons tout d'abord nous rendre dans le dossier sites-available, supprimer le fichier de configuration par défaut et créer le nôtre.

# cd /etc/nginx/sites-available
# rm default
# nano teleinfo

	server {
		listen 80;	#Permet d'écouter sur le port 80 de l'IPv4 de votre serveur
		listen [::]:80;	#Permet d'écouter sur le port 80 de l'IPv6 de votre serveur

		server_name teleinfo.fr; #Vous devez renseigner le nom de domaine de votre site internet

		root /var/www/html/teleinfo; #Définit le répertoire qui va accueillir votre site internet

		index index.php index.html;

		location / { #Afficher une page 404 sur la totalité du site si un fichier n'existe pas
						try_files $uri $uri/ =404;
		}

		location ~ \.php$ {
			try_files $uri =404;
			fastcgi_index index.php;
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
			include /etc/nginx/fastcgi_params;
		}
	}
	

Créer un lien permettant d'activer notre site en production dans le dossier sites-enabled :

# ln -s /etc/nginx/sites-available/teleinfo /etc/nginx/sites-enabled/teleinfo

Il nous reste à créer notre dossier qui accueillera les fichiers de notre site :

# cd /var/www/html
# mkdir teleinfo

On va créer un fichier index.php pour voir si notre configuration est fonctionnelle une fois nginx redémarré :

# nano teleinfo/index.php

et on insert quelque chose comme "youpi, ça marche !"
On teste la configuration nginx :

# nginx -t
# systemctl status nginx

Si c'est OK, on redémarre les services pour valider la configuration :

# service php7.0-fpm restart
# service nginx restart

A l'aide de votre navigateur Internet, demander votre page index.php qui doit s’afficher !


Installation de Adminer

Nous allons installé Adminer car il est beaucoup plus propre et simple à utiliser que phpmyadmin qui, faut bien le reconnaître est une vraie usine à gaz.

# mkdir /var/www/html/admin

Télécharger la dernière version du fichier et copier le dans le dossier que vous venez de créer !

Protéger le répertoire admin

Comme nous venons de créer le répertoire /var/www/html/admin/, il serait bon d'autoriser uniquement l'accès via une adresse IP interne et de bloquer l'accès depuis une adresse IP publique.
Pour ce faire, nous devons configurer nginx pour l’accès au répertoire /admin

# nano /etc/nginx/sites-available/teleinfo

Insérez la section suivante dans la section "server", juste après le reste des directives d'emplacement

	location ~ /admin/.*\.php$ {
		allow 192.168.1.0/24;
		deny all;
		include snippets/fastcgi-php.conf;
		fastcgi_pass unix:/var/run/php/php7.0-fpm.sock;
		fastcgi_split_path_info ^(.+\.php)(/.+)$;
	}
	

On test les paramètres et si c'est OK on redémarre les services :

# nginx -t
# service nginx restart

Vous pouvez accéder à Adminer depuis votre navigateur sous la forme suivante : votreIP/admin/adminer.php

Le serveur web est à présent fonctionnel mais il est grand temps d'améliorer tout ça avec un peu de tuning...


Personnaliser nginx

Maintenant que nginx est installé avec succès, il est temps d'effectuer une configuration de base. Nginx, prêt à l'emploi est plutôt bien optimisé, mais quelques ajustements de base sont nécessaires pour améliorer les performances.
Modifions quelques paramètres dans nginx.conf

# nano /etc/nginx/nginx.conf

Rechercher et modifier dans le fichier les paramètres suivants :

1) Supprimez la mise en commentaire de la directive multi_accept et activez-la, ce qui informe chaque worker_process d'accepter toutes les nouvelles connexions à la fois, au lieu d'accepter une nouvelle connexion à la fois.

2) Modifiez le paramètre keepalive_timeout de la valeur par défaut 65 à 10 . Keepalive_timeout détermine le nombre de secondes pendant lequel une connexion au client doit rester ouverte avant sa fermeture par Nginx. Cette directive doit être abaissée pour que les connexions inactives puissent être fermées plus tôt 10 secondes au lieu de 65 secondes.

3) Dé-commentez la directive server_tokens et assurez-vous qu'elle est désactivée . Cela désactivera l’émission du numéro de version de Nginx dans les messages d’erreur et les en-têtes de réponse.

4) Après les variables server_tokens, ajoutez la directive client_max_body_size et définissez-la sur 16m .

5) Dé-commentez gzip_vary , cela dit aux mandataires de mettre en cache à la fois la version gzippée et la version normale d’une ressource lorsqu'un client non capable de gzip n’afficherait pas du charabia à cause des fichiers gzippés.

6) Dé-commentez la directive gzip_proxied et définissez-la sur n’importe laquelle, ce qui garantira que toutes les réponses aux demandes soumises par proxy sont gzippées.

7) Dé-commentez le gzip_comp_level et remplacez la valeur par 5 . Le niveau 5 offre une réduction d’environ 75% sur tous les types de fichiers ASCII afin d’obtenir un résultat presque identique à celui du niveau 9 mais n’a pas d’impact significatif sur l’utilisation du processeur de ce niveau.

8) Dé-commentez gzip_http_version 1.1; , cela activera la compression pour HTTP / 1.0 et HTTP / 1.1.

9) Ajoutez une ligne gzip_min_length 256; juste avant la directive gzip_types , cela garantira que le fichier de moins de 256 octets ne sera pas compressé, la valeur par défaut a été définie à 20 octets, ce qui est trop petit et pourrait rendre le fichier compressé encore plus volumineux en raison de la surcharge.

10) Remplacez la directive gzip_types par les types MIME suivants pour éviter les plaintes du test Google PageSpeed ​​sur certains types de fichiers non inclus dans les types MIME par défaut fournis.

  gzip_types
       application/atom+xml
       application/javascript
       application/json
       application/rss+xml
       application/vnd.ms-fontobject
       application/x-font-ttf
       application/x-web-app-manifest+json
       application/xhtml+xml
       application/xml
       font/opentype
       image/svg+xml
       image/x-icon
       text/css
       text/plain
       text/x-component
       text/javascript
       text/xml;

Cela garantira que les types de fichiers JavaScript, CSS et même SVG seront gzippés en plus du type de fichier HTML.

Enregistrez les modifications et testez le fichier de configuration pour vous assurer qu'il n'y a pas d'erreurs. Si tout se passe bien, redémarrez nginx

# nginx -t
# service nginx restart


Paramètres de php.ini

Il faut augmenter le nombre de fichiers upload_max_filesize afin d’être identique à la directive client_max_body_size dans nginx.

# nano /etc/php/7.0/fpm/php.ini

Recherchez la ligne suivante et modifiez la valeur du paramètre upload_max_filesize pour qu'elle corresponde à la valeur que nous avons précédemment attribuée à la directive client_max_body_size lors de la configuration de nginx

upload_max_filesize = 16m

Recherchez ensuite le paramètre cgi.fix_pathinfo. Nous devons dé-commenter la ligne et changer la valeur de 1 à 0

cgi.fix_pathinfo = 0

Cela indique à PHP de ne pas essayer d'exécuter un script si le nom de fichier demandé est introuvable. Cela empêche d'éventuels attaquants de créer une requête pour inciter PHP à exécuter du code qu’il ne devrait pas exécuter.

Enregistrer la configuration.


Logiciels complémentaires

Installons la librairie de développement de mariadb pour pouvoir compiler des programmes en C

# apt-get install libmariadbclient-dev


winringpi

Nous aurons besoin d'une librairie afin d'accéder au port GPIO du Raspberry, j'ai choisi Winringpi.

# apt-get install git-core
# apt-get update && apt-get upgrade
# cd
# git clone git://git.drogon.net/wiringPi
# cd ~/wiringPi
# ./build

Faisons un test pour nous assurer que tout fonctionne.

# gpio readall

Ce qui devrait nous afficher un tableau avec l'état de tous les GPIO :



Installation de digitemp

Digitemp et un logiciel d'acquisition qui, lancé à intervalles réguliers, va ordonner aux capteurs de température de faire une mesure pour en récupérer les valeurs afin de les sauvegarder dans une base de données.

Comme pour wiringpi, il va nous falloir récupérer les sources et les compiler !

Je vous invite à consulter cette page pour plus d'information.


Connexion au disque dur de la Freebox pour les backups

Nous allons tout d’abord créer le point de montage. Il vous faut donc choisir où vous allez monter le disque dur de votre freebox. Je pense que de créer un répertoire dans le dossier media est une bonne idée.

# mkdir /media/freebox

Editez le fichier fstab

# nano /etc/fstab

Ajouter à la fin du fichier

//mafreebox.freebox.fr/Disque\040dur /media/freebox cifs _netdev,rw,users,iocharset=utf8,uid=1000,credentials=/root/.smbcredentials,sec=ntlm,file_mode=0777,dir_mode=0777,auto,x-systemd.automount,vers=1.0 0 0

il nous faut créer le fichier /root/.smbcredentials avec ceci à l’intérieur :

username=
password=

On monte les disques et on vérifie

# mount -a
# df /media/freebox

On devrait voir s'afficher quelque chose comme ça :

	Sys. de fichiers                  blocs de 1K  Utilisé Disponible Uti% Monté sur
	//mafreebox.freebox.fr/Disque dur  239216096  63308240  163733272  28% /media/freebox
	


Installation de RPI-CLONE

RPI-Clone et un script BASH qui va nous permettre de lancer très simplement des sauvegardes de notre précieux.

Il y a aucune installation à faire, il faut juste copier le script dans le dossier /usr/local/bin/ puis lancer le script pour afficher les options.


Installation de mail-utils

Pouvoir envoyer des emails à partir de la ligne de commande d'un serveur est plutôt utile lorsque l'on veut qu'un programme ou un script shell nous informe lorsque qu'il se termine par exemple.

Pour implémenter cette fonctionnalité à votre serveur, il suffit d'installer mailutils

# apt-get install mailutils

Pour envoyer un email à Tante Jeannine, il suffit de lancer la commande suivante :

# mail -s "Hello Jeannine" tante.jeannine@gmail.com

ou l'option s spécifie l'objet du mail suivi de l'adresse email du destinataire.

Après avoir appuyé sur Entrée, il nous faut taper le message et lorsque la saisie est terminée on fait un Ctrl-D au début d'une ligne pour indiquer que le message peut être envoyé.

Ce qui nous donne :

	# mail -s "Hello Jeannine" tante.jeannine@gmail.com
	Bonjour Tata,
	Nous passerons ce WE vers 11h !
	Prépare l'apéro...
	Bisous
	
	


Installation de logwatch

Je vous invite à consulter ce billet dont le sujet a déjà été traité dans un post précédent.


installation Munin

Munin est un logiciel open-source de monitoring, qui permet de surveiller différents services en générant des graphiques à l'aide de RRDtools.
Pour installer Munin, taper ces commandes !

# apt-get install munin munin-node munin-plugins-extra

Ce qui va installer le serveur maître,le client et les plugins supplémentaires.

Puis nous créons un lien symbolique pour la partie serveur web

# ln -s /var/cache/munin/www /var/www/munin

et l'on crée un nouveau fichier de configuration pour nginx.

# nano /etc/nginx/conf.d/munin.conf

avec comme contenu ceci :

	server {
    listen 8081;
    server_name munin.teleinfo.fr;
    access_log /var/log/nginx/acces_munin.log;
    error_log /var/log/nginx/error_munin.log;

    server_name_in_redirect off;
    root /var/www/html/munin;

    location /munin/static/ {
        alias /etc/munin/static/;
        expires modified +1w;
    }
	}
	

On n'oublie pas de relancer les services pour activer l’accès web de munin :

# systemctl reload nginx
# systemctl restart munin-node

L’interface web de munin devrait être accessible via http://IP-serveur:8081

Les plugins pour munin sont disponibles dans le répertoire : /usr/share/munin/plugins/

Pour lister les plugins disponibles, utiliser cette commande :

# munin-node-configure

Pour activer un plugin, il faut créer un lien symbolique vers le répertoire munin :

# ln -s /usr/share/munin/plugins/PLUGINS /etc/munin/plugins/PLUGINS

Relancer munin-node pour la prise en compte de la nouvelle configuration :

# systemctl restart munin-node

Tester les dépendances d’un plugin :

# munin-node-configure --suggest | grep PLUGINS

Il se peut et c'est même probable que l'on rencontre quelques problèmes :

Nginx doit être compilé avec le module HttpStubStatusModule. Vous pouvez vérifier cela en exécutant la commande suivante :

# nginx -V 2>&1 | grep -o with-http_stub_status_module

Si vous voyez la sortie suivante, vous pouvez continuer.

with-http_stub_status_module

Sinon, vous devez recompiler nginx avec le module requis activé ou l'installer à partir d'une source différente. Normalement Raspbian a la bonne version par défaut.

Si vous rencontrez des erreurs avec la bibliothèque LWP (par exemple, LWP::UserAgent ou LWP::VERSION ), un paquet requis par le plugin nginx_status est manquant dans votre système.

# munin-node-configure --suggest

	nginx_request              | no   | no [LWP::UserAgent not found]
	nginx_status               | no   | no [LWP::UserAgent not found]
	

Dans ce cas, il faut installer le paquet libwww-perl :

# apt-get install libwww-perl

Relançons la commande :

# munin-node-configure --suggest

	nginx_request              | no   | no [no nginx status on http://localhost/nginx_status]
	nginx_status               | no   | no [no nginx status on http://localhost/nginx_status]
	

C'est tout bon !

Pour supprimer Munin :

# apt-get remove munin munin-node --purge
# rm -rf /etc/munin
# rm -rf /var/lib/munin
# rm -rf /var/cache/munin


Installation de fail2ban

Je vous invite à consulter ce billet dont le sujet a déjà été traité dans un post précédent.


installation Matomo

Telecharger l'archive et décompresser la en local puis copier le dossier matomo dans /var/www/html

Appliquer les droits au dossier :

# chown www-data:www-data /var/www/html/matomo

On crée un nouveau fichier de configuration pour nginx.

# nano /etc/nginx/sites-available/matomo

avec comme contenu ceci :

	server {
		#J'utilise le port 8082 pour bien séparer le site internet de l'interface Matomo
		listen 8082;
		listen [::]:8082;

		server_name teleinfo.fr;

		root /var/www/html/matomo;
		index index.php;

		location / {
			try_files $uri $uri/ =404;
		}
		location ~ \.php$ {
			try_files $uri =404;
			fastcgi_index index.php;
			fastcgi_pass 127.0.0.1:9000;
			fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
			include /etc/nginx/fastcgi_params;
		}
	}
	

Créer un lien permettant d'activer notre site en production dans le dossier sites-enabled :

# ln -s /etc/nginx/sites-available/teleinfo /etc/nginx/sites-enabled/matomo

On n'oublie pas de relancer les services nginx pour activer l’accès web de Matomo :

# systemctl reload nginx

L’interface web de Matomo devrait être accessible via http://IP-serveur:8082

Pour utiliser la géo-localisation, il faut installer php7.0-gmp

# apt-get install php7.0-gmp

Télécharger le fichier GeoLite2-City_xxxxxxxx.zip et copier le fichier GeoLite2-City.mmdb sur le pi dans le dossier /var/www/html/matomo/misc/

# apt-get install php7.0-bcmath


Désactivation du bluetooh

L'implémentation d'un module Bluetooth a entraîné une modification dans la gestion des ports sur le RPI 3 ce qui cause des problèmes dans l'utilisation du port série par exemple.
Des modifications sont nécessaires du coté du système pour que cela fonctionne et je vous invite à lire cet excellent post de l'ami François qui en fait toute la lumière.


Voilà, c'est la fin de cette longue procédure qui je l’espère vous donnera entière satisfaction.