Patrick Schurig dd24cda445 feat(prévision PV): forecastLearning porte le GTI observé — migration etm67 en place
Trois colonnes nullables : gtiObserved (W/m²), gtiObservedSource
(openmeteo-satellite-state), gtiObservedAt (observedGtiTime tel que publié).
Rattachées au pas [T − 1 h, T) : même convention que gti prévu (§14.3),
Open-Meteo horodatant une moyenne horaire à la fin de son heure.

L'observation arrive 1 à 4 h après l'écriture du pas : elle complète la ligne
existante par un UPDATE ciblé — ces trois colonnes seulement, seulement si
gtiObserved IS NULL. Seule exception à « une ligne n'est jamais réécrite » ;
elle ne crée jamais de ligne. Encore en tampon, elle entre par l'INSERT.

Une table de forme etm67 exacte est migrée par ALTER TABLE ADD COLUMN dans une
transaction : lignes conservées, nouvelles colonnes NULL. Le mécanisme « forme
inattendue → refaite » ne vaut plus que pour les autres formes.

Tests loadmodel : migration d'une base écrite par le code etm67 lui-même
(fixture data/energy-forecast-etm67.sqlite), rattachement, retard, nuit à 0,
valeur jamais remplacée, aucun autre champ touché.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 10:21:18 +02:00

21 lines
823 B
Prolog

include(../common/common.pri)
include(../../../energyplugin/energyplugin.pri)
CONFIG += testcase
TARGET = nymea-energy-loadmodel
# Cible VOLONTAIREMENT légère : aucun serveur nymea, aucun EnergyTestBase.
# La table de paliers et sameHardware() sont de la logique pure — les éprouver ici les rend
# rejouables en quelques millisecondes, là où la suite de simulation coûte un serveur complet
# par test (cf. AGENTS.md, « NE JAMAIS lancer la suite de simulation en un seul processus »).
HEADERS += testloadmodel.h
SOURCES += testloadmodel.cpp
# Une base energy-forecast.sqlite ÉCRITE PAR etm67 (b7317f3) : la migration s'éprouve sur le
# vrai fichier, pas sur une imitation (testTheLearningLogMigratesAnEtm67TableInPlace).
RESOURCES += loadmodel.qrc
target.path = $$[QT_INSTALL_PREFIX]/bin
INSTALLS += target