Skip to content

Home Assistant : consigne des thermostats - #30

Open
NeuTroNBZh wants to merge 2 commits into
lfpoulain:betafrom
NeuTroNBZh:ha-thermostat-consigne
Open

NeuTroNBZh wants to merge 2 commits into
lfpoulain:betafrom
NeuTroNBZh:ha-thermostat-consigne

Conversation

@NeuTroNBZh

@NeuTroNBZh NeuTroNBZh commented Nov 8, 2026 •

Copy link
Copy Markdown
Contributor

Ticket : #29

But

« Mets le bureau à 20 degrés » : régler la consigne d'un thermostat Home Assistant, sans rien d'autre (ni mode, ni ventilation).

Ce qui change

  • Nouveau réglage Modules → Home Assistant → Régler les thermostats, désactivé par défaut : un thermostat déjà coché pour être lu ne devient pas réglable à la mise à jour. Il s'agit du champ climateControl de PATCH /api/admin/home-assistant/access et de la vue, conservé dans la table home_assistant_climate (migration rejouable, ajoutée en fin de liste). Il survit à « Supprimer la connexion », comme « Réserver aux personnes reconnues ».
  • Nouvel outil home_assistant__climate (entityId, temperature de 5 à 35 °C), proposé seulement si le réglage est actif et qu'un climate.* est coché. Sa description donne la plage de chaque thermostat.
  • La consigne est ramenée au pas (target_temp_step ; absent ou nul : 0,5) et à la plage (min_temp, max_temp), envoyée par climate/set_temperature sans relance, puis confirmée par relecture de l'attribut temperature (tolérance d'un demi-degré quand le pas n'est pas annoncé). La valeur relue est renvoyée pour être redite. Après un accusé 2xx, une relecture impossible donne « Consigne acceptée ; lecture de l'état impossible ».
  • Refusé sans appel : réglage désactivé, thermostat non coché, thermostat arrêté (off, pour ne pas le rallumer en douce), thermostat réglé par une plage seule (target_temp_low/target_temp_high, message explicite), valeur hors schéma, paramètre en plus (un mode, par exemple). La garde « Réserver aux personnes reconnues » s'applique aussi.
  • Les thermostats restent lisibles par home_assistant__read. min_temp, max_temp et target_temp_step rejoignent les attributs utiles.
  • Consigne de délégation : lire la consigne avant « monte de deux degrés ».
  • Documentation (Home Assistant, administration, prompts.md, architecture.md ; bornes en °C) et CHANGELOG.md. Type homeAssistantAccess de web/api.ts complété.

Vérifications

  • Rebasée sur beta (0.3.0).
  • npm run check : OK.
  • tests/home-assistant.test.ts, home-assistant-api.test.ts, storage.test.ts, live.test.ts : 100/100, dont 4 tests sur les thermostats (désactivé par défaut puis activé ; pas et plage appliqués ; lecture conservée ; refus sans appel ; pas nul et thermostat qui arrondit au degré ; plage seule ; relecture impossible après accusé ; personnes reconnues) et 1 sur le fragment homeClimate de la configuration Live.
  • Pas encore essayé sur mes thermostats : je le ferai et je compléterai la PR.

Indépendante de #26 et #28.

Copilot AI balanced review requested due to automatic review settings November 8, 2026 22:21

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

@lfpoulain

Copy link
Copy Markdown
Owner

Merci Louis, c'est la PR la plus propre côté autorisations : run() applique la garde « personnes reconnues » avant setTemperature, authorized() exige enabled, climateControl, une entité cochée et le domaine climate, et home_assistant__control ne peut toujours pas toucher un climate. Réglage désactivé par défaut, valeur ramenée à la plage et au pas, relecture, jamais de changement de mode : c'est exactement l'issue. Il reste surtout de la doc et des détails.

À corriger

  1. Doc incohérente (docs/fonctionnalites/home-assistant.md) : « Deux interrupteurs règlent l'accès » est suivi de trois puces. « Cornelius ne peut utiliser que les deux actions marche et arrêt, et la luminosité » est désormais faux. La liste de ce que « Supprimer la connexion » conserve ne cite pas climateControl, alors que le code le conserve. docs/developpement/prompts.md:28 et architecture.md:134 ne mentionnent pas home_assistant__climate.
  2. Type faux (web/api.ts) : homeAssistantAccess n'a pas climateControl. Cela compile grâce au spread, mais le type ne dit pas la vérité.
  3. Tests manquants : la garde « personnes reconnues » avec home_assistant__climate, et le fragment de prompt homeClimate de server/live/configuration.ts.

À améliorer, moins urgent

  • Message d'erreur trompeur : dans setTemperature, si la relecture échoue après un accusé 2xx, le message est « Envoi interrompu ; exécution incertaine », alors que execute() dit « Commande acceptée ; lecture impossible ». Ici accepted n'est pas suivi.
  • target_temp_step : si l'attribut manque, le pas par défaut est 0,5, donc un thermostat au pas de 1 pourrait ne pas confirmer. Un pas à 0 donnerait NaN, sérialisé en null, puis refusé par Home Assistant.
  • Thermostat en plage seule : un thermostat qui n'accepte que target_temp_low et target_temp_high est refusé en 4xx, avec un message générique.
  • Unités : les bornes 5 à 35 sont en °C. Une installation Home Assistant en °F serait incohérente. Une ligne dans la doc suffit.

Rebase

