Cette semaine, nous allons parler d'un sujet à la mode: l'aération d'une salle de travail. Le CO2 étant un bon indicateur de "pollution" de l'air, nous allons voir comment automatiser l'ouverture de fenêtres motorisées Velux en fonction du taux de CO2 à l’intérieur d'une pièce.
Notre challenge est de contrôler l'aération d'une grande pièce avec 6 fenêtres motorisées Velux Integra. Les taux de CO2 à l'extérieur sont généralement de 350 à 450 ppm, tandis que le niveau maximal de CO2 considéré comme acceptable à l'intérieur d'une pièce est de 1000 ppm. Notre but est donc d'ouvrir les fenêtres dès que le taux de CO2 dépasse les 800 ppm.
Pour réaliser un tel système, il faut, d'une part, être capable de mesurer le taux de CO2 et, d'autre part, contrôler l'ouverture et la fermeture de ces fenêtres.
Mesurer le taux de CO2
Chez Yoctopuce nous proposons des capteurs pour mesurer presque tout. En l'occurrence, nous avons le Yocto-CO2-V2 qui permet d'obtenir le taux de CO2 dans l'air. Ce capteur permet de mesurer le taux de CO2 entre 0 et 40000ppm. Exactement ce qu'il nous faut. Note: pour plus de détails sur le Yocto-CO2-V2, vous pouvez consulter cet article.
Contrôler les fenêtres motorisées
Pour contrôler les fenêtres motorisées Velux, nous avons utilisé une interface Velux KLF 200. Ce boîtier permet de commander des fenêtres motorisées Velux à partir de contacts physiques. Il est possible de piloter jusqu'à 200 produits Velux Integra que l'on peut répartir en 5 zones maximum.
Chaque zone est pilotée à l'aide de 2 paires de contacts qui commandent l'ouverture ou la fermeture des fenêtres de la zone. Une fermeture de la première paire de contacts commande l'ouverture de toutes les fenêtres de la zone. Une fermeture de la deuxième paire de contacts commande la fermeture des fenêtres de la zone. Si les deux contacts sont fermés au même moment cela stop l'ouverture ou la fermeture en cours pour, par exemple, laisser la fenêtre entrouverte. Comme le contrôleur permet de piloter 5 zones, il y a en tout 10 paires contacts sur le boîtier.
Chaque zone est pilotée par deux paires de contacts
Dans notre cas il y a 6 fenêtres à piloter. Nous avons regroupé les deux fenêtres les plus proches dans une même zone, et les 4 autres ont chacune leur propre zone. On aurait aussi pu regrouper les 6 fenêtres dans une même zone. Mais nous avons préféré nous laisser la possibilité de contrôler individuellement chaque fenêtre pour, par exemple, n'ouvrir que certaines fenêtres en fonction des conditions météo.
Les deux Yocto-MaxiPowerRelay permettent de piloter les 10 paires de contact
La solution la plus simple pour piloté ces 10 paires de contacts est d'utiliser deux Yocto-MaxiPowerRelay qui permettent de piloter 5 relais chacun. Velux fournissant des câbles avec le KLF 200, le raccordement est trivial.
Le KLF200 avec le Yocto-CO2-V2 et les deux Yocto-MaxiPowerRelay
Une fois le câblage réalisé, il faut noter quelle sortie de chaque relais correspond à quelle commande. Afin de simplifier le code de l'application, nous avons assigné un nom logique à chaque sortie des Yocto-MaxiPowerRelay. Par exemple, nous avons assigné le nom zone_a_close au relais qui contrôle la fermeture les fenêtres de la zone A.
Pour ce faire, nous avons utilisé le VirtualHub. Pour les lecteurs qui ne seraient pas familiers avec le fonctionnement de nos modules, vous pouvez lire notre série de tutoriels qui explique le fonctionnement du VirtualHub et des noms logiques.
Les nom logiques du premier Yocto-MaxiPowerRelay
L'application
L'application est assez simple, elle lit la valeur du capteur de CO2 en boucle et ouvre toutes les fenêtres si le taux de CO2 dépasse une valeur limite.
Nous avons écrit cette application en Python, car ce langage est très facile à utiliser et est disponible sur presque toutes les plateformes. L'application utilise notre librairie Python qui permet d’interagir facilement avec nos modules.
Le code de l'application, bien que relativement simple, serait trop long à détailler dans cet article. Nous allons toutefois voir les parties qui interagissent avec le Yocto-CO2-V2 et les Yocto-MaxiPowerRelay.
Lors de l'initialisation, on récupère la liste des relais et on créé une liste d'objets VeluxZone qui implémente une méthode open et une méthode close qui actionnent la bonne sortie du relais.
def __init__(self, zonename, descr, hwid_close, hwid_open):
self.name = zonename
self._desription = descr
self._closeRelay = YRelay.FindRelay(hwid_close)
self._openRelay = YRelay.FindRelay(hwid_open)
def open(self):
self._openRelay.pulse(200)
def close(self):
self._closeRelay.pulse(200)
La boucle principale de l'application est elle aussi simple. On effectue une mesure toutes les 5 minutes du taux de CO2. Si la valeur dépasse la valeur limite, on appel la méthode open sur notre liste d'objets VeluxZone.
for z in self.zones:
z.open()
YAPI.Sleep(500)
self.closed = False
def close(self):
for z in self.zones:
z.close()
YAPI.Sleep(500)
self.closed = True
def auto(self):
self.close()
sleep_delay = 5000
while self.co2sensor.isOnline():
value = self.co2sensor.get_currentValue()
if self.verbose:
print("C02 value: %dppm" % value)
if value > self.co2_open_limit:
# speed up C02 measure when the windows are open
sleep_delay = 5000 # 5 seconds
if self.closed:
self.open()
elif value < self.co2_close_limit:
sleep_delay = 300000 # 5 minute
if not self.closed:
self.close()
YAPI.Sleep(sleep_delay)
if not self.closed:
self.close()
La limite de CO2, le nom des relais ainsi que d'autres paramètres sont modifiables dans le fichier configuration. Il est aussi possible de configurer l'adresse IP d'un YoctoHub si on désire déporter le système à l'aide d'un YoctoHub.
Pour finir, nous avons branché les 3 modules sur les ports USB d'une machine Windows qui est allumée en permanence et le script est démarré automatiquement. Ce petit système nous permet de garder le local bien aéré.
Cette application est écrite pour répondre à nos besoins, mais vous pouvez facilement la modifier pour l'adapter à vos propres besoins. Le code complet de l'application est disponible sur GitHub:https://github.com/yoctopuce-examples/velux_controler