Réveil progressif pour Home Assistant : lumière, musique, volets et chauffage, avec assistance IA optionnelle.
Un réveil domotique complet qui ne se contente pas de sonner : il prépare la maison au réveil (chauffage, lumière progressive, musique, volets, café), s'adapte au calendrier (jours fériés, vacances scolaires, vacances) et à la présence réelle des occupants. Optionnellement enrichi par l'IA (briefing, musique adaptative, suggestion d'heure, bilan de sommeil).
1 étape pour créer un réveil (30 secondes) :
- Nom (accents acceptés : Réveil, Élève...)
- Heure
- Jours actifs
- Preset : 🎵 Simple, 🌅 Confort, 🏠 Complet
Menu Configurer (9 sections, modifiable après) :
- Base — heure, heure par jour, jours, ponctuel, skip, vacances, rattrapage
- 🎵 Musique — MediaSelector (playlist/radio/favoris), volume progressif, styles par météo
- 💡 Lumière — aube progressive, couleur, température, forme de montée, scène
- 🏠 Confort — chauffage, cafetière, volets (position %), scène matin
- 🧠 Intelligence — présence, jours fériés, capteurs de lit, mode de travail, agenda adaptatif, mouvement, escalade
- 📱 Notification — notify (EntitySelector), TTS (message séparé), snooze
- 🤖 AI Task — briefing, musique adaptative, suggestion, bilan, tasks personnalisées
- 🔒 Sécurité nocturne — vérification des ouvertures chaque soir
- 🧪 Tester les tâches IA — exécuter une tâche immédiatement
Chaque champ a une description expliquant ce qu'il fait et pourquoi.
- Multi-alarmes : plusieurs réveils indépendants (semaine, week-end, sport, enfants…)
- Heure unique ou heure par jour : lundi 8h, mardi 9h, weekend 10h — un seul réveil suffit
- Jours : tous / semaine / weekend / personnalisé (cases indépendantes)
- Jours fériés : désactivation via capteur interne (calendrier officiel français)
- Vacances scolaires : désactivation via
calendarentity (ICS Éducation nationale) - Mode vacances : booléen OU entité (calendar, input_boolean, person) — automatique
- Skip une fois : sauter le prochain réveil sans toucher à la planification
- Alarme ponctuelle : réveil unique auto-désactivé après déclenchement
- Rattrapage au redémarrage : si HA redémarre juste après l'heure du réveil, le réveil se déclenche quand même (tolérance configurable, 15 min par défaut)
- Chauffage : radiateur/thermostat en mode confort X minutes avant
- Chauffe-eau / sèche-serviettes : anticipation salle de bain
- Simulation d'aube : montée progressive de la luminosité sur 5–60 min
- Cafetière / bouilloire : prise connectée ON à H−X min
- Musique via MediaSelector (Spotify, radio, favoris) avec volume progressif
- Volets : ouverture à position configurable (0-100%) si soleil levé
- Scène matin : multi-sélection de lumières/scènes (couloir, cuisine, sdb)
- Notification mobile actionnable avec boutons Snooze / Stop
- Notification persistante : visible sur tous les dashboards, fermée au stop
- Briefing vocal (TTS) : message personnalisable, séparé de la notification.
Nécessite une enceinte (
media_player) et un moteur de synthèse (tts.*) ; le moteur est détecté automatiquement s'il n'est pas précisé. - Restauration de l'état initial : au stop, le volume du Sonos, la luminosité de la lampe et le preset du radiateur reviennent à leur valeur d'avant le réveil.
- Snooze : durée configurable, nombre max de répétitions, notification renvoyée à chaque reprise avec les boutons Snooze/Stop
- Compte à rebours du snooze :
sensor.<nom>_fin_du_snoozeexpose l'instant de reprise, la carte affiche un décompte à la seconde - Stop : notification actionnable, bouton, ou détection de mouvement salle de bain
- Escalade : progressive (3 niveaux : 60% → 80% → 100%) ou classique (tout à 100%)
- Lumière de réveil : couleur RVB ou température de couleur, forme de la montée (douce ou linéaire), scène appliquée en fin de montée
- Présence : ne sonne pas si la personne n'est pas à la maison
- Lever anticipé : mouvement cuisine avant l'heure → annule la sonnerie
- Présence au lit : ne sonne pas si personne n'est couché. Désignez autant de
capteurs que nécessaire dans Options → Intelligence → Capteurs de présence au
lit, quelle qu'en soit la nature — tapis ou capteur sous matelas, radar
millimétrique, capteur de pression,
in_bedWithings. L'intégration interprète les états binaires (on/off), textuels (home/occupied…) et numériques (toute valeur non nulle = présence). Un capteur momentanément indisponible — unbinary_sensor.<...>_in_bedWithings passe àunknownla nuit — est rattrapé par son dernier état connu récent. - Mode de travail : présentiel ou télétravail, en valeur fixe ou via une
entité (
input_select, capteur, calendrier). En télétravail, le trajet est ignoré du briefing et la météo n'influence plus l'heure suggérée. L'entitéselect.<nom>_mode_travailest dynamique : elle suit l'entité configurée en temps réel. - Agenda adaptatif : avance le réveil selon le premier rendez-vous du jour
- Escalade intelligente : 3 niveaux progressifs au lieu de tout à 100% d'un coup
- Briefing matinal IA : briefing naturel (météo, agenda, trajet, batterie). Repli automatique en texte libre si le modèle ne gère pas les réponses structurées (Ollama).
- Musique adaptative : l'IA choisit la playlist selon la météo et le mode de travail. Styles musicaux configurables par famille météo (soleil, couvert, pluie, neige, orage).
- 🔒 Vérification nocturne : chaque soir à l'heure choisie, vérifie que portes, volets, portail et garage sont fermés. Si une ouverture reste ouverte, une notification est envoyée. Logique déterministe, sans IA — fonctionne même sans modèle configuré.
- Suggestion d'heure du soir : notification Accepter/Refuser (l'IA propose, vous validez). Heure de l'envoi configurable.
- Bilan de sommeil hebdomadaire : synthèse + recommandations (service
smartwake.bilan_hebdoou planifié). Désignez vos capteurs de sommeil dans Options → AI Task → Capteurs de sommeil : score, durées de sommeil profond/léger/paradoxal, réveils nocturnes, endormissement, ronflement. Compatible Withings, Fitbit, Oura ou tout autre capteur. Les moyennes sur 7 jours sont calculées via le recorder, avec repli sur la dernière nuit s'il est indisponible, et les durées en secondes sont converties en heures et minutes. Jour et heure d'envoi configurables. - Vérification du lever : 10 min après le Stop, relance si vous êtes encore couché, d'après les capteurs de présence au lit. Quand plusieurs capteurs se contredisent — un radar peut détecter quelqu'un debout dans la pièce sans qu'il soit au lit — l'IA arbitre ; sinon la réponse est directe, sans appel à l'IA.
- AI tasks personnalisées : votre propre prompt + déclencheur + entités +
notification. Trois déclencheurs :
on_wake,on_stop,on_evening. - Tester les tâches IA : Options → 🧪 Tester les tâches IA ou service
smartwake.tester_iapour exécuter une tâche immédiatement et voir le résultat, sans attendre le créneau habituel.
Les prompts utilisés sont visibles dans la description de chaque champ. L'IA ne déclenche jamais la sonnerie. Fallback automatique si indisponible.
Les entity_id sont dérivés du nom du réveil et du nom convivial de chaque
entité. Pour un réveil nommé reveil :
| Entité | Description |
|---|---|
switch.reveil_actif |
Activation du réveil (état restauré au redémarrage) |
switch.reveil_mode_vacances |
Suspend le réveil sans le désactiver |
switch.reveil_saut_du_prochain |
Saute la prochaine occurrence — et permet de l'annuler |
time.reveil_heure |
Heure de référence |
time.reveil_heure_lundi … _dimanche |
Heure propre à chaque jour (mode par_jour) |
select.reveil_jours |
tous / semaine / weekend / personnalise |
select.reveil_mode_heure |
unique ou par_jour |
select.reveil_mode_travail |
indetermine / presentiel / teletravail |
button.reveil_declencher / _stop / _sauter_prochain / _reset |
Actions immédiates |
| Entité | Description |
|---|---|
binary_sensor.reveil_sonne_aujourd_hui |
Le réveil doit sonner aujourd'hui (toutes conditions combinées) |
binary_sensor.reveil_reveil_en_cours |
Le cycle est actif (ringing / prewake / snoozed) |
binary_sensor.reveil_jour_ferie |
Jour férié (via capteur workday) |
binary_sensor.reveil_weekend |
Samedi ou dimanche |
binary_sensor.reveil_vacances_scolaires |
Vacances scolaires en cours (via calendar entity) |
| Entité | Description |
|---|---|
sensor.reveil_statut |
idle / prewake / ringing / snoozed / done / inactif |
sensor.reveil_prochain_reveil |
Date/heure du prochain réveil (timestamp) |
sensor.reveil_snooze_utilises |
Snoozes utilisés sur le cycle en cours |
sensor.reveil_fin_du_snooze |
Instant de reprise de la sonnerie (timestamp) |
sensor.reveil_declenchements_total |
Déclenchements cumulés (total_increasing) |
sensor.reveil_snoozes_total |
Snoozes cumulés (total_increasing) |
sensor.reveil_stops_total |
Stops cumulés (total_increasing) |
sensor.reveil_dernier_reveil |
Horodatage du dernier réveil |
snooze_min, max_snooze, pre_chauffage_min, aube_min,
duree_eclairage_min, luminosite_max, escalade_min, volume_initial,
volume_final, cafe_avant_min.
sensor.<nom>_prochain_reveilest la seule source fiable de l'heure qui sonnera :time.<nom>_heuren'est que l'heure de référence, et peut être décalée par le modepar_jourou l'agenda adaptatif.
| Event | Déclencheur |
|---|---|
smartwake_triggered |
Réveil déclenché |
smartwake_stopped |
Réveil arrêté (raison : manual/snooze_max/mouvement_sdb) |
smartwake_snoozed |
Snooze activé |
smartwake_escalade |
Escalade (level : doux/moyen/max) |
smartwake_prewake |
Phase pré-réveil |
smartwake_activated |
Réveil activé |
smartwake_deactivated |
Réveil désactivé |
smartwake_anomalie |
Anomalie détectée (type) |
- Watchdog : vérifie l'armement au démarrage HA + détecte les redémarrages nocturnes
- Logbook : journalise les événements (sans données sensibles)
- Détection d'anomalie : HA redémarré la nuit, alarme non armée → alerte
- Notification actions : capte
REVEIL_SNOOZE/REVEIL_STOP/REVEIL_ACCEPTER_HH:MMdepuis l'app mobile - Retry : musique (3 tentatives + fallback TTS), volets (2 tentatives + ouverture au lever du soleil)
- Apprentissage : suit les habitudes (heure lever réelle, snooze moyen, régularité) + suggestions d'ajustement
- Diagnostics : Télécharger les diagnostics depuis la page de l'intégration fournit un instantané (configuration, état d'exécution, déclencheurs armés, entités référencées) avec expurgation des données personnelles
- CI : validation automatique (hassfest, HACS, pyflakes, import sous le vrai Home Assistant, tests) à chaque push et chaque semaine
- « Réveille-moi à 6h45 demain » →
smartwake_set_time - « Active le réveil semaine » →
smartwake_activate - « Pas de réveil demain » →
smartwake_skip - « Quand sonne le prochain réveil ? » →
smartwake_status
Les tâches IA ne se déclenchent qu'à des moments précis — au réveil, au stop, le soir — ce qui rend leur mise au point laborieuse. Options → 🧪 Tester les tâches IA permet d'en exécuter une immédiatement et d'afficher son résultat, ou l'erreur rencontrée. L'option correspondante est activée le temps du test.
Tous les modèles ne savent pas produire une réponse conforme à un schéma. Ollama échoue ainsi par « Error with Ollama structured response ». Depuis la 2.18.0, l'appel est alors rejoué en texte libre en réclamant du JSON, puis extrait de la réponse : les tâches structurées fonctionnent donc aussi sur ces modèles.
L'assistant ne pré-remplit une entité que si le choix est sans ambiguïté : un nom explicite mentionnant la chambre, ou un unique candidat dans la maison. Dans le doute, le champ reste vide.
Les volets ne sont jamais pré-remplis, même s'il n'en existe qu'un seul : il peut équiper une autre pièce que la chambre, et une ouverture non voulue au réveil se remarque tard. Le champ est à renseigner soi-même.
Les images de marque sont embarquées dans custom_components/smartwake/brand/
et priment sur le CDN brands.home-assistant.io. Aucune démarche n'est
nécessaire — l'icône apparaît dans la page des intégrations et sur l'appareil.
Ce mécanisme requiert Home Assistant 2026.3 ou supérieur. En deçà, HA affiche l'icône générique des intégrations personnalisées ; tout le reste fonctionne normalement.
Les images sont régénérables : python3 scripts/generer_icones.py.
- Ajoutez ce dépôt dans HACS :
- HACS → Integrations → ⋮ → Custom repositories
- URL :
https://github.com/junkoku38/smartwake - Category : Integration
- Cliquez Install sur "SmartWAKE"
- Redémarrez Home Assistant
- Paramètres → Appareils & Services → Ajouter une intégration → cherchez "SmartWAKE"
Installez aussi la carte dédiée via HACS Frontend :
- URL :
https://github.com/junkoku38/smartwake-card - Category : Dashboard (Lovelace)
type: custom:smartwake-card
entity: switch.reveil_actif
name: Mon réveil
show_stats: true
show_context: true| Entité | Type | Rôle |
|---|---|---|
switch.<nom>_actif |
switch | Activer / désactiver le réveil |
time.<nom>_heure |
time | Heure du réveil (éditable) |
select.<nom>_jours |
select | Jours actifs |
sensor.<nom>_statut |
sensor | Statut (enum : idle/prewake/ringing/snoozed/done) |
sensor.<nom>_prochain_reveil |
sensor | Date/heure du prochain réveil (timestamp) |
sensor.<nom>_snooze_count |
sensor | Snoozes utilisés (cycle en cours) |
sensor.<nom>_total_declenchements |
sensor | Déclenchements totaux (diagnostic) |
sensor.<nom>_total_snoozes |
sensor | Snoozes totaux (diagnostic) |
sensor.<nom>_total_stops |
sensor | Stops totaux (diagnostic) |
sensor.<nom>_dernier_reveil |
sensor | Dernier réveil (diagnostic) |
button.<nom>_stop |
button | Arrêter le réveil |
button.<nom>_sauter_prochain |
button | Sauter le prochain réveil (config) |
button.<nom>_reset |
button | Reset de l'état (diagnostic) |
button.<nom>_declencher |
button | Déclencher manuellement |
number.<nom>_snooze_min |
number | Durée du snooze |
number.<nom>_max_snooze |
number | Nombre max de snooze |
number.<nom>_pre_chauffage_min |
number | Pré-chauffage avant (min) |
number.<nom>_aube_min |
number | Durée simulation aube (min) |
number.<nom>_duree_eclairage_min |
number | Durée éclairage progressif (min) |
number.<nom>_luminosite_max |
number | Luminosité maximale |
number.<nom>_escalade_min |
number | Escalade après (min) |
number.<nom>_volume_initial |
number | Volume initial musique |
number.<nom>_volume_final |
number | Volume final musique |
number.<nom>_cafe_avant_min |
number | Café avant (min) |
binary_sensor.<nom>_sonne_aujourd_hui |
binary_sensor | Sonne aujourd'hui |
binary_sensor.<nom>_reveil_en_cours |
binary_sensor | Réveil en cours |
binary_sensor.<nom>_jour_ferie |
binary_sensor | Jour férié |
binary_sensor.<nom>_weekend |
binary_sensor | Weekend |
binary_sensor.<nom>_vacances_scolaires |
binary_sensor | Vacances scolaires |
| Service | Description |
|---|---|
smartwake.declencher |
Déclenche manuellement le cycle de réveil |
smartwake.snooze |
Active le snooze |
smartwake.stop |
Arrête immédiatement le cycle |
smartwake.sauter_prochain |
Saute le prochain réveil |
smartwake.reset |
Remet à zéro l'état |
smartwake.bilan_hebdo |
Génère et envoie un bilan de sommeil hebdomadaire via AI Task |
| Besoin | Intégration HA |
|---|---|
| Jours fériés FR | Workday (natif) |
| Vacances scolaires FR | Calendrier ICS (intégration Calendar) |
| Musique | Spotify, Music Assistant, Radio Browser, Sonos/Cast |
| TTS briefing | Piper (local), Google TTS, Assist |
| Capteur de sommeil | Withings, Sleep as Android (MQTT) |
| Boutons physiques | Zigbee (IKEA/Aqara), tag NFC |
| AI Task | Ollama (local), Anthropic, Google, OpenAI |
| Carte dashboard | smartwake-card |
| Interface | Carte Mushroom, custom:alarm-clock-card |
Le composant a été audité (revue de code défensive + SAST).
- Bandit : 0 finding
- Semgrep : 0 finding
- Secrets : 0 finding
- Contrôle d'accès strict :
entity_registry(match parconfig_entry_id) - Validation des entrées : slugify (accents), regex heure
^\d{1,2}:\d{2}$+ bornes - Anti-injection de prompt IA : séparation instructions / données contextuelles
- Principe de moindre privilège : AI Task sans accès aux services HA
- Logbook sans fuite : pas de détails sensibles (RDV, heures exactes)
- L'IA ne déclenche jamais la sonnerie :
timetrigger déterministe
Ouvrez une issue sur https://github.com/junkoku38/smartwake/issues
34 tests unitaires (pytest) couvrant :
_jours_actifs(tous, semaine, weekend, jour unique, personnalisé vide/plein)_parse_heure(valide, minuit, invalide)- Coordinator (activation, désactivation, set_heure, set_jours, snooze max, skip, reset)
_sonne_aujourd_hui(semaine, weekend, mode vacances, skip)- Validation nom (slugify, accents)
- Validation heure notification (valide, invalide, injection)
- AI module (désactivé, fallback)
MIT

