Internet-Draft grecon October 2026
Lindblad Expires 19 April 2027 [Page]
Workgroup:
Getting Ready for Energy-Efficient Networking
Internet-Draft:
draft-swepcarl-green-controller-yang-00
Published:
Intended Status:
Standards Track
Expires:
Author:
J. Lindblad
All For Eco

GREEN Controller YANG

Abstract

TODO Abstract

About This Document

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.

Status of This Memo

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.

▲

Table of Contents

1. Introduction

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.

2. Conventions and Definitions

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.

3. Controller Configuration

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.

3.1. Collection

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

3.2. Filtering and Transformation

## Aggregation

Averages, sums, peaks, … TBD

4. Controller Energy Network State

This section describes how to the Energy Controller renders an energy network overview of the devices and their major components that clients may query.

4.1. YANG Tree

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
Figure 1: YANG tree diagram of the energy network.

4.2. Example

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>

5. Audit Trail

5.1. Read provenance data

## Follow Collection Graph ## Compare Collection Graph with Inventory Any devices not reported? Any double counting?

6. YANG Modules

6.1. Types and Groupings

<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>

6.2. Energy Network State

<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>

7. Security Considerations

TODO Security

8. IANA Considerations

This document has no IANA actions.

9. Normative References

[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC7950]
Bjorklund, M., Ed., "The YANG 1.1 Data Modeling Language", RFC 7950, DOI 10.17487/RFC7950, , <https://www.rfc-editor.org/rfc/rfc7950>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.

Acknowledgments

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.

Author's Address

Jan Lindblad
All For Eco