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]















