Blog de dada

DevOps, bidouilleur et routard plein de logiciels libres

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é !

Coucou Firefox, ciao Firefox Snap

Rédigé par dada / 13 juillet 2022 / 9 commentaires


Je ne suis pas un anti-snap. Je n'ai rien contre cette technologie, ni contre les AppImage ou encore les Flatpak. D'ailleurs, d'après ma mémoire défaillante, je n'ai jamais utilisé de Flatpak et je n'ai que quelques AppImage : PrusaSlicer et Cura.

Par contre, des snap, je m'en sers à travers ma distribution bureautique slash gaming de tous les jours : Ubuntu.

Depuis la 22.04, c'est-à-dire environ 3 mois, je sais que mon système est noyauté par ce machin-là et je m'en fiche, au point de presque passer pour un vilain quand je l'affirme publiquement. Juste, ça marche et c'est tout ce que je demande. Enfin, ça, c'était avant, comme le dit une vielle pub pour des lunettes.

Les soucis

C'est un poncif mais c'est important de le rappeler : dans notre beau monde moderne, un ordinateur de bureau sans navigateur, ça ne sert strictement à rien. Et mon navigateur d'amour, c'est Firefox.

Du coup, quand je ne me suis rendu compte qu'il ne se comportait pas comme je le voulais, j'ai commencé à grincer des dents :
- Un insupportable comportement erratique du curseur
- Plantage plusieurs fois par jour pour un simple redimensionnement de la fenêtre
- Certaines extensions inutilisables
- Mise à jour sans mon accord mettant en PLS mon ADSL

Bref, trop c'est trop : un navigateur instable, c'est un drame. Du coup, ça dégage. Je vous propose un rapide tuto inspiré de Linuxtricks.fr.

Retrouver Firefox sans snap

On supprimer les paquets :
snap remove firefox && apt remove firefox
On vérifie que le snap est bien loin (si y'a rien, c'est bon) :
snap list  | grep firefox
On installe le PPA de Mozilla Team :
add-apt-repository ppa:mozillateam/ppa
On fait un peu de pinning en créant un fichier /etc/apt/preferences.d/firefox-for-nosnaps avec ça dedans :
Package: firefox*
Pin: release o=Ubuntu*
Pin-Priority: -1

Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 9
Un gros apt update et apt install firefox et c'est tout bon.

Et alors ?

Ça me fatigue de devoir faire ça. Vraiment.
Si je me sers des variantes LTS d'Ubuntu, c'est bien pour être le plus feignant possible. Ne viendez pas me dire que je ferais mieux de me servir de Debian pour de la bureautique, c'est non. Debian tourne sur les serveurs que je gère : chacun son rôle.
Les LTS devraient me permettre d'utiliser un PC avec le moins de bidouille possible et là, j'ai l'impression de me servir d'un fork d'Ubuntu chelou. C'est chiant.

Pour finir ce rapide billet et titiller les pas-contents-des-choix-de-canonical, rappelez-vous que Mir et Unity ont disparu d'eux-mêmes, abandonnés pas une communauté qui a déclaré ne pas y trouver le moindre intérêt. Qui sait, avec Snap, ça va peut-être finir comme ça ? Patience.

Des extensions GNOME Shell à ne pas rater

Rédigé par dada / 17 mars 2022 / 8 commentaires


On a tendance à l'oublier mais le meilleur environnement graphique pour GNU/Linux qu'est GNOME Shell peut encore s'améliorer avec des extensions toutes bêtes qu'il est facile de piocher en cliquant par ici. Comme il y en a à foison, voici les miennes que j'aime tout plein.

OpenWeather

OpenWeather permet de récupérer facilement les informations météorologiques de la ville de votre choix.


C'est simple, c'est rapide et efficace pour choisir entre l’imperméable et la veste sans devoir regarder dehors.

Sound Input & Output Device Chooser

Vous avez deux ou trois sorties audio ? Vous passez du casque aux haut-parleurs régulièrement ? Installez tout de suite cette extension pour changer d'entrée ou de sorties en littéralement deux clics. Impeccable pour moi qui traîne 5 entrées ou sorties différentes.


CPU Power Manager

Cette extension est spécifique aux PC portables avec des processeurs récents. Elle permet de contrôler les ressources CPU en un clin d’œil. Perso, je m'en sers quand je suis en déplacement ou loin d'un chargeur : couper le boost ou drastiquement castrer la fréquence maximum du CPU permet de laisser la batterie souffler, tout comme vos oreilles en limitant le besoin de ventilation.


À l'opposé, si vous êtes du genre brutasse, vous pouvez forcer votre machine à tourner à 100% de ses capacités. Moyennement conseillé.

Caffeine

Caffeine est vachement chouette quand vous êtes en train de bidouiller quelque chose en suivant le mode d'emploi affiché sur l'écran de votre PC. En quoi, me direz-vous ? En l'empêchant de se mettre en veille ! C'est con mais c'est diablement appréciable.
Accessoirement, en télétravail, ça vous permet de rester affiché comme étant en ligne alors que vous étendez du linge, ou autre.

