Résumé des PRs me concernant en cours

Salut @pierre-gilles,

Merci d’avoir mergé #3270 : la CI ne cassera plus les jours de changement d’heure :folded_hands:

Voici où en sont mes 10 autres PRs ouvertes sur Gladys. Elles sont toutes fusionnables, sans conflit avec master. Cursor a approuvé les dernières versions de 9 d’entre elles. #3200 attend encore sa relecture après le rebase.

Le seul rouge de leur CI est le test de la courbe du soleil, celui corrigé par #3270 : leurs branches ne contiennent pas encore la correction. Il disparaîtra au prochain rebase.

:warning: Un autre test va casser bientôt, sans rapport avec l’heure : celui des calendriers d’énergie (calendar.test.js) publie une date de 2022 en dur. Il échouera à partir du 01/01/2027, quand cette date sortira de la fenêtre des 5 ans.

:thermometer: Thermostat : corrections (retours de @mutmut)

  • #3268 – fix : fin de dérogation au bon moment malgré le changement d’heure
    Une dérogation « jusqu’au prochain créneau » se terminait une heure trop tôt ou trop tard quand l’heure changeait entre-temps. Les bandeaux affichent aussi le jour du créneau quand ce n’est pas aujourd’hui. Ce jour est calculé par le serveur dans le fuseau de Gladys, pas dans celui du téléphone.
    :white_check_mark: Approuvée par Cursor. Les remarques de CodeRabbit sont traitées ou ont reçu une réponse.
  • #3269 – fix : la dérogation suit les modifications du planning
    Si on modifie le planning pendant une dérogation « jusqu’au prochain créneau », sa fin est recalculée sur le nouveau prochain créneau. Une dérogation déjà expirée n’est pas relancée. Un planning vidé reçoit la durée par défaut.
    :white_check_mark: Approuvée par Cursor, retours CodeRabbit traités.

:thermometer: Thermostat : fonctionnalités

À merger dans cet ordre, car elles s’empilent : #3200 → #3201 → #3218. Ensuite #3219, #3225 et #3258, dans l’ordre qu’on veut.

  • #3200 – clim, plusieurs sondes, filtre par pièce
    Pilotage des climatisations (air-conditioning, mode et marche/arrêt), moyenne de plusieurs sondes de température, sélecteurs filtrés par pièce. Ajoute aussi la fonctionnalité « preset actif », avec sa migration, pour déclencher des scènes quand le planning change de preset. Enfin, une PAC allumée à la télécommande pendant un créneau « Arrêt » crée une dérogation jusqu’au prochain créneau.
    :yellow_circle: Rebasée, en attente d’une nouvelle relecture de Cursor.
  • #3201 – radiateurs fil pilote
    :white_check_mark: Approuvée par Cursor.
  • #3218 – délai avant de couper le chauffage quand une fenêtre s’ouvre
    :white_check_mark: Approuvée par Cursor, retours CodeRabbit traités. Ta décision : le délai par défaut, fixé à 60 s pour l’instant.
  • #3219 – changer le planning des thermostats depuis une scène
    :white_check_mark: Approuvée par Cursor.
  • #3225 – animation de la jauge vers la nouvelle consigne
    :white_check_mark: Approuvée par Cursor.
  • #3258 – option « Toute la journée » dans les plages du planning
    :white_check_mark: Approuvée par Cursor.

:spiral_calendar: Scènes

  • #3015 – déclencheur « plages horaires »
    Un planning hebdomadaire complet tient dans une seule scène. Elle se lance au début et à la fin de chaque plage (y compris celles qui passent minuit), avec une condition scene.in-time-range.
    :white_check_mark: Rebasée (conflits résolus avec les nouveautés des scènes), traduction espagnole ajoutée, approuvée par Cursor.

:ocean: Dashboard

  • #3028 – widget des marées
    Horloge de marée, prochaines pleine et basse mer, hauteur d’eau actuelle, courbe du jour et onglets sur 7 jours. Le coefficient s’affiche sur les côtes françaises. Le calcul se fait en local, une fois les données de la station téléchargées.
    J’ai pour l’instant laisser cette PR ouverte car malgré l’intégration que j’ai faite au niveau graphique je ne peux pas encore faire ce que je veux avec les intégrations externe.

Merci !

:alarm_clock: Annexe : un test qui va casser le 31/12/2026

En bref : à partir du 31/12/2026 à minuit (heure de Paris), le job « Server test » sera rouge sur toutes les PRs et sur master, à cause d’un seul test. Le code est correct, c’est le test qui dépend de la date du jour. C’est la même famille de problème que le test du soleil corrigé par #3270.

