Archives de catégorie : Infrastructure

Teslamate-Mail : l’assistant web qu’il vous faut !

Un p’tit dev perso pour compléter un Teslamate déjà très bien fichu, Teslamate-Mail.

Teslamate c’est l’App qui va venir récupérer toutes les informations transmises par votre Tesla, avec en vrac : altitude, vitesse, recharges, GPS, pression des pneus, etc etc. c’est tellement vaste que parfois son interface est rébarbative pour le non Geek.

Teslamate étant hébergé la plupart du temps sur un serveur type docker, il est facile de venir lui ajouter un serveur Web pour ensuite proposer différents menus.

Teslamate-Mail va pouvoir :

  • Afficher le status de votre véhicule
  • Lister les charges effectuées sur une plage de dates, la puissance consommée sur cette plage, avec possibilité d’export par email, pdf, ou csv : pratique pour calculer vos dépenses, prix de revient, etc.
  • Vous informer par email / MQTT / Telegram, au choix, sur la fin de charge, les kWh envoyés, une batterie faible, etc.

Voici une rapide vidéo des fonctionnalités ajoutées en date du 14 Janvier 2026 :

Teslamate-Mail continue d’évoluer avec l’aide de plusieurs IA performantes, dont Gemini ou Claude, des outils surpuissants pour coder proprement et rapidement. Le développement n’est pour le moment pas disponible publiquement, encore un peu de patience 😉

Générer une vidéo simple à partir d’images

Parfois il est utile de pouvoir regrouper des images sous forme d’une vidéo MP4 toute simple, juste pour faire un diaporama. Vous allez me dire, Google Photo le fait, oui MAIS ce truc a la mauvaise idée de recadrer, et donc de zapper la moitié de vos captures d’écran par exemple, pas génial donc.

Voici le script generevideo.sh qui va tout solutionner :

#!/bin/sh

# 1. Configuration du nom de sortie
printf "Nom de la vidéo (par défaut 'video.mp4') : "
read input_name
if [ -z "$input_name" ]; then
    OUTPUT="video.mp4"
else
    # On ajoute .mp4 si l'utilisateur l'a oublié
    case "$input_name" in
        *.mp4) OUTPUT="$input_name" ;;
        *)     OUTPUT="$input_name.mp4" ;;
    esac
fi

TEMP_LIST="list_clips.txt"
DUR=3
printf "" > "$TEMP_LIST"

# 2. Découverte et choix du fichier audio
echo "Recherche de fichiers audio..."
i=1
AUDIO_FILES=$(ls *.mp3 2>/dev/null)

if [ -z "$AUDIO_FILES" ]; then
    echo "Aucun fichier .mp3 trouvé dans le dossier."
    AUDIO_INPUT=""
else
    echo "Choisissez la musique (tapez le numéro ou Entrée pour aucune) :"
    for f in $AUDIO_FILES; do
        echo "$i) $f"
        i=$((i + 1))
    done

    printf "Votre choix : "
    read choix

    if [ -n "$choix" ]; then
        AUDIO_INPUT=$(echo "$AUDIO_FILES" | sed -n "${choix}p")
    fi
fi

if [ -n "$AUDIO_INPUT" ]; then
    echo "Musique sélectionnée : $AUDIO_INPUT"
else
    echo "Aucune musique sélectionnée."
fi

# 3. Création de clips individuels (respect total de la taille d'origine)
images=$(ls tmm* 2>/dev/null | sort -V)

for f in $images; do
    if ffmpeg -v error -i "$f" -f null - 2>/dev/null; then
        echo "Traitement de $f..."
        # On force l'arrondi à 2px (parité obligatoire) sans changer la taille réelle
        ffmpeg -y -loop 1 -i "$f" -t "$DUR" \
            -vf "pad=ceil(iw/2)*2:ceil(ih/2)*2:(ow-iw)/2:(oh-ih)/2:black,format=yuv420p" \
            -c:v libx264 -pix_fmt yuv420p -r 25 "part_$f.ts"
        
        echo "file 'part_$f.ts'" >> "$TEMP_LIST"
    fi
done

# 4. Assemblage final
if [ -s "$TEMP_LIST" ]; then
    echo "Fusion finale vers $OUTPUT..."
    if [ -n "$AUDIO_INPUT" ] && [ -f "$AUDIO_INPUT" ]; then
        ffmpeg -y -f concat -safe 0 -i "$TEMP_LIST" -i "$AUDIO_INPUT" \
            -c copy -c:a aac -shortest "$OUTPUT"
    else
        ffmpeg -y -f concat -safe 0 -i "$TEMP_LIST" -c copy "$OUTPUT"
    fi
