Tests#
How to describe testing: the plan as a test protocol, each execution on one cell as a test. Planned conditions live on the protocol; as-run conditions on the test; both are {value, unit} quantities by contract.
The protocol is the plan; the test is one execution on one cell (
cell_id), linked byprotocol_id.Conditions are
{value, unit}quantities - planned ones on the protocol, as-run ones on the test.PyBaMM-style
experimentstrings become structuredmethodsteps automatically.Deviations from the plan go in the test’s
conformanceblock.
Define one#
The protocol#
from battinfo import TestSpec
protocol = TestSpec(
id="https://w3id.org/battinfo/spec/kxwy-5f5f-f682-hhch",
name="1C cycle life at 25 degC",
kind="cycling",
experiment=[ # PyBaMM syntax — runnable as-is
"Charge at 1C until 4.2 V",
"Hold at 4.2 V until C/20",
"Discharge at 1C until 2.5 V",
"Rest for 10 minutes",
],
# Conditions are quantities ({value, unit}), by contract (#363).
conditions={"ambient_temperature": {"value": 25.0, "unit": "degC"}},
source={"type": "manual", "retrieved_at": 1750000000},
)
record = protocol.to_record()
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/kxwy-5f5f-f682-hhch",
"short_id": "kxwy5f",
"identifier": "test-protocol:kxwy-5f5f-f682-hhch",
"name": "1C cycle life at 25 degC",
"kind": "cycling"
},
"provenance": {
"source_type": "manual",
"retrieved_at": 1750000000,
"battinfo_version": "0.7.0"
},
"method": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.0,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at 1C until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 1.0,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at 1C until 2.5 V"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
}
],
"facets": {
"modes": [
"cc",
"cv",
"rest"
],
"directions": [
"charge",
"discharge"
],
"control_modes": [
"current",
"voltage"
],
"has_cv_hold": true,
"has_rest": true,
"has_eis": false,
"c_rates": [
0.05,
1.0
],
"voltage_window_V": [
2.5,
4.2
],
"temperatures": [
25.0
]
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
}
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"CyclingTest"
],
"@id": "https://w3id.org/battinfo/spec/kxwy-5f5f-f682-hhch",
"schema:name": "1C cycle life at 25 degC",
"schema:additionalType": "cycling",
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at 1C until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at 1C until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2025-06-15T15:06:40+00:00"
}
}
What to notice:
The PyBaMM-style
experimentstrings become the structuredmethodsteps at the record top level, and the JSON-LD emits a typed EMMO workflow (prov:Plan/schema:HowTo).
The execution#
from battinfo import Cell, CellSpec, Test, TestSpec
cell = Cell(
id="https://w3id.org/battinfo/cell/y9xy-kr0v-y5tn-dfj7",
cell_spec=CellSpec(
id="https://w3id.org/battinfo/spec/7d9k-2m4p-8t3x-6nq5",
manufacturer="Samsung SDI", model="INR21700-50E",
format="cylindrical", chemistry="Li-ion",
),
serial_number="LAB-2026-0001",
)
protocol = TestSpec( # the protocol defined above
id="https://w3id.org/battinfo/spec/kxwy-5f5f-f682-hhch",
name="1C cycle life at 25 degC",
kind="cycling",
)
test = Test(
id="https://w3id.org/battinfo/test/3w87-0ddf-ryjg-evxe",
cell=cell, # what you did, to which cell
protocol=protocol, # kind, name, protocol_id all derive
instrument="Biologic VMP-300",
status="completed",
# As-run conditions: what actually applied, as {value, unit}
# quantities (planned conditions live on the protocol).
conditions={"ambient_temperature": {"value": 24.6, "unit": "degC"}},
started_at=1750000000,
source={"type": "measurement", "retrieved_at": 1750000000},
)
record = test.to_record()
{
"schema_version": "0.2.0",
"test": {
"id": "https://w3id.org/battinfo/test/3w87-0ddf-ryjg-evxe",
"short_id": "3w870d",
"identifier": "test:3w87-0ddf-ryjg-evxe",
"name": "LAB-2026-0001 1C cycle life at 25 degC",
"kind": "cycling",
"cell_id": "https://w3id.org/battinfo/cell/y9xy-kr0v-y5tn-dfj7",
"protocol_id": "https://w3id.org/battinfo/spec/kxwy-5f5f-f682-hhch",
"status": "completed",
"conditions": {
"ambient_temperature": {
"value": 24.6,
"unit": "degC"
}
},
"protocol_name": "1C cycle life at 25 degC",
"instrument_name": "Biologic VMP-300",
"started_at": 1750000000
},
"provenance": {
"source_type": "measurement",
"retrieved_at": 1750000000,
"battinfo_version": "0.7.0"
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"BatteryTest",
"schema:Action",
"prov:Activity"
],
"@id": "https://w3id.org/battinfo/test/3w87-0ddf-ryjg-evxe",
"schema:name": "LAB-2026-0001 1C cycle life at 25 degC",
"schema:additionalType": "cycling",
"schema:instrument": "Biologic VMP-300",
"schema:measurementTechnique": "1C cycle life at 25 degC",
"schema:actionStatus": "completed",
"hasTestObject": {
"@id": "https://w3id.org/battinfo/cell/y9xy-kr0v-y5tn-dfj7"
},
"dcterms:conformsTo": {
"@id": "https://w3id.org/battinfo/spec/kxwy-5f5f-f682-hhch"
},
"schema:additionalProperty": [
{
"@type": "schema:PropertyValue",
"schema:name": "ambient_temperature",
"schema:value": 24.6,
"schema:unitText": "degC"
}
],
"hasMeasurementParameter": {
"@type": [
"battinfo:ambientTemperature",
"ConventionalProperty"
],
"skos:prefLabel": "ambient_temperature",
"hasNumericalPart": {
"@type": "RealData",
"hasNumberValue": 24.6
},
"hasMeasurementUnit": "https://w3id.org/emmo#EMMO_36a9bf69_483b_42fd_8a0c_7ac9206320bc"
},
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "measurement",
"prov:generatedAtTime": "2025-06-15T15:06:40+00:00"
}
}
What to notice:
hasTestObject/schema:objectpoint at the cell;dcterms:conformsTopoints at the protocol.protocol=takes the TestSpec itself: kind, protocol name andprotocol_idderive from it — stated once, on the protocol, never retyped on the execution.As-run conditions emit as typed
hasMeasurementParameternodes on the test node (plus aschema:PropertyValuecopy underschema:additionalProperty).
Common examples#
A selection of real, validated records from the packaged examples corpus — each one click away, included from its single source under examples/. The full, living library is the registry: browse it there.
1C Cycle Life at 25 C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-8r2m-4v6k-9p3t-7n5x.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/8r2m-4v6k-9p3t-7n5x",
"short_id": "8r2m4v",
"identifier": "test-protocol:8r2m-4v6k-9p3t-7n5x",
"name": "1C Cycle Life at 25 C",
"kind": "cycling",
"description": "Repeated 1C charge and 1C discharge at nominal room temperature.",
"version": "1.0",
"protocol_url": "https://example.org/protocols/cycle-life-1c"
},
"method": [
{
"mode": "group",
"count": 500,
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": { "c_rate": { "value": 1.0, "unit": "A/Ah" } },
"termination": [ { "quantity": "voltage", "value": 4.2, "unit": "V", "direction": "above" } ],
"description": "Charge at 1C until 4.2 V"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": { "c_rate": { "value": 1.0, "unit": "A/Ah" } },
"termination": [ { "quantity": "voltage", "value": 2.5, "unit": "V", "direction": "below" } ],
"description": "Discharge at 1C until 2.5 V"
}
]
}
],
"record": { "time_s": 30 },
"conditions": {
"temperature": { "value": 25.0, "unit": "degC" }
},
"facets": {
"modes": ["group"],
"directions": ["charge", "discharge"],
"control_modes": ["current"],
"has_cv_hold": false,
"has_rest": false,
"has_eis": false,
"c_rates": [1.0],
"voltage_window_V": [2.5, 4.2],
"temperatures": [25.0]
},
"provenance": {
"source_type": "manual",
"source_file": "cycle-life-1c.protocol.json",
"retrieved_at": 1773811200
},
"notes": [
"Example reusable BattINFO test protocol."
]
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"CyclingTest"
],
"@id": "https://w3id.org/battinfo/spec/8r2m-4v6k-9p3t-7n5x",
"schema:name": "1C Cycle Life at 25 C",
"schema:additionalType": "cycling",
"schema:description": "Repeated 1C charge and 1C discharge at nominal room temperature.",
"hasTask": [
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 500
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at 1C until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at 1C until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2026-03-18T05:20:00+00:00"
}
}
Capacity Check — C/10 at 25 C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-fj4k-hj6f-cd5v-36fb.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/fj4k-hj6f-cd5v-36fb",
"short_id": "fj4khj",
"identifier": "test-protocol:fj4k-hj6f-cd5v-36fb",
"name": "Capacity Check — C/10 at 25 C",
"kind": "capacity_check",
"description": "Standard deliverable-capacity check: CC-CV charge then slow C/10 discharge."
},
"provenance": {
"source_type": "manual",
"retrieved_at": 1781778244
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
}
},
"method": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.3333333333333333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/3 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.1,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/10 until 2.5 V"
}
],
"facets": {
"modes": [
"cc",
"cv"
],
"directions": [
"charge",
"discharge"
],
"control_modes": [
"current",
"voltage"
],
"has_cv_hold": true,
"has_rest": false,
"has_eis": false,
"c_rates": [
0.05,
0.1,
0.3333333333333333
],
"voltage_window_V": [
2.5,
4.2
],
"temperatures": [
25.0
]
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"CapacityTest"
],
"@id": "https://w3id.org/battinfo/spec/fj4k-hj6f-cd5v-36fb",
"schema:name": "Capacity Check — C/10 at 25 C",
"schema:additionalType": "capacity_check",
"schema:description": "Standard deliverable-capacity check: CC-CV charge then slow C/10 discharge.",
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/3 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.3333333333333333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/10 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2026-06-18T10:24:04+00:00"
}
}
Rate Capability: C/10 to 5C Discharge at 25°C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-5v3n-8x1m-4k7p-9r2t.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/5v3n-8x1m-4k7p-9r2t",
"short_id": "5v3n8x",
"identifier": "test-protocol:5v3n-8x1m-4k7p-9r2t",
"name": "Rate Capability: C/10 to 5C Discharge at 25°C",
"kind": "rate_capability",
"description": "Galvanostatic constant-current discharge at six C-rates (C/10, C/5, C/2, 1C, 2C, 5C) to measure deliverable capacity and energy as a function of rate. Each discharge is preceded by a full constant-current constant-voltage charge at C/5. Three cycles are recorded at each rate. A reference C/10 cycle is repeated at the end to confirm capacity recovery.",
"version": "1.0",
"protocol_url": "https://example.org/protocols/rate-capability-c10-to-5c"
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
}
},
"method": [
{
"mode": "group",
"count": 3,
"description": "Three cycles at C/10 discharge",
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/5 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.1,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/10 until 2.5 V"
}
]
},
{
"mode": "group",
"count": 3,
"description": "Three cycles at C/5 discharge",
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/5 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/5 until 2.5 V"
}
]
},
{
"mode": "group",
"count": 3,
"description": "Three cycles at C/2 discharge",
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/5 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.5,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/2 until 2.5 V"
}
]
},
{
"mode": "group",
"count": 3,
"description": "Three cycles at 1C discharge",
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/5 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 1.0,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at 1C until 2.5 V"
}
]
},
{
"mode": "group",
"count": 3,
"description": "Three cycles at 2C discharge",
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/5 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at 2C until 2.5 V"
}
]
},
{
"mode": "group",
"count": 3,
"description": "Three cycles at 5C discharge",
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/5 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 5.0,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at 5C until 2.5 V"
}
]
},
{
"mode": "group",
"count": 1,
"description": "Reference C/10 recovery cycle",
"steps": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.2,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/5 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.1,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/10 until 2.5 V"
}
]
}
],
"provenance": {
"source_type": "manual",
"source_file": "rate-capability-c10-5c.protocol.json",
"retrieved_at": 1746230400
},
"notes": [
"CC-CV charge at C/5 with C/20 cut-off ensures full, reproducible starting SOC across all rates.",
"30-minute rest between steps allows thermal equilibration and open-circuit relaxation.",
"At high rates (2C, 5C) the delivered capacity will be significantly lower than the nominal value; this is the expected and intended outcome.",
"Specific energy (Wh/kg) and energy density (Wh/L) can be computed from the measured energy and the cell mass/volume recorded in the cell-type record.",
"Pre-method-model parameters preserved on migration: {\"setpoints\": {\"charge_rate\": {\"value\": 0.2, \"unit\": \"C\"}, \"charge_cutoff_voltage\": {\"value_text\": \"upper_voltage_limit per cell specification\"}, \"charge_termination_current\": {\"value\": 0.05, \"unit\": \"C\"}, \"discharge_rates\": {\"value_text\": \"C/10, C/5, C/2, 1C, 2C, 5C\"}, \"discharge_cutoff_voltage\": {\"value_text\": \"lower_voltage_limit per cell specification\"}, \"cycles_per_rate\": {\"value\": 3, \"unit\": \"count\"}, \"rest_between_steps\": {\"value\": 30.0, \"unit\": \"min\"}}, \"termination_criteria\": {\"discharge_cutoff_voltage\": {\"value_text\": \"lower_voltage_limit per cell specification\"}}, \"measurement_outputs\": [{\"name\": \"Voltage\", \"unit_text\": \"V\"}, {\"name\": \"Current\", \"unit_text\": \"A\"}, {\"name\": \"Capacity\", \"unit_text\": \"Ah\"}, {\"name\": \"Energy\", \"unit_text\": \"Wh\"}, {\"name\": \"Temperature\", \"unit_text\": \"degC\"}]}"
]
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"CRateTest"
],
"@id": "https://w3id.org/battinfo/spec/5v3n-8x1m-4k7p-9r2t",
"schema:name": "Rate Capability: C/10 to 5C Discharge at 25°C",
"schema:additionalType": "rate_capability",
"schema:description": "Galvanostatic constant-current discharge at six C-rates (C/10, C/5, C/2, 1C, 2C, 5C) to measure deliverable capacity and energy as a function of rate. Each discharge is preceded by a full constant-current constant-voltage charge at C/5. Three cycles are recorded at each rate. A reference C/10 cycle is repeated at the end to confirm capacity recovery.",
"hasTask": [
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 3
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/5 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/10 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 3
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/5 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/5 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 3
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/5 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/2 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.5
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 3
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/5 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at 1C until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 3
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/5 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at 2C until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 3
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/5 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at 5C until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 5.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 1
}
},
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/5 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/10 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2025-05-03T00:00:00+00:00"
}
}
Formation — Slow First Cycles at 25 C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-j19t-9cm0-f219-zh4y.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/j19t-9cm0-f219-zh4y",
"short_id": "j19t9c",
"identifier": "test-protocol:j19t-9cm0-f219-zh4y",
"name": "Formation — Slow First Cycles at 25 C",
"kind": "formation",
"description": "First-cycle formation/activation: slow C/20 cycles to build the SEI, then a C/10 conditioning cycle."
},
"provenance": {
"source_type": "manual",
"retrieved_at": 1781778244
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
}
},
"method": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.05,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/20 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.02,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/50"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 1800.0,
"unit": "s"
},
"description": "Rest for 30 minutes"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.05,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/20 until 2.5 V"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.1,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/10 until 4.2 V"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.1,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/10 until 2.5 V"
}
],
"facets": {
"modes": [
"cc",
"cv",
"rest"
],
"directions": [
"charge",
"discharge"
],
"control_modes": [
"current",
"voltage"
],
"has_cv_hold": true,
"has_rest": true,
"has_eis": false,
"c_rates": [
0.02,
0.05,
0.1
],
"voltage_window_V": [
2.5,
4.2
],
"temperatures": [
25.0
]
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"FormationCycling"
],
"@id": "https://w3id.org/battinfo/spec/j19t-9cm0-f219-zh4y",
"schema:name": "Formation — Slow First Cycles at 25 C",
"schema:additionalType": "formation",
"schema:description": "First-cycle formation/activation: slow C/20 cycles to build the SEI, then a C/10 conditioning cycle.",
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/20 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/50",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.02
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 30 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 1800.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/20 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/10 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/10 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2026-06-18T10:24:04+00:00"
}
}
HPPC — Pulse Power Characterisation at 25°C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-7m4t-1n9v-6r3k-2p8x.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/7m4t-1n9v-6r3k-2p8x",
"short_id": "7m4t1n",
"identifier": "test-protocol:7m4t-1n9v-6r3k-2p8x",
"name": "HPPC — Pulse Power Characterisation at 25°C",
"kind": "hppc",
"description": "Hybrid Pulse Power Characterisation (HPPC) per IEC 62660-1 / USABC methodology. Discharge and charge pulses are applied at nine SOC setpoints (90%, 80%, 70%, 60%, 50%, 40%, 30%, 20%, 10%) to determine DC internal resistance and the cell's power capability envelope as a function of state of charge. A 10s 2C discharge pulse followed by a 40s rest and a 10s 1.75C charge pulse is applied at each SOC level.",
"version": "1.0",
"protocol_url": "https://example.org/protocols/hppc-iec62660"
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
}
},
"method": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/3 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.05,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/20"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.9,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 90% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 90% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 90% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.8,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 80% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 80% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 80% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.7,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 70% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 70% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 70% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.6,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 60% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 60% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 60% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.5,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 50% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 50% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 50% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.4,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 40% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 40% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 40% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.3,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 30% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 30% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 30% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.2,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 20% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 20% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 20% SOC"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.333,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "soc",
"value": 0.1,
"unit": "1",
"direction": "below"
}
],
"description": "Discharge at C/3 to 10% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 2.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 2C discharge pulse at 10% SOC"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "40 s rest"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 1.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "10 s 1.75C charge pulse at 10% SOC"
}
],
"provenance": {
"source_type": "manual",
"source_file": "hppc-iec62660.protocol.json",
"retrieved_at": 1746230400
},
"notes": [
"DC internal resistance is calculated from the instantaneous voltage drop at the start of each pulse: DCIR = delta_V / delta_I.",
"The 1-hour rest period after each charge pulse allows open-circuit relaxation before the next SOC step.",
"Pulse voltage limits must be respected; at low SOC, discharge pulses may be truncated before 10s if the lower voltage limit is reached.",
"Temperature must remain within the cell's operating temperature range throughout; protocol should be paused if the cell surface exceeds 35 degC.",
"Pre-method-model parameters preserved on migration: {\"setpoints\": {\"pre_test_charge_rate\": {\"value\": 0.2, \"unit\": \"C\"}, \"soc_setpoints\": {\"value_text\": \"90%, 80%, 70%, 60%, 50%, 40%, 30%, 20%, 10%\"}, \"soc_step_discharge_rate\": {\"value\": 0.2, \"unit\": \"C\"}, \"discharge_pulse_current\": {\"value\": 2.0, \"unit\": \"C\"}, \"discharge_pulse_duration\": {\"value\": 10.0, \"unit\": \"s\"}, \"rest_after_discharge_pulse\": {\"value\": 40.0, \"unit\": \"s\"}, \"charge_pulse_current\": {\"value\": 1.75, \"unit\": \"C\"}, \"charge_pulse_duration\": {\"value\": 10.0, \"unit\": \"s\"}, \"rest_after_charge_pulse\": {\"value\": 1.0, \"unit\": \"h\"}}, \"termination_criteria\": {\"voltage_lower_limit\": {\"value_text\": \"lower_voltage_limit per cell specification \\u2014 terminate pulse if reached before duration\"}, \"voltage_upper_limit\": {\"value_text\": \"upper_voltage_limit per cell specification \\u2014 terminate charge pulse if reached before duration\"}}, \"measurement_outputs\": [{\"name\": \"Voltage\", \"unit_text\": \"V\"}, {\"name\": \"Current\", \"unit_text\": \"A\"}, {\"name\": \"Temperature\", \"unit_text\": \"degC\"}, {\"name\": \"DCInternalResistance\", \"unit_text\": \"Ohm\"}, {\"name\": \"Capacity\", \"unit_text\": \"Ah\"}]}"
]
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"HPPC"
],
"@id": "https://w3id.org/battinfo/spec/7m4t-1n9v-6r3k-2p8x",
"schema:name": "HPPC — Pulse Power Characterisation at 25°C",
"schema:additionalType": "hppc",
"schema:description": "Hybrid Pulse Power Characterisation (HPPC) per IEC 62660-1 / USABC methodology. Discharge and charge pulses are applied at nine SOC setpoints (90%, 80%, 70%, 60%, 50%, 40%, 30%, 20%, 10%) to determine DC internal resistance and the cell's power capability envelope as a function of state of charge. A 10s 2C discharge pulse followed by a 40s rest and a 10s 1.75C charge pulse is applied at each SOC level.",
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/3 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/20",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.05
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 90% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.9
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 90% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 90% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 80% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.8
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 80% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 80% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 70% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.7
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 70% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 70% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 60% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.6
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 60% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 60% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 50% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.5
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 50% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 50% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 40% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.4
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 40% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 40% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 30% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.3
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 30% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 30% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 20% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.2
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 20% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 20% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/3 to 10% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.333
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "StateOfCharge",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "emmo:EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "10 s 2C discharge pulse at 10% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 2.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "40 s rest",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "10 s 1.75C charge pulse at 10% SOC",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2025-05-03T00:00:00+00:00"
}
}
DCIR — 10 s Pulse Resistance at 50% SOC, 25 C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-ev9g-3eje-xfg8-n19f.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/ev9g-3eje-xfg8-n19f",
"short_id": "ev9g3e",
"identifier": "test-protocol:ev9g-3eje-xfg8-n19f",
"name": "DCIR — 10 s Pulse Resistance at 50% SOC, 25 C",
"kind": "dcir",
"description": "DC internal resistance from a 10 s discharge pulse and rest at 50% state of charge."
},
"provenance": {
"source_type": "manual",
"retrieved_at": 1781778244
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
},
"state_of_charge": {
"value": 50.0,
"unit": "%"
}
},
"method": [
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 1.0,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "Discharge at 1C for 10 seconds"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 40.0,
"unit": "s"
},
"description": "Rest for 40 seconds"
},
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.75,
"unit": "A/Ah"
}
},
"duration": {
"value": 10.0,
"unit": "s"
},
"description": "Charge at 0.75C for 10 seconds"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 600.0,
"unit": "s"
},
"description": "Rest for 10 minutes"
}
],
"facets": {
"modes": [
"rest",
"cc"
],
"directions": [
"charge",
"discharge"
],
"control_modes": [
"current"
],
"has_cv_hold": false,
"has_rest": true,
"has_eis": false,
"c_rates": [
0.75,
1.0
],
"temperatures": [
25.0
]
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo"
],
"@id": "https://w3id.org/battinfo/spec/ev9g-3eje-xfg8-n19f",
"schema:name": "DCIR — 10 s Pulse Resistance at 50% SOC, 25 C",
"schema:additionalType": "dcir",
"schema:description": "DC internal resistance from a 10 s discharge pulse and rest at 50% state of charge.",
"hasTask": [
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at 1C for 10 seconds",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 1.0
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 40 seconds",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 40.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at 0.75C for 10 seconds",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.75
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 10.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 10 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"schema:additionalProperty": [
{
"@type": "schema:PropertyValue",
"schema:name": "state_of_charge",
"schema:propertyID": "conditions",
"schema:value": 50.0,
"schema:unitText": "%"
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2026-06-18T10:24:04+00:00"
}
}
GITT — Galvanostatic Intermittent Titration at 25°C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-3p7k-2m9r-6t4n-1v8x.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/3p7k-2m9r-6t4n-1v8x",
"short_id": "3p7k2m",
"identifier": "test-protocol:3p7k-2m9r-6t4n-1v8x",
"name": "GITT — Galvanostatic Intermittent Titration at 25°C",
"kind": "gitt",
"description": "Galvanostatic Intermittent Titration Technique (GITT) applied during discharge from 100% to ~5% SOC at 25°C. A 10-minute C/10 current pulse is applied followed by a 60-minute rest at open-circuit. The OCV relaxation transient after each pulse is used to calculate the apparent solid-state lithium diffusion coefficient (D_Li) in the electrode as a function of SOC. The full discharge GITT curve also yields a pseudo-equilibrium OCV profile.",
"version": "1.0",
"protocol_url": "https://example.org/protocols/gitt-discharge-25c"
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
},
"initial_state_of_charge": {
"value": 100.0,
"unit": "%"
}
},
"method": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.1,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/10 until 4.2 V"
},
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 4.2,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.02,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Hold at 4.2 V until C/50"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Rest for 1 hour to relax to OCV"
},
{
"mode": "group",
"count": 60,
"description": "Titration sequence: repeat pulse + relaxation through the discharge (ends early below 2.5 V)",
"steps": [
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.1,
"unit": "A/Ah"
}
},
"duration": {
"value": 600.0,
"unit": "s"
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "C/10 discharge pulse for 10 minutes"
},
{
"mode": "rest",
"direction": "rest",
"duration": {
"value": 3600.0,
"unit": "s"
},
"description": "Open-circuit relaxation for 60 minutes"
}
]
}
],
"provenance": {
"source_type": "manual",
"source_file": "gitt-discharge-25c.protocol.json",
"retrieved_at": 1746230400
},
"notes": [
"D_Li is calculated from Weppner-Huggins equation: D = (4/pi) * (I_0 * V_m / (z_A * F * A))^2 * (delta_E_s / delta_E_t)^2.",
"A minimum 1-hour rest is needed for the voltage to approach equilibrium in most lithium-ion electrode materials.",
"Equivalent protocol can be applied during charge (GITT-charge) to probe kinetics in the opposite direction.",
"Full charge pre-conditioning: C/5 CC-CV charge with C/20 cut-off, then 2-hour rest before GITT discharge.",
"Pre-method-model parameters preserved on migration: {\"setpoints\": {\"current_pulse_rate\": {\"value\": 0.1, \"unit\": \"C\"}, \"current_pulse_duration\": {\"value\": 10.0, \"unit\": \"min\"}, \"rest_duration\": {\"value\": 60.0, \"unit\": \"min\"}, \"discharge_cutoff_voltage\": {\"value_text\": \"lower_voltage_limit per cell specification\"}}, \"termination_criteria\": {\"discharge_cutoff_voltage\": {\"value_text\": \"lower_voltage_limit per cell specification \\u2014 or ~5% SOC\"}}, \"measurement_outputs\": [{\"name\": \"Voltage\", \"unit_text\": \"V\"}, {\"name\": \"Current\", \"unit_text\": \"A\"}, {\"name\": \"Capacity\", \"unit_text\": \"Ah\"}, {\"name\": \"Temperature\", \"unit_text\": \"degC\"}]}"
]
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"GalvanostaticIntermittentTitrationTechnique"
],
"@id": "https://w3id.org/battinfo/spec/3p7k-2m9r-6t4n-1v8x",
"schema:name": "GITT — Galvanostatic Intermittent Titration at 25°C",
"schema:additionalType": "gitt",
"schema:description": "Galvanostatic Intermittent Titration Technique (GITT) applied during discharge from 100% to ~5% SOC at 25°C. A 10-minute C/10 current pulse is applied followed by a 60-minute rest at open-circuit. The OCV relaxation transient after each pulse is used to calculate the apparent solid-state lithium diffusion coefficient (D_Li) in the electrode as a function of SOC. The full discharge GITT curve also yields a pseudo-equilibrium OCV profile.",
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/10 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "VoltageHold",
"rdfs:label": "Hold at 4.2 V until C/50",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.02
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Rest for 1 hour to relax to OCV",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 60
}
},
"hasTask": [
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "C/10 discharge pulse for 10 minutes",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.1
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
},
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
},
{
"@type": "OpenCircuitHold",
"rdfs:label": "Open-circuit relaxation for 60 minutes",
"hasTerminationParameter": [
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 3600.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"schema:additionalProperty": [
{
"@type": "schema:PropertyValue",
"schema:name": "initial_state_of_charge",
"schema:propertyID": "conditions",
"schema:value": 100.0,
"schema:unitText": "%"
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2025-05-03T00:00:00+00:00"
}
}
PITT — Potentiostatic Intermittent Titration at 25°C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-pt4v-8mkq-2nwx-7hfd.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/pt4v-8mkq-2nwx-7hfd",
"short_id": "pt4v8m",
"identifier": "test-protocol:pt4v-8mkq-2nwx-7hfd",
"name": "PITT — Potentiostatic Intermittent Titration at 25°C",
"kind": "pitt",
"description": "Potentiostatic Intermittent Titration Technique (PITT) during charge from 3.0 V to 4.2 V at 25°C. The potential is stepped in 10 mV increments; each step is held until the current relaxes below C/50 or 30 minutes elapse. The current transient at each step yields the apparent solid-state diffusion coefficient as a function of potential, and the step charges integrate to a quasi-equilibrium OCV curve.",
"version": "1.0"
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
},
"voltage_step": {
"value": 10.0,
"unit": "mV"
},
"lower_voltage_limit": {
"value": 3.0,
"unit": "V"
},
"upper_voltage_limit": {
"value": 4.2,
"unit": "V"
}
},
"method": [
{
"mode": "cv",
"direction": "hold",
"setpoints": {
"voltage": {
"value": 3.0,
"unit": "V"
}
},
"termination": [
{
"quantity": "c_rate",
"value": 0.02,
"unit": "A/Ah",
"direction": "below"
}
],
"description": "Equilibrate at 3.0 V until C/50"
},
{
"mode": "group",
"count": 120,
"description": "Titration staircase: step the potential +10 mV (3.0 V toward 4.2 V) and hold; the per-iteration setpoint is the previous step plus the voltage_step condition",
"steps": [
{
"mode": "cv",
"direction": "hold",
"termination": [
{
"quantity": "c_rate",
"value": 0.02,
"unit": "A/Ah",
"direction": "below"
},
{
"quantity": "duration",
"value": 1800.0,
"unit": "s"
}
],
"description": "Hold at the stepped potential until C/50 or 30 minutes"
}
]
}
],
"provenance": {
"source_type": "manual",
"retrieved_at": 1757500000
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo"
],
"@id": "https://w3id.org/battinfo/spec/pt4v-8mkq-2nwx-7hfd",
"schema:name": "PITT — Potentiostatic Intermittent Titration at 25°C",
"schema:additionalType": "pitt",
"schema:description": "Potentiostatic Intermittent Titration Technique (PITT) during charge from 3.0 V to 4.2 V at 25°C. The potential is stepped in 10 mV increments; each step is held until the current relaxes below C/50 or 30 minutes elapse. The current transient at each step yields the apparent solid-state diffusion coefficient as a function of potential, and the step charges integrate to a quasi-equilibrium OCV curve.",
"hasTask": [
{
"@type": "VoltageHold",
"rdfs:label": "Equilibrate at 3.0 V until C/50",
"hasControlParameter": [
{
"@type": "Voltage",
"hasNumericalPart": {
"hasNumberValue": 3.0
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.02
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
]
},
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 120
}
},
"hasTask": [
{
"@type": "VoltageHold",
"rdfs:label": "Hold at the stepped potential until C/50 or 30 minutes",
"hasTerminationParameter": [
{
"@type": "TerminationQuantity",
"hasNumericalPart": {
"hasNumberValue": 0.02
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
},
{
"@type": "Duration",
"hasNumericalPart": {
"hasNumberValue": 1800.0
},
"hasMeasurementUnit": {
"@id": "emmo:Second"
}
}
]
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
},
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 3.0
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
},
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"schema:additionalProperty": [
{
"@type": "schema:PropertyValue",
"schema:name": "voltage_step",
"schema:propertyID": "conditions",
"schema:value": 10.0,
"schema:unitText": "mV"
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2025-09-10T10:26:40+00:00"
}
}
EIS Impedance — 100 kHz to 10 mHz at 50% SOC, 25 C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-wmqd-1fbt-zyya-k4bw.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/wmqd-1fbt-zyya-k4bw",
"short_id": "wmqd1f",
"identifier": "test-protocol:wmqd-1fbt-zyya-k4bw",
"name": "EIS Impedance — 100 kHz to 10 mHz at 50% SOC, 25 C",
"kind": "impedance",
"description": "Electrochemical impedance spectroscopy from 100 kHz to 10 mHz, 10 mV AC, at 50% state of charge."
},
"provenance": {
"source_type": "manual",
"retrieved_at": 1781778244
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
},
"state_of_charge": {
"value": 50.0,
"unit": "%"
}
},
"method": [
{
"mode": "eis",
"direction": "hold",
"setpoints": {
"frequency_upper_limit": {
"value": 100000.0,
"unit": "Hz"
},
"frequency_lower_limit": {
"value": 0.01,
"unit": "Hz"
},
"ac_perturbation_amplitude": {
"value": 10.0,
"unit": "mV"
}
}
}
],
"facets": {
"modes": [
"eis"
],
"directions": [],
"control_modes": [],
"has_cv_hold": false,
"has_rest": false,
"has_eis": true,
"temperatures": [
25.0
]
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"ElectrochemicalImpedanceSpectroscopy"
],
"@id": "https://w3id.org/battinfo/spec/wmqd-1fbt-zyya-k4bw",
"schema:name": "EIS Impedance — 100 kHz to 10 mHz at 50% SOC, 25 C",
"schema:additionalType": "impedance",
"schema:description": "Electrochemical impedance spectroscopy from 100 kHz to 10 mHz, 10 mV AC, at 50% state of charge.",
"hasTask": [
{
"@type": "ElectrochemicalImpedanceSpectroscopy"
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"schema:additionalProperty": [
{
"@type": "schema:PropertyValue",
"schema:name": "state_of_charge",
"schema:propertyID": "conditions",
"schema:value": 50.0,
"schema:unitText": "%"
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2026-06-18T10:24:04+00:00"
}
}
Cyclic Voltammetry — 0.1 mV/s, 3.0–4.3 V (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-cv7k-3wpm-9qtx-4nfh.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/cv7k-3wpm-9qtx-4nfh",
"short_id": "cv7k3w",
"identifier": "test-protocol:cv7k-3wpm-9qtx-4nfh",
"name": "Cyclic Voltammetry — 0.1 mV/s, 3.0–4.3 V",
"kind": "cyclic_voltammetry",
"description": "Cyclic voltammetry at 0.1 mV/s between 3.0 V and 4.3 V at 25°C, three cycles. Peak positions and separations identify redox reactions and their reversibility; the slow scan rate keeps the response near-equilibrium for intercalation electrodes.",
"version": "1.0"
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
}
},
"method": [
{
"mode": "group",
"count": 3,
"description": "One full potential cycle per iteration",
"steps": [
{
"mode": "scan",
"direction": "charge",
"setpoints": {
"scan_rate": {
"value": 0.1,
"unit": "mV/s"
},
"upper_voltage_limit": {
"value": 4.3,
"unit": "V"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.3,
"unit": "V",
"direction": "above"
}
],
"description": "Anodic sweep at 0.1 mV/s to 4.3 V"
},
{
"mode": "scan",
"direction": "discharge",
"setpoints": {
"scan_rate": {
"value": 0.1,
"unit": "mV/s"
},
"lower_voltage_limit": {
"value": 3.0,
"unit": "V"
}
},
"termination": [
{
"quantity": "voltage",
"value": 3.0,
"unit": "V",
"direction": "below"
}
],
"description": "Cathodic sweep at 0.1 mV/s to 3.0 V"
}
]
}
],
"provenance": {
"source_type": "manual",
"retrieved_at": 1757500000
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"CyclicVoltammetry"
],
"@id": "https://w3id.org/battinfo/spec/cv7k-3wpm-9qtx-4nfh",
"schema:name": "Cyclic Voltammetry — 0.1 mV/s, 3.0–4.3 V",
"schema:additionalType": "cyclic_voltammetry",
"schema:description": "Cyclic voltammetry at 0.1 mV/s between 3.0 V and 4.3 V at 25°C, three cycles. Peak positions and separations identify redox reactions and their reversibility; the slow scan rate keeps the response near-equilibrium for intercalation electrodes.",
"hasTask": [
{
"@type": "IterativeWorkflow",
"NumberOfIterations": {
"hasNumericalPart": {
"hasNumberValue": 3
}
},
"hasTask": [
{
"@type": "LinearScanVoltammetry",
"rdfs:label": "Anodic sweep at 0.1 mV/s to 4.3 V",
"hasControlParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.3
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.3
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "LinearScanVoltammetry",
"rdfs:label": "Cathodic sweep at 0.1 mV/s to 3.0 V",
"hasControlParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 3.0
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 3.0
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2025-09-10T10:26:40+00:00"
}
}
Quasi-OCV — C/25 Discharge at 25 C (test-protocol)
The record ships in the installed wheel — load it as a starting point:
import json
from importlib import resources
record = json.loads(
resources.files("battinfo")
.joinpath("data/examples/test-protocol/test-protocol-t163-7ba5-r0kn-h9my.json")
.read_text(encoding="utf-8")
)
{
"schema_version": "0.2.0",
"test_spec": {
"id": "https://w3id.org/battinfo/spec/t163-7ba5-r0kn-h9my",
"short_id": "t1637b",
"identifier": "test-protocol:t163-7ba5-r0kn-h9my",
"name": "Quasi-OCV — C/25 Discharge at 25 C",
"kind": "quasi_ocv",
"description": "Quasi-equilibrium open-circuit voltage profile mapped by a very slow C/25 charge and discharge."
},
"provenance": {
"source_type": "manual",
"retrieved_at": 1781778244
},
"conditions": {
"ambient_temperature": {
"value": 25.0,
"unit": "degC"
}
},
"method": [
{
"mode": "cc",
"direction": "charge",
"setpoints": {
"c_rate": {
"value": 0.04,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 4.2,
"unit": "V",
"direction": "above"
}
],
"description": "Charge at C/25 until 4.2 V"
},
{
"mode": "cc",
"direction": "discharge",
"setpoints": {
"c_rate": {
"value": 0.04,
"unit": "A/Ah"
}
},
"termination": [
{
"quantity": "voltage",
"value": 2.5,
"unit": "V",
"direction": "below"
}
],
"description": "Discharge at C/25 until 2.5 V"
}
],
"facets": {
"modes": [
"cc"
],
"directions": [
"charge",
"discharge"
],
"control_modes": [
"current"
],
"has_cv_hold": false,
"has_rest": false,
"has_eis": false,
"c_rates": [
0.04
],
"voltage_window_V": [
2.5,
4.2
],
"temperatures": [
25.0
]
}
}
Emitted by record_to_jsonld, hosted-context mode.
{
"@context": "https://w3id.org/battinfo/context/records/v1.json",
"@type": [
"prov:Plan",
"schema:HowTo",
"PseudoOpenCircuitVoltageMethod"
],
"@id": "https://w3id.org/battinfo/spec/t163-7ba5-r0kn-h9my",
"schema:name": "Quasi-OCV — C/25 Discharge at 25 C",
"schema:additionalType": "quasi_ocv",
"schema:description": "Quasi-equilibrium open-circuit voltage profile mapped by a very slow C/25 charge and discharge.",
"hasTask": [
{
"@type": "ConstantCurrentCharging",
"rdfs:label": "Charge at C/25 until 4.2 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.04
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "UpperVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 4.2
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
},
{
"@type": "ConstantCurrentDischarging",
"rdfs:label": "Discharge at C/25 until 2.5 V",
"hasControlParameter": [
{
"@type": "CRate",
"hasNumericalPart": {
"hasNumberValue": 0.04
},
"hasMeasurementUnit": {
"@id": "electrochemistry:AmperePerAmpereHour"
}
}
],
"hasTerminationParameter": [
{
"@type": "LowerVoltageLimit",
"hasNumericalPart": {
"hasNumberValue": 2.5
},
"hasMeasurementUnit": {
"@id": "emmo:Volt"
}
}
]
}
],
"hasProperty": [
{
"@type": "ConventionalProperty",
"hasNumericalPart": {
"hasNumberValue": 25.0
},
"rdfs:label": "ambient temperature",
"hasMeasurementUnit": {
"@id": "emmo:DegreeCelsius"
}
}
],
"dcterms:source": {
"@type": "prov:Entity",
"dcterms:type": "manual",
"prov:generatedAtTime": "2026-06-18T10:24:04+00:00"
}
}
Fields#
Generated from the packaged JSON Schemas — the same files battinfo validate and the registry’s publish gate enforce. Every record also carries the shared envelope (schema_version, provenance, and optional notes, funding, contributor, license). Quantities are {value, unit} maps and may also carry value_basis (Measured, Conventional, Rated, or Nominal) and conditions (the parameters under which the value holds, each itself a quantity; a qualitative condition may be value_text alone). In JSON-LD, conditions ride a measurement node the quantity isOutputOf; the voltage_reference key instead becomes a hasMetrologicalReference datum on the quantity, beside its unit. When authoring, an instance references its spec with the spec_id= kwarg; the record stores the self-describing <type>_spec_id key shown in the tables below.
test-protocol fields#
Schema: test-protocol.schema.json · required at top level: schema_version, test_spec, provenance
The test_spec block:
Field |
Type |
Required |
Description |
|---|---|---|---|
|
→ SpecIri |
yes |
|
|
→ ShortId |
||
|
string |
Local identifier for the protocol (e.g. a lab protocol code). |
|
|
string |
yes |
Human-readable protocol name. |
|
string |
Free-text description of the procedure. |
|
|
|
yes |
Kind of test the protocol implements. |
|
string |
Protocol version label. |
|
|
string |
URL of the protocol document. |
Top-level method: Ordered, typed descriptive steps. Canonical structured form of the procedure.
The record block:
Field |
Type |
Required |
Description |
|---|---|---|---|
|
number |
Record a data point every this many seconds. |
|
|
number |
Record a data point on a voltage change of this many volts. |
|
|
number |
Record a data point on a current change of this many milliamps. |
The safety block:
Field |
Type |
Required |
Description |
|---|---|---|---|
|
number or null |
Hard upper voltage limit in volts; the instrument aborts beyond it. |
|
|
number or null |
Hard lower voltage limit in volts. |
|
|
number or null |
Hard upper current limit in milliamps. |
|
|
number or null |
Hard lower current limit in milliamps. |
|
|
number or null |
Hard capacity limit in milliamp-hours. |
|
|
number or null |
||
|
number or null |
||
|
number or null |
Grace period in seconds before the safety limits are enforced. |
Top-level conditions: Planned protocol-level conditions, as a map of condition name to a {value, unit} quantity. Recommended keys: ambient_temperature, upper_voltage_limit, lower_voltage_limit, c_rate. As-run values or deviations are recorded on the test record. Recommended keys include initial_state_of_charge (unit ‘1’) and ambient_temperature - the declared starting state of the cell, the convention protocol importers (aurora-unicycler, UCP) map initial-state settings onto.
Top-level facets: Derived rollup index of the method for cheap filtering. Computed from method; never authored by hand.
Top-level artifacts: Actionable-layer links to runnable protocol files.
test fields#
Schema: test.schema.json · required at top level: schema_version, test, provenance
The test block:
Field |
Type |
Required |
Description |
|---|---|---|---|
|
→ TestIri |
yes |
Canonical IRI of this test record. |
|
→ ShortId |
||
|
string |
Local identifier for the test (e.g. a channel or run id). |
|
|
→ CellIri |
yes |
IRI of the cell instance the test was run on. |
|
string |
yes |
Human-readable test name. |
|
→ SpecIri |
IRI of the test-protocol (test spec) this test executed. |
|
|
string |
Free-text description of the test. |
|
|
|
yes |
Kind of test performed. |
|
|
Execution status of the test. |
|
|
string |
Protocol name for display, when no protocol record is linked. |
|
|
string |
URL of the protocol document. |
|
|
string |
Instrument or cycler the test was run on. |
|
|
→ EquipmentIri |
||
|
→ ChannelIri |
||
|
→ UnixTime |
Unix timestamp when the test started. |
|
|
→ UnixTime |
Unix timestamp when the test ended. |
|
|
array of → DatasetIri |
IRIs of dataset records produced by the test. Back-reference to dataset records. dataset.about is the source of truth for what a dataset describes; when records are saved together through a workspace the library fills this list from each dataset’s cell and test links, and hand-authored records may set it directly. |
|
|
object (open keys) |
As-run test conditions, as a map of condition name to a {value, unit} quantity. Planned conditions belong on the test protocol; record here the values actually applied or deviations from the protocol. Recommended keys: ambient_temperature, upper_voltage_limit, lower_voltage_limit, c_rate, state_of_charge. |
|
|
object |
Assessment of how well this record followed the spec that governs it. |
Top-level artifacts: Actionable-layer links to runnable protocol/vendor files produced by or executed in this test.
Design notes#
The reasoning behind the model
Two layers on the protocol. The descriptive layer is method[] — canonical structured steps (modes, directions, setpoints as quantities), authored directly or compiled from PyBaMM-style experiment strings — plus derived facets for querying. The actionable layer is artifacts[]: machine-runnable programs (cycler files, PyBaMM experiments) attached to the spec.
How the kinds are modelled. Each test kind (cycling, capacity check, rate capability, formation, HPPC, ICI, GITT, DCIR, EIS, quasi-OCV) has a canonical method shape; the JSON-LD emits a typed EMMO process graph — prov:Plan / schema:HowTo with a typed method class (for example GalvanostaticIntermittentTitrationTechnique) over an IterativeWorkflow of typed steps with control and termination parameters.
Execution semantics. A test links its cell (hasTestObject / schema:object) and protocol (dcterms:conformsTo). The test is the measurement activity, so as-run conditions emit twice: as typed hasMeasurementParameter nodes on the test node itself (the same shape quantity-level conditions take on their isOutputOf measurement node), and as schema:PropertyValue entries under schema:additionalProperty for standards-only consumers. A voltage_reference condition is a metrological datum, not a parameter — it emits as hasMetrologicalReference with a class-typed reference-electrode node (Li/Li+ → [ReferenceElectrode, LithiumElectrode]). Deviations live in the conformance block with typed deviation entries, so a non-conformant run stays honest without losing the protocol link.
Interop seams. The step model is the import target for executable protocol tools — battinfo.interop.protocols ships import_aurora_unicycler, import_pybamm_experiment, import_bmgen_jsonld, and import_ucp (ionworks Universal Cycler Protocol), and aurora-unicycler exports to_battinfo_jsonld() from its side. Termination conditions cover voltage, current, c_rate, capacity, soc, and duration (SOC is how HPPC states its levels and how UCP’s state-based cutoffs land). A protocol that assumes a starting state declares it in conditions as initial_state_of_charge (unit "1") beside ambient_temperature — the convention importers map initial-state settings onto. Cutoffs in structured steps take the comparison-string shorthand engineers actually write - termination: ["Voltage > 4.2", "C-rate < C/50", "SOC < 0.05", "Time > 30 min"] - normalized to the structured form at construction. And the whole import path is one command: battinfo import-protocol my_protocol.yaml sniffs the format (UCP / aurora / PyBaMM / bmgen), emits the canonical record, links the source file with its sha256, and mints the same IRI on every re-run. The runnable file itself rides artifacts[] as the source of truth; the descriptive method[] is allowed to be partial.