Skip to content
junkoku38Public

About

SmartWAKE — réveil domotique intelligent pour Home Assistant

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Repository files navigation

SmartWAKE

Réveil progressif pour Home Assistant : lumière, musique, volets et chauffage, avec assistance IA optionnelle.

Page de l'intégration

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).

Configuration simplifiée

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.

Fonctionnalités

Planification

  • 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 calendar entity (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)

Pré-réveil (la maison se prépare avant vous)

  • 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

Réveil (à l'heure H)

  • 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.

Contrôles pendant la sonnerie

  • 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_snooze expose 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

Intelligence contextuelle

  • 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_bed Withings. 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 — un binary_sensor.<...>_in_bed Withings passe à unknown la 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_travail est 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

AI Task (HA ≥ 2025.8, optionnel)

  • 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_hebdo ou 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_ia pour 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.

Entités créées

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 :

Contrôles

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

Sondes supervisables (binary_sensor)

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)

État et statistiques (sensors)

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

Réglages (number)

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_reveil est la seule source fiable de l'heure qui sonnera : time.<nom>_heure n'est que l'heure de référence, et peut être décalée par le mode par_jour ou l'agenda adaptatif.

Events HA (pour automatisations externes)

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)

Robustesse

  • 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:MM depuis 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

Assist / commande vocale (LLM Tool Calling)

  • « 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

Tester les tâches IA

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.

Auto-détection à la création

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.

Icône dans Home Assistant

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.

Installation

Via HACS (recommandé)

  1. Ajoutez ce dépôt dans HACS :
    • HACS → Integrations → ⋮ → Custom repositories
    • URL : https://github.com/junkoku38/smartwake
    • Category : Integration
  2. Cliquez Install sur "SmartWAKE"
  3. Redémarrez Home Assistant
  4. Paramètres → Appareils & Services → Ajouter une intégration → cherchez "SmartWAKE"

Custom card (dashboard)

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és créées (par réveil)

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

Services

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

Intégrations recommandées

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

Sécurité

Le composant a été audité (revue de code défensive + SAST).

Scanners

  • Bandit : 0 finding
  • Semgrep : 0 finding
  • Secrets : 0 finding

Mesures de sécurité

  • Contrôle d'accès strict : entity_registry (match par config_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 : time trigger déterministe

Signaler une vulnérabilité

Ouvrez une issue sur https://github.com/junkoku38/smartwake/issues

Tests

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)

Licence

MIT

About

SmartWAKE — réveil domotique intelligent pour Home Assistant

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages