Referenceο
The energydatamodel package exposes a single Element
root with three sibling subtrees β Node,
Edge, and Collection β
plus an Asset mixin and a small set of value
types and helpers. System-structural classes live flat at edm.X;
technology-specific equipment lives under sub-namespaces (edm.solar,
edm.wind, edm.grid, β¦).
Core hierarchyο
Elementο
Element β the root of the EDM type hierarchy.
Element is the shared base for everything in the model. It carries the
fields that any persistable, named, geometry-bearing object needs:
idβ a stable UUID7, generated at constructionnameβ human label (display / CLI navigation)timeseriesβ metadata-onlyTimeSeriesdeclarations attached to this element (df=None; the actual data is written via the energydb data-write path, not carried inline on the EDM tree)geometryβ optional shapely geometry (Point, Polygon, LineString, β¦)extraβ open dict of JSON-native scalars
Sibling subtrees specialize Element:
Node(inenergydatamodel.node) β anything that exists as a βthingβ: graph vertices, Areas, plus container markers. Addsmembersandtz.Edge(inenergydatamodel.edge) β edges between two Nodes. Addsfrom_element,to_element,directed.Asset(inenergydatamodel.asset) β mixin marking physical energy equipment. Mixed withNodeorEdgeviaNodeAsset/EdgeAsset.Collection(inenergydatamodel.containers) β groupings that arenβt graph vertices (Portfolio, Site, Region, β¦).
Identity is a UUID7 assigned at construction. The same Element instance keeps
its id across renames and across JSON round-trips.
- energydatamodel.element.infra(*, default=None, default_factory=None, children=False)[source]ο
- Overloads:
default (T), children (bool) β T
default_factory (Callable[[], T]), children (bool) β T
children (bool) β Any
Build a dataclass
fieldmarked as framework infrastructure.Use in place of
dataclasses.fieldfor any non-domain attribute declared on an Element subclass:my_field: T = infra(default=None) members: list[Element] = infra(default_factory=list, children=True)
- energydatamodel.element.is_infra_field(f)[source]ο
Trueif a dataclass field is framework infrastructure (excluded fromElement.to_properties()).- Return type:
- energydatamodel.element.is_children_field(f)[source]ο
Trueif a dataclass field holds child Elements (excluded from flat storage rows).- Return type:
- class energydatamodel.element.Element(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None)[source]ο
Bases:
objectCommon base for every persistable object in EDM.
Identity is a UUID7 generated at construction.
nameis a mutable human label; renames donβt change theid.Subclasses are auto-registered for JSON dispatch via
__init_subclass__β definingclass Foo(NodeAsset): ...is enough for round-trip serialization, no decorator required.- Parameters:
- lat: dataclasses.InitVar[float | None] = Noneο
- lon: dataclasses.InitVar[float | None] = Noneο
- children()[source]ο
Child elements for tree walking. Override in subclasses with children.
- Return type:
- add_child(obj)[source]ο
Attach a child. Override in subclasses that support children.
- Return type:
- to_tree()[source]ο
Return the hierarchy rendered as an indented tree string.
Use
print(element.to_tree())to display it. In a notebook, printing the element directly (element) also renders the tree via__repr__.- Return type:
- index()[source]ο
Build a
dict[UUID, Element]index of the subtree rooted at self.Use to resolve
Referenceobjects against this tree.
- to_properties()[source]ο
Domain-specific fields as a dict (excludes infra + children fields).
- Return type:
Nodeο
Node β the βvertexβ subtree of EDM.
A Node is anything that exists as a graph vertex in the model: a piece of
equipment, an administrative area, a grid topology point, or a sensor. Adds
two fields to Element:
membersβ child elements (used by WindFarm, Network, etc.)tzβ local timezone, where meaningful
Equipment-shaped vertices (WindTurbine, Battery, Sensor, GridNode, β¦) mix
Asset via NodeAsset in energydatamodel.bases.
Edges between nodes live in the sibling Edge subtree. Logical
groupings (Portfolio, Site, β¦) live in Collection, which is a
sibling of Node under Element β not a subclass of Node.
- class energydatamodel.node.Node(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
ElementAn Element that exists as a graph vertex β can hold members and a timezone.
Subclassed by NodeAsset (equipment) and Area (administrative regions).
- Parameters:
Edgeο
Edge β the βrelationshipβ subtree of EDM.
An Edge is an edge between two Node instances: a line between
two buses, an interconnector between two bidding zones, a pipe between two
delivery points. Edges sit sibling to Node under Element, not
under Node β this keeps members and tz off Edges, where they
donβt apply.
Concrete edge-equipment subclasses (Line, Link, Pipe, Interconnection)
live in energydatamodel.grid under EdgeAsset. Note that
Transformer is a node (NodeAsset), not an edge β it has HV and
LV sides that lines connect to.
- class energydatamodel.edge.Edge(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, from_element=None, to_element=None, directed=True)[source]ο
Bases:
ElementAn edge between two Nodes.
Edges are always directed by convention β flow in the opposite direction is expressed as a signed value on the timeseries. The
directedflag is kept for explicit cases (e.g. pure bidirectional pipes).Endpoints accept an
Element, aUUID, or aReference;__post_init__normalizes all of these toReference. The widened input type is a constructor convenience β once the edge is built,from_elementandto_elementalways holdReference | None.- Parameters:
Assetο
Asset β mixin marking physical energy equipment.
Asset is the umbrella for anything the energy domain treats as a physical,
commissioned piece of equipment: wind turbines, batteries, heat pumps, sensors,
meters, power lines, transformers, pipes. It is a pure mixin β never
instantiated directly and never used as a leaf type. Concrete equipment
classes inherit from Asset together with either Node or
Edge via the NodeAsset / EdgeAsset intermediates in
energydatamodel.bases and energydatamodel.grid.
isinstance(x, Asset) answers βis this a piece of physical equipment?β
uniformly across node- and edge-shaped classes.
- class energydatamodel.asset.Asset(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None)[source]ο
Bases:
ElementMarker mixin for physical energy equipment.
Carries fields genuinely shared across every piece of equipment β independent of whether the equipment is shaped like a graph vertex (
WindTurbine) or a graph edge (Line).- Parameters:
Bases (NodeAsset, GridNode, Sensor)ο
Node-side equipment intermediates.
NodeAssetβ mixesNodeandAsset. The single mixin point on the node side; everything physical and vertex-shaped lives below it with plain single inheritance. Subclassed directly by WindTurbine, Battery, HeatPump, etc.; and further bySensorandGridNodefor their role-specific fields.Sensorβ measurement instruments. Addsheight(shared by every concrete sensor in the weather-sensor family).GridNodeβ topological points in an electrical / grid network (bus, meter, delivery point). Addscarrier.
- class energydatamodel.bases.NodeAsset(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None)[source]ο
-
Mixin intermediate: a
Nodethat is also anAsset.Concrete equipment classes (
WindTurbine,Battery,HeatPump, β¦) and the role-specific intermediatesSensorandGridNodeall inherit from here. Single inheritance below this point.
- class energydatamodel.bases.Sensor(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, height=None)[source]ο
Bases:
NodeAssetA measurement instrument that observes an environmental variable.
Concrete sensor subclasses (
TemperatureSensor,WindSpeedSensor, β¦) inheritheightfrom here and add no new fields.- Parameters:
- class energydatamodel.bases.GridNode(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, carrier=None)[source]ο
Bases:
NodeAssetA topological point in a grid network β a bus, meter, or delivery point.
GridNodes are equipment too (they have manufacturers, commissioning dates, etc. via
Asset). Theyβre distinguished from generation/consumption assets by carrying acarrier.- Parameters:
Containersο
Logical groupings (Portfolio, Site, Region, β¦) β Element
subclasses that hold members but are not graph vertices.
Collection marker and container subclasses.
Collection is an Element whose primary purpose is grouping
other elements. It is not a Node β collections arenβt graph
vertices; theyβre organizational/logical groupings. Collection shares the
members and tz field shape with Node, but the semantics differ β
isinstance(x, Node) on a Portfolio should return False.
Concrete subclasses carry no additional fields; they distinguish a Portfolio from a Site at the type level for serialization / introspection / UI.
Conventions:
Portfolioβ trading/asset aggregate. Typically no geometry.Siteβ a geographic site containing assets. Typically aPointgeometry.MultiSiteβ group of sites.Regionβ a named geographic region with aPolygon/MultiPolygongeometry. (Distinct fromArea: regions are not bound to a market / administrative scope.)EnergyCommunityβ members share resources/balance.VirtualPowerPlantβ traded flexibility aggregate.
- class energydatamodel.containers.Collection(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
ElementAn Element whose primary purpose is grouping other Elements.
Not a
Nodeβ collections are organizational groupings, not graph vertices. Carriesmembersandtz(same shape as Node, different semantics).- Parameters:
- class energydatamodel.containers.Portfolio(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionA trading/asset portfolio aggregate.
- class energydatamodel.containers.Site(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionA geographic site containing one or more assets.
- class energydatamodel.containers.MultiSite(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionAn aggregate of multiple sites.
- class energydatamodel.containers.Region(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionA named geographic region β typically backed by a Polygon geometry.
Distinct from
Area: a Region is not labeled by market or administrative scope; itβs a freeform geographic grouping.
- class energydatamodel.containers.EnergyCommunity(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionAn energy community β members share resources/balance.
- class energydatamodel.containers.VirtualPowerPlant(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionA virtual power plant β traded flexibility aggregate.
Areasο
Administrative or market-defined geographic regions
(BiddingZone, Country, ControlArea, WeatherCell, SynchronousArea).
Area β administrative or market-defined geographic regions.
Each area type is a proper subclass of Area (no scope enum, no
constructor functions). Type discrimination is via isinstance.
BiddingZoneβ electricity market bidding zone (e.g. SE-SE1, DE-LU)Countryβ country-scoped areaControlAreaβ TSO control areaWeatherCellβ meteorological grid cellSynchronousAreaβ AC-synchronous grid (zones sharing one frequency). Carries an extranominal_frequencyfield (50 Hz in Europe / Nordic / GB / Ireland / Baltic / IPS-UPS; 60 Hz in North America).
The geometry (Polygon / MultiPolygon) lives on Element and is
inherited; areas without a known polygon simply leave it None.
- class energydatamodel.area.Area(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
NodeAn administrative or market-defined geographic region.
- class energydatamodel.area.BiddingZone(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
AreaAn electricity market bidding zone (e.g.
SE-SE1,DE-LU).
- class energydatamodel.area.Country(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
AreaA country-scoped area.
- class energydatamodel.area.ControlArea(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
AreaA TSO control area.
- class energydatamodel.area.WeatherCell(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
AreaA meteorological grid cell.
- class energydatamodel.area.SynchronousArea(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None, nominal_frequency=50.0)[source]ο
Bases:
AreaAn AC-synchronous grid β zones that share a single operating frequency.
Examples: NSA (Nordic), CESA (Continental Europe), GBSA (Great Britain), ISA (Ireland), BSA (Baltic), IPSA (IPS/UPS). Default
nominal_frequencyis 50.0 Hz; set 60.0 for North American synchronous areas.- Parameters:
βοΈ Solarο
Solar assets.
- class energydatamodel.solar.FixedMount(surface_tilt=0.0, surface_azimuth=0.0)[source]ο
Bases:
object
- class energydatamodel.solar.SingleAxisTrackerMount(axis_tilt=0.0, axis_azimuth=0.0, max_angle=90.0, backtrack=True, gcr=0.2857142857142857, cross_axis_tilt=0.0, racking_model=None, module_height=None)[source]ο
Bases:
object- Parameters:
- class energydatamodel.solar.PVArray(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, surface_azimuth=None, surface_tilt=None, surface_area=None, efficiency=None, module=None, module_type='glass_polymer', module_parameters=None, temperature_model_parameters=None)[source]ο
Bases:
NodeAsset
- class energydatamodel.solar.PVSystem(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, surface_azimuth=None, surface_tilt=None, albedo=None, surface_type=None, module_parameters=None, inverter_parameters=None, module_type='glass_polymer', racking_model='open_rack')[source]ο
Bases:
NodeAssetA PV system β an Asset that contains
PVArraymembers.Stored in the inherited
memberslist. Attach arrays explicitly withpv_system.members.append(PVArray(...))or viaadd_child(...)β no auto-creation.
- class energydatamodel.solar.SolarPowerArea(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None)[source]ο
Bases:
NodeAssetA solar-power-potential area.
The areaβs polygon lives in the inherited
geometryfield.- Parameters:
- property geojsonο
π¬οΈ Windο
Wind assets.
- class energydatamodel.wind.WindTurbine(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, hub_height=None, rotor_diameter=None, turbine_model=None, power_curve=None, power_coefficient_curve=None)[source]ο
Bases:
NodeAsset
- class energydatamodel.wind.WindFarm(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, farm_efficiency=None)[source]ο
Bases:
NodeAssetA wind farm β an Asset that contains
WindTurbinemembers.Members are stored in the inherited
memberslist. Real wind farms can also contain met masts, transformers and substations, so children arenβt restricted toWindTurbineβ anyElementis accepted.- Parameters:
- class energydatamodel.wind.WindPowerArea(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, area=None, farm_efficiency=None)[source]ο
Bases:
NodeAssetA wind-power-potential area (e.g. offshore zone).
The areaβs polygon lives in the inherited
geometryfield. Constituent turbines or farms (if any) live in the inheritedmemberslist.- Parameters:
π Batteryο
Battery asset.
- class energydatamodel.battery.Battery(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, storage_capacity=None, min_soc=None, max_charge=None, max_discharge=None, charge_efficiency=None, discharge_efficiency=None)[source]ο
Bases:
NodeAsset
π¦ Hydroο
Hydro assets.
- class energydatamodel.hydro.Reservoir(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, surface_area=None, average_depth=None)[source]ο
Bases:
NodeAssetReservoir used in a hydroelectric power plant for storing water.
- Parameters:
- class energydatamodel.hydro.HydroTurbine(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, turbine_type=None, capacity=None, efficiency=None)[source]ο
Bases:
NodeAssetIndividual hydro turbine in a hydroelectric plant.
- Parameters:
- class energydatamodel.hydro.HydroPowerPlant(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, river=None, annual_output=None, turbine_type=None, reservoir_capacity=None, environmental_impact=None, maintenance_schedule=None)[source]ο
Bases:
NodeAssetHydro power plant.
β»οΈ Heat pumpsο
Heat pump asset.
- class energydatamodel.heatpump.HeatPump(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, capacity=None, cop=None, energy_source=None)[source]ο
Bases:
NodeAssetA heat pump in an energy system.
- Parameters:
π Buildingsο
Building and House β Assets that also contain other Assets via inherited members.
- class energydatamodel.building.Building(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, type=None)[source]ο
Bases:
NodeAssetA building. A physical asset that also contains child Elements via the inherited
memberslist.- Parameters:
- class energydatamodel.building.House(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, type=None)[source]ο
Bases:
NodeAssetA house. Same structure as
Buildingwith a few convenience accessors.- Parameters:
π‘οΈ Weather sensorsο
Weather sensors β concrete Sensor subclasses observing
environmental variables. height is inherited from Sensor.
- class energydatamodel.weather.TemperatureSensor(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, height=None)[source]ο
Bases:
Sensor
- class energydatamodel.weather.WindSpeedSensor(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, height=None)[source]ο
Bases:
Sensor
- class energydatamodel.weather.RadiationSensor(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, height=None)[source]ο
Bases:
Sensor
- class energydatamodel.weather.RainSensor(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, height=None)[source]ο
Bases:
Sensor
β‘ Power gridο
Grid-topology classes β edge-equipment subclasses of EdgeAsset
(Line, Link, Pipe, Interconnection), GridNode
subclasses (JunctionPoint, Meter, DeliveryPoint, Transformer),
Collection subclasses (SubNetwork, Network),
and the plain Carrier value type.
Power-grid concrete classes.
EdgeAssetis the single(Edge, Asset)mixin point on the edge side. Concrete edge-equipment classes (Line,Link,Pipe,Interconnection) single-inherit from here.GridNode subclasses (
JunctionPoint,Meter,DeliveryPoint) live here as concrete topological points. TheGridNodebase lives inenergydatamodel.bases.Transformeris also aGridNode(a vertex with HV and LV sides on the electricity carrier).SubNetworkandNetworkareCollectionsubclasses used to group buses + lines.Carrieris a plain value type (not an Element).
- class energydatamodel.grid.Carrier(name, type)[source]ο
Bases:
objectEnergy carrier (electricity, gas, β¦). Plain value type.
- class energydatamodel.grid.EdgeAsset(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, from_element=None, to_element=None, directed=True)[source]ο
-
Mixin intermediate: an
Edgethat is also anAsset.Single mixin point on the edge side. Concrete edge equipment classes (
Line,Link,Pipe,Interconnection) single-inherit from here.
- class energydatamodel.grid.JunctionPoint(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, carrier=None)[source]ο
Bases:
GridNodeA bus / junction in an electrical network.
- class energydatamodel.grid.Meter(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, carrier=None)[source]ο
Bases:
GridNodeA metering point.
- class energydatamodel.grid.DeliveryPoint(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, carrier=None)[source]ο
Bases:
GridNodeA delivery point (end of a feeder).
- class energydatamodel.grid.Transformer(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, members=<factory>, tz=None, carrier=None, capacity=None, voltage_hv=None, voltage_lv=None)[source]ο
Bases:
GridNodeTransformer joining HV and LV sides of an electrical network.
Modeled as a topological grid node, not an edge β matches pandapower / PyPSA topology where a transformer is a vertex with two voltage sides and edges (Lines) attach to each side. Inherits
carrierfromGridNode(always electricity for a transformer).
- class energydatamodel.grid.Line(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, from_element=None, to_element=None, directed=True, capacity=None)[source]ο
Bases:
EdgeAssetTransmission or distribution line.
- Parameters:
- class energydatamodel.grid.Link(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, from_element=None, to_element=None, directed=True, capacity=None)[source]ο
Bases:
EdgeAssetDC link or similar two-node power link.
- Parameters:
- class energydatamodel.grid.Pipe(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, from_element=None, to_element=None, directed=True, capacity=None, medium='gas')[source]ο
Bases:
EdgeAssetGas / heat pipe.
- class energydatamodel.grid.Interconnection(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, commissioning_date=None, from_element=None, to_element=None, directed=True, capacity_forward=None, capacity_backward=None)[source]ο
Bases:
EdgeAssetCross-border / cross-area interconnection between two
Areanodes.The only Edge that carries paired forward/backward capacities β TSO data typically reports them separately.
- class energydatamodel.grid.SubNetwork(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionSubnetwork grouping buses + lines.
- class energydatamodel.grid.Network(*, id=<factory>, name=None, timeseries=<factory>, geometry=None, extra=<factory>, lat=None, lon=None, members=<factory>, tz=None)[source]ο
Bases:
CollectionNetwork grouping subnetworks + transformers + links.
Energy vocabularyο
Quantity / Kind / Scope enums and build_metric() for assembling dotted
metric strings like electricity.demand.area.
Energy vocabulary β Quantity / Kind / Scope enums + build_metric().
Replaces the old ElectricityDemand(TimeSeries) subclass pattern: a
TimeSeries carries a string name field whose value is a dotted
metric string built from (Quantity, Kind, Scope) via
build_metric().
- class energydatamodel.quantities.Quantity(*values)[source]ο
Bases:
StrEnum- ELECTRICITY = 'electricity'ο
- HEATING = 'heating'ο
- COOLING = 'cooling'ο
- GAS = 'gas'ο
- TEMPERATURE = 'temperature'ο
- PRICE = 'price'ο
- FREQUENCY = 'frequency'ο
- class energydatamodel.quantities.Kind(*values)[source]ο
Bases:
StrEnum- DEMAND = 'demand'ο
- SUPPLY = 'supply'ο
- BALANCE = 'balance'ο
- STATE = 'state'ο
- SPOT = 'spot'ο
- FLOW = 'flow'ο
- class energydatamodel.quantities.Scope(*values)[source]ο
Bases:
StrEnum- POINT = 'point'ο
- AREA = 'area'ο
- energydatamodel.quantities.build_metric(quantity, kind, scope=Scope.POINT, *extras)[source]ο
Build a dotted metric string, e.g.
electricity.demand/electricity.demand.area.
Convenience constructors that build metadata-only TimeSeries
instances with pre-filled metric strings:
Convenience constructors that build metadata-only TimeSeries instances
with pre-filled metric strings for common energy quantities.
Each constructor returns a fresh TimeSeries with df=None β suitable
for declaring a series structure on an EDM element before any data exists.
- energydatamodel.constructors.electricity_supply(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.electricity_demand(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.electricity_supply_area(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.electricity_demand_area(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.spot_price(unit='EUR / MWh', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.cross_border_flow(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.temperature(unit='degC', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.gas_supply(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.gas_demand(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.heating_demand(unit='MW', data_type=DataType.ACTUAL, frequency=None, timezone='UTC', description=None)[source]ο
- energydatamodel.constructors.grid_frequency(unit='Hz', data_type=DataType.OBSERVATION, frequency=Frequency.PT1S, timezone='UTC', description=None)[source]ο
Grid frequency (Hz) β a per-synchronous-area observation.
Frequency is shared across all zones in an AC-synchronous grid (NSA, CESA, GBSA, ISA, BSA, IPSA), so this constructor uses
Scope.AREA. Default sample interval is one second; nominal value (50 / 60 Hz) lives on theSynchronousAreaitself, not on the series declaration.
Referencesο
Cross-tree references β Reference,
Index, and build_index() β
let one Element point at another by uuid
without holding a hard Python reference. Useful for grid topology
(an Edge referencing endpoints in a different subtree)
and for round-tripping JSON without duplicating nested objects.
UUID-based cross-tree references and the Index lookup primitive.
A Reference[T] points to another Element by its stable UUID
identity. Resolution against a tree builds an Index (dict[UUID,
Element] produced by DFS) and uses it for O(1) lookup. References are
valid the moment theyβre constructed β no two-pass deserialize.
Path-shaped operations (Reference.path(root)) are still available for
human display and debug, but are not part of the wire format.
- exception energydatamodel.reference.UnresolvedReferenceError[source]ο
Bases:
LookupErrorRaised when a Reference canβt be resolved against a tree.
- class energydatamodel.reference.Index(by_id=None)[source]ο
Bases:
objectdict[UUID, Element]lookup, built once via DFS.The Index is not live-tracked: mutate the tree after building, and the Index goes stale. Rebuild via
build_index()when needed.
- energydatamodel.reference.build_index(root)[source]ο
Walk
root(DFS viachildren()) and collect every Element by id.Detects cycles: a node visited twice via the same
id()raisesValueError. Duplicate UUIDs (same id on two distinct objects) raiseValueErrorβ UUIDs are supposed to be unique.
- class energydatamodel.reference.Reference(target)[source]ο
Bases:
GenericA reference to another Element by its UUID.
Holds either:
a
UUID(canonical, on the wire)an
Element(resolved cache)
Usage:
Reference(other_element) # captures other_element.id Reference(uuid_obj) # by id directly ref.resolve(root) # builds Index, looks up ref.get() # raises if not yet resolved
- get()[source]ο
Return the resolved Element. Raises if not resolved yet.
Use
resolve()to resolve against a tree root first.- Return type:
- resolve(root_or_index)[source]ο
Resolve against a tree root or a pre-built
Index.Idempotent β once resolved, subsequent calls return the cached Element without re-walking. Pass an
Indexdirectly when resolving many References against the same tree.
JSON I/Oο
Lossless JSON round-trip for any registered Element
subclass. Element.__init_subclass__ auto-registers subclasses, so
user-defined node/edge types serialize without any explicit decorator.
Plain value dataclasses (non-Element) must register
themselves via register_value_type().
JSON serialization for Element trees.
Wire format: each element β {"__type__": "ClassName", "id": "<uuid>",
...fields}. Lists of Elements become nested arrays of such dicts.
Reference fields become {"__ref__": "<uuid>"}. Enums become their
string values. Value-type dataclasses (Carrier, β¦) use the same
__type__ tag.
Identity is a UUID7 carried on every Element. Refs hold UUIDs directly,
so element_from_json() is single-pass: there is no separate
βresolve referencesβ walk. Refs are valid the moment theyβre constructed;
Reference.resolve(root) is on-demand and idempotent.
The reserved __type__ / __ref__ / __tuple__ / __geometry__ /
__tz__ keys (double-underscore prefix) avoid collisions with dataclass
fields β classes like Building and House have a type
field of their own, which must survive round-trip.
- energydatamodel.json_io.register_element(cls)[source]ο
Register an Element subclass under its class name for JSON dispatch.
- energydatamodel.json_io.register_value_type(cls)[source]ο
Register a non-Element value dataclass (Carrier, β¦) for JSON dispatch.
Value types carry a
__type__tag on the wire and are instantiated by class-name lookup on load. Analogous toregister_elementbut without the Element inheritance requirement.
- energydatamodel.json_io.element_to_json(element, *, exclude_fields=None)[source]ο
Public: serialize an Element (and its subtree) to a JSON-compatible dict.
Every Element emits its
id(UUID7) so round-trip preserves identity. Refs emit{"__ref__": "<uuid>"}regardless of whether they were constructed from a UUID or a resolved Element.- Parameters:
element (
Element) β The Element to serialize.exclude_fields (
set|None) β Set of field names to skip when serializing. Applied recursively to nested Elements (e.g. passing{"members"}produces a flat, children-free dict). Seeelement_to_storage_dict()for the canonical flat-row form.
- Return type:
- energydatamodel.json_io.to_json_str(element, *, indent=None, exclude_fields=None)[source]ο
Convenience: return a JSON string instead of a dict.
- energydatamodel.json_io.element_to_storage_dict(element, *, extra_excludes=None)[source]ο
Flat-row serialization: elementβs own fields only, children excluded.
Suitable for persistence layers that store tree structure separately (e.g. via
parent_uuidcolumns rather than nested JSON). Children fields (those markedchildren=Truein theirinframetadata) are excluded automatically; add more viaextra_excludes(e.g.{"from_element", "to_element"}for edges whose endpoints are stored as FK columns).
- energydatamodel.json_io.element_from_json(data, *, expected_type=None)[source]ο
Public: deserialize a JSON-compatible dict into an Element tree.
Single-pass: refs become
Reference(uuid)immediately and are valid at construction time. Resolution against the tree is on-demand viaReference.resolve().
- energydatamodel.json_io.register_builtin_elements()[source]ο
Register all Element subclasses reachable via __subclasses__ at call time.
Use as a fallback so callers donβt have to decorate every class manually β the explicit
@register_elementdecorator remains the canonical path. Walks the whole Element subtree (Node, Edge, Asset, Collection, and all their descendants).- Return type: