HeaPi ou piloter des convecteurs électrique avec un Raspberry Pi

HeaPi est un projet que j’ai réalisé (en me basant sur plein de trucs déjà existant) pour contrôler l'ensemble mes convecteurs avec un RaspberryPi et un peu de code pour remplacer un boîtier électronique de gestion des convecteurs.

Mais avant de rentrer dans le sujet, un peu de théorie et sur le fonctionnement du fil pilote sur les radiateurs électriques.

Note, si vous voulez zapper ce billet et partir directement voir les sources, c’est par là !

Fonctionnement du fil pilote

Le principe de fonctionnement est relativement simple : le radiateur dispose de 3 fils, 4 avec la terre :

  1. La phase
  2. Le neutre
  3. Le fil pilote
  4. La terre (optionnel dans certains cas, eh oui !)

La phase et le neutre sont utilisés pour transporter la puissance est sont donc alimentés en 230 volts directement depuis le tableau électrique.

Le fil pilote lui ne transporte pas de puissance mais simplement une signalisation que le circuit de commande du radiateur va détecter pour choisir entre les 4 modes de fonctionnement (ou 6 selon les convecteurs). Ce signal de commande, cet ordre, est envoyé par un boîtier de commande en utilisant la phase. Il est situé dans le coffret électrique pour la connexion avec les radiateurs et une partie déportée pour la commande par l'utilisateur, avec des boutons et des leds.

Voici la liste des 6 ordres et les signaux électriques à transmettre :

  1. Mode confort : pas de signal sur le fil pilote ;
  2. Mode économique (souvent confort -3 °C) : alternance 230 volts complète ;
  3. Mode hors gel (souvent 8 °C) : demi-alternance 230 volts négative ;
  4. Mode arrêt/délestage : demi-alternance 230 volts positive ;
  5. Mode confort - 1° (uniquement en version 6 ordres) : 297 secondes sans signal et alternance 230 volts complète pendant 3 secondes ;
  6. Mode confort - 2° (uniquement en version 6 ordres) : 293 secondes sans signal et alternance 230 volts complète pendant 7 secondes.

Pour résumer dans un tableau avec des dessins

La bascule de ces différents modes ne se fait que si le convecteur est en mode "Programmation", "Auto", "Fil pilote" ou tout autre nom choisi par le fabricant, à l’exception du mode "Arrêt" qui est, généralement, prioritaire peu importe le mode choisi sur le sélecteur du convecteur.

En effet, sur une installation électrique qui dispose du boîtier contrôle du chauffage, ce dernier se situe dans le tableau electrique, et est connecté avec le compteur EDF sur la borne de télé-information (présente à ma connaissance, tous les modèles électroniques). Cette télé-information remonte des informations en boucle qui contiennent entre autres :

  • la puissance souscrite/puissance de coupure ;
  • la puissance actuellement consommée ;
  • le type de contrat (heure pleine/creuse, plein tarif, tarif couleurs, etc) ;
  • le mode actuel (heure pleine/creuse, etc).

Lorsque le boîtier de contrôle du chauffage détecte que la puissance actuellement consommée et égale ou très proche de la puissance de coupure, il va envoyer un ordre "Arrêt" à l'ensemble des radiateurs (ou par zone dans un fonctionnement multi zones) pendant quelques secondes, le temps que la puissance consommée redescende. Le but étant de faire du délestage pour éviter de faire disjoncter l'installation complète.

Bien sûr, ça la partie théorique, dans la pratique certains radiateurs ne respectent pas cette ordre "Arrêt" s’ils ne sont pas en mode "Programmation" et puis ça n'empêchera pas votre compteur de disjoncter si vous utilisez le four, une plancha, vos plaques de cuissons, ainsi qu’un aspirateur et quelques projecteurs de 1000 watts en même temps !

Aussi, ce boîtier qui commande les radiateurs n'est pas obligatoirement muni d'un capteur de température puisque chaque radiateur peut être réglé sur une température de confort (et parfois éco) qui de toute façon contrôlera ou non si le radiateur doit chauffer. En effet, l'usage du fil pilote sur un radiateur n'est pas obligatoire, le radiateur doit fonctionner même si le fil pilote n'est pas utilisé (auquel cas le mode programmation est équivalent au mode confort).

Exemple typique, s’il fait 30°C dans la pièce (plein été et vous venez de terminer une bonne raclette), que la température de confort demandée est de 21°C sur le radiateur, peu importe le mode du radiateur (éco, confort ou programmation) le radiateur ne chauffera pas !

