Skip to content

Commit 32e48f0

Browse files
feat(core): parse the Open OCPP Trace interchange format (#124)
* feat(core): parse the Open OCPP Trace interchange format Read the vendor-neutral Open OCPP Trace format (JSONL or a JSON array of records) into the internal event model. parseTrace() auto-detects it and delegates to parseOpenOcppTrace(); records map onto the OCPP-J frame with raw-frame precedence, messageId-based action derivation, and unknown-field tolerance, reusing the normalize pipeline and the shared untrusted-input limits (extracted to parseLimits.ts). deriveOpenOcppTraceView() reports the format's consumer view. The 15 specification conformance fixtures are vendored and asserted against it in CI, so DebugKit is a checked reference consumer of the format. * docs: record the Open OCPP Trace input adapter in CURRENT_STATE
1 parent fce6420 commit 32e48f0

44 files changed

Lines changed: 2626 additions & 59 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@ocpp-debugkit/toolkit': minor
3+
---
4+
5+
Read the Open OCPP Trace interchange format. `parseTrace()` auto-detects it and `parseOpenOcppTrace()` parses it directly, mapping records onto the internal event model with raw-frame precedence, messageId-based action derivation, and unknown-field tolerance. `deriveOpenOcppTraceView()` exposes the format's consumer view, checked in CI against the specification's 15 conformance fixtures.

CURRENT_STATE.md

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,13 @@
88

99
## Active Milestone
1010

11-
**v0.4.0 - Open OCPP Trace Interop (next)**
11+
**v0.4.0 - Open OCPP Trace Interop (in progress)**
1212

1313
v0.3.1 is published to npm (16 detection rules, 15 scenarios, trace diffing,
14-
rich scenario assertions, and the ci/anonymize/diff CLI commands). Next up is
15-
interoperability with the Open OCPP Trace format: reading and writing the
16-
shared v1.1 interchange format so DebugKit exchanges traces with other OCPP
17-
tools, checked against the shared conformance fixtures.
14+
rich scenario assertions, and the ci/anonymize/diff CLI commands). The interop
15+
milestone reads and writes the shared Open OCPP Trace v1.1 interchange format,
16+
checked against the specification's conformance fixtures. The input half
17+
(#121) has landed; the exporter and `convert` CLI command (#122) remain.
1818

1919
## What's Done
2020

@@ -226,10 +226,20 @@ tools, checked against the shared conformance fixtures.
226226
-`@ocpp-debugkit/toolkit@0.3.1` published to npm
227227
- ✅ Git tag `v0.3.1` + GitHub release `v0.3.1` created
228228

229+
### Open OCPP Trace Input Adapter (PR #124)
230+
231+
-`parseOpenOcppTrace()` reads the Open OCPP Trace v1.1 interchange format
232+
(JSONL or JSON array of records); `parseTrace()` auto-detects and delegates
233+
(Issue #121)
234+
- ✅ Raw-frame precedence, messageId-based action derivation, unknown-field
235+
tolerance; shared untrusted-input limits extracted to `parseLimits.ts`
236+
-`deriveOpenOcppTraceView()` exposes the format's consumer view
237+
- ✅ 15 specification conformance fixtures vendored and asserted in CI
238+
229239
## What's Next
230240

231-
1. **v0.4.0 - Open OCPP Trace Interop** - read and write the Open OCPP Trace
232-
v1.1 interchange format (#121, #122), checked against the shared fixtures
241+
1. **v0.4.0 - Open OCPP Trace Interop** - reading (#121) is done; remaining:
242+
the exporter and `convert` CLI command (#122), then the `v0.4.0` release
233243
2. **v0.5.0 - OCPP 2.0.1 Support** - extend the engine beyond 1.6J: message
234244
set, device model, scenarios, and detection
235245
3. **v1.0.0 - Stable FOSS Ecosystem** - API stabilization, 20+ scenarios, docs

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ validate behavior against known scenarios.
2727
- **Replay Engine** — Deterministic, pure replay engine with step forward/back,
2828
jump-to-event, and configurable playback speed.
2929
- **Report Generation** — Export session analysis as Markdown or HTML reports.
30+
- **Open OCPP Trace Interop** - Read the vendor-neutral
31+
[Open OCPP Trace](https://github.com/open-ocpp-trace/specification) interchange
32+
format, so traces from other OCPP tools can be inspected and analyzed here.
3033
- **React Components** — Reusable, SSR-safe components for building custom
3134
inspector UIs (SessionTimeline, MessageInspector, FailureSummary,
3235
ReportViewer, ReplayControls).

docs/trace-format-spec.md

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,41 @@ A JSON array of raw OCPP message arrays, with no event wrapper:
110110

111111
---
112112

113+
## Open OCPP Trace Format (interop)
114+
115+
DebugKit also reads the
116+
[Open OCPP Trace format](https://github.com/open-ocpp-trace/specification), a
117+
vendor-neutral interchange format for OCPP traces. This lets traces produced by
118+
other tools (simulators, proxies, CSMS test suites) be inspected and analyzed
119+
here without hand-converting them.
120+
121+
The format is a stream of records, one OCPP-J frame per record, as JSONL or a
122+
JSON array of records:
123+
124+
```jsonl
125+
{"schemaVersion":"1.1","timestamp":"2024-01-15T10:30:00.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-001","direction":"cp-to-csms","messageType":"CALL","messageId":"msg-001","action":"BootNotification","payload":{"chargePointVendor":"SyntheticVendor","chargePointModel":"SM-100"},"raw":"[2,\"msg-001\",\"BootNotification\",{\"chargePointVendor\":\"SyntheticVendor\",\"chargePointModel\":\"SM-100\"}]"}
126+
{"schemaVersion":"1.1","timestamp":"2024-01-15T10:30:00.500Z","transport":"json","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-001","payload":{"status":"Accepted"},"raw":"[3,\"msg-001\",{\"status\":\"Accepted\"}]"}
127+
```
128+
129+
`parseTrace()` detects this format automatically; `parseOpenOcppTrace()` parses
130+
it directly. How records are consumed:
131+
132+
- `direction` maps to the internal directions: `cp-to-csms` becomes
133+
`CS_TO_CSMS`, `csms-to-cp` becomes `CSMS_TO_CS`.
134+
- `raw`, when present, is the authoritative frame. If it disagrees with the
135+
decomposed fields, the frame from `raw` wins and a warning is recorded.
136+
- A response (`CALLRESULT` / `CALLERROR`) may omit `action`; its effective
137+
action is derived by correlating on `messageId`. `deriveOpenOcppTraceView()`
138+
reports that correlation as the format's consumer view.
139+
- Unknown fields are ignored, so a trace from a later minor version of the
140+
format still parses. The same size and event-count [limits](#limits) apply.
141+
142+
The format is governed independently at
143+
[open-ocpp-trace/specification](https://github.com/open-ocpp-trace/specification),
144+
which ships a conformance suite that DebugKit's parser is checked against.
145+
146+
---
147+
113148
## OCPP 1.6 JSON Message Structure
114149

115150
OCPP 1.6 JSON uses WebSocket text frames containing JSON arrays. There are

packages/toolkit/README.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ report generation, React components, and CLI.
88

99
- **Trace Parser** — Parse OCPP 1.6 JSON traces in JSON Object, JSONL, or bare
1010
array format. Safe parsing with size and event-count limits.
11+
- **Open OCPP Trace Interop** - Read the vendor-neutral
12+
[Open OCPP Trace](https://github.com/open-ocpp-trace/specification) format via
13+
`parseOpenOcppTrace()` (and `parseTrace()` auto-detection), checked against the
14+
specification's conformance fixtures.
1115
- **Failure Detection** — 16 detection rules (4 critical, 10 warning, 2 info)
1216
covering common failure patterns: failed authorization, connector faults,
1317
station offline, heartbeat timeout, meter value gaps, invalid stop reasons,
@@ -245,6 +249,11 @@ Each event has a `message` field containing a raw OCPP 1.6 JSON array:
245249
- **CallResult:** `[3, "UniqueId", { ...payload }]`
246250
- **CallError:** `[4, "UniqueId", "ErrorCode", "ErrorDescription", {}]`
247251

252+
`parseTrace()` additionally auto-detects the vendor-neutral
253+
[Open OCPP Trace](https://github.com/open-ocpp-trace/specification) interchange
254+
format (records carrying `messageType` and `direction`); parse it directly with
255+
`parseOpenOcppTrace()`.
256+
248257
See the [trace format specification](https://github.com/ocpp-debugkit/toolkit/blob/main/docs/trace-format-spec.md) for full details.
249258

250259
## Links
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Vendored Open OCPP Trace fixtures
2+
3+
Conformance fixtures from the Open OCPP Trace specification, vendored here so
4+
DebugKit's parser is checked against them in CI.
5+
6+
- **Source:** [open-ocpp-trace/specification](https://github.com/open-ocpp-trace/specification)
7+
(`fixtures/`). All data is synthetic.
8+
- Each `<name>/trace.jsonl` is a trace in the shared format. Each
9+
`<name>/expected.json` is the consumer view a conformant implementation
10+
derives from it: correlation pairs, effective actions, unanswered calls, and
11+
orphan responses.
12+
- [`../../openOcppTrace.conformance.test.ts`](../../openOcppTrace.conformance.test.ts)
13+
asserts that `deriveOpenOcppTraceView()` reproduces every `expected.json` and
14+
that `parseOpenOcppTrace()` parses every trace.
15+
16+
Do not edit these by hand. Refresh them from the specification when it changes.
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
{
2+
"schemaVersion": "1.1",
3+
"counts": {
4+
"records": 20,
5+
"calls": 10,
6+
"callResults": 10,
7+
"callErrors": 0
8+
},
9+
"records": [
10+
{
11+
"index": 0,
12+
"messageType": "CALL",
13+
"messageId": "msg-001",
14+
"action": "BootNotification"
15+
},
16+
{
17+
"index": 1,
18+
"messageType": "CALLRESULT",
19+
"messageId": "msg-001",
20+
"action": "BootNotification",
21+
"correlatesWith": 0
22+
},
23+
{
24+
"index": 2,
25+
"messageType": "CALL",
26+
"messageId": "msg-002",
27+
"action": "StatusNotification"
28+
},
29+
{
30+
"index": 3,
31+
"messageType": "CALLRESULT",
32+
"messageId": "msg-002",
33+
"action": "StatusNotification",
34+
"correlatesWith": 2
35+
},
36+
{
37+
"index": 4,
38+
"messageType": "CALL",
39+
"messageId": "msg-003",
40+
"action": "StatusNotification"
41+
},
42+
{
43+
"index": 5,
44+
"messageType": "CALLRESULT",
45+
"messageId": "msg-003",
46+
"action": "StatusNotification",
47+
"correlatesWith": 4
48+
},
49+
{
50+
"index": 6,
51+
"messageType": "CALL",
52+
"messageId": "msg-004",
53+
"action": "Authorize"
54+
},
55+
{
56+
"index": 7,
57+
"messageType": "CALLRESULT",
58+
"messageId": "msg-004",
59+
"action": "Authorize",
60+
"correlatesWith": 6
61+
},
62+
{
63+
"index": 8,
64+
"messageType": "CALL",
65+
"messageId": "msg-005",
66+
"action": "StartTransaction"
67+
},
68+
{
69+
"index": 9,
70+
"messageType": "CALLRESULT",
71+
"messageId": "msg-005",
72+
"action": "StartTransaction",
73+
"correlatesWith": 8
74+
},
75+
{
76+
"index": 10,
77+
"messageType": "CALL",
78+
"messageId": "msg-006",
79+
"action": "StatusNotification"
80+
},
81+
{
82+
"index": 11,
83+
"messageType": "CALLRESULT",
84+
"messageId": "msg-006",
85+
"action": "StatusNotification",
86+
"correlatesWith": 10
87+
},
88+
{
89+
"index": 12,
90+
"messageType": "CALL",
91+
"messageId": "msg-hb-1",
92+
"action": "Heartbeat"
93+
},
94+
{
95+
"index": 13,
96+
"messageType": "CALLRESULT",
97+
"messageId": "msg-hb-1",
98+
"action": "Heartbeat",
99+
"correlatesWith": 12
100+
},
101+
{
102+
"index": 14,
103+
"messageType": "CALL",
104+
"messageId": "msg-007",
105+
"action": "MeterValues"
106+
},
107+
{
108+
"index": 15,
109+
"messageType": "CALLRESULT",
110+
"messageId": "msg-007",
111+
"action": "MeterValues",
112+
"correlatesWith": 14
113+
},
114+
{
115+
"index": 16,
116+
"messageType": "CALL",
117+
"messageId": "msg-008",
118+
"action": "StatusNotification"
119+
},
120+
{
121+
"index": 17,
122+
"messageType": "CALLRESULT",
123+
"messageId": "msg-008",
124+
"action": "StatusNotification",
125+
"correlatesWith": 16
126+
},
127+
{
128+
"index": 18,
129+
"messageType": "CALL",
130+
"messageId": "msg-009",
131+
"action": "StopTransaction"
132+
},
133+
{
134+
"index": 19,
135+
"messageType": "CALLRESULT",
136+
"messageId": "msg-009",
137+
"action": "StopTransaction",
138+
"correlatesWith": 18
139+
}
140+
],
141+
"unansweredCalls": [],
142+
"orphanResponses": []
143+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:00:00.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"cp-to-csms","messageType":"CALL","messageId":"msg-001","action":"BootNotification","payload":{"chargePointVendor":"SyntheticVendor","chargePointModel":"SM-100","chargePointSerialNumber":"CS-SYNTHETIC-003","firmwareVersion":"1.0.0"},"raw":"[2,\"msg-001\",\"BootNotification\",{\"chargePointVendor\":\"SyntheticVendor\",\"chargePointModel\":\"SM-100\",\"chargePointSerialNumber\":\"CS-SYNTHETIC-003\",\"firmwareVersion\":\"1.0.0\"}]"}
2+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:00:00.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-001","payload":{"currentTime":"2024-01-15T12:00:00.500Z","interval":300,"status":"Accepted"},"raw":"[3,\"msg-001\",{\"currentTime\":\"2024-01-15T12:00:00.500Z\",\"interval\":300,\"status\":\"Accepted\"}]"}
3+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:01:00.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","connectorId":0,"direction":"cp-to-csms","messageType":"CALL","messageId":"msg-002","action":"StatusNotification","payload":{"connectorId":0,"status":"Available","errorCode":"NoError"},"raw":"[2,\"msg-002\",\"StatusNotification\",{\"connectorId\":0,\"status\":\"Available\",\"errorCode\":\"NoError\"}]"}
4+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:01:00.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-002","payload":{},"raw":"[3,\"msg-002\",{}]"}
5+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:00.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","connectorId":1,"direction":"cp-to-csms","messageType":"CALL","messageId":"msg-003","action":"StatusNotification","payload":{"connectorId":1,"status":"Preparing","errorCode":"NoError"},"raw":"[2,\"msg-003\",\"StatusNotification\",{\"connectorId\":1,\"status\":\"Preparing\",\"errorCode\":\"NoError\"}]"}
6+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:00.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-003","payload":{},"raw":"[3,\"msg-003\",{}]"}
7+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:15.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"cp-to-csms","messageType":"CALL","messageId":"msg-004","action":"Authorize","payload":{"idTag":"SYNTHETIC-TAG-002"},"raw":"[2,\"msg-004\",\"Authorize\",{\"idTag\":\"SYNTHETIC-TAG-002\"}]"}
8+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:15.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-004","payload":{"idTagInfo":{"status":"Accepted","expiryDate":"2024-12-31T23:59:59.000Z"}},"raw":"[3,\"msg-004\",{\"idTagInfo\":{\"status\":\"Accepted\",\"expiryDate\":\"2024-12-31T23:59:59.000Z\"}}]"}
9+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:30.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","connectorId":1,"direction":"cp-to-csms","messageType":"CALL","messageId":"msg-005","action":"StartTransaction","payload":{"connectorId":1,"idTag":"SYNTHETIC-TAG-002","meterStart":0,"timestamp":"2024-01-15T12:02:30.000Z"},"raw":"[2,\"msg-005\",\"StartTransaction\",{\"connectorId\":1,\"idTag\":\"SYNTHETIC-TAG-002\",\"meterStart\":0,\"timestamp\":\"2024-01-15T12:02:30.000Z\"}]"}
10+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:30.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-005","payload":{"transactionId":100002,"idTagInfo":{"status":"Accepted"}},"raw":"[3,\"msg-005\",{\"transactionId\":100002,\"idTagInfo\":{\"status\":\"Accepted\"}}]"}
11+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:31.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","connectorId":1,"direction":"cp-to-csms","messageType":"CALL","messageId":"msg-006","action":"StatusNotification","payload":{"connectorId":1,"status":"Charging","errorCode":"NoError"},"raw":"[2,\"msg-006\",\"StatusNotification\",{\"connectorId\":1,\"status\":\"Charging\",\"errorCode\":\"NoError\"}]"}
12+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:02:31.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-006","payload":{},"raw":"[3,\"msg-006\",{}]"}
13+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:07:30.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"cp-to-csms","messageType":"CALL","messageId":"msg-hb-1","action":"Heartbeat","payload":{},"raw":"[2,\"msg-hb-1\",\"Heartbeat\",{}]"}
14+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:07:30.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-hb-1","payload":{"currentTime":"2024-01-15T12:07:30.500Z"},"raw":"[3,\"msg-hb-1\",{\"currentTime\":\"2024-01-15T12:07:30.500Z\"}]"}
15+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:15:00.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","connectorId":1,"direction":"cp-to-csms","messageType":"CALL","messageId":"msg-007","action":"MeterValues","payload":{"connectorId":1,"transactionId":100002,"meterValue":[{"timestamp":"2024-01-15T12:15:00.000Z","sampledValue":[{"value":"3500","measurand":"Energy.Active.Import.Register","unit":"Wh"}]}]},"raw":"[2,\"msg-007\",\"MeterValues\",{\"connectorId\":1,\"transactionId\":100002,\"meterValue\":[{\"timestamp\":\"2024-01-15T12:15:00.000Z\",\"sampledValue\":[{\"value\":\"3500\",\"measurand\":\"Energy.Active.Import.Register\",\"unit\":\"Wh\"}]}]}]"}
16+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:15:00.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-007","payload":{},"raw":"[3,\"msg-007\",{}]"}
17+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:18:00.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","connectorId":1,"direction":"cp-to-csms","messageType":"CALL","messageId":"msg-008","action":"StatusNotification","payload":{"connectorId":1,"status":"Faulted","errorCode":"ConnectorLockFailure","info":"Connector lock mechanism failure detected"},"raw":"[2,\"msg-008\",\"StatusNotification\",{\"connectorId\":1,\"status\":\"Faulted\",\"errorCode\":\"ConnectorLockFailure\",\"info\":\"Connector lock mechanism failure detected\"}]"}
18+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:18:00.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-008","payload":{},"raw":"[3,\"msg-008\",{}]"}
19+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:18:05.000Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"cp-to-csms","messageType":"CALL","messageId":"msg-009","action":"StopTransaction","payload":{"transactionId":100002,"idTag":"SYNTHETIC-TAG-002","meterStop":3500,"timestamp":"2024-01-15T12:18:05.000Z","reason":"Other"},"raw":"[2,\"msg-009\",\"StopTransaction\",{\"transactionId\":100002,\"idTag\":\"SYNTHETIC-TAG-002\",\"meterStop\":3500,\"timestamp\":\"2024-01-15T12:18:05.000Z\",\"reason\":\"Other\"}]"}
20+
{"schemaVersion":"1.1","timestamp":"2024-01-15T12:18:05.500Z","ocppVersion":"1.6","transport":"json","chargePointId":"CS-SYNTHETIC-003","direction":"csms-to-cp","messageType":"CALLRESULT","messageId":"msg-009","payload":{"idTagInfo":{"status":"Accepted"}},"raw":"[3,\"msg-009\",{\"idTagInfo\":{\"status\":\"Accepted\"}}]"}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
{
2+
"schemaVersion": "1.1",
3+
"counts": {
4+
"records": 8,
5+
"calls": 4,
6+
"callResults": 4,
7+
"callErrors": 0
8+
},
9+
"records": [
10+
{
11+
"index": 0,
12+
"messageType": "CALL",
13+
"messageId": "msg-001",
14+
"action": "BootNotification"
15+
},
16+
{
17+
"index": 1,
18+
"messageType": "CALLRESULT",
19+
"messageId": "msg-001",
20+
"action": "BootNotification",
21+
"correlatesWith": 0
22+
},
23+
{
24+
"index": 2,
25+
"messageType": "CALL",
26+
"messageId": "msg-002",
27+
"action": "StatusNotification"
28+
},
29+
{
30+
"index": 3,
31+
"messageType": "CALLRESULT",
32+
"messageId": "msg-002",
33+
"action": "StatusNotification",
34+
"correlatesWith": 2
35+
},
36+
{
37+
"index": 4,
38+
"messageType": "CALL",
39+
"messageId": "msg-hb-1",
40+
"action": "Heartbeat"
41+
},
42+
{
43+
"index": 5,
44+
"messageType": "CALLRESULT",
45+
"messageId": "msg-hb-1",
46+
"action": "Heartbeat",
47+
"correlatesWith": 4
48+
},
49+
{
50+
"index": 6,
51+
"messageType": "CALL",
52+
"messageId": "msg-003",
53+
"action": "DiagnosticsStatusNotification"
54+
},
55+
{
56+
"index": 7,
57+
"messageType": "CALLRESULT",
58+
"messageId": "msg-003",
59+
"action": "DiagnosticsStatusNotification",
60+
"correlatesWith": 6
61+
}
62+
],
63+
"unansweredCalls": [],
64+
"orphanResponses": []
65+
}

0 commit comments

Comments
 (0)