Separators#

How to describe separators: a separator-spec is the membrane product (Celgard 2500), a separator instance is one physical roll or lot. A cell references the spec through separator_spec_id, or describes a one-off inline on its holder.

  • The spec is the membrane product; a separator instance is one physical roll or lot.

  • material is the bulk polymer (‘PP’, ‘PE’, ‘cellulose’); structure says how it is layered (monolayer, trilayer, …).

  • material_spec_id cites a standalone material-spec when the membrane material is itself a record.

  • Author with create_separator_spec(...) / create_separator(spec_id=...).

Define one#

The product#

from battinfo.api import create_separator_spec

record = create_separator_spec(
    uid="6nec-h262-tthy-4rnt",
    name="Celgard 2500",
    material="PP",
    structure="monolayer",
    property={
        "thickness": {"value": 25, "unit": "um"},
        "porosity": {"value": 0.55, "unit": "1"},
    },
    manufacturer="Celgard",
    source_type="datasheet",
)
{
  "schema_version": "0.2.0",
  "separator_spec": {
    "id": "https://w3id.org/battinfo/spec/6nec-h262-tthy-4rnt",
    "short_id": "6nech2",
    "name": "Celgard 2500",
    "material": "PP",
    "structure": "monolayer",
    "property": {
      "thickness": {
        "value": 25,
        "unit": "um"
      },
      "porosity": {
        "value": 0.55,
        "unit": "1"
      }
    },
    "manufacturer": {
      "type": "Organization",
      "name": "Celgard"
    }
  },
  "provenance": {
    "source_type": "datasheet",
    "retrieved_at": 1750000000,
    "battinfo_version": "0.7.0"
  }
}

Emitted by record_to_jsonld, hosted-context mode.

{
  "@context": [
    "https://w3id.org/emmo/domain/battery/context",
    {
      "schema": "https://schema.org/",
      "dcterms": "http://purl.org/dc/terms/",
      "battinfo": "https://w3id.org/battinfo/"
    }
  ],
  "@type": [
    "Description",
    "schema:ProductModel",
    "schema:CreativeWork"
  ],
  "isDescriptionFor": {
    "@type": [
      "Polypropylene",
      "Separator"
    ],
    "schema:name": "PP",
    "hasProperty": [
      {
        "@type": [
          "Porosity",
          "ConventionalProperty"
        ],
        "hasNumericalPart": {
          "@type": "RealData",
          "hasNumberValue": 0.55
        },
        "hasMeasurementUnit": "https://w3id.org/emmo#EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
      },
      {
        "@type": [
          "Thickness",
          "ConventionalProperty"
        ],
        "skos:prefLabel": "Thickness",
        "hasNumericalPart": {
          "@type": "RealData",
          "hasNumberValue": 25
        },
        "hasMeasurementUnit": "https://w3id.org/emmo#MicroMetre"
      }
    ],
    "skos:prefLabel": "Celgard 2500",
    "@id": "https://w3id.org/battinfo/spec/6nec-h262-tthy-4rnt#described"
  },
  "@id": "https://w3id.org/battinfo/spec/6nec-h262-tthy-4rnt",
  "schema:name": "Celgard 2500"
}

A physical lot#

from battinfo.api import create_separator

record = create_separator(
    uid="p2vx-4nq7-8mtk-3fhd",
    spec_id="https://w3id.org/battinfo/spec/6nec-h262-tthy-4rnt",
    lot_id="CG25-2026-114",
)
{
  "schema_version": "0.2.0",
  "separator": {
    "id": "https://w3id.org/battinfo/separator/7d9k-2m4p-8t3x-6nq5",
    "separator_spec_id": "https://w3id.org/battinfo/spec/6nec-h262-tthy-4rnt",
    "short_id": "7d9k2m",
    "lot_id": "CG25-2026-114"
  },
  "provenance": {
    "source_type": "lab",
    "retrieved_at": 1750000000,
    "battinfo_version": "0.7.0"
  }
}

Emitted by record_to_jsonld, hosted-context mode.