C'est clair ? Alors passons à la pratique !

Le RaspberryPi

Le RaspberryPi est un mini ordinateur qui ne consomme pas beaucoup de courant, possède un connecteur GPIO (General Purpose Input Output - donc des entrées sorties contrôlables logiciellement). Bref, c’est une base mais il y a un petit détail qui a une grande importance :

Commander un signal en 230 volts avec un RaspberryPi ne peut pas se faire directement. En effet, un RaspberryPi a des sorties en 3 ou 5 volts et si on fait passer du 230 volts dedans, vous aurez au mieux cramé le pi, au pire un nouveau radiateur électrique (qui risque de ne pas fonctionner bien longtemps), bref vous avez compris, ce n'est pas fait pour.

Carte de commande

Alors pour contrôler du 230 volts, il faut une carte et des composants qui vont isoler la partie basse tension (les commandes en 0 / 5 volts du Raspberry Pi) avec le secteur.

Pour ce faire, on utilise un opto coupleur, qui d'un côté reçoit une tension en 0 ou 5 volts et de l'autre côté laisse, ou pas, passer la tension. En gros, c’est un interrupteur piloté en 5 volts.

Comme vu au-dessus, les 4 principaux ordres nécessitent de ne faire passer dans certains cas qu'une demi alternance. Pour régler ce problème, on utilise deux optocoupleurs (des MOC3041) et 2 diodes, ce qui donne le montage suivant.

Ainsi, si on alimente l'optocoupleur avec une tension de 5 volts par le Raspberry Pi, il devient passant et laisse passer la phase qui arrive sur une de ses bornes "haute tension". Ensuite la diode est reliée entre le fil pilote et l'optocoupleur et ne laisse passer qu'une demi alternance.
Si on arrête d'alimenter l'optocoupleur, ce dernier ne laisse plus passer la tension et il n'y a donc plus la demi alternance.
En utilisant ce même principe mais avec une diode dans l'autre sens, on peut laisser passer soit l'alternance positive, soit négative, soit l'alternance complète ou enfin rien.

Les composants utilisés sont détaillés un peu plus loin, le but ici était de réaliser un typon dont le choix précis des composants sur Fritzing n'avait pas d'importante, leur forme, position et boitier si :

Vous trouverez ici les sources du projet Fritzing, ce qui permet notamment de sortir le schéma typon utilisé pour fabriquer la carte électronique.
Je suis de mon côté passé par AERCIM, une entreprise Toulousaine qui fabrique les cartes (sans les composants), puis j'ai acheté et soudé l'ensemble des composants sur la carte à savoir :

  • Un connecteur pour brancher le fil pilote et la phase ;
  • 3 pins pour pouvoir brancher la carte avec le Raspberry Pi ;
  • 2 MOC3041 ;
  • 2 diodes 1N007 ;
  • 2 résistances de 390 ohms.

Ce qui donne ceci :

On a donc en bas de la carte les connexions qui seront réalisées avec le Raspberry Pi et en haut (le truc rouge) ce qui permettra de connecter la phase et le fil pilote.

Allez, on branche

Pour le branchement sur le Raspberry Pi, on utilise le site https://pinout.xyz/ qui permet de savoir à quoi correspond chaque pin sur le RaspberryPi (masse, 5v permanent, 3v3 ou GPIO).

Ce qui nous intéresse, ce sont donc les GPIO et la masse (Ground), mais dans la toute simplicité on remarquera vite que le nom de la pin GPIO2 par exemple correspond physiquement à la position 3 tandis que la GPIO1 est sur la 28.

Pour l'exemple qui va suivre, on va brancher une carte sur les pin physiques 3 et 5 ainsi que la masse (pin 6 par exemple).

Pour des raisons pratiques, j’ai nommé avec un code couleur les pins sur la carte de commande, de gauche à droite sur la première photo : jaune, vert et noir (correspondant à la masse). Si vous cherchez une raison sur ces couleurs, ce sont les 2 premiers câbles de mon kit Arduino que j'avais sous la main au moment du test.

Ce qui nous donne donc ceci :

COULEUR PIN PI PIN SOFT
JAUNE 3 2
VERT 5 3
NOIR 6

N/A

