serveur-web-capteur.py

Cartes Libre Computer à base d'Amlogic — libre-amlogic (produit phare : Le Potato AML-S905X-CC) · Fichier : serveur-web-capteur.py · Langage : Python · Usage : Exposer les mesures de la carte sur un mini serveur web

Sans aucune dépendance externe, la carte devient un serveur web : une page HTML affiche température du SoC et uptime, un endpoint JSON les expose aux tableaux de bord. Le réflexe réseau pour monitorer un SBC headless.

Matériel requis

Une Libre Computer « Le Potato » (Amlogic S905X, 2 Go) sous Armbian, alimentée en 5 V/2,5 A micro-USB, avec son connecteur 40 broches compatible Raspberry Pi. Aucun composant ; la carte est déjà sur le réseau (câble ou Wi-Fi).

Branchement

Aucun câblage. Ouvrir le port 8080 si un pare-feu est actif ; connaître l'IP avec ip addr ou avahi (carte.local).

Fonctionnement

http.server sert un handler maison : do_GET choisit HTML ou JSON selon le chemin, lit sysfs/procfs à la volée. serve_forever boucle en acceptant les connexions. Sous Armbian : sudo apt install gpiod libgpiod-utils python3-gpiod ; les broches du connecteur sont nommées « 7J1 Header PinN » dans gpioinfo. 3,3 V uniquement, aucune broche tolérante 5 V.

Pour aller plus loin

Ajouter des endpoints pour les capteurs (DHT, I2C), ou passer à Flask (pip install flask) pour du routage propre.

serveur-web-capteur.py

#!/usr/bin/env python3
# Mini serveur web (bibliotheque standard uniquement) : etat de la carte.
# http://<ip-de-la-carte>:8080/   -> page HTML
# http://<ip-de-la-carte>:8080/api -> mesures en JSON
import json
import time
from http.server import BaseHTTPRequestHandler, HTTPServer

def mesures():
    with open("/sys/class/thermal/thermal_zone0/temp") as f:
        temp = int(f.read()) / 1000.0
    with open("/proc/uptime") as f:
        uptime = float(f.read().split()[0])
    return {"temperature_c": round(temp, 1),
            "uptime_s": int(uptime),
            "horodatage": time.strftime("%Y-%m-%dT%H:%M:%S%z")}

class Gestionnaire(BaseHTTPRequestHandler):
    def do_GET(self):
        if self.path == "/api":
            corps = json.dumps(mesures()).encode()
            type_ = "application/json"
        else:
            m = mesures()
            corps = (f"<h1>Carte : {m['temperature_c']} C</h1>"
                     f"<p>Uptime : {m['uptime_s']} s</p>").encode()
            type_ = "text/html; charset=utf-8"
        self.send_response(200)
        self.send_header("Content-Type", type_)
        self.end_headers()
        self.wfile.write(corps)

if __name__ == "__main__":
    print("Serveur sur le port 8080 (Ctrl-C pour arreter)")
    HTTPServer(("0.0.0.0", 8080), Gestionnaire).serve_forever()

← Retour à la fiche