Hue Lights


Oui, j'ai ce genre de chose et je ne vous cache pas que j'adore jouer avec ces conneries. Comme vous l'avez deviné, Hue Lights permet d'allumer, d'éteindre, de manipuler vos équipements Philips Hue depuis votre PC. Chouette !

Freon

J'aime bien connaître la température à l'intérieur de ma tour et la vitesse de rotation des ventilateurs. C'est à la fois mon côté geek qui veut ça mais aussi mes problèmes de chauffe, et par les temps qui courent, ce n'est plus un petit problème. Ça peut coûter cher. Bref, pour assouvir ce besoin, je me sers de Freon. C'est simple, sobre et ça se glisse bien dans l'interface.

Multi Monitor Add-On

Nous sommes de plus en plus à avoir deux, si ce n'est plus, écrans. Souvent en mode plein écran, je fatiguais de ne pas pouvoir lire les infos ajoutées par les extensions citées tout à long de ce billet sur l'écran « moins » utilisé. Pour corriger le tir : Multi Monitor ! Les infos sont présentes sur mes deux moniteurs, ou trois quand je suis au boulot : tip top, Mesdames et Messieurs !

Quelques mentions spéciales

Peut-on parler des extensions Shell sans parler du fameux GSConnect ? Un gros incontournable pour celles et ceux qui veulent contrôler leur PC depuis un smartphone et (un peu moins) inversement. Parlons aussi de Pomodoro qui peut vous aider à rythmer vos journées en télétravail. Pour la route, System-monitor qui ajoute sous vos yeux des informations sur l'état des ressources du PC.

Et vous, vous vous servez de quoi ?

Rapport d'incident : j'ai cassé diaspodon.fr

Rédigé par dada / 08 mars 2022 / Aucun commentaire


Il y a des jours où la confiance vous embarque bêtement.

Fin février, je me lançais dans la mise à niveau de l'intégralité de l'infrastructure qui propulse les différents services que j'ai sous ma responsabilité : des instances Mobilizon, Peertube, Pixelfed et Mastodon. Une mise à niveau, c'est quand on passe d'une version majeure à une autre d'un système d'exploitation. Ce n'est jamais anodin (update != upgrade).

Étape 1 - 27 février 2022 - 15h45

Après avoir testé avec succès ces mises à niveau sur des serveurs de moindre importance, plein de confiance, je finis par couper diaspodon.fr pour m'en occuper. D'abord, un dump de la base de données PostgreSQL 9.6 puis un snapshot complet des volumes et, hop, la mise à niveau.

Étape 2 - 27 février 2022 - 16h30

Une fois la mise à niveau terminée sans problème, je relance le serveur, teste un ou deux trucs et retourne vaquer à mes occupations passionnantes du moment (coucou TWW3).

Étape 3 - 4 mars 2022 environ

Une semaine plus tard, Greenman me signale qu'on ne peut plus correctement le mentionner (le fameux @ + pseudo). Pas grave, me dis-je, c'est le seul avec ce souci. 48h plus tard, après un week-end chargé, je suis réveillé par des SMS des copains qui signalent tous une inactivité bizarre depuis au moins 9h. C'est cassé.

Étape 4 - 7 mars 2022 - 10h ~ 12h

La documentation était pourtant claire : à la fin de la mise à niveau (cf Étape 1), il fallait impérativement mettre à jour les index des bases de données pour éviter le cauchemar absolu : les duplicated entries. Chose que je n'ai pas faite sans sourciller. Devinez quoi ? J'ai du en virer, de ces cochonneries. Merci encore à Luc pour son aide formidable. Une fois corrigé à la main les dizaines de duplicate, je passe à la mise à jour qui fini par passer.
La tant attendue et redoutée mise à niveau de PostgreSQL 9.6 à PostgreSQL 13 est correctement finalisée. Il était temps.

Étape 5 - 7 mars 2022 - 12h ~ 13h

J'ai l'impression de voir le bout du tunnel quand, finalement, non. Sidekiq, outil nécessaire au fonctionnement de Mastodon, refuse de redémarrer.
Il s'avère, chers ami-e-s, que Debian 11 n'est pas complètement compatible avec la configuration officielle de Mastodon. Cette version de Debian n'a plus les bonnes dépendances pour faire tourner jemalloc, bidule connu des admin d'instance Mastodon pour contrôler la consommation en mémoire du logiciel. Quand, le 28 février, j'ai nettoyé les vieux paquets « inutilisés », j'ai cassé une deuxième fois l'instance.

Une fois compris, j'ai réinstallé les dépendances Ruby de Mastodon en virant l'option  RUBY_CONFIGURE_OPTS=--with-jemalloc et l’occurrence dans la configuration du service systemd de sidekiq.

Étape 6 - 7 mars 2022 - 13h15