Ensuite, on utilise le programme bash présent ici pour pouvoir contrôler la carte, pour ce premier test, les codes couleurs n'ont pas d'importance, ça viendra plus loin.

En envoyant les commandes suivantes on va activer un des MOC mais pas l'autre :

bash ./gpio mode 2 out
bash ./gpio mode 3 out
bash ./gpio write 2 1
bash ./gpio write 3 0

Le fait que les 2 entrées des toutes mes cartes soient nommées jaune (yellow) et verte (green) permet derrière d'établir une table de vérité valable pour toutes les cartes qui est la suivante :

Mode Yellow Green
Confort 0 0
Arrêt/Stop 0 1
Frost 1 0
Éco 1 1

Bon ça c’est un exemple, mais quitte à remplacer le boîtier de commande des radiateurs, pourquoi ne pas utiliser plusieurs cartes de commandes, chacune pour une zone/pièce (qui permet de commander un ou plusieurs radiateurs) ?!

Et puis, pourquoi ne pas faire un petit programme (en bash) pour ne pas avoir à taper à chaque fois les bonnes valeurs ?

On voit les choses en grand !

J'ai décidé que pour mon besoin j'allais utiliser 4 cartes, ce qui me permet d'avoir 4 zones (chaques zones peut avoir un ou plusieurs radiateurs) que je peux commander chacune comme je veux.

Histoire de faire ça proprement, on place tout ça dans une petite boite : 4 cartes de commandes, le RaspberryPi et l'ensemble des câbles pour tout connecter.

Avant de refermer j’ai utilisé un oscilloscope pour contrôler que chaque carte fonctionne comme prévu.

Dans ce montage, il manque une carte pour récupérer les informations du compteur EDF, principalement pour déclancher un délestage... et un fusible.

J’espère avoir la place pour ajouter la carte de délestage dans mon boîtier mais ce n’est pas dans mes priorités.

Pour le fusible, j’ai réalisé que j’aurais dû protéger les MOC par un fusible de faible intensité (une centaine milliampère) car clairement si pour une raison ou une autre, un des radiateurs court-circuite le fil pilote avec le neutre, je peux être sûr que ce seront les MOC qui vont cramer en premier en espérant que ça ne fasse pas de dégât plus grave.
Bref, c’est donc prévu d'en ajouter un pour protéger l'ensemble des cartes, en attendant que je mesure la consommation, c’est branché sur un fusible de 2A du tableau électrique.

Côté programmation

Le code utilisé est entièrement disponible sur mon dépôt git, et il y a plusieurs fichiers :

  • heapi.sh - la seule commande à utiliser pour tout contrôler !
  • cards - le seul fichier à modifier pour faire correspondre aux branchements ;
  • crontab.example - un exemple d'une crontab pour commander ça de manière totalement automatique, on y vient ;
  • libheapi - un ensemble de fonction pour commander les cartes ;
  • gpio - la librairie vue plus haut qui permet de contrôler les sorties GPIO du RaspberryPi ;
  • Les autres ne sont pas utilisés ou contiennent uniquement de la documentation.

Le fichier cards

C’est le seul fichier, avec la crontab, qu'il faut modifier au moins une fois.

Ce fichier contient la liste des cartes et fait la correspondance entre le nom de la carte la correspondance avec le GPIO. 

Vous pouvez mettre n'importe quel nom pour les cartes, mais ce nom doit impérativement commencer par "card" et ne pas avoir d'espace et la première lettre en majuscule.

Ensuite pour chaque carte il faut définir les variables yellow et green avec la correspondance GPIO vue par le logiciel (donc pas le branchement physique).

Voici un extrait du fichier :

#/bin/bash
### IMPORTANT!
# All card must start by:
# card
# eg: cardMyStupidCard
###
#first card
cardSejour1 ()
{
        yellow=2
        green=3
}
#card 2
cardChambre ()
{
        yellow=27
        green=17
}

Le fichier heapi.sh

C’est votre boîtier de commande, si je peux dire ainsi.

Il s'utilise simplement, tout d'abord faut initialiser les sorties GPIO configurées dans le fichiers cartes, pour ça on va lancer la commande suivante :

bash ./heapi.sh init

Cette commande doit être lancée après chaque redémarrage du RaspberryPi, on verra dans le fichier crontab comment cette problématique est traitée.
Lorsque cette commande est lancée, tous les radiateurs sont automatiquement configurés en mode "hors gel".

Ensuite on peut utiliser la commande list pour lister l'ensemble des cartes configurées

