etm-powersync-app/tools/rpc/ratios_check.dart
Patrick Schurig bedeabf767 fix(banc): l'adresse du banc passe à 10.42.60.21 — sondes, tests on-device, consignes
Le banc `hems` est renuméroté (192.168.1.75 → 10.42.60.21). Portés : les 11
sondes `tools/rpc/*` et leur README, les 3 tests on-device, le `hint` de
l'écran Installations, les procédures de CLAUDE.md et des deux documents de
cadrage.

Ce qui n'est PAS touché, et c'est délibéré : les relevés datés (RELEVE_LOTC,
RECAP, Prompt 3g2, maquettes) et les fixtures `hems75_*.json`. Un relevé daté
dit ce qui a été observé ce jour-là ; le réécrire échange une trace contre une
cohérence de surface. CLAUDE.md porte la note qui fait le lien : `.75` et
`hems75` désignent la même machine.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-10-13 06:37:33 +02:00

50 lines
2.1 KiB
Dart

// Ce que l'APP conclut des deux bornes de `GetEnergyRatios` — pas ce que le JSON montre.
//
// ⚠️ `dart run` : cette sonde **importe le modèle de l'app** (`EnergyRatiosSnapshot`) plutôt
// que de relire la charge utile à sa façon. Une lecture parallèle ne prouverait rien sur ce
// que l'écran dira — c'est la leçon de `measurement_check.dart`.
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:etm_powersync_app/models/energy_ratios_snapshot.dart';
Future<void> main(List<String> args) async {
final host = args.isNotEmpty ? args[0] : '10.42.60.21';
final ws = await WebSocket.connect('ws://$host:4444')
.timeout(const Duration(seconds: 8));
var id = 0;
final pending = <int, Completer<Map<String, dynamic>>>{};
ws.listen((raw) {
final m = jsonDecode(raw as String) as Map<String, dynamic>;
final rid = m['id'];
if (rid is int && pending.containsKey(rid)) pending.remove(rid)!.complete(m);
});
Future<Map<String, dynamic>> call(String m) {
final myId = ++id;
final c = Completer<Map<String, dynamic>>();
pending[myId] = c;
ws.add(jsonEncode({'id': myId, 'method': m, 'params': const {}}));
return c.future.timeout(const Duration(seconds: 15));
}
await call('JSONRPC.Hello');
final r = await call('NymeaEnergy.GetEnergyRatios');
final p = Map<String, dynamic>.from(r['params'] as Map);
print('brut : ${jsonEncode(p)}');
final s = EnergyRatiosSnapshot.fromJson(p);
String q(DateTime? d) => d == null ? '—' : d.toLocal().toString();
print('périodeDébut : ${q(s.periodStartedAt)} (frontière de journée → BILAN)');
print('mesuréDepuis : ${q(s.measuredSince)} (baseline → RATIOS)');
print('fuseau : ${s.timeZone}');
print('datePeriode : ${s.datePeriode}');
print('baselineRepriseEnJournee : ${s.baselineRepriseEnJournee}');
if (s.baselineRepriseEnJournee) {
final couvert = DateTime.now().difference(s.measuredSince!);
print(' -> les ratios ne couvrent que ${couvert.inMinutes} min, '
'pas la journée. C\'est CE que le drapeau rend lisible.');
}
await ws.close();
}