Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
c4b816b
docs(wallbox): design spec and implementation plan for the Wallbox co…
Oct 5, 2026
ad09a46
feat(wallbox): transport with sign in, token refresh and charger reads
Oct 5, 2026
1576306
feat(wallbox): command line mode and stand-in status fixtures
Oct 5, 2026
3d03db5
feat(wallbox): normalise charger status payloads
Oct 5, 2026
486c3b5
feat(wallbox): transport control calls and command line actions
Oct 5, 2026
0548579
feat(wallbox): component with polling, publishing and rate limit back…
Oct 5, 2026
f089b6a
feat(wallbox): pause, lock, charging current and Eco-Smart controls
Oct 5, 2026
00a9a0f
feat(wallbox): automatic car charging configuration
Oct 5, 2026
f5fedfa
feat(wallbox): Predbat-led charging with persistent release
Oct 5, 2026
4bb0a79
docs(wallbox): document the Wallbox component
Oct 5, 2026
30c1175
fix(wallbox): stable charger-to-car order and a paused record that ca…
Oct 5, 2026
b7dd4c7
feat(wallbox): command line mode builds the component and runs one fu…
Oct 5, 2026
32b7de3
test(wallbox): add a real locked-charger status capture as a fixture
Oct 5, 2026
8a5d7e8
fix(wallbox): report HTTP 409 as the charger refusing an action in it…
Oct 5, 2026
f0095aa
fix(wallbox): a refused control no longer claims the account lacks ad…
Oct 5, 2026
4494a19
feat(wallbox): do not send pause or resume to a locked charger
Oct 5, 2026
3c53f8e
feat(wallbox): put the charger name in each entity's friendly name
Oct 5, 2026
0bee169
feat(wallbox): show the charger's operation mode on the status sensor
Oct 5, 2026
9301e51
feat(wallbox): no plan-led control for OCPP chargers; publish timezon…
Oct 5, 2026
def2afc
feat(wallbox): publish the latest firmware version and whether an upd…
Oct 5, 2026
96876eb
docs(wallbox): setup steps, command line usage and debug journal find…
Oct 5, 2026
42ed6e6
fix(wallbox): address review - release bookkeeping, per-charger isola…
Oct 5, 2026
1a5de0c
Merge remote-tracking branch 'origin/main' into feat/wallbox-component
Oct 5, 2026
15a3ad5
style(wallbox): apply black formatting
Oct 5, 2026
012f673
refactor(wallbox): read the saved control state once when nothing is …
Oct 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .cspell/custom-dictionary-workspace.txt
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,7 @@ dtype
dwindow
eauth
echargingpile
ecosmart
Eddi
eddis
efgh
Expand Down
3 changes: 2 additions & 1 deletion .github/copilot-instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ class MyComponent(ComponentBase):
await asyncio.sleep(interval)
```

**Key components**: `WebInterface`, `PredbatMCPServer`, `SolarAPI`, `AlertFeed`, `GECloudDirect`, `CarbonAPI`, `FoxAPI`, `DatabaseManager`, `OctopusAPI`, `OhmeAPI`, `HAHistory`, `HAInterface`
**Key components**: `WebInterface`, `PredbatMCPServer`, `SolarAPI`, `AlertFeed`, `GECloudDirect`, `CarbonAPI`, `FoxAPI`, `DatabaseManager`, `OctopusAPI`, `OhmeAPI`, `WallboxAPI`, `HAHistory`, `HAInterface`

Components are managed via `Components` class (`apps/predbat/components.py`) and initialized via plugin system (`apps/predbat/plugin_system.py`).

Expand Down Expand Up @@ -326,6 +326,7 @@ Web interface in `apps/predbat/web.py` runs on port 5052 (configurable via `web_
- `gecloud.py` - GivEnergy cloud API
- `fox.py` - Fox ESS cloud API
- `ohme.py` - Ohme EV charger integration
- `wallbox.py` - Wallbox EV charger integration
- `carbon.py` - Carbon intensity API

