From 372be1644c286a1bd640ab14266e775896da75e4 Mon Sep 17 00:00:00 2001 From: Patrick Schurig Date: Fri, 31 Jul 2026 10:33:49 +0200 Subject: [PATCH] specs: record acceptance criteria status and remaining gaps --- specs/fronius-sunspec.md | 72 +++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 15 deletions(-) diff --git a/specs/fronius-sunspec.md b/specs/fronius-sunspec.md index 1ac1494..63612c9 100644 --- a/specs/fronius-sunspec.md +++ b/specs/fronius-sunspec.md @@ -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= 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.