else
    echo "Erreur : Aucun fichier valide n'a été traité."
    exit 1
fi

# 5. Nettoyage et rapport
rm -f part_tmm* "$TEMP_LIST"
echo "------------------------------"
echo "Fichiers images utilisés :"
echo "$images"
echo "------------------------------"
if [ -n "$AUDIO_INPUT" ]; then
    echo "Audio utilisé : $AUDIO_INPUT"
fi
echo "Vidéo générée : $OUTPUT"
echo "vidéo terminée"

Chaque image s’affichera durant 3 secondes, mais tu peux sans soucis régler ce temps à volonté depuis le script. Tu peux même ajouter un fichier audio au format mp3, le script demandera quel fichier utiliser.
Place le script dans le répertoire de tes images, lance le script avec bash generevideo.sh . Il va demander le nom de la video (video.mp4) par défaut, et le fichier audio à choisir s’il existe.

Vous obtiendrez un list.txt qui listera les images détectées, pratique pour vérifier si besoin.
Ce script a été initialement généré par Gemini, puis modifié.

Proxmox sur iMac 5K 2019 : autoboot

Si, comme moi, vous avez un « vieil » iMac 5K 2019 et que vous vous lancez sur Proxmox, vous allez rapidement vous demander comment le faire redémarrer automatiquement en cas de coupure de courant…

Avec le fonctionnement interne de cet ordinateur, rien n’est simple, mais la solution est relativement rapide. Commencez par arrêter l’ordinateur en maintenant le bouton d’allumage enfoncé pendant 15 secondes.

Rallumez le et tout de suite après, avant l’apparition du logo Apple, enfoncez trois touches sur le clavier : ⌘ Command + R

Patientez, patientez, patientez jusqu’à l’apparition d’un écran de réinstallation. Là, rendez-vous dans le menu Options pour lancer le TERMINAL.

Dans le Terminal, entrez :

nvram AutoBoot=%03

Puis vérifiez :

nvram -p | grep AutoBoot

Entrez alors la commande Reboot et laissez votre iMac relancer Proxmox.

Débranchez alors le cordon secteur, rebranchez le : l’iMac va redémarrer tout seul, vous avez réussi !

Des trames MQTT avec Alexa

Vous vous êtes sans doute demandé comment on pouvait envoyer des trames MQTT avec Alexa et ainsi profiter de plus de fonctionnalités domotiques.
Commencez par installer le skill URL SWITCH sur votre Alexa :

Activez le skill depuis votre App Alexa puis rendez-vous sur https://www.virtualsmarthome.xyz/ pour venir créer vos interrupteurs, ces switches virtuels qui permettront d’interagir avec vos trames MQTT. Ici, nous avons créé volet salon, un switch destiné à télécommander l’ouverture et la fermeture des volets du salon :

Vous l’aurez compris, l’envoi d’une commande https suppose d’avoir un serveur hébergé, un p’tit VPS tout simple par exemple chez Pulsheberg que nous avons souvent utilisé pour nos dev, avec leur offre de base VPS Cloud à 5 ou 6 € par mois, largement suffisante pour héberger votre serveur Mosquitto, un certificat Let’s Encrypt et un Apache 2 pour vos pages de gestion Web en html ou php. Je passerai sur l’installation d’un serveur, d’Apache2 ou de PHP, c’est décrit un peu partout sur le web, la difficulté ne sera pas là 😉

Nous allons créer deux fichiers :

  • alexa.php pour faire l’appel vers un script python, hébergé sur /var/www/html de votre Apache 2
  • sendmessage.py, un script python hébergé sur /var/www/html/cgi-bin/sendmessage.py pour venir répondre aux commandes d’alexa.php et envoyer les trames MQTT

ALEXA.PHP :

<?php
// alexa.php

function sendMQTTMessage($topic, $message) {
    // On échappe chaque argument séparément pour éviter les injections shell
    $topicArg   = escapeshellarg($topic);
    $messageArg = escapeshellarg($message);

    $command = "python3 /var/www/html/cgi-bin/sendmessage.py $topicArg $messageArg";
    $output  = shell_exec($command);

    return $output;
}

