CI / Backend tests (Maven / Java 21) (push) Successful in 40s
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01U8EHjVrf5ffw1Vjn5bPGJu
3.9 KiB
3.9 KiB
Roadmap
Bottom-up: each milestone builds on a verified one below it, and master stays deployable. Closed milestones shrink to one line here; details stay in git history and in decisions/.
Done
- (none yet) · baseline
e345063: read-only, sends 8 sensor values to InfluxDB every 300 s; no control of the controller. Runs on the Pi.
Current: M0 Foundation
No behaviour change.
- Docs structure:
CLAUDE.md,CONTRIBUTING.md,docs/(this PR) scripts/check.sh: build, tests, doc size limits, secret scan- Git
pre-pushhook and CI both runscripts/check.sh; remove.drone.ymlandDockerfile - Deploy: CI builds the backend Docker image;
scripts/deploy-gateway.shcopies the jar to the Pi, restarts, checks/health, rolls back on failure - Skills:
/ship,/close-milestone
Feasibility checks (after M0, before M1)
- C1 Gateway sharing: MK01 takes one client; our poll drops my parents' Frisko app.
- C2 Frisko app is used rarely: keep 300 s polls until our UI replaces it, then the backend is the only client, with a "release gateway" switch for the app.
- C5 Parents raise the economy temperature (CWU 4143, CO 4131) to force heating; no tariff.
- C6 Energy sources readable locally: Deye via Solarman logger, Fronius Solar API, house meter.
- C3 Backup of the 14 app-editable settings:
research/frisko/settings-backup-2026-10-23.json. - C4 Write works: FC6 4143 8 → 9 → 8 (my request), echo OK, read-back after 1 s, no password.
Next
| Milestone | Scope | Done when |
|---|---|---|
| M1 Gateway: all readings | Fix D7 first. Baseline becomes the gateway: heat pump incl. state registers (4112–4119, 4201–4203, 4221–4228), Deye, Fronius, house meter and BME280 (moved from rpi-measurements, same schemas; then retire it) into Influx with a buffer; snapshot; config outside the jar; fix D1–D5 |
A week on the Pi without manual action, Grafana unchanged |
| M2 Understand the controller | Timing (safe poll rate, response times), which pumps run in which state, open questions in docs/frisko/ |
docs/frisko/ reviewed; F3 limits agreed |
| M3 Backend and web UI, read-only | Backend in Docker in Kraków: history from Influx, snapshot from the gateway; F1, F2, F5, F7 with the schematic and charts after research/ui/; Traefik route and auth (decide the login method first) |
My father sees the heat pump and the energy on his phone |
| M4 Setpoints | F3 through gateway commands with timed restore (ADR-006); CWU first, then CO; S1–S6 | Father boosts hot water from his phone, value restored on time |
| M5 Alarms | F4; decide the channel first (e.g. ntfy, Telegram) | Simulated alarm reaches the phone |
| M6 Native app? | Decide: keep the web UI, WebView wrapper or React Native | Decision recorded |
Known defects in the baseline (input for M1)
- D1 Self-restart works only while something polls
/health(HealthMonitor). - D2 Influx client logs every request (
LogLevel.FULL), ~420 journal lines/hour. - D3 Config is packaged inside the jar.
- D4 Dead code and config:
pollIntervalMs,windowSeconds,ModbusCachedWrapper, write path. - D5 Single and batch reads use different addresses for registers ≥ 4100 (
ModbusRtuTcpRepository). - D6 Development runs wrote test fields into the production
Dom_Pompadatabase. - D7 Pi network: all 880 DNS errors of the week came in one hour (19.10, 10:00), likely an outage,
not config. But the Pi's WireGuard routes most of
192.168.0.0/24into the tunnel (Kraków uses the same subnet), so it reaches only.10and.150locally. Fix: PiAllowedIPsonly10.0.0.0/24, 10.2.0.0/24(Influx and Gitea go via the public IP anyway), plus outbound NAT on OPNsense's WireGuard interface so the Pi answers Kraków through the tunnel.
Knowledge
- Controller: docs/frisko/rx910-se21.md
- Energy devices: research/energy/
- UI reference: research/ui/