Document: 4 of 5
Type: Normative Registry Specification
Version: 1.1
Status: Architecture Review Candidate
Compatibility: OCETS 1.1
The Plant Registry is the authoritative, schema-enforced source of truth for OCETS platform objects, ownership, topology, capabilities, and controlled metadata. It supports validation, configuration generation, discovery, authorization scope, documentation, and historical interpretation.
Organization
-> Portfolio
-> Plant
-> Asset
-> Device
-> Measurement Point
-> Capability
Plant -> Topology -> Relationship -> typed registered endpoints
A Plant belongs to exactly one Organization and MAY belong to multiple Portfolios of that Organization. Relationships do not replace the required ownership references in the hierarchy.
| Vocabulary | Allowed values |
|---|---|
lifecycle status |
planned, active, maintenance,
disabled, retired |
role |
grid, load, pv,
battery, inverter, meter,
transformer, busbar, collector,
environment |
energy_form |
electricity_ac, electricity_dc,
thermal, environmental,
operational |
phase |
l1, l2, l3, n,
total |
direction |
import, export, charge,
discharge, generation,
consumption, bidirectional |
topology kind |
electrical, physical,
telemetry |
relationship type |
contains, feeds,
connected_to, measures, controls,
powered_by |
endpoint kind |
plant, asset, device,
measurement_point |
An Organization requires id, name, and
status; it MAY declare data_residency_region
and tags. Its ID is globally unique and establishes the tenant,
governance, and authorization boundary.
A Portfolio requires id, organization_id,
name, and status. Portfolio IDs are unique
within one Organization. Portfolios group Plants and do not change Plant
identity or ownership.
A Plant requires id, organization_id,
name, timezone, and status. It
MAY declare portfolio_ids, country,
operator, commissioned_at,
data_residency_region, and tags.
Every portfolio_id SHALL resolve to a Portfolio in the
same Organization. Plant IDs are globally unique. Country values SHOULD
use ISO 3166-1 alpha-2 and timezone values SHOULD use IANA timezone
identifiers.
An Asset requires id, plant_id,
type, name, and status. It MAY
declare vendor, model, serial number, location, and commissioning time.
Asset IDs are unique within a Plant.
A Device requires id, plant_id,
asset_id, role, energy_form, and
status. It MAY declare vendor, model, protocols,
implementation-specific communication data, profiles, and capabilities.
Device IDs are unique within a Plant.
A Device claiming edge_collector_observability SHALL use
role=collector, energy_form=operational, and
list every required profile Metric. Its ID SHALL NOT derive solely from
hostname, IP address, or replaceable serial number.
A Measurement Point requires id, plant_id,
device_id, type, and name. It MAY
declare role, energy form, phase, string, MPPT, direction, nominal
voltage, or parent Measurement Point. IDs are unique within a Plant.
A Capability references a canonical Metric name from the versioned
Canonical Metric Catalogue. Local capabilities SHALL use an
x-<organization>- namespace. Capabilities do not
imply that current data is healthy or available.
A Topology requires id, plant_id,
kind, immutable positive integer version,
name, status, and valid_from; it
MAY declare valid_to. Topology IDs are unique within a
Plant, while (plant_id, id, version) identifies a specific
graph version.
Versions of the same active Topology SHALL have non-overlapping
validity intervals. valid_to SHALL be later than
valid_from. Grid connections, transformers, busbars,
inverters, batteries, loads, collectors, and their semantic points SHALL
be registered as Assets, Devices, or Measurement Points rather than
embedded anonymous nodes.
A Relationship requires id, plant_id,
topology_id, topology_version,
type, from, to,
status, and valid_from; it MAY declare
valid_to. Endpoints are objects with kind and
id.
All endpoints SHALL exist in the Relationship Plant.
contains SHALL be acyclic. connected_to is
symmetric and SHALL occur only once for an unordered endpoint pair.
Other relationship types are directed. Electrical feeds and
connected_to graphs MAY contain cycles.
Recommended endpoint constraints are:
| Type | From | To |
|---|---|---|
contains |
Plant, Asset, or Device | Asset, Device, or Measurement Point |
feeds |
Asset or Measurement Point | Asset or Measurement Point |
connected_to |
Asset or Measurement Point | Asset or Measurement Point |
measures |
Device or Measurement Point | Asset or Measurement Point |
controls |
Device | Asset or Device |
powered_by |
Asset or Device | Asset or Measurement Point |
controls records a semantic relationship only; command
authorization and behavior remain outside OCETS v1.1.
version: "1.1"
registry_id: "example-registry"
revision: "2026-07-13T10:00:00Z"
organizations:
- id: "example-energy"
name: "Example Energy"
status: "active"
portfolios:
- id: "germany"
organization_id: "example-energy"
name: "German Plants"
status: "active"
plants:
- id: "plant-example"
organization_id: "example-energy"
portfolio_ids: ["germany"]
name: "Example Plant"
timezone: "Europe/Berlin"
country: "DE"
status: "active"
assets:
- id: "transformer-01"
plant_id: "plant-example"
type: "transformer"
name: "Transformer 01"
status: "active"
- id: "busbar-01"
plant_id: "plant-example"
type: "busbar"
name: "Main Busbar"
status: "active"
devices:
- id: "meter-01"
plant_id: "plant-example"
asset_id: "transformer-01"
role: "meter"
energy_form: "electricity_ac"
status: "active"
capabilities: ["active_power", "voltage", "current"]
measurement_points:
- id: "mp-transformer-secondary"
plant_id: "plant-example"
device_id: "meter-01"
type: "transformer_secondary"
name: "Transformer Secondary"
role: "transformer"
energy_form: "electricity_ac"
topologies:
- id: "primary-electrical"
plant_id: "plant-example"
kind: "electrical"
version: 1
name: "Primary Electrical Topology"
status: "active"
valid_from: "2026-07-01T00:00:00Z"
relationships:
- id: "rel-transformer-busbar"
plant_id: "plant-example"
topology_id: "primary-electrical"
topology_version: 1
type: "feeds"
from: {kind: "asset", id: "transformer-01"}
to: {kind: "asset", id: "busbar-01"}
status: "active"
valid_from: "2026-07-01T00:00:00Z"Registry implementations SHALL validate against JSON Schema Draft
2020-12 or an equivalent enforceable contract. The complete normative
schema is maintained as
implementation/registry/schema/plant-registry-v1.1.schema.json;
its $id, version constant, definitions, and controlled
vocabularies are part of OCETS-REGISTRY-1.1.
Implementations MAY add stricter local validation but SHALL NOT accept data forbidden by the normative schema. Cross-reference, tenant-boundary, graph, interval, catalogue, and profile rules from Section 13 remain mandatory even where JSON Schema cannot express them.
Validation SHALL ensure:
contains graphs are acyclic and symmetric Relationships
are not duplicated;The base path is /api/ocets/registry/v1.
GET / returns service metadata and the current immutable
Registry revision. Collections and /{id} resources SHALL
exist for organizations, portfolios,
plants, assets, devices,
measurement-points, relationships,
topologies, metric-definitions, and
event-types.
GET /snapshot returns one revision-consistent bulk
representation. GET /changes?since=<revision> returns
retained changes after a known revision. Collections use opaque
cursor, bounded limit, and optional
organization_id, plant_id,
status, and updated_since filters where
applicable.
Every success response identifies registry_revision and
emits an ETag. If-None-Match SHALL be
supported. Cursors SHALL remain bound to the revision that created them.
Errors contain code, message, and
request_id. Authentication and tenant authorization are
mandatory; an implementation SHALL avoid revealing whether an
unauthorized cross-tenant resource exists.
The profile is read-only. Registry mutation, approval, deployment, and rollback APIs are implementation-specific.
The Registry MAY generate collector configuration, transport mappings, storage labels, dashboards, alerts, API caches, documentation, and topology diagrams. Outputs SHALL identify their source Registry revision and SHALL NOT become independent sources of truth.
Registry changes SHALL be reviewed, attributable, and associated with an immutable revision. Breaking identity changes require a migration plan. Deprecated and retired objects remain resolvable for historical interpretation. Security-sensitive changes and manual corrections require an audit record.