Resumen de las PRs en curso que me conciernen

Hola @pierre-gilles,

Gracias por fusionar #3270: la CI ya no fallará los días de cambio de hora :folded_hands:

Aquí está el estado de mis otras 10 PRs abiertas en Gladys. Todas están listas para fusionarse, sin conflictos con master. Cursor ha aprobado las últimas versiones de 9 de ellas. #3200 aún espera una revisión después del rebase.

El único error en su CI es la prueba de la curva del sol, la corregida por #3270: sus ramas aún no contienen la corrección. Desaparecerá en el próximo rebase.

:warning: Otra prueba fallará pronto, sin relación con la hora: la de los calendarios de energía (calendar.test.js) publica una fecha fija de 2022. Fallará a partir del 01/01/2027, cuando esta fecha salga de la ventana de 5 años.

:thermometer: Termostato: correcciones (comentarios de @mutmut)

  • #3268 – fix: fin de la excepción en el momento correcto a pesar del cambio de hora
    Una excepción « hasta el próximo intervalo » terminaba una hora demasiado temprano o tarde cuando la hora cambiaba entre tanto. Las bandas también muestran el día del intervalo cuando no es hoy. Este día se calcula por el servidor en la zona horaria de Gladys, no en la del teléfono.
    :white_check_mark: Aprobado por Cursor. Los comentarios de CodeRabbit están tratados o han recibido una respuesta.
  • #3269 – fix: la excepción sigue las modificaciones del horario
    Si se modifica el horario durante una excepción « hasta el próximo intervalo », su fin se recalcula en el nuevo próximo intervalo. Una excepción ya expirada no se reinicia. Un horario vacío recibe la duración por defecto.
    :white_check_mark: Aprobado por Cursor, comentarios de CodeRabbit tratados.

:thermometer: Termostato: funcionalidades

Para fusionar en este orden, ya que se apilan: #3200 → #3201 → #3218. Luego #3219, #3225 y #3258, en el orden que se quiera.

  • #3200 – aire acondicionado, varias sondas, filtro por habitación
    Control de los aires acondicionados (air-conditioning, modo y encendido/apagado), promedio de varias sondas de temperatura, selectores filtrados por habitación. También se añade la funcionalidad « preset activo », con su migración, para activar escenas cuando el horario cambia de preset. Finalmente, una bomba de calor encendida por el mando a distancia durante un intervalo « Apagado » crea una excepción hasta el próximo intervalo.
    :yellow_circle: Rebasado, en espera de una nueva revisión de Cursor.
  • #3201 – radiadores fil piloto
    :white_check_mark: Aprobado por Cursor.
  • #3218 – retraso antes de apagar la calefacción cuando se abre una ventana
    :white_check_mark: Aprobado por Cursor, comentarios de CodeRabbit tratados. Tu decisión: el retraso por defecto, fijado a 60 s por ahora.
  • #3219 – cambiar el horario de los termostatos desde una escena
    :white_check_mark: Aprobado por Cursor.
  • #3225 – animación de la escala hacia la nueva consigna
    :white_check_mark: Aprobado por Cursor.
  • #3258 – opción « Todo el día » en los intervalos del horario
    :white_check_mark: Aprobado por Cursor.

:spiral_calendar: Escenas

  • #3015 – desencadenante « intervalos horarios »
    Un horario semanal completo cabe en una sola escena. Se lanza al inicio y al final de cada intervalo (incluyendo aquellos que pasan la medianoche), con una condición scene.in-time-range.
    :white_check_mark: Rebasado (conflictos resueltos con las novedades de las escenas), traducción al español añadida, aprobado por Cursor.

:ocean: Dashboard

  • #3028 – widget de las mareas
    Reloj de mareas, próxima pleamar y bajamar, altura del agua actual, curva del día y pestañas de 7 días. El coeficiente se muestra en las costas francesas. El cálculo se hace localmente, una vez descargados los datos de la estación.
    Por ahora he dejado esta PR abierta porque, a pesar de la integración que he hecho a nivel gráfico, aún no puedo hacer lo que quiero con las integraciones externas.

Gracias !

:alarm_clock: Anexo: una prueba que fallará el 31/12/2026

En resumen: a partir del 31/12/2026 a medianoche (hora de París), el trabajo « Server test » estará rojo en todas las PRs y en master, debido a una sola prueba. El código es correcto, es la prueba la que depende de la fecha del día. Es el mismo tipo de problema que la prueba del sol corregida por #3270.

