Ce projet est un serveur backend pour un système domotique, conçu pour être rapide, modulaire et orienté événements. Il gère l'état de la maison (lumières, chauffage, portes, température), conserve un historique des événements et automatise certaines tâches via un moteur de règles intelligent.
- Runtime: Bun (JavaScript/TypeScript runtime ultra-rapide)
- Framework Web: ElysiaJS
- Base de données: PostgreSQL
- ORM: Prisma
- Outils: Biome (Linter/Formatter), Lefthook (Git Hooks), Docker
- Bun installé (
curl -fsSL https://bun.sh/install | bash) - Docker et Docker Compose (pour la base de données)
-
Cloner le projet et installer les dépendances :
bun install
-
Configurer les variables d'environnement : Copiez le fichier d'exemple et adaptez-le (notamment l'URL de la base de données).
cp .env.example .env
-
Démarrer la base de données :
docker compose up -d
- Mode développement (avec rechargement automatique) :
bun run dev
- Mode production :
bun start
L'API utilise un système d'authentification personnalisé basé sur un couple ClientID et ClientToken.
- Header requis :
Authorization - Format :
ClientID:ClientToken - Validation : Le serveur vérifie que le
ClientIDexiste et que le token fourni correspond au token chiffré stocké en base.
⚠️ Note : La route/statusest publique. Toutes les autres routes (/check,/history,/temp,/toggle,/auth) sont protégées par le middleware d'authentification.
GET /status: Vérifier l'état du serveur (Public).GET /check: Vérification de santé avancée (Protégé).
Ces routes permettent de modifier l'état des appareils.
POST /toggle/light: Allumer/Éteindre la lumière.POST /toggle/door: Ouvrir/Fermer la porte.POST /toggle/heat: Activer/Désactiver le chauffage.
POST /temp: Mettre à jour la température actuelle de la maison.- Body :
{ "temp": "number" }
- Body :
GET /history: Récupérer l'historique des événements (changements d'état, règles déclenchées).
Le serveur expose un endpoint WebSocket pour les mises à jour en temps réel.
- Topic :
home-updates - Fonctionnement : Le dashboard reçoit automatiquement les changements d'état (nouvelle température, lumière allumée, etc.) dès qu'ils se produisent.
Le système intègre un moteur de règles (src/rules/engine.ts) qui réagit aux changements d'état (EVENTS.STATE_CHANGE).
-
HEAT_ON_COLD (Chauffage Auto)
- Condition : Température < 19°C ET Porte fermée ET Chauffage éteint.
- Action : Allume le chauffage.
-
HEAT_OFF_HOT (Économie Chauffage)
- Condition : Température > 23°C ET Chauffage allumé.
- Action : Éteint le chauffage.
-
LIGHT_ON_ENTRY (Lumière Entrée)
- Condition : Porte ouverte ET Lumière éteinte.
- Action : Allume la lumière (Bienvenue !).
-
ECO_GUARD_DOOR (Sécurité Énergie)
- Condition : Porte ouverte ET Chauffage allumé.
- Action : Coupe le chauffage pour ne pas chauffer l'extérieur.
.
├── prisma/ # Schéma DB, Migrations et Seeds
├── src/
│ ├── middleware/ # AuthMiddleware (vérification token)
│ ├── routes/ # Définition des routes API (Elysia)
│ ├── rules/ # Moteur de règles et définitions
│ ├── services/ # Logique métier (HomeStateService)
│ ├── utils/ # Utilitaires (Crypto, EventBus)
│ ├── enums.ts # Types d'événements (TEMPERATURE, LIGHT...)
│ └── index.ts # Point d'entrée serveur
└── tests/ # Tests unitaires et d'intégration
- Linter le code :
bun run lint(via Biome) - Lancer les tests :
bun test