import 'dart:async'; import 'dart:convert'; import 'dart:io'; // Sonde JSON-RPC read-only contre le HEMS .75. // Usage: dart probe.dart [jsonParams] Future main(List args) async { final host = args.isNotEmpty ? args[0] : '192.168.1.75'; final method = args.length > 1 ? args[1] : 'NymeaEnergy.GetLoadConfig'; final params = args.length > 2 ? jsonDecode(args[2]) as Map : {}; final ws = await WebSocket.connect('ws://$host:4444') .timeout(const Duration(seconds: 8)); var id = 0; final pending = >>{}; ws.listen((raw) { final m = jsonDecode(raw as String) as Map; final rid = m['id']; if (rid is int && pending.containsKey(rid)) { pending.remove(rid)!.complete(m); } else if (m['notification'] != null) { stderr.writeln('[notif] ${m['notification']}'); } }); Future> call(String m, [Map p = const {}]) { final myId = ++id; final c = Completer>(); pending[myId] = c; ws.add(jsonEncode({'id': myId, 'method': m, 'params': p})); return c.future.timeout(const Duration(seconds: 15)); } final hello = await call('JSONRPC.Hello'); stderr.writeln('--- JSONRPC.Hello ---'); stderr.writeln(const JsonEncoder.withIndent(' ').convert(hello['params'])); final res = await call(method, params); stdout.writeln(const JsonEncoder.withIndent(' ').convert(res)); await ws.close(); }