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 by protocol_id.

  • Conditions are {value, unit} quantities - planned ones on the protocol, as-run ones on the test.

  • PyBaMM-style experiment strings become structured method steps automatically.

  • Deviations from the plan go in the test’s conformance block.

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 experiment strings become the structured method steps 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:object point at the cell; dcterms:conformsTo points at the protocol.

  • protocol= takes the TestSpec itself: kind, protocol name and protocol_id derive from it — stated once, on the protocol, never retyped on the execution.

  • As-run conditions emit as typed hasMeasurementParameter nodes on the test node (plus a schema:PropertyValue copy under schema: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

id

→ SpecIri

yes

short_id

→ ShortId

identifier

string

Local identifier for the protocol (e.g. a lab protocol code).

name

string

yes

Human-readable protocol name.

description

string

Free-text description of the procedure.

kind

cycling | capacity_check | rate_capability | hppc … (22 values)

yes

Kind of test the protocol implements.

version

string

Protocol version label.

protocol_url

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

time_s

number

Record a data point every this many seconds.

voltage_V

number

Record a data point on a voltage change of this many volts.

current_mA

number

Record a data point on a current change of this many milliamps.

The safety block:

Field

Type

Required

Description

max_voltage_V

number or null

Hard upper voltage limit in volts; the instrument aborts beyond it.

min_voltage_V

number or null

Hard lower voltage limit in volts.

max_current_mA

number or null

Hard upper current limit in milliamps.

min_current_mA

number or null

Hard lower current limit in milliamps.

max_capacity_mAh

number or null

Hard capacity limit in milliamp-hours.

max_temperature_degC

number or null

min_temperature_degC

number or null

delay_s

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

id

→ TestIri

yes

Canonical IRI of this test record.

short_id

→ ShortId

identifier

string

Local identifier for the test (e.g. a channel or run id).

cell_id

→ CellIri

yes

IRI of the cell instance the test was run on.

name

string

yes

Human-readable test name.

protocol_id

→ SpecIri

IRI of the test-protocol (test spec) this test executed.

description

string

Free-text description of the test.

kind

cycling | capacity_check | rate_capability | quasi_ocv … (22 values)

yes

Kind of test performed.

status

planned | running | completed | aborted … (5 values)

Execution status of the test.

protocol_name

string

Protocol name for display, when no protocol record is linked.

protocol_url

string

URL of the protocol document.

instrument_name

string

Instrument or cycler the test was run on.

equipment_id

→ EquipmentIri

channel_id

→ ChannelIri

started_at

→ UnixTime

Unix timestamp when the test started.

ended_at

→ UnixTime

Unix timestamp when the test ended.

dataset_ids

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.

conditions

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.

conformance

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.