powersync-energy-plugin-etm/CLAUDE.md

108 lines
4.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# CLAUDE.md
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
## Overview
This is a **nymea energy plugin** (Qt/C++ shared library) that extends the nymea energy experience with smart EV charging, spot market price-based charging scheduling, and overload protection. It links against `libnymea` and `libnymea-energy` and is loaded at runtime by the nymea daemon.
## Build System
The project uses **qmake**. Build out-of-tree:
```bash
mkdir build && cd build
qmake ../nymea-energy-plugin-nymea.pro
make -j$(nproc)
```
Build with coverage instrumentation:
```bash
qmake CONFIG+=coverage ../nymea-energy-plugin-nymea.pro
make -j$(nproc)
```
Build translations:
```bash
make lupdate # extract strings into .ts files
make lrelease # compile .ts → .qm
```
Supports both Qt5 (C++11) and Qt6 (C++17). The `.pri` file detects the Qt version automatically.
## Running Tests
Three test binaries are built under `tests/auto/`:
| Test binary | Source directory |
|---|---|
| `nymeaenrgytestcharging` | `tests/auto/charging/` |
| `nymeaenrgytestspotmarket` | `tests/auto/spotmarket/` |
| `nymea-energy-simulation` | `tests/auto/simulation/` |
Run a single test binary directly after building:
```bash
./tests/auto/charging/nymeaenrgytestcharging
./tests/auto/spotmarket/nymeaenrgytestspotmarket
./tests/auto/simulation/nymea-energy-simulation
```
Run simulations in Docker (produces plots in `results/`):
```bash
./docker-simulation.sh
```
Generate HTML coverage report after running tests with coverage build:
```bash
./generate-coverage-report.sh -b /path/to/build
```
## Architecture
### Plugin Entry Point
`energyplugin/energypluginnymea.cpp` — Implements `EnergyPlugin`. The `init()` method constructs and wires together all subsystems:
- `EnergyManagerConfiguration` — loads runtime tuning parameters
- `SpotMarketManager` — manages spot price data providers
- `SmartChargingManager` — core charging orchestration
- `NymeaEnergyJsonHandler` — registers the JSON-RPC API for clients (version 08)
### Core Subsystems
**`SmartChargingManager`** (`energyplugin/smartchargingmanager.*`) — The central logic engine. On each `update()` tick it:
1. Gathers state via `prepareInformation()`
2. Calculates spot market charging schedules via `planSpotMarketCharging()`
3. Calculates surplus solar charging via `planSurplusCharging()`
4. Applies decisions to EV chargers via `adjustEvChargers()`
5. Enforces overload protection via `verifyOverloadProtection()`
**`SpotMarketManager`** (`energyplugin/spotmarket/`) — Aggregates spot price data from registered `SpotMarketDataProvider` instances (currently `SpotMarketDataProviderAwattar`). Provides `scheduleChargingTime()` to calculate optimal time windows given weighted price scores.
**`NymeaEnergyJsonHandler`** (`energyplugin/nymeaenergyjsonhandler.*`) — JSON-RPC handler exposing charging config, spot market config, score entries, and schedules to UI clients.
**`RootMeter`** / **`EvCharger`** — Thin wrappers around nymea `Thing` objects, exposing typed accessors for power readings and charger state.
**`EnergyManagerConfiguration`** — Read-only configuration loaded from `$NYMEA_ENERGY_MANAGER_CONFIG` or `/var/lib/nymea/energy-manager-configuration.json`. Defaults are production-safe; the file exists only for test environment tuning.
### Types (`energyplugin/types/`)
Value types used across subsystems: `ChargingInfo`, `ChargingAction`, `ChargingSchedule`, `ChargingProcessInfo`, `ScoreEntry`, `SmartChargingState`, `TimeFrame`.
### Tests
- `tests/mocks/plugins/energymocks/` — nymea integration plugin mock (EV charger, meter thing types)
- `tests/mocks/spotmarketprovider/``SpotMarketDataProviderMock` with static JSON datasets
- `tests/auto/common/``EnergyTestBase` shared base class using `nymea-tests` framework
- `tests/auto/simulation/` — Time-accelerated simulation using `ENERGY_SIMULATION` define; the `SmartChargingManager` exposes `simulationCallUpdate()` hooks only when this define is active
### Key pkgconfig Dependencies
- `nymea` — core daemon API (`Thing`, `ThingManager`, `JsonHandler`, etc.)
- `nymea-energy` — energy experience API (`EnergyPlugin`, `EnergyManager`, `EnergyLogs`)
- `nymea-core` / `nymea-tests` — test utilities (test builds only)