{
  "@context": [
    "https://w3id.org/emmo/domain/battery/context",
    {
      "schema": "https://schema.org/",
      "dcterms": "http://purl.org/dc/terms/",
      "battinfo": "https://w3id.org/battinfo/"
    }
  ],
  "@type": "Separator",
  "@id": "https://w3id.org/battinfo/separator/7d9k-2m4p-8t3x-6nq5",
  "schema:isVariantOf": {
    "@id": "https://w3id.org/battinfo/spec/6nec-h262-tthy-4rnt"
  }
}

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.

Celgard 2400 (separator-spec)

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/separator-spec/wgym-4xfa-pws1-ek1b.json")
    .read_text(encoding="utf-8")
)
{
  "schema_version": "0.2.0",
  "separator_spec": {
    "id": "https://w3id.org/battinfo/spec/wgym-4xfa-pws1-ek1b",
    "short_id": "wgym4x",
    "name": "Celgard 2400",
    "material": "polypropylene",
    "structure": "monolayer",
    "property": {
      "thickness": {
        "value": 25,
        "unit": "um"
      },
      "porosity": {
        "value": 0.41,
        "unit": "1"
      }
    },
    "manufacturer": {
      "type": "Organization",
      "name": "Celgard",
      "id": "https://w3id.org/battinfo/organization/9jcc-71jq-m4vk-r8jm"
    }
  },
  "provenance": {
    "source_type": "datasheet",
    "retrieved_at": 1781768181
  },
  "notes": [
    "Celgard 2400 monolayer PP separator. Discovery-Benchmark cells use Celgard separators."
  ]
}

Emitted by record_to_jsonld, hosted-context mode.

{
  "@context": [
    "https://w3id.org/emmo/domain/battery/context",
    {
      "schema": "https://schema.org/",
      "dcterms": "http://purl.org/dc/terms/",
      "battinfo": "https://w3id.org/battinfo/"
    }
  ],
  "@type": [
    "Description",
    "schema:ProductModel",
    "schema:CreativeWork"
  ],
  "isDescriptionFor": {
    "@type": [
      "Polypropylene",
      "Separator"
    ],
    "schema:name": "polypropylene",
    "hasProperty": [
      {
        "@type": [
          "Porosity",
          "ConventionalProperty"
        ],
        "hasNumericalPart": {
          "@type": "RealData",
          "hasNumberValue": 0.41
        },
        "hasMeasurementUnit": "https://w3id.org/emmo#EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
      },
      {
        "@type": [
          "Thickness",
          "ConventionalProperty"
        ],
        "skos:prefLabel": "Thickness",
        "hasNumericalPart": {
          "@type": "RealData",
          "hasNumberValue": 25
        },
        "hasMeasurementUnit": "https://w3id.org/emmo#MicroMetre"
      }
    ],
    "skos:prefLabel": "Celgard 2400",
    "@id": "https://w3id.org/battinfo/spec/wgym-4xfa-pws1-ek1b#described"
  },
  "@id": "https://w3id.org/battinfo/spec/wgym-4xfa-pws1-ek1b",
  "schema:name": "Celgard 2400"
}
Ceramic-coated PE (separator-spec)

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/separator-spec/v94j-jm2h-t8d1-t5a6.json")
    .read_text(encoding="utf-8")
)
{
  "schema_version": "0.2.0",
  "separator_spec": {
    "id": "https://w3id.org/battinfo/spec/v94j-jm2h-t8d1-t5a6",
    "short_id": "v94jjm",
    "name": "Ceramic-coated PE",
    "material": "polyethylene",
    "structure": "monolayer",
    "coating": "Al2O3",
    "property": {
      "thickness": {
        "value": 20,
        "unit": "um"
      },
      "porosity": {
        "value": 0.42,
        "unit": "1"
      }
    }
  },
  "provenance": {
    "source_type": "datasheet",
    "retrieved_at": 1781768181
  },
  "notes": [
    "Ceramic (Al2O3) coated PE separator for higher thermal stability."
  ]
}