// Récupération des paramètres depuis l’URL, par ex. :
// alexa.php?topic=maison/salon&message=allume+lampe
$topic   = isset($_GET['topic'])   ? $_GET['topic']   : '';
$message = isset($_GET['message']) ? $_GET['message'] : '';

// Un minimum de validation
if ($topic === '' || $message === '') {
    http_response_code(400);
    echo "Paramètres manquants. Utilisation : alexa.php?topic=xxx&message=yyy";
    exit;
}

// Appel du script Python
$result = sendMQTTMessage($topic, $message);

// Retour simple (à adapter selon tes besoins : JSON, texte, etc.)
header('Content-Type: text/plain; charset=utf-8');
echo "OK\n";
echo "Topic : $topic\n";
echo "Message : $message\n";
echo "Résultat Python :\n";
echo $result;

SENDMESSAGE.PY :

#!/usr/bin/env python3

import os
import sys

# Récupérer les arguments passés en ligne de commande
if len(sys.argv) != 3:
    print("Usage: python3 sendmessage.py <topic> <message>")
    sys.exit(1)

topic = sys.argv[1]
message = sys.argv[2]

# Configuration du broker MQTT
broker = "ip_du_serveur_MQTT"
port = 1883
username = "ton_nom_utilisateur"
password = "ton_mot_de_passe"

# Indiquer que le contenu est du texte brut (facultatif)
print()  # Ligne vide nécessaire

# Commande pour publier le message MQTT
command = f"mosquitto_pub -h {broker} -p {port} -u {username} -P {password} -t {topic} -m '{message}' -r"

# Exécuter la commande
exit_code = os.system(command)

if exit_code == 0:
    print("")
else:
    print("Erreur lors de l'envoi de la trame.")

Pas compliqué, si ?
Pensez à bien ajouter une mise à jour de votre certificat SSL par contre, dans crontab :

0 3 * * * root certbot renew --quiet

Pour protéger votre serveur Web, pensez à ajouter un .htaccess adapté… Vous pourrez alors par exemple envoyer une requête https comme suit :

https://login_htaccess:motdepasse_htaccess@iot.monserveurmqtt.fr/alexa.php?topic=/salon/volet&message=1

pour ouvrir et :

https://login_htaccess:motdepasse_htaccess@iot.monserveurmqtt.fr/alexa.php?topic=/salon/volet&message=1

pour fermer. Le login_htaccess et son mot de passe positionnés au début, suivis par @ permettent de contourner la fenêtre d’authentification du serveur web.

Mais vous pouvez tout à fait désactiver le .htaccess pour le simple fichier alexa.php, avec tous les risques que cela comporte bien entendu, en modifiant .htaccess :

 ===== Désactiver l'auth Basic pour alexa.php =====
# Auth sur tout sauf alexa.php
<FilesMatch "^(?!alexa\.php$).*">
    AuthUserFile /var/www/.htpasswd
    AuthType Basic
    AuthName "My restricted Area"
    Require valid-user
</FilesMatch>

# ===== Redirection HTTPS pour tout sauf alexa.php =====
RewriteEngine On

# EXCLURE alexa.php des redirections
RewriteCond %{REQUEST_URI} !^/alexa\.php$

# Pour tous les autres fichiers : forcer HTTPS
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]

Protégez-vous des pubs intrusives en utilisant le DNS

Il est fort probable que vous soyez inondé par un flux incessant de publicités numériques chaque jour. Loin d’être une simple nuisance, cette omniprésence publicitaire représente un risque tangible pour votre sécurité. Une seule publicité malveillante peut suffire à installer un cheval de Troie, un logiciel espion ou même un rançongiciel sur tous vos équipements : ordinateurs, smartphones, tablettes, et même votre Smart TV.

Vous avez peut-être déjà eu recours à des extensions de navigateur performantes, comme uBlock Origin. Cependant, l’utilisation d’une extension nécessite une installation répétée sur chacun de vos appareils connectés. C’est un véritable défi, voire impossible, sur des équipements comme les téléviseurs intelligents ou les navigateurs mobiles qui ne supportent pas ces modules additionnels. Alors, comment assurer une défense cohérente et globale ?

La réponse est de prendre le contrôle de votre réseau domestique à sa source. En agissant au niveau de votre réseau local, vous pouvez bloquer les contenus indésirables avant qu’ils n’atteignent vos appareils. Voici comment procéder.

