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
56 lines
2.5 KiB
Dart
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'));
|
|
});
|
|
});
|
|
}
|