[Ordinateur/Maison] Surveillance de la Connexion d’Internet et de l’état du réseau à distance

Dans ma maison, j’ai eu quelques problèmes avec des coupures de courant. Ces coupures proviennent d’orages qui font sauter le disjoncteur général. Quand je suis à la maison, je remets simplement ce disjoncteur, mais quand je suis en vacances, alors je ne me rends même pas compte. En Septembre dernier, l’intégralité de mon congélateur était à jeter après un défaut de disjoncteur qui est resté inapercu pendant 3 jours.

J’ai donc décidé de mettre en place un système de surveillance qui m’avertis que le courant est coupé. Je me sers de ma connexion d’internet pour surveiller. Le souci est que je ne veux pas ouvrir le firewall de mon routeur ADSL, car je ne veux pas me soucier des potentiels vulnérabilités.

L’astuce est simple : un Raspberry PI – qui se trouve dans ma maison – appelle une page internet toute les minutes. Cette page se trouve sur mon espace internet chez mon hébergeur. La page ne fait que enregistrer l’heure du dernier appel. Une autre page me permet de voir l’état à distance.raspberry_surveillance

Schéma de Fonctionnement
Schéma de Fonctionnement

Au cas où je me rends compte d’un problème, je peux appeler un ami pour aller voir et remettre le disjoncteur.

La Page pour le Protocole

La page ping.php ne fait rien d’autre que stocker la date et l’heure (timestamp) actuel lors de l’appel dans les fichiers last.txt et log.txt. Le fichier last.txt est écrasé à chaque écriture mais le fichier log.txt contient tous les enregistrements depuis le début de l’utilisation de cette page.

Le code PHP pour la page ping.php :

<html>
<body>
</body>
</html>
 
<?php
	$file = 'log.txt';
	$stamp = date('Y-m-d H:i:s', time()) . "\n";
	// Ecrit le contenu dans le fichier, en utilisant le drapeau
	// FILE_APPEND pour rajouter à la suite du fichier 
	file_put_contents($file, $stamp, FILE_APPEND);
 
	$file = 'last.txt';
	$stamp = date('Y-m-d H:i:s', time());
	// Ecrit le contenu dans le fichier, en utilisant le drapeau
	// FILE_APPEND pour rajouter à la suite du fichier 
	file_put_contents($file, $stamp);
?>

Appel de la Page par le Raspberry PI

Le Raspberry PI doit appeler la page ping.php qui se trouve à une adresse de mon serveur qui se trouve chez un grand hébergeur. L’appel peut se faire avec l’exécutable Linux wget. Pour l’exécution périodique, j’utilise l’outil cron qui fait parti de quasiment toutes les distributions Linux.

J’ai suivi les instructions de ce site : https://www.raspberrypi.org/documentation/linux/usage/cron.md

En bref :

  1. Ouvre la configuration de cron avec “sudo crontab -e”
  2. Ajoute la ligne “0 * * * * wget http://monserveur.com/ping.php”
  3. Enregistre le fichier.
  4. Redémarre le Raspberry PI.

La Page de Visualisation à Distance

La visualisation peu se faire simplement en affichant last.txt ou log.txt, mais j’ai préféré de mettre en place une petite page qui me rend la visualisation plus agréable :

Vue de la page status.php
Vue de la page status.php

Le fichier status.php doit se trouver dans le même dossier que ping.php et contenir le code suivant :

<html>
<head>
<style type="text/css">
 body {
	 font-family: "Arial";
	 color: white;
	 background-color: black;
 }
 span.green {
	 color: green;
 }
 span.orange {
	 color: orange;
 }
 span.red {
	 color: red;
 }
</style>
</head>
<body>
<h1>Surveillance &agrave; distance de coupure de courant/internet</h1>
 
