Equipment#

How to describe lab equipment: the product as an equipment spec, each bench unit as equipment, each addressable slot as a channel.

  • Spec = the product; equipment = one bench unit (serial, location); channel = one addressable slot on a unit.

  • Channel identity is deterministic from (unit, index): re-registering a bench never duplicates channels.

  • Tests point at the unit and channel via equipment_id / channel_id.

Define one#

An equipment spec (the product)#

from battinfo.api import create_equipment_spec

record = create_equipment_spec(
    id="https://w3id.org/battinfo/spec/7d9k-2m4p-8t3x-6nq5",
    name="SkyRC MC3000",
    manufacturer="SkyRC",
    model="MC3000",
    equipment_class="cycler",          # category is data, never a namespace
    channel_count=4,
    supported_chemistries=["NiMH", "Li-ion", "LiFePO4", "Na-ion"],
)
{
  "schema_version": "0.2.0",
  "equipment_spec": {
    "id": "https://w3id.org/battinfo/spec/7d9k-2m4p-8t3x-6nq5",
    "short_id": "7d9k2m",
    "name": "SkyRC MC3000",
    "equipment_class": "cycler",
    "model": "MC3000",
    "channel_count": 4,
    "supported_chemistries": [
      "NiMH",
      "Li-ion",
      "LiFePO4",
      "Na-ion"
    ],
    "manufacturer": {
      "type": "Organization",
      "name": "SkyRC"
    }
  },
  "provenance": {
    "source_type": "datasheet",
    "retrieved_at": 1750000000,
    "battinfo_version": "0.7.0"
  }
}

Known gap

No JSON-LD emitter exists for equipment records yet; the canonical record is the published form.

An equipment unit#

from battinfo.api import create_equipment

record = create_equipment(
    id="https://w3id.org/battinfo/equipment/y9xy-kr0v-y5tn-dfj7",
    spec_id="https://w3id.org/battinfo/spec/7d9k-2m4p-8t3x-6nq5",
    serial_number="MC3K-2026-0001",
    name="Cycler 1",
    location="Lab B",
    status="active",
)
{
  "schema_version": "0.2.0",
  "equipment": {
    "id": "https://w3id.org/battinfo/equipment/y9xy-kr0v-y5tn-dfj7",
    "equipment_spec_id": "https://w3id.org/battinfo/spec/7d9k-2m4p-8t3x-6nq5",
    "short_id": "y9xykr",
    "serial_number": "MC3K-2026-0001",
    "name": "Cycler 1",
    "location": "Lab B",
    "status": "active"
  },
  "provenance": {
    "source_type": "lab",
    "retrieved_at": 1750000000,
    "battinfo_version": "0.7.0"
  }
}

Known gap

No JSON-LD emitter exists for equipment records yet.

A channel on that unit#

from battinfo.api import create_channel

# The channel uid is deterministic from (unit, index): registering the
# same bench twice never duplicates channels.
record = create_channel(
    equipment_id="https://w3id.org/battinfo/equipment/y9xy-kr0v-y5tn-dfj7",
    index=1,
    label="MC3000-A/CH1",
)
{
  "schema_version": "0.2.0",
  "channel": {
    "id": "https://w3id.org/battinfo/channel/7d9k-2m4p-8t3x-6nq5",
    "equipment_id": "https://w3id.org/battinfo/equipment/y9xy-kr0v-y5tn-dfj7",
    "index": 1,
    "short_id": "7d9k2m",
    "label": "MC3000-A/CH1"
  },
  "provenance": {
    "source_type": "lab",
    "retrieved_at": 1750000000,
    "battinfo_version": "0.7.0"
  }
}

Known gap

No JSON-LD emitter exists for channel records yet.

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.