DNS icon in iOS 17 Outlined style

Votre routeur : la porte d’entrée de la protection

La majorité des réseaux domestiques fonctionnent selon un schéma simple : votre routeur utilise le protocole DHCP (Dynamic Host Configuration Protocol) pour assigner une adresse IP unique à chaque appareil. Il leur transmet également les adresses des serveurs DNS. Dans la plupart des cas, ces serveurs sont ceux par défaut de votre Fournisseur d’Accès Internet (FAI), et ils offrent rarement des fonctionnalités avancées de sécurité ou de confidentialité.

L’astuce consiste à ignorer les serveurs DNS de votre FAI et à configurer votre routeur pour qu’il utilise des serveurs DNS spécialisés dans le blocage de publicités.

Comment configurer un DNS anti-pubs sur votre routeur :

C’est la méthode la plus simple et la plus efficace pour sécuriser votre foyer.

  1. Identifiez l’interface d’administration : accédez à l’interface de gestion de votre routeur. Cela se fait généralement en tapant une adresse comme 192.168.1.1 ou 192.168.1.254 dans la barre d’adresse de votre navigateur.
  2. Localisez les réglages DNS : Naviguez jusqu’à la section des paramètres réseau (souvent appelée WAN, Internet ou DHCP).
  3. Remplacez les adresses : Saisissez les adresses IP d’un service DNS qui filtre activement les publicités et les traqueurs.

Plusieurs services de qualité proposent ces serveurs filtrants :

ServiceAdresses IP du Serveur Filtrant (Primaire / Secondaire)
AdGuard DNS94.140.14.14 et 94.140.15.15
NextDNS45.90.28.152 et 45.90.30.152
ControlD76.76.2.2 et 76.76.10.2
  • Exemple avec NextDNS : Vous entrerez 45.90.28.152 dans le champ DNS Primaire et 45.90.30.152 dans le champ DNS Secondaire de votre routeur.

Important : une fois ces nouvelles adresses configurées, vérifiez que tous vos appareils sont réglés pour obtenir leurs paramètres (y compris les serveurs DNS) automatiquement via le protocole DHCP. De cette manière, le routeur distribuera les adresses des serveurs de blocage à tous les utilisateurs.

Cette méthode s’applique sans soucis sur les hotspots Wifipak, protégeant le réseau WiFi de vos invités/clients.

L’alternative : configuration par appareil

Si vous êtes limité par votre routeur (votre FAI vous empêchant d’en modifier les réglages DNS), vous pouvez contourner le problème en effectuant la configuration manuellement sur chaque terminal. Il vous suffit alors de configurer l’un des ensembles de serveurs DNS mentionnés ci-dessus dans les paramètres réseau (Wi-Fi ou Ethernet) de votre ordinateur, de votre téléphone ou de votre tablette.

Vous trouverez également des routeurs destinés à se connecter à votre Box internet, tel ce routeur « Liberté » proposé pré-configuré chez Monwifi.fr.

En adoptant cette approche centralisée, vous transformez votre serveur DNS en un puissant bouclier pour l’intégralité de votre domicile, assurant une navigation plus rapide, plus propre et surtout plus sûre.

Hotspot et caméras ?

Et si vous profitiez d’avoir un hotspot WiFi, avec un enregistreur de connexions qui fonctionne sous linux, pour venir y installer un serveur Web et mettre à disposition de vos utilisateurs les clichés instantanés d’une ou plusieurs vues des caméras IP de votre établissement ?

C’est ce qui motive le projet de Monwifi actuellement en version Beta, avec une interface d’administration pour ajouter et supprimer les caméras :

et une interface de visualisation destinée à vos utilisateurs et clients :

Ici nous avons choisi de capturer le flux de 3 caméras en montage, dont celle de Chamonix, excusez nous du peu 😉
Si vous cliquez sur une image, un onglet s’ouvre et elle s’affiche en pleine résolution, permettant aisément de zoomer. Cette page fonctionne sur PC, smartphone, ou tablette, bien entendu.