<?php
	$file = 'log.txt';
	$stamp = date('Y-m-d H:i:s', time()) . "\n";
	// Ecrit le contenu dans le fichier, en utilisant le drapeau
	// FILE_APPEND pour rajouter à la suite du fichier 
	file_put_contents($file, $stamp, FILE_APPEND);
 
	$file = 'last.txt';
	// Ouvre un fichier pour lire un contenu existant
	$last = file_get_contents($file);
	$stamp = date('Y-m-d H:i:s', time());
	ereg("^([0-9]{4})-([0-9]{2})-([0-9]{2}) ([0-9]{2}):([0-9]{2}):([0-9]{2})$",$last,$regs);
 
	print("<p><b>Dernier ping : </b>".$regs[3]."/".$regs[2]."/".$regs[1]." &agrave; ".$regs[4]."h".$regs[5]." et ".$regs[6]."s</p>");
 
	$year = intval($regs[1]);
	$month = intval($regs[2]);
	$day = intval($regs[3]);
	$hours = intval($regs[4]);
	$minutes = intval($regs[5]);
	$seconds = intval($regs[6]);
 
	$last_time = mktime ($hours,$minutes,$seconds,$month,$day,$year);
	$interval =  time() - $last_time;
	print("<p>Dernier ping il y a ".$interval."s.");
 
	if ($interval <= 60)
	{
		print("<p>Etat : <span class=\"green\">fonctionnel</span></p>");
	}
	else
	{
		if ($interval <= 300)
		{
			print("<p>Etat : <span class=\"orange\">intermittent</span></p>");
		}
		else
		{
			print("<p>Etat : <span class=\"red\">interrompu</span></p>");
		}
	}
?>
 
</body>
</html>

La date et l’heure de la dernière connexion sont affichés en claire. Si le dernier ping a été fait il y a 60s ou moins, l’état “fonctionnel” est écrit. Jusqu’à 5 minutes de manquement l’état “intermittent” est écrit. Au-delà de 5 minutes l’état “interrompu” est écrit.

[Fr] Jardinage – Construction d’un mur de soutènement en Pierre sèche

Il y a deux ans nous avons acheté une maison ancienne qui était en location auparavant. Le jardin était dans un état brut, sans véritable plantation. Par rapport à la rue, le jardin est en soubassement de 3m, au niveau du sous-sol de la maison.

On se trouvait donc face à une partie du terrain en forte pente. Tout le monde pouvait regarder à partir du trottoir dans notre jardin et on pouvait y accéder facilement.

Pente avant construction du mur
Pente avant construction du mur
Pente avant construction du mur
Pente avant construction du mur

Pour couper le vent, on voulait mettre une haie de troëne au niveau de la rue (limité en hauteur à 1,20m par le PLU), doublé par des fargesias (bambous restant en souche) à 3m du trottoir. Ensuite, deux  surfaces planes pour la plantation de fleurs, arbustes et arbres étaient prévues. Vue en coupe :

Coupe du projet de construction
Coupe du projet de construction

Pour tenir la terre en place, il fallait construire deux murs de soutènement. Pour des raison esthétiques et de simplicité de construction nous avons choisi de construire ces murs en pierre brute, sans liaison par mortier. Par coup de chance, un fermier en Allemagne nous a cédé 15t de pierres calcaires/sableuses issu de la démolition d’une ancienne ferme pour 150€. Le transport s’est fait avec un transporteur français, le chargement à la main :

Livraison des pierres
Livraison des pierres

Après quelques mois de travail dur (que quelques heures par semaine étaient disponibles), les murs étaient terminés et la terre apportée :

Premières plantations - Haie de troëne, buis, hortensias et bambou
Premières plantations – Haie de troëne, buis, hortensias et bambou

Un an et demi plus tard, avec la plantation, les choses commencent à prendre forme :

Murs en pierre sèche, 2 ans après la plantation
Murs en pierre sèche, 2 ans après la plantation
Murs en pierre sèche vue de la terrasse, 2 ans après la plantation
Murs en pierre sèche vue de la terrasse, 2 ans après la plantation

Mode d’emploi

D’abord un peu de théorie : les murs en pierre sèche sont construites sans liaison par mortier, et sur fondation sèche. Pour des murs d’une hauteur supérieure à 1m, il faut prévoir une fondation en béton. Plus de détails aussi sur  Wikipedia.

D’une manière générale, la base du mur doit être plus large que le haut. Dans le cas particulier du mur de soutènement, il faut le pencher vers la pente de la colline. Il n’y a pas de contre-mur à construire. Le principe ci-dessous :

