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 |
|---|---|---|---|
|
→ SpecIri |
yes |
|
|
→ ShortId |
||
|
string |
yes |
|
|
string |
||
|
string |
||
|
integer |
||
|
array of string |
||
|
→ quantitative-properties |
||
|
→ OrgRef |
||
|
→ OrgRef |
||
|
string |
||
|
string |
equipment fields#
Schema: equipment.schema.json · required at top level: schema_version, equipment, provenance
Field |
Type |
Required |
Description |
|---|---|---|---|
|
→ EquipmentIri |
yes |
|
|
→ SpecIri |
yes |
|
|
→ ShortId |
||
|
string |
||
|
string |
||
|
string |
||
|
→ FlexDate |
||
|
|
||
|
→ quantitative-properties |
||
|
string |
channel fields#
Schema: channel.schema.json · required at top level: schema_version, channel, provenance
Field |
Type |
Required |
Description |
|---|---|---|---|
|
→ ChannelIri |
yes |
|
|
→ EquipmentIri |
yes |
|
|
integer |
yes |
|
|
→ ShortId |
||
|
string |
||
|
|
||
|
→ quantitative-properties |
||
|
string |