bash ./heapi.sh list
chambre
sejour1

Pour passer les radiateurs connectés à ma carte chambre en mode confort et ceux du séjour1 en mode éco ? Rien de plus simple :

bash ./heapi.sh chambre conf
bash ./heapi.sh sejour1 eco

Et enfin, si on souhaite savoir dans quel mode est le radiateur de la chambre, on utilise la commande suivante :

bash ./heapi.sh chambre stat

Ce qui nous donne le résulat suivant :

Yellow: 'out 0'
Green: 'out 0'
mode: conf

Et c’est tout ! Les noms des modes disponibles sont :

  • conf pour confort ;
  • eco pour économique ;
  • frost pour hors-gel ;
  • stop pour arrêt.

Crontab ?

La crontab est un fichier que l'on donne au logiciel crontab pour qu'il execute des commandes à certains moment précis (heure, jours, etc)

Pour la mettre en place vous pouvez recopier le fichier crontab.example et executer la commande suivante, en partant du principe que l'ensemble du logiciel heapi est installé dans le dossier /root).

cp /root/heapi/crontab.example /root/heapi/crontab
ln -s /root/heapi/crontab /etc/cron.d/heapi

Pour le fonctionnement de la crontab, je ne vais pas expliquer en détail, allez voir la documentation qui est bien plus complète.

Je vais juste détailler l'exemple suivant :

# m h  dom mon dow  	user	 command
@reboot			    root	/root/heapi/heapi.sh init
40 22   *   *   * 	root	/root/heapi/heapi.sh chambre conf
0  0    *   *   *  	root	/root/heapi/heapi.sh chambre eco
0  5    *   *   *   root    /root/heapi/heapi.sh chambre conf
30 6    *   *   1-5 root	/root/heapi/heapi.sh chambre stop
30 8    *   *   6,7 root	/root/heapi/heapi.sh chambre stop

La ligne commançant par @reboot permet d'executer la commande init à chaque démarrage du raspberry Pi.

Ensuite, tous les jours à 22 heures 40, la zone chambre passe en mode confort, puis à minuit en mode éco jusqu’à 5 heures où on remet le mode confort. Enfin à 6 heures 30 du lundi au vendredi on éteint complètement le chauffage, sauf le samedi et dimanche où le chauffage reste actif jusqu'à 8 heures 30.

Encore un peu plus de doc ?

Le reste de la documentation est sur le git, c’est plus ou moins détaillé mais avec ce billet plus les documents présents vous devriez arriver à dupliquer ça chez vous !

Merci au blog Téléfab pour toute la partie carte et schéma et pour m'avoir donné l'idée d'aller plus loin et surtout au boîtier EJ 110T de Hager qui en tombant en panne et un boitier neuf afficher dans les 250 euros m'a bien motivé pour faire quelque chose de « mieux » !

En bonus quelques images.

Test avec oscilloscope, nov. 2020
Test avec l'oscilloscope
Version alpha du projet, nov. 2020
Version alpha du projet, directement branché sur les radiateurs !
Une fois la boite fermé, nov. 2020
Une fois la boite fermé

Capteurs de température dans les salles de Tetaneutral.net

Depuis quelques jours, des courbes de température des 3 salles associatives de Tetaneutral (Myrys & TLS00) sont visibles sur un graphique ici : https://temper.aplu.fr/ et les données peuvent être téléchargées en CSV. Cela vient compléter le capteur de température et d'humidité déjà présent à  […]

Lire la suite

Quelle version de LineageOS pour le Wileyfox Swift ?

Ce billet sera mis à jour au fil des mises à jour de LineageOS pour vous indiquer quelle version de LineageOS j’utilise, vous pouvez bien sûr prendre les devants et passer sur une autre version, mais parfois certaines mises à jour sont problématiques…

Au 26 avril 2020 : lineage-16.0-20200423-microG-crackling.zip, pas de soucis rencontré.
Le patch de sécurité est celui du 5 avril 2020.

Lire la suite

Les télécommandes infrarouge sous Linux

Les télécommandes infrarouge sous Linux Article mis-à-jour en différenciant les informations spécifiques à Ubuntu 20.04 en vert, et celles spécifiques à Ubuntu 18.04 en orange; Historique Les télécommandes infrarouge étaient classiquement gérées par LIRC (Linux Infrared Remote Control) sous Linux  […]

Lire la suite

Haut de page