## Common Gotchas
Expand Down
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ The main loop (`update_pred()`) runs every 5 minutes: fetch data → run optimiz

### Component/Plugin System

`components.py` defines a registry of 18 pluggable components (DB, HA, Web, MCP, GECloud, Octopus, Fox, Solax, Solis, Axle, Ohme, Kraken, etc.). Each component:
`components.py` defines a registry of 31 pluggable components (DB, HA, Web, MCP, GECloud, Octopus, Fox, Solax, Solis, Axle, Ohme, Wallbox, Kraken, etc.). Each component:

- Inherits from `ComponentBase`
- Has `api_start()` / `api_stop()` lifecycle methods
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ The main loop (`update_pred()`) runs every 5 minutes: fetch data → run optimiz

### Component/Plugin System

`components.py` defines a registry of 18 pluggable components (DB, HA, Web, MCP, GECloud, Octopus, Fox, Solax, Solis, Axle, Ohme, Kraken, etc.). Each component:
`components.py` defines a registry of 31 pluggable components (DB, HA, Web, MCP, GECloud, Octopus, Fox, Solax, Solis, Axle, Ohme, Wallbox, Kraken, etc.). Each component:

- Inherits from `ComponentBase`
- Has `api_start()` / `api_stop()` lifecycle methods
Expand Down
14 changes: 14 additions & 0 deletions apps/predbat/components.py
Original file line number Diff line number Diff line change
Expand Up @@ -289,6 +289,20 @@ def load_component_class(component_info):
"phase": 1,
"can_restart": True,
},
"wallbox": {
"class": "wallbox.WallboxAPI",
"name": "Wallbox Charger",
"event_filter": "predbat_wallbox_",
"args": {
"username": {"required": True, "secret": True, "config": "wallbox_username"},
"password": {"required": True, "secret": True, "config": "wallbox_password"},
"automatic": {"required": False, "config": "wallbox_automatic", "default": True},
"wallbox_control": {"required": False, "config": "wallbox_control", "default": False},
"poll_seconds": {"required": False, "config": "wallbox_poll_seconds", "default": 120},
},
"phase": 1,
"can_restart": True,
},
"fox": {
"class": "fox.FoxAPI",
"name": "Fox API",
Expand Down
5 changes: 5 additions & 0 deletions apps/predbat/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -2777,6 +2777,11 @@
"myenergi_enable_controls": {"type": "boolean"},
"myenergi_poll_seconds": {"type": "integer", "zero": False},
"myenergi_zappi_control": {"type": "boolean"},
"wallbox_username": {"type": "string", "empty": False},
"wallbox_password": {"type": "string", "empty": False},
"wallbox_automatic": {"type": "boolean"},
"wallbox_control": {"type": "boolean"},
"wallbox_poll_seconds": {"type": "integer", "zero": False},
"fox_key": {"type": "string", "empty": False},
"fox_automatic": {"type": "boolean"},
"fox_automatic_ignore_pv": {"type": "boolean"},
Expand Down
9 changes: 9 additions & 0 deletions apps/predbat/config/apps.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -319,6 +319,15 @@ pred_bat:
# it explicitly to True/False to override that decision
#ohme_automatic_octopus_intelligent: True

# Wallbox EV charger cloud direct integration
#wallbox_username: !secret wallbox_username
#wallbox_password: !secret wallbox_password
# Register the Wallbox chargers with Predbat as cars (on by default)
#wallbox_automatic: True
# Let Predbat pause and resume the chargers according to its own car charging plan.
# Requires wallbox_automatic
#wallbox_control: True

# car_charging_energy defines a daily incrementing sensor which measures the charge added to your car and resets to zero at midnight
# is used for car_charging_hold feature to filter out car charging from the previous load data
# Automatically set to detect Wallbox and Zappi, if it doesn't match manually enter your sensor name
Expand Down
Loading
Loading