La prueba afectada
server/test/lib/energy-contract/manager/calendar.test.js (alrededor de la línea 292), añadida con los contratos de energía (#3130). Verifica que el relleno inicial de un calendario de tarifas solo recalcula los costes a partir del inicio del primer contrato (01/01/2025). Para ello, publica un color Tempo con una fecha fija:

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

Por qué fallará
calendar.publish.js rechaza las fechas de más de 5 años (PAST_WINDOW_MS = 5 * 365 días), lo cual es intencional. Pero la ventana avanza cada día mientras que la fecha de la prueba es fija:

  • El 01/01/2022 en París comienza a 2021-12-31T23:00Z.
  • La ventana cuenta 1 825 días, sin los años bisiestos.
  • Entre el 01/01/2022 y el 01/01/2027 hay 1 826 días, porque 2024 es bisiesto.

La fecha sale de la ventana el 30/12/2026 a las 23:00 UTC. La publicación es entonces rechazada con starts_at must be between 5 years ago and 7 days ahead.

Verificado ejecutando esta prueba en master con el reloj desplazado:

Reloj Resultado
30/12/2026 22:58 UTC :white_check_mark: 10 pruebas pasan
30/12/2026 23:01 UTC :cross_mark: 1 fallo

Posibles correcciones

  1. Acercar la fecha (por ejemplo 2024-06-01): una línea para cambiar, pero el problema vuelve a mediados de 2029.
  2. Congelar el reloj durante esta prueba con los temporizadores falsos de sinon (shouldAdvanceTime, ya que la prueba también se basa en un retraso real): la prueba ya no depende del día en que se ejecuta.

Propongo la 2, en una pequeña PR aparte. Puedo encargarme de ello si quieres.

Hola @Will_71,

¡Gracias por el gran trabajo y por el resumen muy claro!

He revisado tus 10 PRs: revisión del código, más una prueba de la interfaz en cada rama, con dispositivos simulados (MQTT para las ventanas y el cable piloto). Todo está publicado como comentario en cada PR de GitHub. En general, funciona realmente bien. Aquí están los puntos principales:

  • #3268 / #3269 : OK. Queda un punto por corregir en cada una: el rótulo « mañana » sigue apareciendo después de la medianoche, y una excepción de 30 minutos puede extenderse hasta el próximo punto del horario.
  • #3200 : el aire acondicionado, el promedio de los sensores y el filtro por habitación funcionan bien. Sin embargo, una parada del aire acondicionado mal interpretada (time-out, corte de energía, control remoto en un intervalo de Off) puede detener el termostato definitivamente. Pequeño detalle también: un Confort a 21 °C por defecto en modo aire acondicionado, es frío.
  • #3201 : genial en la interfaz. Solo un problema real: una vez que el radiador se detiene desde el módulo, ya no se puede reiniciar desde el módulo.
  • #3218 : OK. Solo hay que limitar el retraso, porque un valor enorme hace desbordar el temporizador.
  • #3219 : OK. La prueba « servicio detenido » no funciona, y el resumen de la tarjeta muestra la identificación bruta del horario.
  • #3225 : OK, solo un poco de acabado.
  • #3258 : « Copiar a » un día en « Todo el día » corta el calefacción el resto del día. Esto debe corregirse antes de fusionar, ya que es el uso típico para las vacaciones.
  • #3015 : problema en el cambio de hora para los intervalos que comienzan o terminan entre las 2 h y las 3 h, y un error de entrada en el editor (las líneas se reordenan mientras se escribe).
  • #3028 : como decías, es mejor pasar por una integración externa. He anotado en la revisión lo que habrá que retomar en el momento del puerto.

Dos comentarios generales:

  • Cada PR pasa sola a master, pero #3200, #3201 y #3218 entran en conflicto entre sí. Al rebase, algunas líneas no serán señaladas por git pero romperán; las he listado en las revisiones.
  • El « Server test » rojo en todas las PRs proviene de la prueba de la curva solar en el cambio de hora, corregida por #3270. Una fusión de master es suficiente.

¡Muchas gracias, es una gran contribución al termostato! :folded_hands:

Gracias por tus comentarios. Me ocuparé de ello lo antes posible.

Para las PR que entren en conflicto, sí, estaba previsto, pero no quería mezclar, sabiendo que las solicitudes y errores llegaron a medida que se realizaban las pruebas, por lo que cada PR no se abrió al mismo tiempo.

Te mantendré informado en cuanto avance.

Para la PR sobre las mareas, la integración externa ya se ha publicado desde hace varios días, pero he dejado la PR abierta por ahora debido a ciertos puntos gráficos que no puedo reproducir.