Aller au contenu principal
logoYvan Kerdanet
Tous les projets
seb-mlrd /

smart-home-iot

Créé le 4 mai 2026 · Dernière mise à jour 7 mai 2026

// langages

Java52.7%TypeScript43.9%PowerShell1.7%Roff0.8%SCSS0.7%HTML0.2%

// README

Smart Home IoT

Plateforme de gestion d'objets connectés en temps réel. Un backend Spring Boot ingère la télémétrie MQTT de vos appareils, la persiste dans TimescaleDB et la pousse en direct vers un frontend Angular via WebSocket STOMP.

Équipe

  • Yvan Kerdanet — backend, MQTT, WebSocket, simulateur
  • Sébastien Maillard — backend CRUD/auth, frontend Angular

Contraintes & arbitrages

  • Souveraineté des données (France/Europe) — voir ADR-001 et ADR-002
  • Disponibilité critique (99,999%) — voir ADR-002

État du projet

Ce qui tourne : ingestion MQTT → TimescaleDB → WebSocket → frontend temps réel, auth JWT, CRUD appareils, pilotage via commandes MQTT, simulateur JavaSim.

Ce qui ne tourne pas : pas de déploiement cloud (démo en local), pas de tests automatisés, pas de CI.

Documentation

DocumentContenu
docs/architecture.mdArchitecture détaillée, modèle de données, RPO/RTO
docs/adr/0001-vendor-lockin.mdTrade-off HiveMQ Cloud vs self-hosted, plan de migration
docs/adr/0002-disponibilite-souverainete.mdArbitrage 99,999% vs souveraineté
docs/adr/0003-base-de-donnees.mdTimescaleDB vs InfluxDB vs PostgreSQL
docs/plan.mdLots de travail, statuts, ce qui n'a pas été fait
docs/tensions.mdAuto-audit du brief, tensions identifiées
docs/defense.mdAnticipation Q&A
docs/postmortem.mdCe qui a marché, raté, surprises

Stack technique

CoucheTechnologie
FrontendAngular 19 · Angular Material · RxStomp
BackendSpring Boot 3.2.5 · Java 21 · Spring Security (JWT)
Base de donnéesTimescaleDB (PostgreSQL 15) · Liquibase
MessagerieHiveMQ Cloud (MQTT v5)
Temps réelWebSocket STOMP (SimpMessagingTemplate)
SimulateurJavaSim (Java · Maven Exec)

Architecture

[JavaSim] │ MQTT telemetry / status / command/ack ▼ [HiveMQ Cloud] │ ▼ [Backend :8081] ──── REST API ────► [Frontend :4200] │ JWT auth · Liquibase Angular 19 │ TimescaleDB Angular Material │ └── WebSocket STOMP (/ws) ──────► temps réel (statut, télémétrie)

Prérequis


Démarrage rapide

1. Base de données

cd docker docker compose up -d

Démarre TimescaleDB sur le port 5434 et pgAdmin sur http://localhost:5050.
Liquibase crée et migre le schéma automatiquement au premier démarrage du backend.

2. Backend

cd backend ./mvnw.cmd spring-boot:run # Windows ./mvnw spring-boot:run # Linux / macOS

Le backend écoute sur http://localhost:8081.
Les variables d'environnement suivantes peuvent être surchargées (valeurs par défaut suffisantes en local) :

VariableDéfautDescription
DB_HOSTlocalhostHôte PostgreSQL
DB_PORT5433Port PostgreSQL (5434 côté Docker, mappé 5433 dans l'app)
MQTT_HOSTlocalhostHôte MQTT
MQTT_PORT8883Port MQTT (TLS)
MQTT_USER(vide)Identifiant HiveMQ
MQTT_PASSWORD(vide)Mot de passe HiveMQ
JWT_SECRETchange-me-in-production-…Clé de signature JWT (≥ 256 bits)

Pour HiveMQ Cloud, renseignez MQTT_HOST, MQTT_USER et MQTT_PASSWORD selon votre cluster.

3. Frontend

cd frontend npm install npm start

Application disponible sur http://localhost:4200.

4. Simulateur (optionnel)

Le simulateur publie de la télémétrie fictive via MQTT pour tester sans vrai hardware.

  1. Créez votre compte via le frontend (/auth/register) ou Postman (POST /api/v1/auth/register)
  2. Créez vos appareils (frontend ou Postman POST /api/v1/devices) et relevez leurs UUID
  3. Récupérez votre userId depuis pgAdmin (SELECT id FROM users) ou depuis le JWT décodé
  4. Renseignez les UUID dans JavaSim/src/main/resources/config.yml
# JavaSim/src/main/resources/config.yml broker: host: <votre-cluster>.hivemq.cloud port: 8883 user: <mqtt-user> password: <mqtt-password> user_id: <votre-userId-UUID> devices: - id: <uuid-device-1> type: thermostat interval_ms: 5000 # ...
  1. Lancez le simulateur :
cd JavaSim ./mvnw.cmd exec:java # Windows ./mvnw exec:java # Linux / macOS

Types d'appareils supportés

TypeMétriques publiéesCommandes disponibles
thermostattemperature, humidity, setpointset_temperature
temperature_sensortemperature, humidity
lux_sensorlux
light_actuatorstate, brightnessturn_on, turn_off, set_brightness
shutter_actuatorposition, stateopen, close, set_position
smart_plugstate, power_w, energy_kwhturn_on, turn_off
co2_sensorco2_ppm, temperature
motion_detectormotion, lux

API REST — principales routes

# Auth POST /api/v1/auth/register POST /api/v1/auth/login POST /api/v1/auth/refresh POST /api/v1/auth/logout # Appareils GET /api/v1/devices POST /api/v1/devices GET /api/v1/devices/:id PUT /api/v1/devices/:id DELETE /api/v1/devices/:id # Catalogue types GET /api/v1/device-types # Télémétrie GET /api/v1/devices/:id/telemetry/latest GET /api/v1/devices/:id/telemetry/history # Commandes POST /api/v1/devices/:id/commands GET /api/v1/devices/:id/commands

Toutes les routes (hors /auth) nécessitent le header Authorization: Bearer <accessToken>.


pgAdmin

Accès : http://localhost:5050
Login : admin@smarthome.dev / admin

Pour connecter le serveur :

  • Host : timescaledb (nom du container Docker)
  • Port : 5432
  • Maintenance database : smarthome
  • Username / Password : smarthome / smarthome

Structure du projet

smart-home-iot/ ├── backend/ # Spring Boot — API REST + MQTT + WebSocket ├── frontend/ # Angular 19 — dashboard temps réel ├── JavaSim/ # Simulateur d'appareils IoT └── docker/ # docker-compose (TimescaleDB + pgAdmin)