Coupe du mur en pierre sèche
Coupe du mur en pierre sèche

L’exemple ci-dessous montre la construction d’un mur en demi-cercle de 0,8m de haut à l’arrière de ma maison. Le but est de cacher la vieille trappe de visite de la fosse sceptique.

Les fondations

J’ai creusé un trou de 50cm de large et 40cm de profond pour y mettre ca. 30cm de crasse sur un géotextile. C’est important pour le drainage et donc pour mettre les pierres hors gel. La première rangé de pierres est plus large que le mur au final, pour constituer une bordure basse au niveau de la pelouse. Ceci facilite l’entretien de la pelouse, car on peur passer dessus avec la tendeuse. Cette première rangé ne doit pas dépasser ne niveau de la pelouse.

Fondations du petits mur (géotextile et crasse)
Fondations du petits mur (géotextile et crasse)

Les rangés basses

Derrière les premières rangés, je mets toujours de la crasse pour drainer, avant de mettre la terre végétale. La construction se fait en essayant plusieurs pierres avant d’en trouver une qui est bien placée. Il est préférable d’utiliser des grandes pierres en-dessous.

Premières rangés du petit mur
Premières rangés du petit mur

De temps en temps, une pierre mise de travers, directement dans la crasse ou la terre, augmente la stabilité.

Certaines pierres vont loin dans la terre pour rendre le mur plus stable
Certaines pierres vont loin dans la terre pour rendre le mur plus stable

Note: La stabilité finale du mur sera seulement établie quand le remplissage de terre est terminé.

Les rangés hautes

La pression ici est moins forte, on peut donc construire moins épais et avec des pierres plus petites. Les règles de construction sont les mêmes que pour les rangés basses, sauf qu’on n’utilise plus de la crasse pour remplir le trou derrière les pierres (on ne veut pas planter dans de la crasse, hein).

La plus grande difficulté est de retrouver au même niveau sur la dernière rangé. C’est un travail pour ceux qui aiment bien les puzzles, mais au final, mon carré haut est plutôt sympa :

Petit mur avant mettre de la terre de bruyère
Petit mur avant mettre de la terre de bruyère

Quelques vieilles photos historiques

Ci-dessous encore quelques photos faites pendant la construction du premier mur :

Construction des murs dans la pente
Construction des murs dans la pente
Remplissage avec de la terre
Remplissage avec de la terre

[Fr] Jardinage – Construction de Potagers surélevés

Un potager surélevé peut être très esthétique dans le jardin. Il démarque le potager du reste du jardin et met en valeur les plantation de fruits et légumes. Dans un potager classique on perçoit les carottes, salades, choux etc. comme “quelque chose qui pousse au niveau du sol”. Dans un potager surélevé les mêmes plantes deviennent actrices principales et prennent une belle place décorative dans le jardin.

Vue d'ensemble des potagers surélevés
Vue d’ensemble des potagers surélevés en construction

En plus des considérations esthétiques, quelques autres avantages rendent intéressant la construction de potagers surélevés:

  • facilite d’entretien et cueillette
    La hauteur du potager permet de bien planter, entretenir et cueillir sans trop se charger le dos.
  • bon rendement du potager
    Avec le temps, le bois sous la terre pourrit tout doucement et ensemble avec le composte, il fournit des ressources pour les plantes et chauffe la terre. La chaleur fourni par le composte et le bois suffit pour rallonger la saison de plantation de quelque semaines.
  • moins de difficultés à lutter contre limasses et mauvaises herbes
    Pour se débarrasser de limasses, il suffit de leur couper le chemin en bas du potager soit avec une grille, du sable ou des grains. Les mauvaises herbes sont faciles à enlever du potager car les racines ne vont pas bien loin.
  • les déchets verts directement recyclés
    Les jardins très grands, avec beaucoup de plantes et donc déchets verts peuvent profiter de potages surélevés pour bien utiliser ces déchets.

On peut construire un potager surélevé avec un peu tout : des palettes, des parpaings, de la pierre taillé, du grillage en fer, du bois … J’ai décidé de tout faire en bois et je montre mes plans ici.

