Blog de dada

DevOps, bidouilleur et routard plein de logiciels libres

Attention, ce billet se traine depuis plus de 3 mois. Les informations qu'il contient ne sont peut-être plus à jour.


Brancher un capteur CO2 Ampel à Home Assistant

Rédigé par dada / / Aucun commentaire


J'ai ajouté à mon attirail de domotique un capteur de concentration de CO2. Pourquoi ? Pour pouvoir encore plus sereinement laisser tourner mon imprimante quand je suis un peu loin, mais pas que (covid). Il ne m'est encore jamais rien arrivé mais ce n'est pas une raison pour ne pas ajouter une bretelle à la ceinture.

Mon choix s'est porté sur le CO2-Ampel de Watterott. Oui, j'ai pris le même modèle que Framasky, à savoir celui avec un module wifi qui expose trois données : la concentration de CO2, la température et l’humidité.

Le projet

L'idée est d'ajouter ce capteur à mon installation personnelle de Home Assistant. Branché à ce machin, je pourrais déclencher une série d'actions pour limiter les dégâts en cas de soucis. La plus importante étant de tout de suite couper le courant de ma machine via sa prise connectée, une Shelly Plus S.

Le souci

Le souci est assez basique : le boîtier n'est pas du tout lisible par Home Assistant. Pour qu'ils se causent entre eux, je dois réussir à parcourir la page web proposée par le boîtier pour en sortir du texte lisible par HA. En bon langage de dév : faut scrapper le HTML pour sortir du JSON lisible par HA.

Le développement

Y'a plus qu'à coder un bout de python, avec flask, pour convertir le HTML qui m'intéresse en JSON puis poser le bout de code dans mon routeur pour qu'il vive sa plus belle vie au milieu de mon infrastructure maison.

import time
import requests
import os
import json
import flask

app = flask.Flask(__name__)
url_ampel = 'http://192.168.1.195'

@app.route('/json', methods=['GET'])
def home():
html_text = requests.get(url_ampel, timeout=3).text

dict = {
"co2": html_text[115:html_text.find('br',72)-3],
"temp": html_text[140:html_text.find('br',140)-3],
"humi": html_text[167:html_text.find('br',167)-3]
}

return dict

app.run(host="192.168.1.1",port=9455)


Ici, le code va interroger le boîtier sur son IP (192.168.1.195) pour récupérer l'intégralité du HTML (html_text). J'ai déjà chopé la position dans ce string des trois infos que je veux (115, 140, 167) et comme elles peuvent légèrement varier en taille, je récupère ce qu'il y a jusqu'au prochain retour à la ligne, pour être large. Le tout est stocké dans un dictionnaire et exposé sur le réseau sur l'IP du Turris Mox et via le port 9455.

Le script d'init dans le Turris

Une fois que le code est fonctionnel, il va bien falloir le mettre dans le Turris Mox pour qu'il vive en autonomie. Voici donc le contenu du fichier ampel_json qui sera dans /etc/init.d/.

#!/bin/sh /etc/rc.common

START=99
USE_PROCD=1
APPBINARY="/root/ampel/ampel_json.py"

start_service() {
procd_open_instance
procd_set_param command python3 $APPBINARY
procd_set_param respawn
procd_close_instance
}
stop() {
kill $(ps faux | grep 'python3 /etc/root/ampel_json' | awk '{print $2}')
}

Le nom est assez important puisque c'est lui que je cherche pour tuer le programme avec la commande stop.

L'intégration dans HA

Alors, déjà, HA, c'est le bordel. Il n'est pas foutu de fournir un truc simple pour modifier sa configuration. Pour lui dire d'aller gazouiller avec un peu de JSON, il faut modifier le fichier configuration.yaml et le seul moyen de faire ça consiste à ajouter l'extension File Editor qui servira d'éditeur de texte...! Bref.

Une fois que vous avez passé les 15 étapes d'installation de l'add-on, voici une façon de faire parmi tant d'autres :

sensor:
  - platform: rest
    scan_interval: 60
    name: Ampel CO2
    resource: http://192.168.1.1:9455/json
    value_template: '{{value_json.co2}}'
  - platform: rest
    scan_interval: 60
    name: Ampel Temperature
    resource: http://192.168.1.1:9455/json
    value_template: '{{value_json.temp}}'
  - platform: rest
    scan_interval: 60
    name: Ampel Humidity
    resource: http://192.168.1.1:9455/json
    value_template: '{{value_json.humi}}'
Ce que ces lignes de YAML font est, encore et toujours quand on a compris, assez simple : elles vont créer 3 entités : Ampel CO2, Ampel Temperature et Ampel Humidity et va les rafraîchir toutes les minutes.
Loin de moi l'idée de passer pour un expert en Home Assistant alors n'hésitez pas à venir me tirer les oreilles, cordialement, en commentaire.

Au final

Au final ? J'ai un capteur de CO2 qui refile des données à un truc de domotique installé sur un Raspberry Pi 4 ! J'ai plus qu'à faire une règle qui dit que si la concentration en CO2 est trop élevée, il faut couper la prise de la machine, et zou, c'est plié.

Enfin, ça fait tellement longtemps que je ne fais plus réellement de développement que j'ai souffert à chaque étape. Heureusement, la logique d'il y a 10 ans est toujours la même. Merci aux copines et copains dev' qui m'ont gentiment donné les bonnes bibliothèques à utiliser ! J'me suis quand-même bien marré !

Écrire un commentaire

Quelle est le sixième caractère du mot 0lm8q2t ?