Imaginons maintenant que vous exploitiez un établissement avec une piscine : les utilisateurs de votre hotspot wifipak vont pouvoir visualiser en temps semi-réel l’occupation du bassin, je dis bien semi-réel car il n’est pas question d’être intrusif et de diffuser un flux vidéo, uniquement d’afficher un snapshot, c’est à dire une capture d’écran à un instant t.
De même, une caméra IP sur un parcours de golf, sur une terrasse de restaurant, sur une plage privée vous offriront la même possibilité : on y va ? on n’y va pas ? Trop de monde ? Y’a personne ?!
Mais on peut également imaginer visualiser une aire de jeux pour voir que le p’tit dernier s’amuse bien, sans risques.

Revenons à l’administration de ces captures, peut-être avez-vous remarqué ce détail :

RTSP ? Oui, rtsp, ce protocole sur pratiquement toutes les caméras IP qui permet de visualiser le flux vidéo. Toutes les caméras ne font hélas pas de snapshot, à l’instar des TP-Link TAPO : il faut dans ce cas pouvoir capturer le flux vidéo et en extraire une image à un instant donné, lors de cette rapide capture, avant de l’afficher.

Vous aurez ainsi le choix de plusieurs modèles de caméras, soit avec un flux RTSP, soit avec une capacité de snapshot. Nous avons pour le moment testé les caméras Ubiquiti, après avoir activé le snapshot dans l’interface d’administration de chaque caméra. Les caméras TAPO TP-Link refusent elle systématiquement la capture rtsp, aussi avons nous décidé de tester un matériel Imou :

Affaire à suivre… nous allons rapidement découvrir si ce matériel nous offrira toutes les fonctionnalités attendues, car à ce tarif (< 50 €), il ne manque pas de qualités 😉

Evolution des fonctionnalités :

Comment faire évoluer l’interface ? Cela va dépendre des idées de nos clients, il faudra dans un premier temps tester un prototype, voir si le retour des clients est positif, découvrir quels aspects nous devrons faire évoluer surtout.

Déjà, nous imaginons pouvoir ajouter l’envoi d’une image vers un serveur Web, pour par exemple afficher une vue en temps réel de la plage en face de votre établissement, l’enneigement des pistes de la station, une ligne d’horizon sur les montagnes voisines, ou tout paysage que vous voudrez bien proposer à vos visiteurs internet : un lien sur la caméra, un serveur ftp avec un login et un mot de passe, des heures de fonctionnement en fonction du lever du jour sur un lieu donné, et une fréquence d’actualisation. Simple non ?

L’IA, outil de taille :

Inutile de vous le cacher, nous avons utilisé plusieurs IA pour générer ces interfaces, avec en tête ChatGPT et MistralAI. Nous avons rapidement oublié Gemini par Google car à chaque correction, seule une partie des codes était affichée, nécessitant de redemander sans cesse l’envoi du code entier pour ne pas perdre de temps : en vain, l’intelligence est absente de Gemini pour ce qui concerne le code informatique, il vaut mieux l’utiliser pour trouver des recettes de cuisine ou demander l’âge avancé de Flamby Mou 1er, ex-Mouzident sociamou de la France ;-))))

Ces outils sont fabuleux, rapides surtout, mais en aucun cas ne remplacent totalement, pour le moment, notre capacité d’analyse et de programmation. Nous les avons éduqués, orientés, modifiés à la main souvent. Cela reste des outils, mais ne nous voilons pas la face, ils sont fabuleusement utiles !

Conclusion :

Si le projet vous intéresse, si vous utilisez ou voudriez utiliser un hotspot Wifipak, n’hésitez pas à nous faire signe sur Monwifi.fr pour devenir Beta-testeur dès que le projet sera un peu plus avancé.
A terme il pourrait bien s’ouvrir à d’autres matériels hotspot en ne s’utilisant que comme serveur Web et serveur de capture d’images, qui sait…

RouterOS : calculez le volume de données mensuel !

Vous utilisez RouterOS 7 ou ultérieur sur un appareil Mikrotik pour votre réseau ? Voici un script qui va pouvoir calculer le trafic mensuel passant sur le port WAN, ether1 en général. Vous aurez, au préalable, configuré l’envoi d’email dans votre RouterOS et remplacé les emails de destination (emailTo) et d’émission (emailFrom) par vos propres emails :

# --- Configuration ---
:local interfaceName "ether1"
:local emailTo "tonemail@gmail.com"
:local emailSubject "RAPPORT MENSUEL: Trafic ether1 (Go)"
:local emailFrom "noreply@tonemail.fr"

:put "--- SCRIPT DE TRAFIC (DÉMARRAGE) ---"

