| Internet-Draft | grecon | October 2026 |
| Lindblad | Expires 19 April 2027 | [Page] |
TODO Abstract¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://janlindblad.github.io/draft-green-controller/draft-swepcarl-green-controller-yang.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-swepcarl-green-controller-yang/.¶
Discussion of this document takes place on the Getting Ready for Energy-Efficient Networking Working Group mailing list (mailto:green@ietf.org), which is archived at https://mailarchive.ietf.org/arch/browse/green/. Subscribe at https://www.ietf.org/mailman/listinfo/green/.¶
Source for this draft and an issue tracker can be found at https://github.com/janlindblad/draft-green-controller.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 19 April 2027.¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
In the GREEN architecture, GREEN Controllers are responsible for collecting, aggregating, transforming telemetry data concerning energy consumption, as well as storing or forwarding the result. This document describes the YANG modules used to configure and monitor the collection.¶
The GREEN Controllers need this configuration to perform their function, but this information is also the basis for auditors verifying where the data is coming from, how it has been computed and that it is correct.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
This section describes how to configure the Energy Controller so that it knows what devices to collect data from, and how. How to filter, transform and aggregate the collected data. Where to deliver any output streams, if any, and whether do populate a power and energy overview of the network.¶
The GREEN Controller needs to ensure data is collected from the devices under its control, but the actual data does not necessarily need to pass through the Controller.¶
This YANG module enumerates the devices it collects data from, and also specifies which collection method it uses for each device. A few collection methods are specified in this module, but augmentations with additional mechanisms are expected.¶
TBD¶
## Aggregation¶
Averages, sums, peaks, … TBD¶
This section describes how to the Energy Controller renders an energy network overview of the devices and their major components that clients may query.¶
The current working assumption is that the energy controller superimposes the energy network view on top of an IVY inventory topology. The IVY components are augmented with information about the component's instantaneous-power, total-energy-consumed etc. Each component may also declare its energy relations. The relations describe which other components does this component powers or meters, and what it is powered-by.¶
module: ietf-power-energy-network
augment /nw:networks/nw:network/nw:network-types:
+--rw energy-network!
augment /nw:networks/nw:network/nw:node:
+--rw energy-node-attributes!
+--rw references
| +--rw ref-string? string
| +--rw ref-ietf-hw? string
+--rw power
| +--rw instantaneous-power? int64
| +--rw nameplate-power? uint32
| +--rw data-source-accuracy? identityref
| +--rw power-factor? power-factor
| +--rw measurement-local? boolean
+--rw energy
| +--rw total-energy-consumed? uint64
| +--rw total-energy-delivered? uint64
| +--rw data-source-accuracy? identityref
| +--rw measurement-local? boolean
| +--rw certifications* identityref
+--rw component* [component-id]
+--rw component-id string
+--rw references
| +--rw ref-string? string
| +--rw ref-ietf-hw? string
+--rw power
| +--rw instantaneous-power? int64
| +--rw nameplate-power? uint32
| +--rw data-source-accuracy? identityref
| +--rw power-factor? power-factor
| +--rw measurement-local? boolean
+--rw energy
| +--rw total-energy-consumed? uint64
| +--rw total-energy-delivered? uint64
| +--rw data-source-accuracy? identityref
| +--rw measurement-local? boolean
| +--rw certifications* identityref
+--rw relationship* [type peer-node]
+--rw type identityref
+--rw peer-node -> ../../../../../nw:node/node-id
+--rw peer-component* [peer-component]
+--rw peer-component -> ../../../../../../nw:node[nw:node-id=current()/../../peer-node]/pen:energy-node-attributes/component/component-id
+--rw details? string
augment /nwi:network-inventory/nwi:network-elements/nwi:network-element/nwi:components/nwi:component:
+--ro power
| +--ro instantaneous-power? int64
| +--ro nameplate-power? uint32
| +--ro data-source-accuracy? identityref
| +--ro power-factor? power-factor
| +--ro measurement-local? boolean
+--ro energy
+--ro total-energy-consumed? uint64
+--ro total-energy-delivered? uint64
+--ro data-source-accuracy? identityref
+--ro measurement-local? boolean
+--ro certifications* identityref
grouping references:
+-- references
+-- ref-string? string
+-- ref-ietf-hw? string
grouping relationship-set:
+-- relationship* [type peer-node]
+-- type identityref
+-- peer-node -> ../../../../../nw:node/node-id
+-- peer-component* [peer-component]
+-- peer-component -> ../../../../../../nw:node[nw:node-id=current()/../../peer-node]/pen:energy-node-attributes/component/component-id
+-- details? string
In order to make this YANG module a little more digestible, here follows a simple YANG instance data example of what a small energy network might look like.¶
In this example, we have three Routers in a triangle formation. Each router has either an IP Phone or a Wifi Access Point attached to one of its line cards, which also deliver power to this device.¶
The example's first section shows a classic network underlay called "green-underlay-1". It lists the nodes in the network and describes how their data paths are connected.¶
The second section is more interesting from an energy point of view. It shows the same network seen as an energy network, "green-energy-1".¶
For each node in the network we see its node-id used by the controller, references to what the node is called in some other contexts, and the current power and energy data. Then a list of components living on this node.¶
For each component, there is a component-id and references to alternate names of this node in other contexts. Then power and energy data for this component, and the energy relationships this component has with other components, such as powered-by or metering.¶
<CODE BEGINS> file "three-router-example@2026-09-26.json"
{
"ietf-yang-instance-data:instance-data-set": {
"name": "three-router-example",
"content-schema": {
"module": [
"ietf-network@2018-02-26",
"ietf-network-topology@2018-02-26",
"ietf-network-inventory-topology@2026-09-11",
"ietf-network-inventory@2026-05-27",
"ietf-power-energy-base@2026-09-26",
"ietf-power-energy-network@2026-09-26"
]
},
"revision": [
{
"date": "2026-09-26",
"description": "Initial version"
}
],
"description": [
"Three-router example with separate underlay and energy networks"
],
"content-data": {
"ietf-network:networks": {
"network": [
{
"network-id": "green-underlay-1",
"network-types": {
"ietf-network-inventory-topology:inventory-topology": {}
},
"node": [
{
"node-id": "r1"
},
{
"node-id": "r2"
},
{
"node-id": "r3"
},
{
"node-id": "phone-a"
},
{
"node-id": "phone-b"
},
{
"node-id": "ap-c"
}
],
"ietf-network-topology:link": [
{
"link-id": "r1-r2",
"source": {
"source-node": "r1"
},
"destination": {
"dest-node": "r2"
},
"ietf-network-inventory-topology:inventory-mapping-attributes": {
"link-type": "ietf-network-inventory-topology:fiber"
}
},
{
"link-id": "r2-r3",
"source": {
"source-node": "r2"
},
"destination": {
"dest-node": "r3"
},
"ietf-network-inventory-topology:inventory-mapping-attributes": {
"link-type": "ietf-network-inventory-topology:fiber"
}
},
{
"link-id": "r3-r1",
"source": {
"source-node": "r3"
},
"destination": {
"dest-node": "r1"
},
"ietf-network-inventory-topology:inventory-mapping-attributes": {
"link-type": "ietf-network-inventory-topology:fiber"
}
},
{
"link-id": "r1-phone-a",
"source": {
"source-node": "r1"
},
"destination": {
"dest-node": "phone-a"
},
"ietf-network-inventory-topology:inventory-mapping-attributes": {
"link-type": "ietf-network-inventory-topology:copper"
}
},
{
"link-id": "r2-phone-b",
"source": {
"source-node": "r2"
},
"destination": {
"dest-node": "phone-b"
},
"ietf-network-inventory-topology:inventory-mapping-attributes": {
"link-type": "ietf-network-inventory-topology:copper"
}
},
{
"link-id": "r3-ap-c",
"source": {
"source-node": "r3"
},
"destination": {
"dest-node": "ap-c"
},
"ietf-network-inventory-topology:inventory-mapping-attributes": {
"link-type": "ietf-network-inventory-topology:copper"
}
}
]
},
{
"network-id": "green-energy-1",
"network-types": {
"ietf-power-energy-network:energy-network": {}
},
"node": [
{
"node-id": "r1",
"ietf-power-energy-network:energy-node-attributes": {
"references": {
"ref-string": "router-1",
"ref-ietf-hw": "r1-chassis"
},
"power": {
"instantaneous-power": 165000,
"nameplate-power": 450,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"energy": {
"total-energy-consumed": 2840,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"component": [
{
"component-id": "chassis",
"references": {
"ref-ietf-hw": "r1-chassis"
},
"power": {
"instantaneous-power": 145000,
"nameplate-power": 350,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"energy": {
"total-energy-consumed": 2200,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"relationship": [
{
"type": "ietf-power-energy-base:powering",
"peer-node": "r1",
"peer-component": [
{
"peer-component": "lc1",
"details": "backplane feed"
},
{
"peer-component": "lc2",
"details": "backplane feed"
}
]
}
]
},
{
"component-id": "lc1",
"references": {
"ref-ietf-hw": "r1-lc1"
},
"power": {
"instantaneous-power": 8000,
"nameplate-power": 50,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r1",
"peer-component": [
{
"peer-component": "chassis",
"details": "backplane feed"
}
]
},
{
"type": "ietf-power-energy-base:powering",
"peer-node": "phone-a",
"peer-component": [
{
"peer-component": "phone-main",
"details": "PoE to phone-a"
}
]
}
]
},
{
"component-id": "lc2",
"references": {
"ref-ietf-hw": "r1-lc2"
},
"power": {
"instantaneous-power": 7500,
"nameplate-power": 50,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r1",
"peer-component": [
{
"peer-component": "chassis",
"details": "backplane feed"
}
]
}
]
},
{
"component-id": "psu1",
"references": {
"ref-ietf-hw": "r1-psu1"
},
"power": {
"instantaneous-power": 6200,
"nameplate-power": 30,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
}
}
]
}
},
{
"node-id": "r2",
"ietf-power-energy-network:energy-node-attributes": {
"references": {
"ref-string": "router-2",
"ref-ietf-hw": "r2-chassis"
},
"power": {
"instantaneous-power": 162000,
"nameplate-power": 450,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"energy": {
"total-energy-consumed": 2790,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"component": [
{
"component-id": "chassis",
"references": {
"ref-ietf-hw": "r2-chassis"
},
"power": {
"instantaneous-power": 143000,
"nameplate-power": 350,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"relationship": [
{
"type": "ietf-power-energy-base:powering",
"peer-node": "r2",
"peer-component": [
{
"peer-component": "lc1",
"details": "backplane feed"
},
{
"peer-component": "lc2",
"details": "backplane feed"
}
]
}
]
},
{
"component-id": "lc1",
"references": {
"ref-ietf-hw": "r2-lc1"
},
"power": {
"instantaneous-power": 7800,
"nameplate-power": 50,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r2",
"peer-component": [
{
"peer-component": "chassis",
"details": "backplane feed"
}
]
},
{
"type": "ietf-power-energy-base:powering",
"peer-node": "phone-b",
"peer-component": [
{
"peer-component": "phone-main",
"details": "PoE to phone-b"
}
]
}
]
},
{
"component-id": "lc2",
"references": {
"ref-ietf-hw": "r2-lc2"
},
"power": {
"instantaneous-power": 7300,
"nameplate-power": 50,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r2",
"peer-component": [
{
"peer-component": "chassis",
"details": "backplane feed"
}
]
}
]
},
{
"component-id": "psu1",
"references": {
"ref-ietf-hw": "r2-psu1"
},
"power": {
"instantaneous-power": 6100,
"nameplate-power": 30,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
}
}
]
}
},
{
"node-id": "r3",
"ietf-power-energy-network:energy-node-attributes": {
"references": {
"ref-string": "router-3",
"ref-ietf-hw": "r3-chassis"
},
"power": {
"instantaneous-power": 168000,
"nameplate-power": 450,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"energy": {
"total-energy-consumed": 2905,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"component": [
{
"component-id": "chassis",
"references": {
"ref-ietf-hw": "r3-chassis"
},
"power": {
"instantaneous-power": 147000,
"nameplate-power": 350,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-gold-10"
},
"relationship": [
{
"type": "ietf-power-energy-base:powering",
"peer-node": "r3",
"peer-component": [
{
"peer-component": "lc1",
"details": "backplane feed"
},
{
"peer-component": "lc2",
"details": "backplane feed"
}
]
}
]
},
{
"component-id": "lc1",
"references": {
"ref-ietf-hw": "r3-lc1"
},
"power": {
"instantaneous-power": 8100,
"nameplate-power": 50,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r3",
"peer-component": [
{
"peer-component": "chassis",
"details": "backplane feed"
}
]
}
]
},
{
"component-id": "lc2",
"references": {
"ref-ietf-hw": "r3-lc2"
},
"power": {
"instantaneous-power": 7600,
"nameplate-power": 50,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r3",
"peer-component": [
{
"peer-component": "chassis",
"details": "backplane feed"
}
]
},
{
"type": "ietf-power-energy-base:powering",
"peer-node": "ap-c",
"peer-component": [
{
"peer-component": "ap-main",
"details": "PoE to access point"
}
]
}
]
},
{
"component-id": "psu1",
"references": {
"ref-ietf-hw": "r3-psu1"
},
"power": {
"instantaneous-power": 6300,
"nameplate-power": 30,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
}
}
]
}
},
{
"node-id": "phone-a",
"ietf-power-energy-network:energy-node-attributes": {
"references": {
"ref-string": "1234"
},
"power": {
"instantaneous-power": 4800,
"nameplate-power": 15,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"energy": {
"total-energy-consumed": 120,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"component": [
{
"component-id": "phone-main",
"references": {
"ref-string": "1234"
},
"power": {
"instantaneous-power": 4800,
"nameplate-power": 15,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r1",
"peer-component": [
{
"peer-component": "lc1",
"details": "PoE source on router r1 line card"
}
]
}
]
}
]
}
},
{
"node-id": "phone-b",
"ietf-power-energy-network:energy-node-attributes": {
"references": {
"ref-string": "5678"
},
"power": {
"instantaneous-power": 4700,
"nameplate-power": 15,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"energy": {
"total-energy-consumed": 115,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"component": [
{
"component-id": "phone-main",
"references": {
"ref-string": "5678"
},
"power": {
"instantaneous-power": 4700,
"nameplate-power": 15,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r2",
"peer-component": [
{
"peer-component": "lc1",
"details": "PoE source on router r2 line card"
}
]
}
]
}
]
}
},
{
"node-id": "ap-c",
"ietf-power-energy-network:energy-node-attributes": {
"references": {
"ref-string": "ap-local-17"
},
"power": {
"instantaneous-power": 7300,
"nameplate-power": 20,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"energy": {
"total-energy-consumed": 230,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"component": [
{
"component-id": "ap-main",
"references": {
"ref-string": "ap-local-17"
},
"power": {
"instantaneous-power": 7300,
"nameplate-power": 20,
"data-source-accuracy": "ietf-power-energy-base:accuracy-measured-silver-1"
},
"relationship": [
{
"type": "ietf-power-energy-base:powered-by",
"peer-node": "r3",
"peer-component": [
{
"peer-component": "lc2",
"details": "PoE source on router r3 line card"
}
]
}
]
}
]
}
}
]
}
]
}
}
}
}
<CODE ENDS>¶
## Follow Collection Graph ## Compare Collection Graph with Inventory Any devices not reported? Any double counting?¶
<CODE BEGINS> file "ietf-power-energy-base.yang"
module ietf-power-energy-base {
yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-power-energy-base";
prefix peb;
import iana-power-and-energy {
prefix ianaeo;
reference
"IANA-defined identities for power and energy class";
}
organization
"IETF GREEN Working Group";
contact
"WG Web: <https://datatracker.ietf.org/wg/green/>
WG List: <mailto:green@ietf.org>";
description
"Base identities, typedefs, and reusable power and energy
attributes.";
revision 2026-07-02 {
description
"Initial revision.";
reference
"RFC XXX: Energy Object YANG Data Model";
}
identity data-source-accuracy {
description
"Base identity for all possible data accuracy types.";
}
identity accuracy-unknown {
base data-source-accuracy;
description
"The accuracy of the power data is unknown.";
}
identity accuracy-unavailable {
base accuracy-unknown;
description
"A power data is not available for some reason, such as a sensor failure or a component being powered off.";
}
identity accuracy-like-parent {
base data-source-accuracy;
description
"The accuracy of the power and energy data is inherited from the parent object.";
}
identity accuracy-estimated {
base data-source-accuracy;
description
"The power data is estimated rather than directly measured.";
}
identity accuracy-static {
base accuracy-estimated;
description
"Static data such as manufacturer specifications or nameplate ratings.";
}
identity accuracy-historic {
base accuracy-estimated;
description
"Historic measurement data for this specific system and usage pattern.";
}
identity accuracy-learned {
base accuracy-estimated;
description
"A machine-learning-based prediction.";
}
identity accuracy-measured {
base data-source-accuracy;
description
"The power data is a direct, real-time measurement from a sensor.";
}
identity accuracy-measured-bronze {
base accuracy-measured;
description
"Direct measurement with bronze accuracy.";
}
identity accuracy-measured-bronze-1 {
base accuracy-measured-bronze;
description
"Bronze accuracy with +/-1 absolute unit.";
}
identity accuracy-measured-bronze-10 {
base accuracy-measured-bronze;
description
"Bronze accuracy with +/-10 absolute units.";
}
identity accuracy-measured-bronze-100 {
base accuracy-measured-bronze;
description
"Bronze accuracy with +/-100 absolute units.";
}
identity accuracy-measured-bronze-1000 {
base accuracy-measured-bronze;
description
"Bronze accuracy with +/-1000 absolute units.";
}
identity accuracy-measured-silver {
base accuracy-measured;
description
"Direct measurement with silver accuracy.";
}
identity accuracy-measured-silver-1 {
base accuracy-measured-silver;
description
"Silver accuracy with +/-1 absolute unit.";
}
identity accuracy-measured-silver-10 {
base accuracy-measured-silver;
description
"Silver accuracy with +/-10 absolute units.";
}
identity accuracy-measured-silver-100 {
base accuracy-measured-silver;
description
"Silver accuracy with +/-100 absolute units.";
}
identity accuracy-measured-silver-1000 {
base accuracy-measured-silver;
description
"Silver accuracy with +/-1000 absolute units.";
}
identity accuracy-measured-gold {
base accuracy-measured;
description
"Direct measurement with gold accuracy.";
}
identity accuracy-measured-gold-1 {
base accuracy-measured-gold;
description
"Gold accuracy with +/-1 absolute unit.";
}
identity accuracy-measured-gold-10 {
base accuracy-measured-gold;
description
"Gold accuracy with +/-10 absolute units.";
}
identity accuracy-measured-gold-100 {
base accuracy-measured-gold;
description
"Gold accuracy with +/-100 absolute units.";
}
identity accuracy-measured-gold-1000 {
base accuracy-measured-gold;
description
"Gold accuracy with +/-1000 absolute units.";
}
identity accuracy-measured-red {
base accuracy-measured;
description
"Direct measurement with red accuracy.";
}
identity accuracy-measured-red-1 {
base accuracy-measured-red;
description
"Red accuracy with +/-1 absolute unit.";
}
identity accuracy-measured-red-10 {
base accuracy-measured-red;
description
"Red accuracy with +/-10 absolute units.";
}
identity accuracy-measured-red-100 {
base accuracy-measured-red;
description
"Red accuracy with +/-100 absolute units.";
}
identity accuracy-measured-red-1000 {
base accuracy-measured-red;
description
"Red accuracy with +/-1000 absolute units.";
}
identity accuracy-measured-ones {
base accuracy-measured;
description
"All digits are valid except trailing zeros.";
}
typedef power-factor {
type uint8 {
range "0 .. 100";
}
default 100;
description
"Percent value of the power factor measurement.";
}
identity power-state {
description
"Base identity for all possible power states.";
}
identity power-state-on {
base power-state;
description
"Full power on.";
}
identity power-state-off {
base power-state;
description
"Power off.";
}
identity power-state-sleep {
base power-state;
description
"Low-power state.";
}
identity energy-relationship-type {
description
"Base identity for energy object relationships.";
}
identity powered-by {
base energy-relationship-type;
description
"Energy Object A is powered by Energy Object B.";
}
identity powering {
base energy-relationship-type;
description
"Energy Object A is powering Energy Object B.";
}
identity metered-by {
base energy-relationship-type;
description
"Energy Object A is metered by Energy Object B.";
}
identity metering {
base energy-relationship-type;
description
"Energy Object A is metering Energy Object B.";
}
identity aggregated-by {
base energy-relationship-type;
description
"Energy Object A is aggregated by Energy Object B.";
}
identity aggregating {
base energy-relationship-type;
description
"Energy Object A is aggregating Energy Object B.";
}
identity enabled-by {
base energy-relationship-type;
description
"Energy Object A is enabled by Energy Object B.";
}
identity enabling {
base energy-relationship-type;
description
"Energy Object A is enabling Energy Object B.";
}
grouping power-and-energy-attributes {
description
"Reusable power and energy measurement attributes.";
container power {
description
"Container for power measurement attributes.";
leaf instantaneous-power {
type int64;
units "mWatts";
description
"Instantaneous power usage for the energy object.";
}
leaf nameplate-power {
type uint32;
units "Watts";
description
"Nameplate power rating of the energy object.";
}
leaf data-source-accuracy {
type identityref {
base data-source-accuracy;
}
default accuracy-like-parent;
description
"Accuracy of the power data source.";
}
leaf power-factor {
type power-factor;
description
"Percent value of the power factor measurement.";
}
leaf measurement-local {
type boolean;
description
"Indicates whether the power measurement is local or remote.";
}
}
container energy {
description
"Container for energy measurement attributes.";
leaf total-energy-consumed {
type uint64;
units "Watt-hours";
description
"Total cumulative energy consumed since the last reset.";
}
leaf total-energy-delivered {
type uint64;
units "Watt-hours";
description
"Total cumulative energy delivered since the last reset.";
}
leaf data-source-accuracy {
type identityref {
base data-source-accuracy;
}
default accuracy-like-parent;
description
"Accuracy of the energy data source.";
}
leaf measurement-local {
type boolean;
description
"Indicates whether the energy measurement is local or remote.";
}
leaf-list certifications {
type identityref {
base ianaeo:certification-type;
}
description
"Certifications applicable to this energy object.";
}
}
}
}
<CODE ENDS>¶
<CODE BEGINS> file "ietf-power-energy-network.yang"
module ietf-power-energy-network {
yang-version 1.1;
namespace "urn:ietf:params:xml:ns:yang:ietf-power-energy-network";
prefix pen;
import ietf-network {
prefix nw;
reference
"RFC 8345: A YANG Data Model for Network Topologies";
}
import ietf-power-energy-base {
prefix peb;
reference
"RFC XXX: Energy Object YANG Data Model";
}
import ietf-network-inventory {
prefix nwi;
reference
"RFC XXXX: A YANG Data Model for Network Inventory";
}
organization
"IETF GREEN Working Group";
contact
"WG Web: <https://datatracker.ietf.org/wg/green/>
WG List: <mailto:green@ietf.org>";
description
"Augments the network inventory model with reusable power and
energy attributes for network components and defines a
network-wide energy flow view.";
revision 2026-09-26 {
description
"Initial revision.";
reference
"RFC XXX: Energy Object YANG Data Model";
}
grouping references {
description
"A set of optional identifiers for correlating an energy
node or component with external systems. Multiple
references may be present simultaneously.";
container references {
description
"External references for this object.";
leaf ref-string {
type string;
description
"Implementation-specific local or proprietary
identifier.";
}
leaf ref-ietf-hw {
type string;
description
"Identifier corresponding to a component known through
the ietf-hardware model.";
}
// Augment additional external references as needed here
// Augmentations would need to target each location where this
// grouping is used.
}
}
grouping relationship-set {
description
"Relationships from a local component to peer nodes and
zero or more peer components.";
list relationship {
key "type peer-node";
description
"Relationships for a local energy component.";
leaf type {
type identityref {
base peb:energy-relationship-type;
}
description
"The type of relationship the local component has with
the peer node or component(s).";
}
leaf peer-node {
type leafref {
path "../../../../../nw:node/nw:node-id";
}
description
"The peer energy node participating in this
relationship.";
}
list peer-component {
key "peer-component";
description
"One or more peer components within the peer node.
If this list is empty, the relationship applies to the
peer node as a whole.";
leaf peer-component {
type leafref {
path "../../../../../../nw:node[nw:node-id=current()/../../peer-node]"
+ "/pen:energy-node-attributes/pen:component"
+ "/pen:component-id";
}
description
"A peer component within the referenced peer node.";
}
leaf details {
type string;
description
"Additional implementation-specific details about the
relationship to this peer component.";
}
}
}
}
augment "/nw:networks/nw:network/nw:network-types" {
description
"Introduces a network type for representing energy flows
between network devices and components.";
container energy-network {
presence
"Indicates an energy-flow network.";
description
"This network type represents energy relationships, power
sourcing, and energy-consuming structures that may exist
alongside other network views such as physical or logical
topology.";
}
}
augment "/nw:networks/nw:network/nw:node" {
when '../nw:network-types/pen:energy-network';
description
"Adds energy modeling attributes to nodes in an energy
network.";
container energy-node-attributes {
presence
"Indicates that the node participates in the energy
network view.";
description
"Energy-related attributes for a node in the energy
network. The node may represent a router, phone, access
point, or another energy-relevant device.";
uses references;
uses peb:power-and-energy-attributes;
list component {
key "component-id";
description
"Energy-relevant components scoped locally to this node.
Component identifiers are unique only within the parent
node, avoiding network-wide naming collisions.";
leaf component-id {
type string;
description
"Identifier of the component within the parent energy
node.";
}
uses references;
uses peb:power-and-energy-attributes;
uses relationship-set;
}
}
}
augment "/nwi:network-inventory/nwi:network-elements/nwi:network-element/nwi:components/nwi:component" {
description
"Adds power and energy attributes to network inventory
components.";
uses peb:power-and-energy-attributes;
}
}
<CODE ENDS>¶
TODO Security¶
This document has no IANA actions.¶
TODO acknowledge.¶
Members of the design team are Emile Stehpan, Qin Wu, Sawsan Elzahr, Marisol Palmero, Gen Chen, Muhammad Awais Jadoon, Reshad Rahman, Benoit Claise and Jan Lindblad. Work overseen by Rob Wilton and Diego Lopez.¶