|

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

  • Statistiques mensuelles

    Comme chaque mois, voici le point sur les visites reçues sur ce blog WiFi. Un rapide rappel des visites mensuelles : Juillet : 6810 Août : 7400 Septembre : 8200 Octobre : 8990 Firefox progresse, avec près de 53% des utilisateurs, tout comme MSIE avec 35,51%. Windows représente près de 89% des systèmes utilisés. Les MAC ne sont que 5,74% à surfer ici, suivis par Linux avec 4,99%. Ces chiffres sont basés sur une période d’un mois, du 29 Septembre…

  • Couverture 4G Freemobile

    Avec le lancement de l’offre 4G Freemobile, incluant, rappelons le, 20 Go de données en 4G ET 3 Go en 3G, nombreux sont les fanboys qui vont se précipiter, d’autant que l’offre est au même tarif, nécessitant juste l’acceptation de nouvelles conditions générales de vente. Seulement voilà, qui de la couverture 4G de notre opérateur bricoleur ? Un petit tour sur http://www.antennesmobiles.fr/ et  vous serez fixés, comme ici dans l’Ouest de notre beau pays : Oui, la carte parle d’elle même, les…

  • CPL : une norme forcément incompatible

    Lors de quelques essais effectués avec des modules CPL (courant porteur en ligne), nous avons voulu en profiter pour tester la compatibilité entre les marques. Nous avons pour cela installé des modules 200 Mbps de deux marques différentes, et ce qui était prévisible s’est produit : les deux modules d’une marque, branchés et en service, avaient pris le pas sur les trois modules d’une autre marque !! Alors, le CPL, une norme ou pas ? On est en droit de…

  • |

    Point d’accès sans évolution

    L’avantage de travailler dans le WiFi depuis déjà quelques années, c’est d’avoir vu arriver les premiers modules USB 11 Mbps, fort coûteux à l’époque, mais également d’avoir pu observer l’évolution des points d’accès. Au départ était le WRT54GL : Ce petit appareil conçu et produit par Linksys, qui n’était pas encore Cisco, proposait 54 Mbps et surtout pouvait être flashé avec des firmwares offrant des fonctionnalités avancées, tels DD-WRT, OpenWRT, et tant d’autres. Certains lecteurs ici l’utilisent encore, c’est un…

  • Switch POE Ubiquiti maison

    A défaut d’avoir un switch POE 24 V compatible avec les modules Ubiquiti, un peu d’astuce, quelques doses de colles, un peu de câblage ethernet, et vous obtiendrez une solution économique, simple, mais à 300 % fonctionnelle. Commençons par nous procurer un bloc POE avec alimentation externe, tel celui proposé chez Infracom : Sur ce module, nous disposons d’une entrée d’alimentation externe, sur la droite de l’image. Procurons nous ensuite un bloc d’alimentation, en sélectionnant avec soin l’intensité en fonction…

  • Joyeux anniversaire Infracom ! 19 ans !

    Joyeux anniversaire Infracom, avec 19 bougies en ce 1er Février 2014 ! Créée le 1er Février 1995, Infracom a tout d’abord été immatriculée au RCS de Lyon, avant de se transférer sur St Nazaire en 1998, puis Pontchâteau en 2000, et finalement Crossac depuis pas loin de 7 années maintenant. Initialement, j’avais eu l’intention de revenir sur les faits marquants, les contraintes (coucou le RSI, l’Organic, l’Urssaf…), les concurrents copieurs et casseurs de prix qui vous refourguent n’importe quoi sous…

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.