Construction du Bac

J’ai décidé de construire des bacs de 1,2m x 2m x 0,5m (largeur x longueur x hauteur). Le bois utilisé est celui du douglas, qui a l’avantage qui tient relativement bien dehors sans traitement spécial. Les plans ci-dessous montrent comment le construire :

Plan potager surélevé
Plan du potager surélevé

Les planches a et b sont des planches de 88mm x 20mm x 2m qui s’encastrent l’une dans l’autre. Les planches a sont coupés à 1,2m de longueur. J’ai mis pour a et b 5 planches en hauteur, mais toute autre hauteur est possible.

Les poteaux c sont fabriqués à partir de poteaux 60mm x 40mm x 2m découpés à la bonne longueur. Pour mon cas, 50cm de longueur est suffisant.

Les planches d et e servent à rendre les caisses plus joli et plus résistantes à la pluie. Il s’agit de planches de 94mm x 20mm x 2m, découpés à 1,05m dans le cas des planches e.

Après avoir découpé toutes les planches, il faut les visser ensemble. J’ai utilisé des vis inox 4,5 x 40, mais des vis moins chers de même taille feront aussi l’affaire.

Je conseille d’abord de lier les planches a avec deux poteaux c. Il faut utiliser 2×2 vis par planche pour garantir une bonne stabilité. Ensuite il faut monter un poteau c au milieu des planches b. Le toute peut finalement être assemblé. Pour tout l’assemblage, un marteau aide bien à minimiser l’espace entre les planches.

Les planches de finition d et e seront montées plus tard.

Fondations et Nivelage

Les fondations sont nécessaires pour permettre d’orienter et bien niveler le potager et surtout pour éviter l’eau stagnante au niveau des planches et poteaux en bois.

D’abord il faut creuser les fentes dans le sol pour pouvoir poser les fondations et le cadre. Il faut que les poteaux rentrent quelque centimètres dans le sol et que les planches du cadre sont à peu près au niveau du  sol (pour faire joli). J’ai creusé 10 à 15 cm de profond et de large :

Creuser les fondations
Creuser les fondations

Ensuite il faut essayer si les dimensions sont bonnes, ce qui se fait en posant le cadre provisoirement sur les tranchés. Si les dimensions sont bonnes, il faut à nouveau enlever le cadre et remplir les tranchés avec de la crasse ou d’autres cailloux . La mise à niveau se fait en étalant la crasse et en posant le cadre dessus (c’est un peu un puzzle, il faut être patient) :

Mise à niveau du cadre par ajustement de la hauteur des fondations
Mise à niveau du cadre par ajustement de la hauteur des fondations

Quand le niveau du sol est très irrégulier ou pentu, alors il peut être intéressant d’égaliser la hauteur avec des dalles :

Creuser des fondations pour pose de dalles avant mise en place du cadre du potager
Creuser des fondations pour pose de dalles avant mise en place du cadre du potager
Pose des dalles dans la fondation
Pose des dalles dans la fondation

pot_fondation6

Remplissage des fondations avec de la crasse
Remplissage des fondations avec de la crasse

Pour finir le remplissage j’utilise du sable :

Finition des fondations avec du sable
Finition des fondations avec du sable

Protection contre Rongeurs

La température du sol du potager est plus élevé que du reste du sol à cause de la décomposition du bois et du composte. Cela attire des rongeurs. Pour éviter ces intrus, je pose un grillage de poulailler dans le fond du cadre. Il est vissé avec les chutes du bois :

Pose du grillage dans le potager
Pose du grillage dans le potager
Pose du grillage dans le potager
Pose du grillage dans le potager

Protection en Plastique

Pour éviter que le bois du cadre de l’eau stagnante et de l’exposition à l’humidité en permanence, il faut mettre une bâche en plastique à l’intérieur. J’ai utilisé de la bâche destiné à créer des étangs, mais on peut aussi utiliser de l’onduline. Pour fixer la bâche, j’enroule une chute de bois dedans, que je visse directement sur le cadre. Pour pouvoir fixer les planches de finitions, il est préférable d’aligner la chute de bois avec le haut des planches du cadre :

