module ietf-hardware {
  yang-version 1.1;
  namespace "urn:ietf:params:xml:ns:yang:ietf-hardware";
  prefix hw;

  import ietf-inet-types {
    prefix inet;
  }
  import ietf-yang-types {
    prefix yang;
  }
  import iana-hardware {
    prefix ianahw;
  }

  organization
    "IETF NETMOD (Network Modeling) Working Group";

  contact
    "WG Web:   <https://datatracker.ietf.org/wg/netmod/>
     WG List:  <mailto:netmod@ietf.org>

     Editor:   Andy Bierman
               <mailto:andy@yumaworks.com>

     Editor:   Martin Bjorklund
               <mailto:mbj@tail-f.com>

     Editor:   Jie Dong
               <mailto:jie.dong@huawei.com>

     Editor:   Dan Romascanu
               <mailto:dromasca@gmail.com>";

  description
    "This module contains a collection of YANG definitions for
     managing hardware.

     This data model is designed for the Network Management Datastore
     Architecture (NMDA) defined in RFC 8342.
     Copyright (c) 2018 IETF Trust and the persons identified as
     authors of the code.  All rights reserved.

     Redistribution and use in source and binary forms, with or
     without modification, is permitted pursuant to, and subject
     to the license terms contained in, the Simplified BSD License
     set forth in Section 4.c of the IETF Trust's Legal Provisions
     Relating to IETF Documents
     (https://trustee.ietf.org/license-info).

     This version of this YANG module is part of RFC 8348; see
     the RFC itself for full legal notices.";

  revision 2018-03-13 {
    description
      "Initial revision.";
    reference
      "RFC 8348: A YANG Data Model for Hardware Management";
  }

  /*
   * Features
   */

  feature entity-mib {
    description
      "This feature indicates that the device implements
       the ENTITY-MIB.";
    reference
      "RFC 6933: Entity MIB (Version 4)";
  }

  feature hardware-state {
    description
      "Indicates that ENTITY-STATE-MIB objects are supported";
    reference
      "RFC 4268: Entity State MIB";
  }

  feature hardware-sensor {
    description
      "Indicates that ENTITY-SENSOR-MIB objects are supported";
    reference
      "RFC 3433: Entity Sensor Management Information Base";
  }

  /*
   * Typedefs
   */

  typedef admin-state {
    type enumeration {
      enum unknown {
        value 1;
        description
          "The resource is unable to report administrative state.";
      }
      enum locked {
        value 2;
        description
          "The resource is administratively prohibited from use.";
      }
      enum shutting-down {
        value 3;
        description
          "The resource usage is administratively limited to current
           instances of use.";
      }
      enum unlocked {
        value 4;
        description
          "The resource is not administratively prohibited from
           use.";
      }
    }
    description
      "Represents the various possible administrative states.";
    reference
      "RFC 4268: Entity State MIB - EntityAdminState";
  }

  typedef oper-state {
    type enumeration {
      enum unknown {
        value 1;
        description
          "The resource is unable to report its operational state.";
      }
      enum disabled {
        value 2;
        description
          "The resource is totally inoperable.";
      }
      enum enabled {
        value 3;

        description
          "The resource is partially or fully operable.";
      }
      enum testing {
        value 4;
        description
          "The resource is currently being tested and cannot
           therefore report whether or not it is operational.";
      }
    }
    description
      "Represents the possible values of operational states.";
    reference
      "RFC 4268: Entity State MIB - EntityOperState";
  }

  typedef usage-state {
    type enumeration {
      enum unknown {
        value 1;
        description
          "The resource is unable to report usage state.";
      }
      enum idle {
        value 2;
        description
          "The resource is servicing no users.";
      }
      enum active {
        value 3;
        description
          "The resource is currently in use, and it has sufficient
           spare capacity to provide for additional users.";
      }
      enum busy {
        value 4;
        description
          "The resource is currently in use, but it currently has no
           spare capacity to provide for additional users.";
      }
    }
    description
      "Represents the possible values of usage states.";
    reference
      "RFC 4268: Entity State MIB -  EntityUsageState";
  }

  typedef alarm-state {
    type bits {
      bit unknown {
        position 0;
        description
          "The resource is unable to report alarm state.";
      }
      bit under-repair {
        position 1;
        description
          "The resource is currently being repaired, which, depending
           on the implementation, may make the other values in this
           bit string not meaningful.";
      }
      bit critical {
        position 2;
        description
          "One or more critical alarms are active against the
           resource.";
      }
      bit major {
        position 3;
        description
          "One or more major alarms are active against the
           resource.";
      }
      bit minor {
        position 4;
        description
          "One or more minor alarms are active against the
           resource.";
      }
      bit warning {
        position 5;
        description
          "One or more warning alarms are active against the
           resource.";
      }
      bit indeterminate {
        position 6;
        description
          "One or more alarms of whose perceived severity cannot be
           determined are active against this resource.";
      }
    }
    description
      "Represents the possible values of alarm states.  An alarm is a
       persistent indication of an error or warning condition.

       When no bits of this attribute are set, then no active alarms
       are known against this component and it is not under repair.";
    reference
      "RFC 4268: Entity State MIB - EntityAlarmStatus";
  }

  typedef standby-state {
    type enumeration {
      enum unknown {
        value 1;
        description
          "The resource is unable to report standby state.";
      }
      enum hot-standby {
        value 2;
        description
          "The resource is not providing service, but it will be
           immediately able to take over the role of the resource to
           be backed up, without the need for initialization
           activity, and will contain the same information as the
           resource to be backed up.";
      }
      enum cold-standby {
        value 3;
        description
          "The resource is to back up another resource, but it will
           not be immediately able to take over the role of a
           resource to be backed up and will require some
           initialization activity.";
      }
      enum providing-service {
        value 4;
        description
          "The resource is providing service.";
      }
    }
    description
      "Represents the possible values of standby states.";
    reference
      "RFC 4268: Entity State MIB - EntityStandbyStatus";
  }

  typedef sensor-value-type {
    type enumeration {
      enum other {
        value 1;
        description
          "A measure other than those listed below.";
      }
      enum unknown {
        value 2;
        description
          "An unknown measurement or arbitrary, relative numbers";
      }
      enum volts-AC {
        value 3;
        description
          "A measure of electric potential (alternating current).";
      }
      enum volts-DC {
        value 4;
        description
          "A measure of electric potential (direct current).";
      }
      enum amperes {
        value 5;
        description
          "A measure of electric current.";
      }
      enum watts {
        value 6;
        description
          "A measure of power.";
      }
      enum hertz {
        value 7;
        description
          "A measure of frequency.";
      }
      enum celsius {
        value 8;
        description
          "A measure of temperature.";
      }
      enum percent-RH {
        value 9;
        description
          "A measure of percent relative humidity.";
      }
      enum rpm {
        value 10;
        description
          "A measure of shaft revolutions per minute.";
      }
      enum cmm {
        value 11;
        description
          "A measure of cubic meters per minute (airflow).";
      }
      enum truth-value {
        value 12;
        description
          "Value is one of 1 (true) or 2 (false)";
      }
    }
    description
      "A node using this data type represents the sensor measurement
       data type associated with a physical sensor value.  The actual
       data units are determined by examining a node of this type
       together with the associated sensor-value-scale node.

       A node of this type SHOULD be defined together with nodes of
       type sensor-value-scale and type sensor-value-precision.
       These three types are used to identify the semantics of a node
       of type sensor-value.";
    reference
      "RFC 3433: Entity Sensor Management Information Base -
                 EntitySensorDataType";
  }

  typedef sensor-value-scale {
    type enumeration {
      enum yocto {
        value 1;
        description
          "Data scaling factor of 10^-24.";
      }
      enum zepto {
        value 2;
        description
          "Data scaling factor of 10^-21.";
      }
      enum atto {
        value 3;
        description
          "Data scaling factor of 10^-18.";
      }
      enum femto {
        value 4;
        description
          "Data scaling factor of 10^-15.";
      }
      enum pico {
        value 5;
        description
          "Data scaling factor of 10^-12.";
      }
      enum nano {
        value 6;
        description
          "Data scaling factor of 10^-9.";
      }
      enum micro {
        value 7;
        description
          "Data scaling factor of 10^-6.";
      }
      enum milli {
        value 8;
        description
          "Data scaling factor of 10^-3.";
      }
      enum units {
        value 9;
        description
          "Data scaling factor of 10^0.";
      }
      enum kilo {
        value 10;
        description
          "Data scaling factor of 10^3.";
      }
      enum mega {
        value 11;
        description
          "Data scaling factor of 10^6.";
      }
      enum giga {
        value 12;
        description
          "Data scaling factor of 10^9.";
      }
      enum tera {
        value 13;
        description
          "Data scaling factor of 10^12.";
      }
      enum peta {
        value 14;
        description
          "Data scaling factor of 10^15.";
      }
      enum exa {
        value 15;
        description
          "Data scaling factor of 10^18.";
      }
      enum zetta {
        value 16;
        description
          "Data scaling factor of 10^21.";
      }
      enum yotta {
        value 17;
        description
          "Data scaling factor of 10^24.";
      }
    }
    description
      "A node using this data type represents a data scaling factor,
       represented with an International System of Units (SI) prefix.
       The actual data units are determined by examining a node of
       this type together with the associated sensor-value-type.

       A node of this type SHOULD be defined together with nodes of
       type sensor-value-type and type sensor-value-precision.
       Together, associated nodes of these three types are used to
       identify the semantics of a node of type sensor-value.";
    reference
      "RFC 3433: Entity Sensor Management Information Base -
                 EntitySensorDataScale";
  }

  typedef sensor-value-precision {
    type int8 {
      range "-8 .. 9";
    }
    description
      "A node using this data type represents a sensor value
       precision range.

       A node of this type SHOULD be defined together with nodes of
       type sensor-value-type and type sensor-value-scale.  Together,
       associated nodes of these three types are used to identify the
       semantics of a node of type sensor-value.

       If a node of this type contains a value in the range 1 to 9,
       it represents the number of decimal places in the fractional
       part of an associated sensor-value fixed-point number.

       If a node of this type contains a value in the range -8 to -1,
       it represents the number of accurate digits in the associated
       sensor-value fixed-point number.

       The value zero indicates the associated sensor-value node is
       not a fixed-point number.

       Server implementers must choose a value for the associated
       sensor-value-precision node so that the precision and accuracy
       of the associated sensor-value node is correctly indicated.

       For example, a component representing a temperature sensor
       that can measure 0 to 100 degrees C in 0.1 degree
       increments, +/- 0.05 degrees, would have a
       sensor-value-precision value of '1', a sensor-value-scale
       value of 'units', and a sensor-value ranging from '0' to
       '1000'.  The sensor-value would be interpreted as
       'degrees C * 10'.";
    reference
      "RFC 3433: Entity Sensor Management Information Base -
                 EntitySensorPrecision";
  }

  typedef sensor-value {
    type int32 {
      range "-1000000000 .. 1000000000";
    }
    description
     "A node using this data type represents a sensor value.

      A node of this type SHOULD be defined together with nodes of
      type sensor-value-type, type sensor-value-scale, and
      type sensor-value-precision.  Together, associated nodes of
      those three types are used to identify the semantics of a node
      of this data type.

      The semantics of a node using this data type are determined by
      the value of the associated sensor-value-type node.

      If the associated sensor-value-type node is equal to 'voltsAC',
      'voltsDC', 'amperes', 'watts', 'hertz', 'celsius', or 'cmm',
      then a node of this type MUST contain a fixed-point number
      ranging from -999,999,999 to +999,999,999.  The value
      -1000000000 indicates an underflow error.  The value
      +1000000000 indicates an overflow error.  The
      sensor-value-precision indicates how many fractional digits
      are represented in the associated sensor-value node.

      If the associated sensor-value-type node is equal to
      'percentRH', then a node of this type MUST contain a number
      ranging from 0 to 100.

      If the associated sensor-value-type node is equal to 'rpm',
      then a node of this type MUST contain a number ranging from
      -999,999,999 to +999,999,999.

      If the associated sensor-value-type node is equal to
      'truth-value', then a node of this type MUST contain either the
      value 1 (true) or the value 2 (false).

      If the associated sensor-value-type node is equal to 'other' or
      'unknown', then a node of this type MUST contain a number
      ranging from -1000000000 to 1000000000.";
    reference
      "RFC 3433: Entity Sensor Management Information Base -
                 EntitySensorValue";
  }

  typedef sensor-status {
    type enumeration {
      enum ok {
        value 1;
        description
          "Indicates that the server can obtain the sensor value.";
      }
      enum unavailable {
        value 2;
        description
          "Indicates that the server presently cannot obtain the
           sensor value.";
      }
      enum nonoperational {
        value 3;
        description
          "Indicates that the server believes the sensor is broken.
           The sensor could have a hard failure (disconnected wire)
           or a soft failure such as out-of-range, jittery, or wildly
           fluctuating readings.";
      }
    }
    description
      "A node using this data type represents the operational status
       of a physical sensor.";
    reference
      "RFC 3433: Entity Sensor Management Information Base -
                 EntitySensorStatus";
  }

  /*
   * Data nodes
   */

  container hardware {
    description
      "Data nodes representing components.

       If the server supports configuration of hardware components,
       then this data model is instantiated in the configuration
       datastores supported by the server.  The leaf-list 'datastore'
       for the module 'ietf-hardware' in the YANG library provides
       this information.";

    leaf last-change {
      type yang:date-and-time;
      config false;
      description
        "The time the '/hardware/component' list changed in the
         operational state.";
    }

    list component {
      key name;
      description
        "List of components.

         When the server detects a new hardware component, it
         initializes a list entry in the operational state.

         If the server does not support configuration of hardware
         components, list entries in the operational state are
         initialized with values for all nodes as detected by the
         implementation.

         Otherwise, this procedure is followed:

           1. If there is an entry in the '/hardware/component' list
              in the intended configuration with values for the nodes
              'class', 'parent', and 'parent-rel-pos' that are equal
              to the detected values, then the list entry in the
              operational state is initialized with the configured
              values, including the 'name'.

           2. Otherwise (i.e., there is no matching configuration
              entry), the list entry in the operational state is
              initialized with values for all nodes as detected by
              the implementation.

         If the '/hardware/component' list in the intended
         configuration is modified, then the system MUST behave as if
         it re-initializes itself and follow the procedure in (1).";
      reference
        "RFC 6933: Entity MIB (Version 4) - entPhysicalEntry";

      leaf name {
        type string;
        description
          "The name assigned to this component.

           This name is not required to be the same as
           entPhysicalName.";
      }

      leaf class {
        type identityref {
          base ianahw:hardware-class;
        }
        mandatory true;
        description
          "An indication of the general hardware type of the
           component.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalClass";
      }

      leaf physical-index {
        if-feature entity-mib;
        type int32 {
          range "1..2147483647";
        }
        config false;
        description
          "The entPhysicalIndex for the entPhysicalEntry represented
           by this list entry.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalIndex";
      }

      leaf description {
        type string;
        config false;
        description
          "A textual description of the component.  This node should
           contain a string that identifies the manufacturer's name
           for the component and should be set to a distinct value
           for each version or model of the component.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalDescr";
      }

      leaf parent {
        type leafref {
          path "../../component/name";
          require-instance false;
        }
        description
          "The name of the component that physically contains this
           component.

           If this leaf is not instantiated, it indicates that this
           component is not contained in any other component.

           In the event that a physical component is contained by
           more than one physical component (e.g., double-wide
           modules), this node contains the name of one of these
           components.  An implementation MUST use the same name
           every time this node is instantiated.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalContainedIn";
      }

      leaf parent-rel-pos {
        type int32 {
          range "0 .. 2147483647";
        }
        description
          "An indication of the relative position of this child
           component among all its sibling components.  Sibling
           components are defined as components that:

             o share the same value of the 'parent' node and

             o share a common base identity for the 'class' node.

           Note that the last rule gives implementations flexibility
           in how components are numbered.  For example, some
           implementations might have a single number series for all
           components derived from 'ianahw:port', while some others
           might have different number series for different
           components with identities derived from 'ianahw:port' (for
           example, one for registered jack 45 (RJ45) and one for
           small form-factor pluggable (SFP)).";

        reference
          "RFC 6933: Entity MIB (Version 4) -
                     entPhysicalParentRelPos";
      }

      leaf-list contains-child {
        type leafref {
          path "../../component/name";
        }
        config false;
        description
          "The name of the contained component.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalChildIndex";
      }

      leaf hardware-rev {
        type string;
        config false;
        description
          "The vendor-specific hardware revision string for the
           component.  The preferred value is the hardware revision
           identifier actually printed on the component itself (if
           present).";
        reference
          "RFC 6933: Entity MIB (Version 4) -
                     entPhysicalHardwareRev";
      }

      leaf firmware-rev {
        type string;
        config false;
        description
          "The vendor-specific firmware revision string for the
           component.";
        reference
          "RFC 6933: Entity MIB (Version 4) -
                     entPhysicalFirmwareRev";
      }

      leaf software-rev {
        type string;
        config false;

        description
          "The vendor-specific software revision string for the
           component.";
        reference
          "RFC 6933: Entity MIB (Version 4) -
                     entPhysicalSoftwareRev";
      }

      leaf serial-num {
        type string;
        config false;
        description
          "The vendor-specific serial number string for the
           component.  The preferred value is the serial number
           string actually printed on the component itself (if
           present).";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalSerialNum";
      }

      leaf mfg-name {
        type string;
        config false;
        description
          "The name of the manufacturer of this physical component.
           The preferred value is the manufacturer name string
           actually printed on the component itself (if present).

           Note that comparisons between instances of the
           'model-name', 'firmware-rev', 'software-rev', and
           'serial-num' nodes are only meaningful amongst components
           with the same value of 'mfg-name'.

           If the manufacturer name string associated with the
           physical component is unknown to the server, then this
           node is not instantiated.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgName";
      }

      leaf model-name {
        type string;
        config false;
        description
          "The vendor-specific model name identifier string
           associated with this physical component.  The preferred
           value is the customer-visible part number, which may be
           printed on the component itself.
           If the model name string associated with the physical
           component is unknown to the server, then this node is not
           instantiated.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalModelName";
      }

      leaf alias {
        type string;
        description
          "An 'alias' name for the component, as specified by a
           network manager, that provides a non-volatile 'handle' for
           the component.

           If no configured value exists, the server MAY set the
           value of this node to a locally unique value in the
           operational state.

           A server implementation MAY map this leaf to the
           entPhysicalAlias MIB object.  Such an implementation needs
           to use some mechanism to handle the differences in size
           and characters allowed between this leaf and
           entPhysicalAlias.  The definition of such a mechanism is
           outside the scope of this document.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalAlias";
      }

      leaf asset-id {
        type string;
        description
          "This node is a user-assigned asset tracking identifier for
           the component.

           A server implementation MAY map this leaf to the
           entPhysicalAssetID MIB object.  Such an implementation
           needs to use some mechanism to handle the differences in
           size and characters allowed between this leaf and
           entPhysicalAssetID.  The definition of such a mechanism is
           outside the scope of this document.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalAssetID";
      }

      leaf is-fru {
        type boolean;
        config false;

        description
          "This node indicates whether or not this component is
           considered a 'field-replaceable unit' by the vendor.  If
           this node contains the value 'true', then this component
           identifies a field-replaceable unit.  For all components
           that are permanently contained within a field-replaceable
           unit, the value 'false' should be returned for this
           node.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalIsFRU";
      }

      leaf mfg-date {
        type yang:date-and-time;
        config false;
        description
          "The date of manufacturing of the managed component.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalMfgDate";
      }

      leaf-list uri {
        type inet:uri;
        description
          "This node contains identification information about the
           component.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalUris";
      }

      leaf uuid {
        type yang:uuid;
        config false;
        description
          "A Universally Unique Identifier of the component.";
        reference
          "RFC 6933: Entity MIB (Version 4) - entPhysicalUUID";
      }

      container state {
        if-feature hardware-state;
        description
          "State-related nodes";
        reference
          "RFC 4268: Entity State MIB";

        leaf state-last-changed {
          type yang:date-and-time;
          config false;
          description
            "The date and time when the value of any of the
             admin-state, oper-state, usage-state, alarm-state, or
             standby-state changed for this component.

             If there has been no change since the last
             re-initialization of the local system, this node
             contains the date and time of local system
             initialization.  If there has been no change since the
             component was added to the local system, this node
             contains the date and time of the insertion.";
          reference
            "RFC 4268: Entity State MIB - entStateLastChanged";
        }

        leaf admin-state {
          type admin-state;
          description
            "The administrative state for this component.

             This node refers to a component's administrative
             permission to service both other components within its
             containment hierarchy as well other users of its
             services defined by means outside the scope of this
             module.

             Some components exhibit only a subset of the remaining
             administrative state values.  Some components cannot be
             locked; hence, this node exhibits only the 'unlocked'
             state.  Other components cannot be shut down gracefully;
             hence, this node does not exhibit the 'shutting-down'
             state.";
          reference
            "RFC 4268: Entity State MIB - entStateAdmin";
        }

        leaf oper-state {
          type oper-state;
          config false;
          description
            "The operational state for this component.

             Note that this node does not follow the administrative
             state.  An administrative state of 'down' does not
             predict an operational state of 'disabled'.

             Note that some implementations may not be able to
             accurately report oper-state while the admin-state node
             has a value other than 'unlocked'.  In these cases, this
             node MUST have a value of 'unknown'.";
          reference
            "RFC 4268: Entity State MIB - entStateOper";
        }

        leaf usage-state {
          type usage-state;
          config false;
          description
            "The usage state for this component.

             This node refers to a component's ability to service
             more components in a containment hierarchy.

             Some components will exhibit only a subset of the usage
             state values.  Components that are unable to ever
             service any components within a containment hierarchy
             will always have a usage state of 'busy'.  In some
             cases, a component will be able to support only one
             other component within its containment hierarchy and
             will therefore only exhibit values of 'idle' and
             'busy'.";
          reference
            "RFC 4268: Entity State MIB - entStateUsage";
        }

        leaf alarm-state {
          type alarm-state;
          config false;
          description
            "The alarm state for this component.  It does not
             include the alarms raised on child components within its
             containment hierarchy.";
          reference
            "RFC 4268: Entity State MIB - entStateAlarm";
        }

        leaf standby-state {
          type standby-state;
          config false;
          description
            "The standby state for this component.

             Some components will exhibit only a subset of the
             remaining standby state values.  If this component
             cannot operate in a standby role, the value of this node
             will always be 'providing-service'.";
          reference
            "RFC 4268: Entity State MIB - entStateStandby";
        }
      }

      container sensor-data {
        when 'derived-from-or-self(../class,
                                   "ianahw:sensor")' {
          description
            "Sensor data nodes present for any component of type
             'sensor'";
        }
        if-feature hardware-sensor;
        config false;

        description
          "Sensor-related nodes.";
        reference
          "RFC 3433: Entity Sensor Management Information Base";

        leaf value {
          type sensor-value;
          description
            "The most recent measurement obtained by the server
             for this sensor.

             A client that periodically fetches this node should also
             fetch the nodes 'value-type', 'value-scale', and
             'value-precision', since they may change when the value
             is changed.";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorValue";
        }

        leaf value-type {
          type sensor-value-type;
          description
            "The type of data units associated with the
             sensor value";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorType";
        }
        leaf value-scale {
          type sensor-value-scale;
          description
            "The (power of 10) scaling factor associated
             with the sensor value";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorScale";
        }

        leaf value-precision {
          type sensor-value-precision;
          description
            "The number of decimal places of precision
             associated with the sensor value";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorPrecision";
        }

        leaf oper-status {
          type sensor-status;
          description
            "The operational status of the sensor.";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorOperStatus";
        }

        leaf units-display {
          type string;
          description
            "A textual description of the data units that should be
             used in the display of the sensor value.";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorUnitsDisplay";
        }

        leaf value-timestamp {
          type yang:date-and-time;
          description
            "The time the status and/or value of this sensor was last
             obtained by the server.";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorValueTimeStamp";
        }
        leaf value-update-rate {
          type uint32;
          units "milliseconds";
          description
            "An indication of the frequency that the server updates
             the associated 'value' node, represented in
             milliseconds.  The value zero indicates:

              - the sensor value is updated on demand (e.g.,
                when polled by the server for a get-request),

              - the sensor value is updated when the sensor
                value changes (event-driven), or

              - the server does not know the update rate.";
          reference
            "RFC 3433: Entity Sensor Management Information Base -
                       entPhySensorValueUpdateRate";
        }
      }
    }
  }

  /*
   * Notifications
   */

  notification hardware-state-change {
    description
      "A hardware-state-change notification is generated when the
       value of /hardware/last-change changes in the operational
       state.";
    reference
      "RFC 6933: Entity MIB (Version 4) - entConfigChange";
  }

  notification hardware-state-oper-enabled {
    if-feature hardware-state;
    description
      "A hardware-state-oper-enabled notification signifies that a
       component has transitioned into the 'enabled' state.";

    leaf name {
      type leafref {
        path "/hardware/component/name";
      }

      description
        "The name of the component that has transitioned into the
         'enabled' state.";
    }
    leaf admin-state {
      type leafref {
        path "/hardware/component/state/admin-state";
      }
      description
        "The administrative state for the component.";
    }
    leaf alarm-state {
      type leafref {
        path "/hardware/component/state/alarm-state";
      }
      description
        "The alarm state for the component.";
    }
    reference
      "RFC 4268: Entity State MIB - entStateOperEnabled";
  }

  notification hardware-state-oper-disabled {
    if-feature hardware-state;
    description
      "A hardware-state-oper-disabled notification signifies that a
       component has transitioned into the 'disabled' state.";

    leaf name {
      type leafref {
        path "/hardware/component/name";
      }
      description
        "The name of the component that has transitioned into the
         'disabled' state.";
    }
    leaf admin-state {
      type leafref {
        path "/hardware/component/state/admin-state";
      }
      description
        "The administrative state for the component.";
    }
    leaf alarm-state {
      type leafref {
        path "/hardware/component/state/alarm-state";
      }

      description
        "The alarm state for the component.";
    }
    reference
      "RFC 4268: Entity State MIB - entStateOperDisabled";
  }

}