Une conclusion

Lisez la doc, ou Luc, bordel !

Pinetime : j'ai craqué pour une montre connectée

Rédigé par dada / 06 janvier 2022 / 17 commentaires


Sachez d'abord qu'il y a beaucoup de choses que je déteste avec les objets connectés. Les deux principales étant la collecte massive de données permettant aux entreprises de se faire du pognon sur le dos des utilisateurs et l'espèce d'obsolescence programmée de ces différents bidules qui sont, au choix, abonnés niveau logiciel ou poussés vers la sortie par des nouveaux modèles sans intérêt.

PINE64 a pourtant réussi à me faire croire que leur montre pouvait être chouette.

Note importante : j'ai acheté un Flame (abonné), puis une Aquaris M10 (abandonnée), un Fairphone (volé) et un Turris Mox (bidouillé). On va dire que les trucs plus ou moins surprenants, j'y fonce. Voici donc ma PineTime.

De quoi parle-t-on ?


En simple, on est face à une montre connectée des plus classiques :
  • Elle affiche l'heure.
  • Elle donne une idée du rythme cardiaque.
  • Elle fait compte à rebours et chronomètre.
  • Elle compte les pas.
  • Elle permet de dessiner.
  • Elle permet de jouer au 2048.
  • Elle sert d'extension du smartphone (musique, GPS, notifications, appels, etc)
Chose appréciable : j'ai un tout petit poignet et sa grande diagonale de 45mm n'est absolument pas dérangeante. C'est moins d'un centimètre de plus que ma bonne vieille DWYT. Je déteste les énormes montres.

Quel est son intérêt ?

Elle est bidouillable. Si ça ne tenait qu'à ma fainéantise, ce billet ne ferait que quelques mots : foncez essayer cette montre, c'est comme un PC sous GNU/Linux, on s'amuse à se prendre la tête et c'est super. En plus, elle coûte seulement 30 balles. Mais bon, étayons.


Elle fonctionne à l'aide d'un fork de FreeRTOS qu'on appelle InifiniTime. Le développeur principal - je crois - de ce fork est un francophone qu'on peut saluer sur Mastodon et qui accepte les dons via Liberapay. S'il fallait faire un bingo des trucs qui me font plaisir, il ne manquerait que de cracher à la tronche d'OpenCollective pour être parfait.

Tout ça pour dire qu'on peut suivre publiquement le fonctionnement de la montre et y participer. On peut aussi s'assurer qu'elle ne va pas aller consolider vos données personnelles pour en tirer un quelconque revenu. Impeccable.

Et ça marche ?

Comme toujours : chez moi, ça marche. Mes besoins sont à la fois simples et tordus : je veux pouvoir la mettre à jour via mes PC sous Ubuntu et la brancher à mon honorable OnePlus 5T sous /e/.

Et ça fonctionne sans trop de souci.  Depuis le PC, je passe par Siglo pour mettre à jour le firmware de la bête. Ça demande 3 lignes de codes et du Bluetooth. Simple.
Pour mon téléphone, GadgetBridge (Mastodon, Liberapay, F-droid) fait parfaitement l'affaire. L’application récupère les données générées par la montre afin de les sauvegarder dans des jolies graphiques.



Enfin, bref, ça marche.

C'est de la belle bidouille

À n'en point douter, ça reste de la bidouille. Si ndiswrapper vous parle et que vous avez déjà compilé un kernel pour rigoler, ça va être de la rigolade. Pour les autres, n'ayez pas peur, tout est très bien documenté. Personnellement, la montre était parfaitement utilisable au bout d'une petite heure.
À l'heure où j'écris ces lignes, la montre tourne en 1.7.1. La mienne n'a pas été livrée avec ce Firmware mais une version un peu ancienne et bancale. Je me suis rapidement jeté dans la procédure de mise à jour et tous les soucis ont disparu. Dans les soucis, y'avait l'impossibilité de régler l'heure. Rigolez pas, j'ai un peu flippé !

Notez qu'il n'est pas possible d'exiger des choses pharamineuses d'un objet à 30€. Si vous voulez des trucs crades de compétition, la Fnac propose des machines à 500€.
Pour le moment, la montre fonctionne, fait ce que je lui demande et se glisse très bien dans mon environnement numérique. C'est tout ce que je lui demande. Et, très sérieusement, j'adore recevoir des notifications Github quand un bout de code évolue. #geek.

La montre en image

Je vous laisse avec une vidéo de test de Wekeys, histoire de vous montre la bête en vrai. Bon visionnage !


Je reviendrais sans doute dans un billet d'ici quelques semaines, le temps de tester la chose plus sérieusement. Sincèrement, je ne m'attends à pas grand-chose. Mes besoins sont presque comblés. À la rigueur, des infos sur le sommeil pourraient être chouettes même si je ne garde pas ma montre la nuit. Enfin voilà : ce qui débarquera dans la montre ne sera que bonus à mes yeux !