etm-powersync-app/test/detection_compteurs_test.dart
Patrick Schurig a6dd319ef2 fix(rôles): le compteur RÉSEAU n'est plus détecté comme compteur solaire
Signalé sur banc après changement de matériel : Fronius SunSpec retiré, Eastron
SDM72 posé en rootMeter et SDM120 en compteur de production. L'écran affichait le
SDM72 dans les DEUX rôles, avec « auto · lecture seule » — donc sans moyen de le
corriger.

La box était juste (`GetRootMeter` rend bien le SDM72) et les interfaces
distinguaient les deux sans ambiguïté :

  Grid / sdm72          : energymeter, smartmeter, connectable
  PV   / sdm120Producer : smartmeterproducer, smartmeter, connectable

C'est notre liste qui ne discriminait pas : le rôle solaire acceptait
`energymeter`, `meter` et `smartmeter` — portées par TOUT compteur, réseau
compris — et ignorait `smartmeterproducer`, la seule qui dise « ce compteur
mesure une production ».

Deux corrections, la seconde tenant même si une future classe déclare des
interfaces trop larges :

- le rôle solaire exige désormais une interface de production ;
- le Thing acté comme compteur RACINE n'est plus candidat à aucun autre rôle.

Reste ouvert, et c'est le vrai fond du signalement : une détection automatique
ne devrait pas être un cul-de-sac. Les lignes de compteur n'ont aujourd'hui
AUCUN geste — pas de sélecteur, quel que soit l'état. Le badge « lecture seule »
est honnête, mais une inférence fausse doit pouvoir se corriger.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GKM8FDNHZWogAsjjfB8pSw
2026-09-06 12:31:59 +02:00

56 lines
2.5 KiB
Dart

/// **Le compteur réseau n'est pas un compteur solaire** — signalé sur banc, pas trouvé ici.
///
/// Le 2026-09-06, `.75` a changé de matériel : Fronius SunSpec retiré, **Eastron SDM72**
/// posé en compteur réseau (rootMeter) et **SDM120** en compteur de production. L'écran a
/// affiché le SDM72 dans les DEUX rôles — réseau *et* solaire — avec le badge
/// « auto · lecture seule », donc sans aucun moyen de le corriger.
///
/// La box, elle, était juste : `Energy.GetRootMeter` rendait bien le SDM72, et les
/// interfaces distinguaient les deux appareils sans ambiguïté :
///
/// | Thing | classe | interfaces |
/// |---|---|---|
/// | `Grid` | `sdm72` | `energymeter`, `smartmeter`, `connectable` |
/// | `PV` | `sdm120Producer` | **`smartmeterproducer`**, `smartmeter`, `connectable` |
///
/// La liste de l'app pour le rôle solaire contenait `energymeter`, `meter` et `smartmeter`
/// — portées par **tout** compteur, réseau compris — et **pas** `smartmeterproducer`, la
/// seule qui dise « ce compteur mesure une production ».
library;
import 'package:etm_powersync_app/providers/energy_setup_provider.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
group('les interfaces discriminent, ou elles ne servent à rien', () {
test('le rôle solaire exige une interface de PRODUCTION', () {
final solaire = EmsRole.solarMeter.compatibleInterfaces;
expect(solaire, contains('smartmeterproducer'));
// Les génériques sont exclues : elles matchent le compteur réseau.
expect(solaire, isNot(contains('energymeter')));
expect(solaire, isNot(contains('smartmeter')));
expect(solaire, isNot(contains('meter')));
});
test('le SDM72 du banc ne matche plus le rôle solaire', () {
// Interfaces réelles, relevées sur `.75`.
const sdm72 = ['energymeter', 'smartmeter', 'connectable'];
expect(
sdm72.any((i) => EmsRole.solarMeter.compatibleInterfaces.contains(i)),
isFalse);
});
test('le SDM120 du banc matche, lui', () {
const sdm120 = ['smartmeterproducer', 'smartmeter', 'connectable'];
expect(
sdm120.any((i) => EmsRole.solarMeter.compatibleInterfaces.contains(i)),
isTrue);
});
test('le rôle réseau garde ses génériques — c\'est là qu\'elles ont un sens', () {
expect(EmsRole.gridMeter.compatibleInterfaces, contains('energymeter'));
expect(EmsRole.gridMeter.compatibleInterfaces, contains('smartmeter'));
});
});
}