Le test concerné
server/test/lib/energy-contract/manager/calendar.test.js (vers la ligne 292), ajouté avec les contrats d’énergie (#3130). Il vérifie que le remplissage initial d’un calendrier de tarifs ne recalcule les coûts qu’à partir du début du premier contrat (01/01/2025). Pour ça, il publie une couleur Tempo avec une date en dur :

await energyContract.publishCalendarEntries('tempo', [{ date: '2022-01-01', value: 'blue' }], ...);

Pourquoi il va casser
calendar.publish.js refuse les dates de plus de 5 ans (PAST_WINDOW_MS = 5 * 365 jours), ce qui est voulu. Mais la fenêtre avance chaque jour alors que la date du test est fixe :

  • Le 01/01/2022 à Paris commence à 2021-12-31T23:00Z.
  • La fenêtre compte 1 825 jours, sans les années bissextiles.
  • Entre le 01/01/2022 et le 01/01/2027, il y a 1 826 jours, car 2024 est bissextile.

La date sort donc de la fenêtre le 30/12/2026 à 23:00 UTC. La publication est alors refusée avec starts_at must be between 5 years ago and 7 days ahead.

Vérifié en lançant ce test sur master avec l’horloge décalée :

Horloge Résultat
30/12/2026 22:58 UTC :white_check_mark: 10 tests passent
30/12/2026 23:01 UTC :cross_mark: 1 échec

Corrections possibles

  1. Rapprocher la date (par exemple 2024-06-01) : une ligne à changer, mais le problème revient mi-2029.
  2. Figer l’horloge pendant ce test avec les faux timers de sinon (shouldAdvanceTime, car le test s’appuie aussi sur un vrai délai) : le test ne dépend plus du jour où il tourne.

Je propose la 2, dans une petite PR à part. Je peux m’en occuper si tu veux.

Salut @Will_71,

Merci pour ce gros travail, et pour le récap très clair !

J’ai fait une review de tes 10 PRs : relecture du code, plus un test de l’interface sur chaque branche, avec des appareils simulés (MQTT pour les fenêtres et le fil pilote). Tout est posté en commentaire sur chaque PR GitHub. Dans l’ensemble, ça fonctionne vraiment bien. Voici les points principaux :

  • #3268 / #3269 : OK. Il reste un point à corriger sur chacune : le libellé « demain » reste affiché après minuit, et une dérogation de 30 min peut être prolongée jusqu’au prochain point du planning.
  • #3200 : la clim, la moyenne des capteurs et le filtre par pièce marchent bien. En revanche, un arrêt de la clim mal interprété (timeout, coupure de courant, télécommande sur un créneau Off) peut arrêter le thermostat définitivement. Petit point aussi : un Confort à 21 °C par défaut en mode climatisation, c’est froid.
  • #3201 : top dans l’interface. Un seul vrai souci : une fois le radiateur arrêté depuis le module, on ne peut plus le relancer depuis le module.
  • #3218 : OK. Il faut juste borner le délai, car une valeur énorme fait déborder le timer.
  • #3219 : OK. Le test « service arrêté » ne marche pas, et le résumé de la carte affiche l’identifiant brut du planning.
  • #3225 : OK, juste un peu de finition.
  • #3258 : « Copier vers » un jour en « Toute la journée » coupe le chauffage le reste de la journée. C’est à corriger avant de merger, vu que c’est l’usage typique pour les vacances.
  • #3015 : souci au changement d’heure pour les plages qui commencent ou finissent entre 2 h et 3 h, et un bug de saisie dans l’éditeur (les lignes se réordonnent pendant qu’on tape).
  • #3028 : comme tu le disais, il vaut mieux passer par une intégration externe. J’ai noté dans la review ce qu’il faudra reprendre au moment du portage.

Deux remarques générales :

  • Chaque PR passe seule sur master, mais #3200, #3201 et #3218 entrent en conflit entre elles. Au rebase, certaines lignes ne seront pas signalées par git mais casseront ; je les ai listées dans les reviews.
  • Le « Server test » rouge sur toutes les PRs vient du test de la courbe solaire au changement d’heure, corrigé par #3270. Un merge de master suffit.

Encore merci, c’est une super contribution au thermostat ! :folded_hands:

Merci pour tes retours. Je m’en occupe au plus vite.

Pour les PR qui seront en conflit, oui c’était prévu mais je ne voulais pas mélanger, sachant que les demandes et bugs sont arrivés au fil des essais donc chaque PR ne se sont pas ouvertes en même temps.

Je te tiens informé dès que j’ai avancé.

Pour la PR sur les marées, l’intégration externe est déjà publiée depuis plusieurs jours maintenant mais je laissée le PR ouverte pour l’instant par rapport à certains points graphiques que je ne peux pas reproduire.