Emitted by record_to_jsonld, hosted-context mode.

{
  "@context": [
    "https://w3id.org/emmo/domain/battery/context",
    {
      "schema": "https://schema.org/",
      "dcterms": "http://purl.org/dc/terms/",
      "battinfo": "https://w3id.org/battinfo/"
    }
  ],
  "@type": [
    "Description",
    "schema:ProductModel",
    "schema:CreativeWork"
  ],
  "isDescriptionFor": {
    "@type": [
      "Polyethylene",
      "Separator"
    ],
    "schema:name": "polyethylene",
    "hasProperty": [
      {
        "@type": [
          "Porosity",
          "ConventionalProperty"
        ],
        "hasNumericalPart": {
          "@type": "RealData",
          "hasNumberValue": 0.42
        },
        "hasMeasurementUnit": "https://w3id.org/emmo#EMMO_5ebd5e01_0ed3_49a2_a30d_cd05cbe72978"
      },
      {
        "@type": [
          "Thickness",
          "ConventionalProperty"
        ],
        "skos:prefLabel": "Thickness",
        "hasNumericalPart": {
          "@type": "RealData",
          "hasNumberValue": 20
        },
        "hasMeasurementUnit": "https://w3id.org/emmo#MicroMetre"
      }
    ],
    "skos:prefLabel": "Ceramic-coated PE",
    "@id": "https://w3id.org/battinfo/spec/v94j-jm2h-t8d1-t5a6#described"
  },
  "@id": "https://w3id.org/battinfo/spec/v94j-jm2h-t8d1-t5a6",
  "schema:name": "Ceramic-coated PE"
}

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.

separator-spec fields#

Schema: separator-spec.schema.json · required at top level: schema_version, separator_spec, provenance

Field

Type

Required

Description

id

→ ComponentSpecIri

yes

short_id

→ ShortId

name

string

yes

Human-readable name of this separator design (e.g. ‘Celgard 2325’).

material

string

Bulk separator material (e.g. ‘PP’, ‘PE’, ‘cellulose’).

structure

monolayer | bilayer | trilayer | composite … (6 values)

Physical layer structure of the separator membrane.

coating

string

Surface coating applied to the base membrane, e.g. ‘Al2O3’, ‘SiO2’, ‘PVDF’, ‘ceramic’.

material_spec_id

string

property

→ quantitative-properties

Named quantity map of separator properties (e.g. thickness, porosity, gurley_number, ionic_conductivity). See the property keys reference for the full list of recognised keys.

manufacturer

→ OrgRef

Manufacturer of the item.

supplier

→ OrgRef

Supplier or vendor the item was sourced from.

product_id

string

Manufacturer or supplier product/grade identifier.

comment

string

Free-text comment.

separator fields#

Schema: separator.schema.json · required at top level: schema_version, separator, provenance

Field

Type

Required

Description

id

→ ComponentIri

yes

separator_spec_id

→ ComponentSpecIri

yes

IRI of the separator-spec this physical separator realizes.

short_id

→ ShortId

name

string

Human-readable label for this physical item (e.g. a lab inventory id).

lot_id

string

Manufacturer or supplier lot number.

batch_id

string

Internal lab batch identifier, when different from the supplier lot.

supplier

→ OrgRef

Supplier or vendor the item was sourced from.

manufactured_at

→ FlexDate

Date this item was manufactured.

datasets

array of → DatasetLink

Characterization datasets recorded for this physical item.

property

→ quantitative-properties

Named quantity map of technical properties (snake_case key to value+unit quantity).

comment

string

Free-text comment.

Design notes#

The reasoning behind the model

Generated surface. create_separator_spec, save_separator_spec, query_separator_specs, template_separator_spec and the bare-name instance equivalents are thin wrappers over the shared component machinery (create_component_spec("separator", ...) underneath) — one registry entry per family, no divergent code paths.

Coatings are a holder. A ceramic-coated separator states its coating under coating (the same holder shape an electrode coating uses); CeramicCoating is a published class and types the node.