specs: record acceptance criteria status and remaining gaps

This commit is contained in:
Patrick Schurig 2026-07-31 10:33:49 +02:00
parent 89406495a8
commit 372be1644c

View File

@ -359,20 +359,62 @@ confirmation humaine au moment de l'implémentation.
## Tableau de statut
Suite : `sunspec/tests/`, **38 tests, 38 verts**.
Build : `qmake6 NYMEA_SUNSPEC_PATH=<sysroot> sunspec/tests/tests.pro && make check`.
Sans `NYMEA_SUNSPEC_PATH`, `sunspec.pri` résout `libnymea-sunspec` par
`pkg-config`, ce qui suppose `libnymea-sunspec-dev` installé système.
| AC | Objet | Test | Statut |
|---|---|---|---|
| AC-1 | plage −100…+100 | `test_AC_1_*` | à renseigner |
| AC-2 | lecture `inWRte`/`outWRte` | `test_AC_2_*` | à renseigner |
| AC-3 | `enableDischarging` relu | `test_AC_3_*` | à renseigner |
| AC-4 | `RvrtTms` écrit en dernier | `test_AC_4_*` | à renseigner |
| AC-5 | filtre fabricant | `test_AC_5_*` | à renseigner |
| AC-6 | little-endian | `test_AC_6_*` | à renseigner |
| AC-7 | paramètres `froniusConnection` | `test_AC_7_*` | à renseigner |
| AC-8 | plancher 7 s | `test_AC_8_*` | à renseigner |
| AC-9 | registres interdits | `test_AC_9_*` | à renseigner |
| AC-10 | `revertTime` 300 s | `test_AC_10_*` | à renseigner |
| AC-11 | table mode → registres | `test_AC_11_*` | à renseigner |
| AC-12 | relecture du SF | `test_AC_12_*` | à renseigner |
| AC-13 | relecture + `controlHealthy` | `test_AC_13_*` | à renseigner |
| AC-14 | classement par `IDStr` | `test_AC_14_*` | à renseigner |
| AC-15 | agrégats modèle 160 | `test_AC_15_*` | à renseigner |
| AC-1 | plage −100…+100 | `test_AC_1_*` | vert |
| AC-2 | lecture `inWRte`/`outWRte` | `test_AC_2_*` | vert |
| AC-3 | `enableDischarging` relu | `test_AC_3_*` | vert |
| AC-4 | `RvrtTms` écrit en dernier | `test_AC_4_*` | vert |
| AC-5 | filtre fabricant | `test_AC_5_*` | vert |
| AC-6 | little-endian | `test_AC_6_*` | vert — mais c'est une **inférence** (H-3), pas une mesure |
| AC-7 | paramètres `froniusConnection` | `test_AC_7_*` | vert |
| AC-8 | plancher 7 s | `test_AC_8_*` | vert, avec réserve ci-dessous |
| AC-9 | registres interdits | `test_AC_9_*` | vert |
| AC-10 | `revertTime` 300 s | `test_AC_10_*` | vert |
| AC-11 | table mode → registres | `test_AC_11_*` | vert au niveau du plan ; **aucune action n'expose encore les six modes** |
| AC-12 | relecture du SF | `test_AC_12_*` | vert |
| AC-13 | relecture + `controlHealthy` | `test_AC_13_*` | vert |
| AC-14 | classement par `IDStr` | `test_AC_14_*` | vert ; **non branché** — modèle 160 toujours absent du `switch` (anomalie A5, hors périmètre) |
| AC-15 | agrégats modèle 160 | `test_AC_15_*` | idem AC-14 |
### Réserves à lever
- **AC-8** — le minuteur d'interrogation de nymea est **global au plugin**, pas
par connexion. Le plancher est donc appliqué à l'échelle du plugin dès qu'une
connexion `fronius` est configurée : c'est plus strict que l'AC, jamais moins.
Le paramètre `updateInterval` par thing a été **retiré** de
`froniusConnection` : l'architecture du plugin ne peut pas l'honorer par
connexion, et un réglage sans effet serait pire que son absence.
- **AC-11** — la fonction `FroniusRules::planBatteryMode()` produit exactement
la table du contrat, et le plan est exécutable par
`IntegrationPluginSunSpec::executeSetpointPlan()`. Il manque l'action nymea
qui l'appelle : le nommage de cette action et de ses paramètres n'est pas
tranché par le contrat.
- **AC-14 / AC-15** — les fonctions de classement et d'agrégation sont écrites
et testées, mais aucun thing du modèle 160 n'est créé tant que l'anomalie A5
(`ModelIdMppt` absent du `switch` de `processDiscoveryResult()`) n'est pas
corrigée. A5 est hors du périmètre des quatre correctifs demandés.
- **AC-15.4** — respecté par construction : aucun calcul de production PV par
différence n'a été ajouté.
### Multi-unit-ID (H-1)
**Non implémenté.** `froniusConnection` porte bien le paramètre `meterSlaveId`
(AC-7, vert), mais le plugin n'instancie encore qu'une seule `SunSpecConnection`
par thing. Le passage à deux connexions internes touche `m_sunSpecConnections`,
`createConnection()`, `setupThing()`, `processDiscoveryResult()`,
`thingRemoved()`, `postSetupThing()` et `onRefreshTimer()`.
Deux raisons de ne pas l'avoir fait dans la foulée : la décision D1 n'est pas
validée, et le brief demande explicitement de traiter ce lot **isolément**,
après que le reste soit fonctionnel sur l'onduleur seul. S'y ajoute H-4 : rien
ne dit que l'onduleur accepte deux connexions TCP simultanées, et le
constructeur recommande des requêtes séquentielles. Ce point se mesure au banc ;
le supposer serait exactement le mode de défaillance que le contrat cherche à
éviter.