# --- 1. Vérification de l'interface ---
:local ifName [/interface get [find name=$interfaceName] name]
:if ($ifName = "") do={
    :put "ERREUR: Interface $interfaceName non trouvée"
    :error "Interface non trouvée"
}
:put "Interface trouvée: $ifName"

# --- 2. Lecture brute des compteurs (forcée en nombre) ---
:local rxBytes [:tonum [/interface get [find where name=$ifName] rx-byte]]
:local txBytes [:tonum [/interface get [find where name=$ifName] tx-byte]]
:local totalBytes ($rxBytes + $txBytes)

:put "Données lues - Total: $totalBytes octets"

# --- 3. Conversion en Go (base 10) ---
:local rxGB ($rxBytes / 1000000000)
:local txGB ($txBytes / 1000000000)
:local totalGB ($totalBytes / 1000000000)

# --- 4. Formatage à 2 décimales ---
:local rxGBstr [:pick [:tostr $rxGB] 0 ([:find [:tostr $rxGB] "."] + 3)]
:local txGBstr [:pick [:tostr $txGB] 0 ([:find [:tostr $txGB] "."] + 3)]
:local totalGBstr [:pick [:tostr $totalGB] 0 ([:find [:tostr $totalGB] "."] + 3)]

:put "Conversions effectuées: $totalGBstr Go"

# --- 5. Construction du mail ---
:local today [/system clock get date]

:local body "RAPPORT MENSUEL DE TRAFIC\n\n"
:set body ($body . "Interface: $ifName\n")
:set body ($body . "Période: 30 jours jusqu'au $today\n\n")
:set body ($body . "TRAFFIC CUMULÉ:\n")
:set body ($body . " $totalGBstr Go\n")

:set body ($body . "Compteurs réinitialisés pour le prochain cycle.")

:put "Corps email généré"

# --- 6. Réinitialisation éventuelle ---
/interface reset-counters $ifName
:put "Compteurs réinitialisés"

# --- 7. Envoi du mail ---
/tool e-mail send to=$emailTo from=$emailFrom subject=$emailSubject body=$body
:put "Email envoyé"

:put "--- SCRIPT TERMINÉ ---"

Ce script a été initialement généra par ChatGPT, modifié manuellement, corrigé, et vous enverra tous les 30 jours un email avec le volume total de trafic généré sur cette période.

RouterOS : gestion du ping et alerte