Fixation de la bâche d'étanchéité avec une chute enroulée
Fixation de la bâche d’étanchéité avec une chute enroulée

Montage des Planches de Finition

Les planches de finition d et se vissent sur les poteaux et sur les chutes qui fixent la bâche :

Pose des planches de finition
Pose des planches de finition

Remplissage

Tout le secret du potager surélevé se trouve dans son remplissage. Les différentes couches sont les suivantes (de bas vers le haut) :

Remplissage d’un potager surélevé
  1. Découpe de bois et déchets verts
  2. Terre végétale et composte semi-fini
  3. Composte fini
  4. Terre de bruyère

D’abord j’ai mis les bois :

Première couche de remplissage avec du bois
Première couche de remplissage avec du bois

Ensuite j’ai mis mes déchets verts (on y trouve de l’herbe, un sapin de noël, de la découpe du troène …) :

Seconde couche de remplissage avec les restes de pelouse et des déchets organiques du jardin
Seconde couche de remplissage avec les restes de pelouse et des déchets organiques du jardin

Ma terre végétale est relativement lourde, je la mélange généralement avec du sable :

Remplissage avec de la terre végétale et du sable
Remplissage avec de la terre végétale et du sable

Ensuite une couche de composte semi-fini est ajouté :

Remplissage avec du composte semi-fini
Remplissage avec du composte semi-fini

La couche de composte vient ici d’une société vendant du composte :

Remplissage du potager avec du composte
Remplissage du potager avec du composte

Finalement on ajoute la terre de bruyère. Cette étape sera faite une fois que le composte se tasse un peu (dans deux semaines).

Le niveau de remplissage va encore diminuer, car le bois et les déchets se tassent. La décomposition du bois et des déchets vont causer une diminution du niveau les premiers 2 ans. Il faut donc un peu sur-remplir le potager au début, et ensuite remettre à niveau tous les ans.

[Fr] Projet – Bougies électriques pour lanternes – Multitasking

A présent, la “bougie” ne sait que faire une chose : imiter la lumière aléatoire d’une bougie. C’est déjà pas mal, mais je voudrais pouvoir communiquer par liaison série avec le circuit. Et cela sans que le programme “bougie” s’arrête.

Dans le précédent programme, la grande partie du temps de calcul a été perdu à rien faire. La fonction “delay(x)” force le processeur à ne rien faire pendant un temps x.

Dans un nouveau programme, je vais remplir la même tâche qu’avant (faire clignoter la lampe), mais en utilisant moins de temps de calcul. Ceci peut être fait en comparant le temps absolu depuis démarrage du processeur avec un temps enregistré. Ce temps est accessible via la fonction “millis()” qui fournit un nombre du type “unsigned long”:

#define PIN_PWM_OUT 0

unsigned long last_timestamp;

void lamp_setup(){
  pinMode(PIN_PWM_OUT, OUTPUT);
  last_timestamp = millis();
}

/* lamp driver */
void lamp_loop(){
  unsigned long timestamp = millis();
  if (timestamp - last_timestamp > 100)
    {
       analogWrite(PIN_PWM_OUT,random(128,255));
       last_timestamp = timestamp;
    }
}
 
void setup() {
  lamp_setup();
}

void loop() {
   lamp_loop();
}

Voilà donc un programme bien plus extensible que le dernier. Maintenant on peut ajouter d’autres fonctionnalités dans la boucle principale.

La classe SoftwareSerial et ses limites

La série Attiny25, 45 et 85 est performante, mais ne dispose pas de périphérie pour la communication UART. Cela limite le champ d’application, mais pour des liaison lentes on peut envisager l’utilisation de la classe SoftwareSerial qui vient avec les librairies Arduino.

SoftSerial envoie les bits conforme à UART utilisant des délais crées avec des commandes “nop”. La réception se fait de la même manière, mais utilisant des interruptions sur l’entrée Rx. Ces interruptions arrêtent le fonctionnement normal du processeur (la boucle principale) pour exécuter du code différent. Ici la capture et lecture du message du port série.

