Blog de dada

DevOps, bidouilleur et routard plein de logiciels libres

Python

Brancher un capteur CO2 Ampel à Home Assistant

Rédigé par dada / 22 août 2022 / 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é !

Astuces du dimanche #4

Rédigé par dada / 10 mai 2015 / 2 commentaires


Quatrième version des astuces du dimanche ! Je dois avouer que j'aime bien cette formule simple et rapide pour partager des astuces peu révolutionnaires mais qu'il fait bon rappeler de temps en temps.

Au programme de cette semaine : partager des fichiers en réseau sans se prendre la tête et comment créer une archive de sauvegarde (pour un backup, par exemple) et vous l'envoyer alors que vous n'avez pas de place sur le disque dur.

Partager ses fichiers via python

Sans clés USB ou système de partage en réseau, il est bien difficile de partager un fichier avec le PC du voisin. La solution suivante permet de se servir de python pour créer un serveur web simple. Il sera accessible depuis votre adresse IP et le port spécifié.

  • Avec python 2.7 ou plus
# python -m SimpleHTTPServer 80
  • Avec python 3 ou plus
# python -m http.server 80
Lancez l'une de ces commandes depuis un terminal ouvert là où se trouve le ficher à transférer, donnez votre IP et le port à votre pote/collègue et le tour est joué. Attention tout de même à ne pas lancer cette commande depuis votre /home/ sous peine de partager l’intégralité de votre vie privée ;-)

Création et envoie d'archive par le réseau

C'est un truc que je rencontre souvent au boulot : faut faire un gros tar.gz de sauvegarde et le placer bien au chaud sur une autre machine mais pas moyen d'y arriver avec l'espace disque disponible.
Pas de panique, la commande tar associée à ssh, à un pipe et cat permette de faire des miracles.

ssh -n ServeurDistant -p PORT 'tar zcvf - toto.txt' | cat - > toto.tar.gz

Avec ça, depuis votre terminal, vous récupérez le contenu de toto.txt, que vous archivez simplement sur votre disque dur local. Celui du serveur distant n'est plus utilisé : terminé le problème de place !

Bon dimanche ! :)