Skip to content

Commit 47d3913

Browse files
davmozclaude
andcommitted
update V2X charger data model: add connector_status, charging_state, deprecate status/plug_connected
Add connector_status (OCPP ConnectorStatusEnumType) and charging_state (OCPP ChargingStateEnumType + discharging) as structured replacements for the flat status string. Add ac_W field. Mark status and plug_connected as deprecated. Add v2x_charger to DERData root structure. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent d13965b commit 47d3913

1 file changed

Lines changed: 42 additions & 25 deletions

File tree

docs/technical/data-models.md

Lines changed: 42 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -127,16 +127,18 @@ The following sections describe the standardized telemetry data structures for D
127127
- [PV Data Model](#pv-data-model)
128128
- [Battery Data Model](#battery-data-model)
129129
- [Meter Data Model](#meter-data-model)
130+
- [V2X Charger Data Model](#ev-charger-data-model-v2x-enabled)
130131

131132
## Base Structure
132133

133134
### DERData Root Structure
134135

135-
The root data structure can contain up to three subsystems:
136+
The root data structure can contain up to four subsystems:
136137

137138
- **pv**: Photovoltaic system data
138139
- **battery**: Battery storage system data
139140
- **meter**: Meter data
141+
- **v2x_charger**: Vehicle-to-grid charger data
140142

141143
### Inheritance Model
142144

@@ -183,7 +185,7 @@ Common fields shared by all device types:
183185

184186
| Field | Unit | Data Type | Description |
185187
| -------------- | ------------ | --------- | -------------------------------------- |
186-
| `type` | - | string | Object type ("pv", "battery", "meter") |
188+
| `type` | - | string | Object type ("pv", "battery", "meter", "v2x_charger") |
187189
| `make` | - | string | Manufacturer/brand name (optional) |
188190
| `timestamp` | milliseconds | integer | Timestamp of reading start |
189191
| `read_time_ms` | milliseconds | integer | Time taken to complete the reading |
@@ -306,30 +308,23 @@ Grid meter data with import/export and phase-level measurements:
306308
{
307309
"type": "v2x_charger",
308310
"make": "Ferroamp",
309-
"status": "charging",
311+
"connector_status": "occupied",
312+
"charging_state": "charging",
310313
"protocol": "ISO_15118_20",
311-
"control_mode": "dynamic_bpt",
314+
"control_mode": "bi_dir",
312315
"plug_connected": true,
313316
"W": 5300,
317+
"ac_W": 5300,
314318
"A": 23.0,
315319
"V": 230.5,
316320
"Hz": 49.98,
317321
"L1_V": 232.8,
318322
"L1_A": 23.0,
319323
"L1_W": 5354,
320-
"L2_V": 230.9,
321-
"L2_A": 0.0,
322-
"L2_W": 0,
323-
"L3_V": 230.2,
324-
"L3_A": 0.0,
325-
"L3_W": 0,
326324
"dc_W": 5100,
327325
"dc_V": 400.0,
328326
"dc_A": 12.75,
329327
"vehicle_soc_fract": 0.55,
330-
"ev_target_energy_req_Wh": 5300,
331-
"ev_max_energy_req_Wh": 18100,
332-
"ev_min_energy_req_Wh": -25800,
333328
"session_charge_Wh": 1500,
334329
"session_discharge_Wh": 0,
335330
"total_charge_Wh": 142000,
@@ -341,13 +336,16 @@ Grid meter data with import/export and phase-level measurements:
341336

342337
| Field | Unit | Data Type | Description |
343338
|-------|------|-----------|-------------|
344-
| `type` | - | string | Always "v2x_charger" |
339+
| `type` | - | string | Always `"v2x_charger"` |
345340
| `make` | - | string | Manufacturer brand (e.g., Ferroamp, Ambibox) |
346-
| `status` | - | string | State (idle, charging, discharging, error, suspended) |
341+
| `connector_status` | - | string | Connector availability (see [Connector Status](#connector-status)) |
342+
| `charging_state` | - | string | Vehicle/session charging state (see [Charging State](#charging-state)) |
343+
| `status` | - | string | **Deprecated.** Legacy flat status string. Use `connector_status` + `charging_state` instead |
347344
| `protocol` | - | string | Active protocol (e.g., ISO_15118_2, ISO_15118_20, DIN) |
348-
| `control_mode` | - | string | scheduled (Car decides) or dynamic (EMS/Charger decides) |
349-
| `plug_connected` | - | boolean | true if cable is physically inserted |
350-
| `W` | W | integer | AC Grid Power: (+) Charging, (-) Discharging/V2G |
345+
| `control_mode` | - | string | `"unknown"`, `"bi_dir"` (bidirectional), or `"uni_dir"` (charge only) |
346+
| `plug_connected` | - | boolean | **Deprecated.** Use `connector_status` instead — derivable from status != `"available"` |
347+
| `W` | W | integer | Active Power, derived from `ac_W` or `dc_W * 0.95`. (+) Charging, (-) V2G |
348+
| `ac_W` | W | integer | AC Active Power (+) Charging, (-) V2G |
351349
| `A` | A | float | AC Grid Current (Total) |
352350
| `V` | V | float | AC Grid Voltage (Average) |
353351
| `Hz` | Hz | float | Grid Frequency |
@@ -360,16 +358,35 @@ Grid meter data with import/export and phase-level measurements:
360358
| `vehicle_soc_fract` | fraction | float | Vehicle State of Charge (0.0 - 1.0) |
361359
| `ev_target_energy_req_Wh` | Wh | integer | Demand: Energy needed to reach driver's target SoC |
362360
| `ev_max_energy_req_Wh` | Wh | integer | Capacity: Empty space in battery available for charging |
363-
| `ev_min_energy_req_Wh` | Wh | integer | V2G Potential: Energy available for export (Negative value = V2G) |
361+
| `ev_min_energy_req_Wh` | Wh | integer | V2G Potential: Energy available for export (negative = V2G) |
364362
| `session_charge_Wh` | Wh | integer | Energy imported by EV during this session |
365363
| `session_discharge_Wh` | Wh | integer | Energy exported by EV during this session |
366364
| `total_charge_Wh` | Wh | integer | Lifetime Energy delivered to EV |
367365
| `total_discharge_Wh` | Wh | integer | Lifetime Energy exported from EV (V2G) |
368366

369-
**Status Values:**
367+
#### Connector Status
370368

371-
- `"charging"` - Vehicle is connected and actively charging/discharging
372-
- `"suspended"` - A vehicle is plugged into the port, but the charger is not delivering any power
373-
- `"available"` - Charger is ready and no vehicle connected
374-
- `"preparing"` - Vehicle connected, preparing to charge (authentication, cable check, etc.)
375-
- `"error"` - Charger or charging session has encountered an error
369+
Describes the physical connector's availability. Based on OCPP 2.0.1 `ConnectorStatusEnumType`, with `preparing` and `finishing` retained from OCPP 1.6 for backward compatibility.
370+
371+
| Value | Meaning |
372+
|-------|---------|
373+
| `"available"` | Ready, nothing plugged in |
374+
| `"preparing"` | Cable plugged in, session not started yet |
375+
| `"finishing"` | Session ending, cable still plugged in |
376+
| `"reserved"` | Locked for a specific user |
377+
| `"unavailable"` | Intentionally offline (maintenance, admin) |
378+
| `"faulted"` | Hardware/software fault |
379+
| `"occupied"` | In use (charging, discharging, or connected) |
380+
381+
#### Charging State
382+
383+
Describes the vehicle/charging session state. Based on OCPP 2.0.1 `ChargingStateEnumType`, extended with `discharging` for V2G.
384+
385+
| Value | Meaning |
386+
|-------|---------|
387+
| `"charging"` | Energy actively flowing to vehicle |
388+
| `"discharging"` | Energy flowing from vehicle to grid (V2G) |
389+
| `"suspended_ev"` | Vehicle not accepting power (e.g., battery full) |
390+
| `"suspended_evse"` | Charger not delivering power (e.g., smart charging limit, pending auth) |
391+
| `"ev_connected"` | Cable plugged in, session open, no energy flowing yet |
392+
| `"idle"` | Transaction open but no EV connected (e.g., cable removed mid-session) |

0 commit comments

Comments
 (0)