beta a avancé (#26, #34, #36, #38, 0.3.0). Conflits attendus sur CHANGELOG.md, tests/home-assistant.test.ts et la doc, plus server/home-assistant.ts et shared/home-assistant.ts avec #32 (garde les deux champs de la vue), et server/storage.ts avec #28. Je te suggère de faire passer #32 avant #30, puis #28 en dernier.

@lfpoulain lfpoulain added home-assistant Intégration Home Assistant modifications demandées Relue : des corrections sont attendues avant la fusion à rebaser À mettre à jour depuis la branche beta labels Nov 9, 2026
NeuTroNBZh and others added 2 commits November 9, 2026 16:07
Nouvel outil home_assistant__climate, proposé seulement si le nouveau
réglage « Régler les thermostats » est activé (désactivé par défaut :
un thermostat coché pour être lu ne devient pas réglable). La consigne
est ramenée à min_temp / max_temp et au pas du thermostat, envoyée par
climate/set_temperature puis confirmée par relecture. Un thermostat
arrêté est refusé ; le mode n'est jamais changé. Les thermostats
restent lisibles par home_assistant__read.

Réglage climateControl de PATCH /api/admin/home-assistant/access,
conservé dans la table home_assistant_climate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Doc : trois interrupteurs, actions possibles à jour, « Supprimer la
  connexion » conserve aussi climateControl, unités en °C, thermostats
  en plage et pas absent ; prompts.md et architecture.md citent
  home_assistant__climate ; liste « non pris en charge » à jour.
- web/api.ts : homeAssistantAccess accepte climateControl.
- setTemperature suit accepted : après un accusé 2xx, une relecture
  impossible donne « Consigne acceptée ; lecture de l'état impossible ».
- Pas absent ou nul : arrondi au demi-degré (plus de NaN), relecture
  tolérante d'un demi-degré et valeur relue annoncée.
- Thermostat réglé par une plage seule : refusé avec un message clair,
  rien n'est envoyé.
- Tests : garde « personnes reconnues » avec home_assistant__climate,
  fragment homeClimate de la configuration Live, pas nul et thermostat
  qui arrondit au degré, plage seule, relecture impossible après accusé.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@NeuTroNBZh
NeuTroNBZh force-pushed the ha-thermostat-consigne branch from ee4b1d7 to f230dc4 Compare November 9, 2026 15:14
@NeuTroNBZh

Copy link
Copy Markdown
Contributor Author

Merci pour la relecture. Corrigé dans f230dc4, branche rebasée sur beta (0.3.0) :

À corriger

  1. Doc : « Trois interrupteurs », phrase des actions possibles à jour (consigne si Régler les thermostats est activé), « Supprimer la connexion » cite aussi ce réglage, liste « non pris en charge » à jour ; prompts.md et architecture.md mentionnent home_assistant__climate.
  2. homeAssistantAccess de web/api.ts accepte climateControl.
  3. Tests ajoutés : garde « personnes reconnues » avec home_assistant__climate (outil masqué, appel refusé, rien envoyé) et fragment homeClimate de liveConfiguration.

Moins urgent, fait aussi

  • accepted est suivi : après un 2xx, une relecture impossible donne « Consigne acceptée ; lecture de l'état impossible ».
  • Pas absent ou nul : arrondi au demi-degré (plus de NaN), relecture tolérante d'un demi-degré, et la valeur relue est celle annoncée (testé avec un thermostat factice qui arrondit au degré).
  • Thermostat en plage seule : refusé avant tout envoi avec « Ce thermostat se règle par une plage (minimum et maximum) : Cornelius ne la modifie pas. »
  • Unités : une ligne dans la doc (bornes en °C, installation en °F non prise en charge).

npm run check OK ; home-assistant, home-assistant-api, storage, live : 100/100. Après la fusion de #32, je rebase et je garde les deux champs de la vue.

@lfpoulain

Copy link
Copy Markdown
Owner

Merci pour les corrections, tout ce que j'avais demandé est fait (doc, type, tests, accepted suivi, pas absent). Un nouveau bug est apparu avec la tolérance : sans target_temp_step, elle vaut 0,51 (server/home-assistant.ts:924 et :954). Pour une consigne à 20 et une demande de 20,5, la toute première relecture de l'ancienne valeur suffit à confirmer. Mesuré avec le faux Home Assistant réglé pour ne rien appliquer : « Consigne réglée à 20 °C, confirmée par Home Assistant », alors que rien n'a changé. Piste : en tolérance large, exiger que la valeur relue diffère de la consigne d'avant, ou soit exacte à 0,01 près.

Attention au rebase : #32 est fusionnée, et #30 remet catalog: [...this.entities.values()] dans setAccess. Il faut retirer cette ligne en rebasant, sinon le correctif de #32 est annulé. Garde aussi les deux champs de la vue (newEntities et climateControl).

@lfpoulain

Copy link
Copy Markdown
Owner

Salut Louis, petite relance : il reste le faux positif de la tolérance de 0,51 sans target_temp_step (une relecture de l'ancienne consigne confirme un changement qui n'a pas eu lieu), puis le rebase sur beta. En rebasant, pense à ne pas remettre catalog: [...] dans setAccess (correctif de #32).

Dis-nous si tu comptes la reprendre, ou si tu préfères qu'on s'en charge.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

home-assistant Intégration Home Assistant modifications demandées Relue : des corrections sont attendues avant la fusion à rebaser À mettre à jour depuis la branche beta

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants