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 TurrisUne 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 finalAu 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é !
Read more