Plus d’infos sur le fonctionnement d’une liaison série par software se trouvent ici :

http://thegaragelab.com/a-software-uart-for-the-attiny85/

Ils utilisent une autre librairie mais le fonctionnement est similaire.

Le fonctionnement en détail de la librairie SoftwareSerial se comprend le mieux en lisant les fichiers SoftwareSerial.c et .h qui se trouvent dans le dossier des librairies Arduino.

D’abord, je vais mettre en place un petit programme de test :

#define PIN_PWM_OUT 0

unsigned long last_timestamp;

void lamp_setup(){
  pinMode(PIN_PWM_OUT, OUTPUT);
  last_timestamp = millis();
}

/* lamp driver */
void lamp_loop(){
  unsigned long timestamp = millis();
  if (timestamp - last_timestamp > 100)
    {
       analogWrite(PIN_PWM_OUT,random(128,255));
       last_timestamp = timestamp;
    }
}

/* serial */
void serial_setup()
{
  mySerial.begin(1200);
  mySerial.listen();
}

if (mySerial.available()!=0)
{
  mySerial.write(mySerial.read());
}

/* main */
void setup() {
  lamp_setup();
  serial_setup();
}

void loop() {
   lamp_loop();
   serial_loop();
}

Ce programme ne fait rien d’autre qu’envoyer l’octet reçu par liaison série par cette même. C’est une sorte d’écho.

Via le logiciel HTERM et un Arduino USB Serial Light Adapter je communique avec le Attiny.

L’envoi et la réception d’un byte fonctionne très bien, mais deux bytes successifs ne veulent pas passer. Le deuxième (et troisième etc.) byte est toujours corrompu.

Je pense que le problème est que la succession de deux bytes est trop rapide. Il me faut un moyen pour rendre un peu plus long le temps d’attente entre deux bytes envoyés par le PC ou le contrôleur.

Pour mieux comprendre le phénomène, il faut un oscillographe. Le mien n’est pas terrible, mais pour comprendre ce problème il est suffisant. La capture d’écran ci-dessous montre bien que les trois caractères “AVR” (0x41 0x56 0x52) se suivent sans véritable pause :

'AVR' par liaison série
‘AVR’ par liaison série

C’est bien ce que je craignait. Et le logiciel HTERM ne permet pas de modifier le temps entre l’envoi de deux bytes.

Ce qu’il faut retenir pour le contrôleur (qui sera basé Arduino), c’est qu’il faut un délai entre deux bytes envoyés. La longueur du délai reste à déterminer.

Introduire un délai dans l’envoi des messages

Puisque mes logiciels PC pour le port série ne permettent pas confortablement d’introduire des délais, j’ai décidé d’utiliser un autre Arduino pour accomplir cette tâche.

Le code est très simple, il s’agit de recevoir des bytes via liaison série hardware et de les transférer via SoftwareSerial en ajoutant une pause :

#include <SoftwareSerial.h>

SoftwareSerial mySerial(10, 11); // RX, TX

void setup()  
{
  Serial.begin(1200);
  mySerial.begin(1200);
}

void loop()
{
  while (mySerial.available()){
    Serial.write(mySerial.read());
    //delayMicroseconds(100);
  }
  while (Serial.available()){
    mySerial.write(Serial.read());
    //delayMicroseconds(100);
  }
}

Finalement, je n’ai même pas eu besoin du délai artificiel, car l’exécution même ajoute suffisamment de délais :

AVR par liaison série
‘AVR’ par liaison série

Cette-fois ci l’Attiny répond bien à tous les messages. Il reste tout de même à déterminer le délai minimal entre deux bytes. Mais ça c’est une autre histoire.

[Fr] AVR ISP à deux sous

J’ai trouvé un programmeur ISP pour Atmel AVR en kit pour seulement 5€90. D’après le vendeur, il fonctionne avec AVR Studio et AVRDUDE. Je l’ai commandé pour remplacer mon montage immense basé sur Arduino.

AVR ISP USB Stick

Le tout est disponible sur le site ehajo.de et l’envoi en France coûte 4€50.

Je vous tiens au courant de premiers tests dès qu’il arrive à la maison.