SkyRC MC3000 (equipment-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/equipment-spec/rchb-csx8-3vp8-ekcs.json")
    .read_text(encoding="utf-8")
)
{
  "schema_version": "0.2.0",
  "equipment_spec": {
    "id": "https://w3id.org/battinfo/spec/rchb-csx8-3vp8-ekcs",
    "short_id": "rchbcs",
    "name": "SkyRC MC3000",
    "equipment_class": "cycler",
    "model": "MC3000",
    "channel_count": 4,
    "supported_chemistries": [
      "NiMH",
      "NiCd",
      "NiZn",
      "Eneloop",
      "Li-ion",
      "LiIo4.35",
      "LiFePO4",
      "RAM",
      "LTO",
      "Na-ion"
    ],
    "property": {
      "charge_current": {
        "min_value": 0.05,
        "max_value": 3.0,
        "unit": "A"
      },
      "discharge_current": {
        "min_value": 0.05,
        "max_value": 2.0,
        "unit": "A"
      },
      "charge_power_max": {
        "value": 50,
        "unit": "W"
      },
      "discharge_power_max": {
        "value": 15,
        "unit": "W"
      },
      "battery_capacity": {
        "min_value": 0.1,
        "max_value": 50.0,
        "unit": "Ah"
      },
      "operating_temperature": {
        "min_value": 0,
        "max_value": 40,
        "unit": "degC"
      },
      "weight": {
        "value": 600,
        "unit": "g"
      },
      "channel_voltage_max": {
        "value": 5,
        "unit": "V"
      },
      "channel_current_max": {
        "value": 3,
        "unit": "A"
      },
      "input_power": {
        "value_text": "DC 11-18V/4A",
        "unit_text": "V/A"
      },
      "usb_power_output": {
        "value_text": "DC 5V/2.1A",
        "unit_text": "V/A"
      },
      "dimensions": {
        "value_text": "200x124x69 mm",
        "unit_text": "mm"
      }
    },
    "manufacturer": {
      "type": "Organization",
      "name": "SkyRC"
    }
  },
  "provenance": {
    "source_type": "datasheet",
    "retrieved_at": 1781900000,
    "battinfo_version": "0.7.0",
    "source_url": "https://www.skyrc.com/mc3000_charger",
    "citation": "https://www.skyrc.com/mc3000_charger"
  },
  "notes": [
    "Four-channel benchtop charger-analyzer for round cells; each slot is an independent channel.",
    "Datasheet battery capacity range 100-50000 mAh, recorded here as 0.1-50 Ah."
  ]
}
Cycler 1 (equipment)

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/equipment/bw1k-j56y-r2ax-2adv.json")
    .read_text(encoding="utf-8")
)
{
  "schema_version": "0.2.0",
  "equipment": {
    "id": "https://w3id.org/battinfo/equipment/bw1k-j56y-r2ax-2adv",
    "equipment_spec_id": "https://w3id.org/battinfo/spec/rchb-csx8-3vp8-ekcs",
    "short_id": "bw1kj5",
    "serial_number": "MC3K-2026-0001",
    "name": "Cycler 1",
    "location": "Lab B",
    "status": "active"
  },
  "provenance": {
    "source_type": "lab",
    "retrieved_at": 1781900000,
    "battinfo_version": "0.7.0"
  },
  "notes": [
    "Physical SkyRC MC3000 unit in Lab B; channels register under this unit.",
    "Equipment uid minted deterministically from (spec uid, serial number)."
  ]
}

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.

equipment-spec fields#

Schema: equipment-spec.schema.json · required at top level: schema_version, equipment_spec, provenance

Field

Type

Required

Description

id

→ SpecIri

yes

short_id

→ ShortId

name

string

yes

equipment_class

string

model

string

channel_count

integer

supported_chemistries

array of string

property

→ quantitative-properties

manufacturer

→ OrgRef

supplier

→ OrgRef

product_id

string

comment

string

equipment fields#

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

Field

Type

Required

Description

id

→ EquipmentIri

yes

equipment_spec_id

→ SpecIri

yes

short_id

→ ShortId

serial_number

string

name

string

location

string

commissioned_at

→ FlexDate

status

active | maintenance | retired | unknown

property

→ quantitative-properties

comment

string

channel fields#

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

Field

Type

Required

Description

id

→ ChannelIri

yes

equipment_id

→ EquipmentIri

yes

index

integer

yes

short_id

→ ShortId

label

string

status

active | maintenance | retired | unknown

property

→ quantitative-properties

comment

string