Interface web vocale qui comprend vos commandes via un LLM et pilote les composants électroniques de votre maison via Arduino.
Démonstration du pilotage vocal d'une maison miniature : éclairage RGB par pièce, ventilateur, porte de garage, commandés en langage naturel.
- À propos
- Fonctionnalités
- Architecture
- Matériel requis
- Structure du projet
- Installation
- Lancement
- Utilisation
- Format des réponses LLM
- Actions disponibles
- API HTTP
- Licence
IOTHouse est un projet de groupe d'interface web vocale pour maison connectée, développé à 3 dans le cadre académique à l'UDM. L'utilisateur parle dans son navigateur, sa voix est transcrite en texte, le texte est envoyé à un LLM cloud qui décide s'il s'agit d'une commande ou d'une conversation, puis l'action est exécutée sur un Arduino qui pilote les composants électroniques de la maison.
Le projet explore l'intégration de Grands Modèles de Langage dans des objets du quotidien pour offrir une interaction naturelle avec le matériel embarqué — un terrain d'expérimentation qui a servi de base au projet plus ambitieux MARC (mon projet de fin de licence, en solo cette fois).
- 🎙️ Reconnaissance vocale dans le navigateur via la Web Speech API (aucun modèle à installer)
- 🧠 LLM Mistral Large via Ollama Cloud pour la compréhension du langage naturel
- 📋 Sortie JSON structurée : le LLM distingue automatiquement commande domotique et conversation
- 🔊 Synthèse vocale des réponses via gTTS (Google Text-to-Speech)
- 💡 Pilotage Arduino : LEDs RGB (couleurs personnalisables pour la chambre), ventilateur, porte garage
- 🌐 Interface web HTTPS accessible depuis tous les appareils du réseau
- 🔄 Historique conversationnel (6 derniers échanges) pour des dialogues cohérents
- 📊 Suivi d'état temps réel de chaque pièce côté serveur
┌─────────────────────────────────────────────┐
│ Navigateur │
│ index.html · app.js · style.css │
│ Web Speech API (STT) │
└──────────────────┬──────────────────────────┘
│ HTTPS · /send_text · /command
▼
┌─────────────────────────────────────────────┐
│ Raspberry Pi 4 · server.py │
│ Flask HTTPS · gestion d'état maison │
│ gTTS pour la synthèse vocale │
└────────┬──────────────────────────┬─────────┘
│ │
│ HTTP │ Série
▼ ▼
┌─────────────────────┐ ┌────────────────────┐
│ Ollama Cloud │ │ Arduino Uno │
│ Mistral Large │ │ LEDs · Moteurs │
│ Sortie JSON │ │ /dev/ttyACM0 │
└─────────────────────┘ └────────────────────┘
| Composant | Détail |
|---|---|
| Raspberry Pi 4 | Pour faire tourner le serveur Flask |
| Arduino Uno | Connexion USB sur la Pi |
| LEDs (R, G, B) | 6 pièces : salon, chambre, cuisine, garage |
| Moteur DC | Ventilateur du salon |
| Moteur DC ou servo | Porte du garage |
| Pont en H L298N | Pilotage des moteurs DC |
| Microphone | Compatible navigateur (USB ou intégré) |
| Haut-parleur | Sortie audio pour la voix de l'assistant |
.
├── IOTHouse/ # Code Arduino
│ └── IOTHouse.ino # Sketch (LEDs + Moteur DC + porte garage)
│
├── server.py # Serveur Flask HTTPS
├── index.html # Interface web de la maison
├── app.js # Logique JS (STT navigateur + appels API)
├── style.css # Styles de l'interface
├── Modelfile # Configuration du LLM Ollama
├── requirements.txt # Dépendances Python
├── cert.pem # Certificat SSL (à générer)
├── key.pem # Clé privée SSL (à NE PAS commit)
└── LICENSE # Licence MIT
sudo apt update
sudo apt install python3-pip openssl -ypip install -r requirements.txtLes principales libs utilisées : Flask, requests, gTTS, pyserial.
Le projet utilise Mistral Large via Ollama Cloud (mistral-large-3:675b-cloud).
# Installer Ollama
curl -fsSL https://ollama.com/install.sh | sh
# Se connecter à Ollama Cloud (clé API requise)
export OLLAMA_API_KEY="<votre_clé>"
export OLLAMA_HOST="https://ollama.com"💡 Tu peux aussi utiliser un modèle local en remplaçant
OLLAMA_MODELdansserver.pypar exemple parmistralouqwen2.5:3bpour une exécution 100% locale.
Uploader le sketch IOTHouse/IOTHouse.ino sur l'Arduino via l'IDE Arduino ou arduino-cli :
arduino-cli core install arduino:avr
arduino-cli compile --fqbn arduino:avr:uno IOTHouse/
arduino-cli upload -p /dev/ttyACM0 --fqbn arduino:avr:uno IOTHouse/HTTPS est obligatoire pour accéder au microphone depuis le navigateur. Générer un certificat auto-signé :
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes
⚠️ Ne jamais commitkey.pemsur GitHub — c'est ta clé privée. Vérifier qu'elle est dans.gitignore.
python3 server.pyLe serveur démarre sur https://localhost:5000 (et https://<ip-pi>:5000 depuis tout le réseau local).
Le navigateur affichera un avertissement de sécurité dû au certificat auto-signé — c'est normal sur un réseau local, accepter l'exception.
Ajouter dans crontab -e :
@reboot cd /chemin/vers/IOTHouse && python3 server.py
- Ouvrir l'interface dans le navigateur
- Cliquer sur le bouton micro
- Énoncer une commande, par exemple :
- « Allume la lumière du salon »
- « Mets la chambre en mauve »
- « Ouvre la porte du garage »
- « Éteins tout »
- « Mets le ventilateur en mode rapide »
L'assistant confirme oralement et exécute la commande sur l'Arduino.
L'interface SVG de la maison permet de cliquer directement sur chaque pièce pour l'allumer/éteindre, sans passer par la voix.
Si la requête n'est pas une commande domotique, le LLM répond simplement par la voix sans actionner le matériel. Exemple :
- « Quelle heure est-il ? »
- « Raconte-moi une blague »
Le LLM est contraint de répondre uniquement en JSON valide, selon deux formats :
{
"type": "commande",
"reponse": "Ok, j'allume le salon",
"action": "allumerSalon"
}{
"type": "commande",
"reponse": "Voilà ta chambre en mauve",
"action": "allumerChambre 161 113 136"
}{
"type": "chat",
"reponse": "Il est 14h32 actuellement."
}| Action | Description |
|---|---|
allumerSalon / eteindreSalon |
Lumière du salon (blanc par défaut) |
salonRouge / salonVert / salonBleu |
Salon en couleur fixe |
allumerChambre / eteindreChambre |
Lumière de la chambre |
allumerChambre <R> <G> <B> |
Chambre en couleur RGB personnalisée |
allumerCuisine / eteindreCuisine |
Lumière de la cuisine (rouge par défaut) |
allumerGarage / eteindreGarage |
Lumière du garage |
ouvrirGarage / fermerGarage |
Porte du garage motorisée |
allumerVentilo / eteindreVentilo |
Ventilateur du salon |
ventiloLent / ventiloRapide |
Vitesse du ventilateur |
allumerTout / eteindreTout |
Toutes les pièces et le ventilateur |
| Route | Méthode | Description |
|---|---|---|
/ |
GET | Interface web (index.html) |
/send_text |
POST | Pipeline vocal : { "user_text": "allume le salon" } |
/command |
POST | Commande directe : { "command": "allumerSalon" } |
/status |
GET | État courant : Arduino, modèle, état des pièces |
/tts/<filename> |
GET | Servir un fichier audio TTS généré |
{
"ai_reply": "Ok, j'allume le salon",
"action": "allumerSalon",
"type": "commande",
"tts_url": "/tts/tts_1737054321000.mp3",
"house_state": {
"salon": true,
"chambre": false,
"cuisine": false,
"garage-light": false,
"garage-door": false,
"fan": false
}
}Navigateur
│
▼
Web Speech API (STT) ← reconnaissance vocale native du navigateur
│
▼ POST /send_text
Flask server.py
│
▼ HTTP
Mistral Large (Ollama Cloud) ← LLM, sortie JSON contrainte
│
├── type: commande → série vers Arduino via /dev/ttyACM0
│ + mise à jour de house_state
│
└── type: chat → gTTS → fichier MP3 → renvoyé au navigateur
│
▼
Lecture dans le navigateur
could not open port /dev/ttyACM0
→ Vérifier le port avec ls /dev/ttyACM* /dev/ttyUSB* et adapter ARDUINO_PORT dans server.py.
Le microphone ne s'active pas dans le navigateur
→ Le HTTPS est obligatoire. Vérifier que cert.pem et key.pem sont bien présents et que tu accèdes à https:// (pas http://).
Erreur Ollama : 401 / 403
→ Vérifier que OLLAMA_API_KEY est correctement exporté avant de lancer server.py.
Pas de son lors de la réponse
→ gTTS nécessite un accès Internet. Vérifier la connexion. Sinon basculer vers espeak-ng (fonction generate_tts2 déjà présente dans le code).
Projet de groupe réalisé dans le cadre académique à l'Université des Mascareignes (Maurice), par 3 étudiants en 3ème année de Licence en Informatique Appliquée.
| Membre | Liens |
|---|---|
| SALLAH Assiongbon Théodore Jean-Paul | |
| RAKOTOMAVO Ny Vetso | |
| RAZAFINDRATSIMBA Angelin Fehizoro |
🎓 Université des Mascareignes — Maurice
- Ollama et le modèle Mistral Large
- Flask
- gTTS — Google Text-to-Speech (interface Python non officielle)
- Web Speech API — reconnaissance vocale navigateur
Ce projet est distribué sous licence MIT — voir le fichier LICENSE.
Si ce projet vous a plu, n'hésitez pas à laisser une ⭐ !
