|

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]

Publications similaires

  • |

    Livebox Inventel : débit maximum ?

    Comment connaître le débit actuel et surtout le débit maximum de votre Livebox ? Nous nous intéresserons ici uniquement au modèle Inventel. Ouvre un navigateur internet, puis rendez vous sur http://192.168.1.1/statsadsl.html Rentre le login « admin » et le mot de passe « admin » pour accéder à la page. Vous allez retrouver deux lignes importantes :   Flux descendant Flux montant Taux de transfert (kbps) 6386 1020 Il s’agit là de votre connexion actuellement en place, soit 6.23 Mbps dans cet exemple. La…

  • Livebox : améliorer le WiFi ?

    Ces derniers jours, nombreux sont les appels ou emails concernant l’amélioration du WiFi d’une Livebox : vous voulez augmenter la portée du réseau sans fil, pouvoir couvrir votre jardin ou envoyer le WiFi dans une habitation à 200 m de là ? C’est assez simple en fait, Monwifi.fr vous propose pas mal de solutions adaptées. Commençons par le plus simple : ajouter une ou plusieurs antennes. Oui, une sur les vieilles Sagem en forme de triangle, deux pour les Livebox 2,…

  • |

    CM : ne pas aider, à tout prix

    Un CM, vous connaissez ? Mais si, celles ou ceux qui, sur des réseaux qu’on dit « sociaux », est en charge de répondre à VOS demandes, VOUS, le client en difficulté ou atteint d’une questionnite aigüe. Le Community Manager, CM si t’es un minimum geek, c’est celui qui est là pour vous A I D E R, je l’écris en gros car l’ironie est présente, ironie car dans les faits le CM n’est là que pour apporter une réponse. Tenez, prenons…

  • La minute écolo : mise en sac !

    Un p’tit coup de gueule en cette fin d’année de COP21, mais surtout un coup de bon sens, tout simplement : les fameux sacs plastiques qu’on veut bannir partout, qu’on va vous remplacer par des sacs bobo-écolos ! A défaut de pouvoir s’éclater sur de nouvelles attaques ou de nouveaux sujet sensationnels, nos journaleux ont décidé de ressortir ce sujet, un véritable marronnier. Oui, ces sacs ont tendance à se retrouver n’importe où, mais ne nous faisons aucune illusion, ils…

  • Deuxième canal de France en terme de fréquentations, juste après le canal du Midi, le canal du Nivernais est désormais muni d’antennes WiFi offrant un accès à internet. De plus, des bornes multimédias ont été installées sur les principaux sites, avec en prime un site dédié à un usage mobile, m.canal.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.