Comment surveiller une IP sur votre routeur RouterOS 7.xx ? Un simple script, ping, se chargera de vous prévenir par email (à condition d’avoir configuré votre envoi d’email dans /tools/e-mail, cf plus bas dans ce billet.

Voici déjà le script qui va tester 3 fois l’adresse 192.168.1.21, et en cas de non-réponse envoyer un email aux deux destinataires, recipient et recipient1 mentionnés dans le script :

    :local targetIP "192.168.1.21";
    :local recipient "monemail@chezmoi.fr ";
    :local recipient1 "secondemail@chezlui.fr";
    :local subjectFail ("ALERTE PING HS ");
    :local bodyFail ("Email automatisé pour vous indiquer que le module ne répond plus. \r\nMerci de bien vouloir vérifier le branchement ethernet et l'alimentation. \r\nVous pouvez le  débrancher, et le rebrancher. \r\nSi l'alerte persiste, merci de contacter votre prestataire.\r\n\r\n
*** Ceci est un message automatisé, ne pas répondre ****");
    :local logMessage ("Test ping vers " . $targetIP);
    :local success 0
    :for i from=1 to=3 do={
        :if ([/ping $targetIP count=1] = 1) do={
            :set success ($success + 1)
        }
    }
    :if ($success = 0) do={
        /tool e-mail send to=$recipient subject=$subjectFail body=$bodyFail
        /tool e-mail send to=$recipient1 subject=$subjectFail body=$bodyFail
    }

Pour ce qui est de la configuration de l’email dans /tools/e-mail :

        server: mail.monserveur.fr        
          port: 465                    
           tls: yes                    
           vrf: main                   
          from: noreply@chezmoi.fr     
          user: alerte@monserveur.fr
      password: LePenEstNulle;;    

Ici, nous avons créé un email alerte@monserveur.fr pour pouvoir expédier. L’envoi se fait sur mail.monserveur.fr mais cela changera selon votre configuration : smtp, imap, etc. tout est possible, pensez à modifier les paramètres.

Vous n’avez désormais plus qu’à exécuter le script ping toutes les 12 heures par exemple :

/system scheduler add name=ping-schedule \
    interval=12h \
    on-event=ping \
    start-time=startup

Et voilà, en cas de coupure vous recevrez une alerte email sur les 2 emails pré-configurés.
Pratique non ?

Enregistreur de connexions hotspot : mise à jour !

Voici venir l’évolution des enregistreurs de connexion pour les hotspots Wifipak :

Ce seront désormais des X96, petites box TV à l’origine, transformées en enregistreurs de connexions après quelques manipulations logicielles.
Pourquoi ce choix ? Un stockage emmc qui permet de se passer de carte micro-SD, une très faible consommations électrique, un module ultra-compact qui sait se faire oublier, un prix de revient moindre qui permet de contenir les inévitables augmentations tarifaires de cette époque un brin trouble 😉

Au final, que du bonheur, pas de pannes, pas de maintenance, simplicité totale, conforme à l’esprit de nos hotspots Wifipak : liberté, efficacité, simplicité !

Raspberry Pi Pico W : utilisation de la LED interne

Voici venir le tout nouveau Raspberry Pi Pico W, avec le WiFi intégré :

Force est de constater que cette p’tite framboise à 6 € offre de multiples possibilités pour qui voudra programmer en Python, oubliant le langage plutôt hermétique des ardui-bidules, pas forcément ma tasse de thé vous l’aurez compris.

Nous allons voir ici comment connecter le Pico W au WiFi, créer une simple page Web et venir allumer la LED interne sitée à proximité du connecteur USB. Nous supposerons que vous avez déjà installé le firmware et allez utiliser Thonny, le soft idéal pour programmer et injecter vos scripts python.

Commençons par créer un fichier secrets.py que nous allons sauvegarder sur le Pico W, fichier qui aura le contenu suivant :

SSID = "nom_du_réseau_wifi"
PASSWORD = "clé_de_sécurité"

Passons ensuite au script principal qui sera lui sauvegardé dans main.py sur le Pico W :

import usocket as socket
import network
from machine import Pin
import secrets

wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(secrets.SSID, secrets.PASSWORD)
light = machine.Pin("LED", machine.Pin.OUT)

Led = "ON"

htmlresponse = """HTTP/1.0 200 OK
Content-Type: text/html

<!DOCTYPE html>
<meta charset="UTF-8">
<html>
    <head>
        <title>Serveur RaspiPicoW</title>
    </head>
    <body>
        <p>Etat de la LED : {} </p>
        <p> <a href = "/?etat=on" >Led ON </a>  </p>
        <p> <a href = "/?etat=off" >Led OFF </a> </p>
        <p> <a href = "/?etat=toggle" >TOGGLE </a> </p>
    </body>
</html>
"""

def connexion_wifi(ssid,password):
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print("connexion",ssid)
        wlan.connect(secrets.SSID, secrets.PASSWORD)
        while not wlan.isconnected():
            pass
    print("Adresse IP :", wlan.ifconfig()[0])
    print("Masque réseau : ", wlan.ifconfig()[1])
    print("Gateway :", wlan.ifconfig()[2])
    print("Serveur DNS :", wlan.ifconfig()[3])
    return wlan.ifconfig()[0]

AdresseIP = connexion_wifi(secrets.SSID, secrets.PASSWORD)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((AdresseIP,8080))
s.listen(1)

while True :
    print("Attente connexion ...")
    connexion = s.accept()
    ClientAddress = connexion[1]
    ClientSocket = connexion[0]
    print("Adresse client connecté :",ClientAddress[0])
    request = ClientSocket.recv(2048)
    Lrequest = request.decode('utf-8').split(' ')
    if Lrequest[0] == 'GET' :
        url =Lrequest[1]
        if url[0:7] =="/?etat=":
            if url[7:] == 'on':
                light.on()
                Led = "ON"
            elif url[7:] == 'off':
                light.off()
                Led = "OFF"
            elif url[7:] == 'toggle':
                light.toggle()
        ClientSocket.send(htmlresponse.format(Led))
    ClientSocket.close()

Il ne vous reste plus qu’à exécuter le script, le Shell vous affichera l’adresse IP obtenue une fois le WiFi connecté. Rendez vous sur cette adresse IP via votre navigateur internet et hop :

La page web interne s’affiche, à vous de jouer maintenant !