<?xml version="1.0" encoding="UTF-8"?>
<!--
  IoT Component objects for TR-181 Device:2 model

  Copyright (c) 2019-2024, Broadband Forum

  Redistribution and use in source and binary forms, with or
  without modification, are permitted provided that the following
  conditions are met:

  1. Redistributions of source code must retain the above copyright
     notice, this list of conditions and the following disclaimer.

  2. Redistributions in binary form must reproduce the above
     copyright notice, this list of conditions and the following
     disclaimer in the documentation and/or other materials
     provided with the distribution.

  3. Neither the name of the copyright holder nor the names of its
     contributors may be used to endorse or promote products
     derived from this software without specific prior written
     permission.

  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
  CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
  INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

  The above license is used as a license under copyright only.
  Please reference the Forum IPR Policy for patent licensing terms
  <https://www.broadband-forum.org/ipr-policy>.

  Any moral rights which are necessary to exercise under the above
  license grant are also deemed granted under this license.

  Comments or questions about this Broadband Forum data model should be
  directed to <info@broadband-forum.org>.
-->

<dm:document
    xmlns:dm="urn:broadband-forum-org:cwmp:datamodel-1-10"
    xmlns:dmr="urn:broadband-forum-org:cwmp:datamodel-report-1-0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="
      urn:broadband-forum-org:cwmp:datamodel-1-10
        https://www.broadband-forum.org/cwmp/cwmp-datamodel-1-10.xsd
      urn:broadband-forum-org:cwmp:datamodel-report-1-0
        https://www.broadband-forum.org/cwmp/cwmp-datamodel-report-1-0.xsd"
    spec="urn:broadband-forum-org:tr-181-2-20-0-iot"
    file="tr-181-2-20-0-iot.xml">
  <import file="tr-106-types.xml" spec="urn:broadband-forum-org:tr-106">
    <component name="Alias"/>
  </import>

  <import file="tr-181-2-root.xml" spec="urn:broadband-forum-org:tr-181-2-20-root">
    <component name="Root"/>
  </import>

  <dataType name="IoTUnitType">
    <description>
      Possible Unit types used for decimal values.
    </description>
    <string>
      <!-- Numeric-->
      <enumeration value="-">
        <description>Dimensionless quantity</description>
      </enumeration>
      <enumeration value="%">
        <description>Percent</description>
      </enumeration>
      <enumeration value="deg">
        <description>Decimal degrees</description>
      </enumeration>
      <!-- temperature-->
      <enumeration value="degC">
        <description>Celsius</description>
      </enumeration>
      <enumeration value="degF">
        <description>Fahrenheit</description>
      </enumeration>
      <enumeration value="K">
        <description>Kelvin [SI]</description>
      </enumeration>
      <!-- length-->
      <enumeration value="km">
        <description>Kilometer [SI]</description>
      </enumeration>
      <enumeration value="m">
        <description>Meter [SI]</description>
      </enumeration>
      <enumeration value="cm">
        <description>Centimeter [SI]</description>
      </enumeration>
      <enumeration value="mm">
        <description>Millimeter [SI]</description>
      </enumeration>
      <!-- time -->
      <enumeration value="h">
        <description>Hour</description>
      </enumeration>
      <enumeration value="min">
        <description>Minute</description>
      </enumeration>
      <enumeration value="s">
        <description>Second [SI]</description>
      </enumeration>
      <enumeration value="ms">
        <description>Millisecond</description>
      </enumeration>
      <!-- area -->
      <enumeration value="sq-km">
        <description>Square kilometer</description>
      </enumeration>
      <enumeration value="sq-m">
        <description>Square meter</description>
      </enumeration>
      <enumeration value="sq-cm">
        <description>Square cm</description>
      </enumeration>
      <!-- volume, capacity -->
      <enumeration value="cu-m">
        <description>Cubic meter</description>
      </enumeration>
      <enumeration value="l">
        <description>Liter [SI]</description>
      </enumeration>
      <enumeration value="cl">
        <description>Centiliter [SI]</description>
      </enumeration>
      <enumeration value="ml">
        <description>Milliliter [SI]</description>
      </enumeration>
      <!-- Mass and weight -->
      <enumeration value="kg">
        <description>Kilogram [SI]</description>
      </enumeration>
      <enumeration value="g">
        <description>Gram [SI]</description>
      </enumeration>
      <enumeration value="mg">
        <description>Milligram [SI]</description>
      </enumeration>
      <!-- Power -->
      <enumeration value="Wh">
        <description>Watt hour</description>
      </enumeration>
      <enumeration value="kWh">
        <description>Kilowatt hour</description>
      </enumeration>
      <!-- Energy -->
      <enumeration value="W">
        <description>Watt [SI]</description>
      </enumeration>
      <enumeration value="A">
        <description>Ampere [SI]</description>
      </enumeration>
      <enumeration value="Hz">
        <description>Hertz [SI]</description>
      </enumeration>
      <enumeration value="V">
        <description>Volt [SI]</description>
      </enumeration>
      <enumeration value="N">
        <description>Newton [SI]</description>
      </enumeration>
      <enumeration value="Pa">
        <description>Pascal [SI]</description>
      </enumeration>
      <enumeration value="C">
        <description>Coulomb [SI]</description>
      </enumeration>
      <enumeration value="F">
        <description>Farad [SI]</description>
      </enumeration>
      <enumeration value="ohm">
        <description>Ohm [SI]</description>
      </enumeration>
      <enumeration value="S">
        <description>Siemens [SI]</description>
      </enumeration>
      <enumeration value="Wb">
        <description>Weber [SI]</description>
      </enumeration>
      <enumeration value="T">
        <description>Tesla [SI]</description>
      </enumeration>
      <enumeration value="H">
        <description>Henry [SI]</description>
      </enumeration>
      <enumeration value="lm">
        <description>Lumen [SI]</description>
      </enumeration>
      <enumeration value="lx">
        <description>Lux [SI]</description>
      </enumeration>
      <!-- binary multiples -->
      <enumeration value="byte">
        <description>1 byte = 8 bits</description>
      </enumeration>
      <!-- Misc -->
      <enumeration value="mps">
        <description>Meter per second</description>
      </enumeration>
      <enumeration value="cd">
        <description>Candela [SI]</description>
      </enumeration>
      <enumeration value="mol">
        <description>Mole [SI]</description>
      </enumeration>
      <enumeration value="UV">
        <description>Ultraviolet index</description>
      </enumeration>
      <enumeration value="RGB">
        <description>
          RGB color, encoded as integer value between 0 (usually represented as
          0x000000) and 16777215 (usually represented as 0xFFFFFF), e.g. Blue
          would be 255 (usually represented as 0x0000FF)
        </description>
      </enumeration>
      <enumeration value="ppm">
        <description>
          Parts per million (Alternative use percent: 1ppm = 0.0001%)
        </description>
      </enumeration>
      <enumeration value="Sv">
        <description>Sievert (J/kg) [SI]</description>
      </enumeration>
      <enumeration value="J">
        <description>Joule [SI]</description>
      </enumeration>
      <enumeration value="rpm">
        <description>
          Rotations per minute
        </description>
      </enumeration>
      <enumeration value="pps">
        <description>
          Pulses per second
        </description>
      </enumeration>
      <enumeration value="cu-m/s">
        <description>
          Cubic meters per second
        </description>
      </enumeration>
      <enumeration value="liter/s">
        <description>
          Liters per second
        </description>
      </enumeration>
      <enumeration value="dB">
        <description>
          The decibel (symbol: dB) is a relative unit of measurement equal to one tenth of a bel (B). It expresses the ratio of two values of a power or root-power quantity on a logarithmic scale. 
        </description>
      </enumeration>
      <enumeration value="dBm">
        <description>
          dBm or dBmW (decibel-milliwatts) is a unit of power level expressed using a logarithmic decibel (dB) scale respective to one milliwatt (mW). 
        </description>
      </enumeration>
      <enumeration value="eV" version="2.19">
        <description>
          Electron Volt
        </description>
      </enumeration>
      <enumeration value="var" version="2.20">
        <description>
          var: (IEC symbol): reactive power (volt-ampere-reactive). 
          It represents the electrical power that flows back and forth between the phase conductors and the neutral conductor of a three-phase network, but does not perform any mechanical work.
        </description>
      </enumeration>
      <enumeration value="VA" version="2.20">
        <description>
          VA: (SI symbol) apparent power: unit of measurement for electrical power. 
          It represents the total available power in a alternating current system. It is made of the active power (W) and the reactive power (var).
        </description>
      </enumeration>
      <enumeration value="PF" version="2.20">
        <description>
          PF: (Power Factor: In AC power system it is defined as the ratio of the real power absorbed by the load to the apparent power flowing in the circuit. 
          It is important the the power factor should be as close to "1.0" as possible. It is generally expressed as a decimal value or as a percentage.
        </description>
      </enumeration>
      <enumeration value="dateTime" version="2.20">
        <description>
          A timestamp in dateTime format (the subset of the ISO 8601 date-time format defined by the SOAP dateTime type).
        </description>
      </enumeration>
      <enumeration value="bps" version="2.20">
        <description>
          bps: bits per second
        </description>
      </enumeration>
    </string>
  </dataType>

  <dataType name="IoTDeviceType">
    <description>
      Describes the type of Device that the {{object}} instance is
      representing. {{enum}}
    </description>
    <string>
      <enumeration value="Alarm"/>
      <enumeration value="AntiTheft"/>
      <enumeration value="Bell"/>
      <enumeration value="Clock"/>
      <enumeration value="Door"/>
      <enumeration value="Fan"/>
      <enumeration value="GarageDoor"/>
      <enumeration value="HVAC"/>
      <enumeration value="Light"/>
      <enumeration value="Lock"/>
      <enumeration value="Meter"/>
      <enumeration value="Motor"/>
      <enumeration value="Oven"/>
      <enumeration value="PowerStrip"/>
      <enumeration value="Sensor"/>
      <enumeration value="SensorStrip"/>
      <enumeration value="Siren"/>
      <enumeration value="Thermostat"/>
    </string>
  </dataType>

  <dataType name="IoTLevelType">
    <description>
      Describes the type of IoT Level Controller or Sensor that the {{object}}
      instance is representing. {{enum}}
    </description>
    <string>
      <enumeration value="Acceleration"/>
      <enumeration value="Area"/>
      <enumeration value="Battery"/>
      <enumeration value="Brightness"/>
      <enumeration value="Concentration"/>
      <enumeration value="Conductivity"/>
      <enumeration value="Distance"/>
      <enumeration value="Energy"/>
      <enumeration value="Flow"/>
      <enumeration value="Humidity"/>
      <enumeration value="Intensity"/>
      <enumeration value="Luminance"/>
      <enumeration value="Meter"/>
      <enumeration value="Motion"/>
      <enumeration value="Position"/>
      <enumeration value="Power"/>
      <enumeration value="Pressure"/>
      <enumeration value="Radiation"/>
      <enumeration value="Speed"/>
      <enumeration value="Temperature"/>
      <enumeration value="Volume">
        <description>
          Amount of space that an object or substance occupies
        </description>
      </enumeration>
      <enumeration value="Weight"/>
      <enumeration value="Depth"/>
      <enumeration value="Counter"/>
      <enumeration value="Duration" version="2.19"/>
    </string>
  </dataType>

  <dataType name="IoTEnumControlType">
    <description>
      Describes the type of IoT Enum Controller that the {{object}} instance is
      representing. {{enum}}
    </description>
    <string>
      <enumeration value="AlarmMode"/>
      <enumeration value="DoorMode"/>
      <enumeration value="FanMode"/>
      <enumeration value="LockMode"/>
      <enumeration value="OperatingMode"/>
      <enumeration value="TemperatureMode"/>
      <enumeration value="ThermostatMode"/>
    </string>
  </dataType>

  <dataType name="IoTEnumSensorType">
    <description>
      Describes the type of IoT Enum Sensor type the {{object}} instance is representing.
    </description>
    <string>
      <enumeration value="AlarmState"/>
      <enumeration value="DoorState"/>
      <enumeration value="FanState"/>
      <enumeration value="LockState"/>
      <enumeration value="OperatingState"/>
      <enumeration value="TemperatureState"/>
      <enumeration value="ThermostatFanState"/>
    </string>
  </dataType>
  
  <dataType name="IoTBlobSensorType">
    <description>
     Describes the type of IoT Blob Sensor that the {{object}}
     instance is representing.These are examples to identify a "string of bytes" that has been sent by a Sensor {{enum}}
    </description>
    <string>
        <enumeration value="ascii"/>
        <enumeration value="base64"/>
        <enumeration value="id"/>
        <enumeration value="gif"/>
        <enumeration value="jpeg"/>
        <enumeration value="json"/>
        <enumeration value="numberplate"/>
        <enumeration value="text"/>
        <enumeration value="url"/>
        <enumeration value="raw"/>
        <enumeration value="utf-8"/>
        <enumeration value="utf-16"/>
        <enumeration value="utf-32"/>
        <enumeration value="uuid"/>
        <enumeration value="xml"/>
        <enumeration value="yaml"/>
    </string>
 </dataType>
 
  <dataType name="IoTPulseType">
   <description>
     Describes the type of pulse that the {{object}}
     instance is representing. {{enum}}
   </description>
   <string>
     <enumeration value="PushButton"/>
     <enumeration value="MagneticContact"/>
     <enumeration value="ElectronicLock"/>
     <enumeration value="MotionTrigger"/>
   </string>
  </dataType>

  <component name="IoT_NodeComponent">

    <parameter name="NodeNumberOfEntries" access="readOnly" version="2.13">
      <description>
        {{numentries}}
      </description>
      <syntax>
        <unsignedInt/>
      </syntax>
    </parameter>

    <object name="Node.{i}." access="readOnly" minEntries="0"
        maxEntries="unbounded" mountType="mountPoint"
        numEntriesParameter="NodeNumberOfEntries" version="2.13">
      <description>
        Each Node instance represents distinct functional devices, which are
        virtual and abstracted representation of functionality.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <component ref="Alias"/>

      <parameter name="Type" access="readOnly">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="IoTDeviceType"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. e.g. a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>
    </object>
  </component>

  <component name="IoT_ProxiedDeviceExtensionComponent">
    <description>
      Extensions for the proxied device object
    </description>

    <parameter name="Type" access="readOnly" version="2.13">
      <description>
        {{datatype|expand}}
      </description>
      <syntax>
        <dataType ref="IoTDeviceType"/>
      </syntax>
    </parameter>

    <parameter name="Description" access="readOnly" version="2.13">
      <description>
        Human-readable description of the {{object}}. e.g. a more detailed
        description of {{param|Type}}.
      </description>
      <syntax>
        <string>
          <size maxLength="256"/>
        </string>
      </syntax>
    </parameter>

    <parameter name="Name" access="readWrite" version="2.13">
      <description>
        A textual name of the instance, which can be assigned by the user.
        {{object}}.
      </description>
      <syntax>
        <string>
          <size maxLength="64"/>
        </string>
      </syntax>
    </parameter>

    <parameter name="Online" access="readOnly" version="2.13">
      <description>
        This parameter provides the state of the {{object}} on the underlying
        (proxied) connected network.
      </description>
      <syntax>
        <boolean/>
      </syntax>
    </parameter>

    <parameter name="LastTimeContacted" access="readOnly" version="2.13">
      <description>
        The date time of the last successful contact.
      </description>
      <syntax>
        <dateTime/>
      </syntax>
    </parameter>

    <parameter name="InterfaceReference" access="readOnly" version="2.13">
      <description>
        {{reference|a protocol object that uses the {{param|ProxyProtocol}}}}.
      </description>
      <syntax>
        <string>
          <pathRef refType="strong" targetType="row"/>
        </string>
      </syntax>
    </parameter>

    <parameter name="ProxyProtocol" access="readOnly" version="2.13">
      <description>
        The protocol being used to communicate between the Agent and this
        Proxied Device. {{enum}}

        Vendors can extend the enumerated values with vendor specific
        extensions, in which case the rules outlined in {{bibref|TR-106|3.3}}
        MUST be adhered to.
      </description>
      <syntax>
        <string>
          <enumeration value="Z-Wave">
            <description>see {{bibref|Z-Wave}}</description>
          </enumeration>
          <enumeration value="ZigBee">
            <description>see {{bibref|ZigBee}}</description>
          </enumeration>
          <enumeration value="UPnP-DM">
            <description>see {{bibref|UPnP-DM:1}}</description>
          </enumeration>
        </string>
      </syntax>
    </parameter>
  </component>

  <component name="IoT_ObjectComponent">

    <parameter name="IoTCapabilityNumberOfEntries" access="readOnly"
        version="2.13">
      <description>
        {{numentries}}
      </description>
      <syntax>
        <unsignedInt/>
      </syntax>
    </parameter>

    <object name="IoTCapability.{i}." access="readOnly" minEntries="0"
        maxEntries="unbounded"
        numEntriesParameter="IoTCapabilityNumberOfEntries" version="2.13">
      <description>
        This list of IoT capability objects.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>
      <uniqueKey functional="false">
        <parameter ref="Name"/>
      </uniqueKey>

      <component ref="Alias"/>

      <parameter name="Name" access="readWrite">
        <description>
          A textual name of the instance, which can be assigned by the user.
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Class" access="readOnly">
        <description>
          Describes the type of functionality that {{object}} is representing.
          Depending on the functionality the corresponding sub-object is
          instantiated.

          Note: Only one of the defined sub-objects can exist in an {{object}}
          instance.
        </description>
        <syntax>
          <string>
            <enumeration value="BinaryControl"/>
            <enumeration value="LevelControl"/>
            <enumeration value="EnumControl"/>
            <enumeration value="PulseControl" version="2.20"/>
            <enumeration value="BinarySensor"/>
            <enumeration value="LevelSensor"/>
            <enumeration value="MultiLevelSensor"/>
            <enumeration value="EnumSensor"/>
            <enumeration value="BlobSensor" version="2.19"/>
            <enumeration value="PulseSensor" version="2.20"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="BindingNumberOfEntries" access="readOnly" version="2.20">
        <description>
          {{numentries}}
        </description>
        <syntax>
          <unsignedInt/>
        </syntax>
      </parameter>

    </object>

    <object name="IoTCapability.{i}.BinaryControl." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.13">
      <description>
        This capability provides a boolean function that is mapped to the type
        of function it represents.

        E.g. If the instance represents a door lock ({{param|Type}} is
        {{enum|Locked|Type}}), a {{param|Value}} of {{true}} says the door lock
        is locked.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          Describes the type of functionality that {{object}} is representing.
        </description>
        <syntax>
          <string>
            <enumeration value="Switch"/>
            <enumeration value="Locked"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. e.g. a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Value" access="readWrite">
        <description>
          Value of {{true}} or {{false}} that reflects the functionality.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <command name="Toggle()" async="true">
        <description>
          Toggle the {{param|Value}}.
        </description>
      </command>
    </object>

    <object name="IoTCapability.{i}.LevelControl." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.13">
      <description>
        LevelController is used to model a control with a range of continuous
        states.

        These values are configurable via {{param|Value}} and measured in
        {{param|Unit}} and are restricted between a Min and Max values.

        Intensity profile - {{param|Value}} of intensity and ability to update
        that level through {{command|StepUp()}} and {{command|StepDown()}}
        commands with a configurable {{param|StepValue}}.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="IoTLevelType"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. e.g. a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Value" access="readWrite">
        <description>
          The desired run value that this {{object}} will be between
          {{param|MinValue}} and {{param|MaxValue}}.
        </description>
        <syntax>
          <decimal/>
        </syntax>
      </parameter>

      <parameter name="Unit" access="readOnly">
        <description>
          Units in which {{param|Value}}, {{param|Value}}, {{param|MinValue}},
          {{param|MaxValue}} and {{param|StepValue}} are expressed.
          {{datatype|expand}}.
        </description>
        <syntax>
          <dataType ref="IoTUnitType"/>
        </syntax>
      </parameter>

      <parameter name="MinValue" access="readOnly">
        <description>
          Minimum allowed value for {{param|Value}}.
        </description>
        <syntax>
          <decimal/>
        </syntax>
      </parameter>

      <parameter name="MaxValue" access="readOnly">
        <description>
          Maximum allowed value for {{param|Value}}.
        </description>
        <syntax>
          <decimal/>
        </syntax>
      </parameter>

      <parameter name="StepValue" access="readWrite">
        <description>
          Number of {{param|Unit}} changes of each {{command|StepUp()}} and
          {{command|StepDown()}} command.
        </description>
        <syntax>
          <decimal/>
          <!--<default type="object" value="1"/>-->
        </syntax>
      </parameter>
  
      <command name="StepUp()" async="true">
        <description>
          Step Up the {{param|Value}}.
        </description>
      </command>

      <command name="StepDown()" async="true">
        <description>
          Step Down the {{param|Value}}.
        </description>
      </command>
    </object>

    <object name="IoTCapability.{i}.EnumControl." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.13">
      <description>
        The EnumControl reflects the Enumerated level Control functionality.

        The enumeration is defined by the {{param|ValidValues}} parameter. This
        will provide a comma-separated list of values that are available for
        configuring via the {{param|Value}} parameter.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="IoTEnumControlType"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. For example, a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Value" access="readWrite">
        <description>
          Current value representing the {{object}}; MUST be an element of
          {{param|ValidValues}}.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="ValidValues" access="readOnly">
        <description>
          List of valid values from the control represented by the {{object}}.
        </description>
        <syntax>
          <list/>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <command name="StepUp()" async="true">
        <description>
          Step up the {{param|Value}} to the next allowed value in the enum.
        </description>
      </command>

      <command name="StepDown()" async="true">
        <description>
          Step down the {{param|Value}} to the previous allowed value in the
          enum.
        </description>
      </command>
    </object>

    <object name="IoTCapability.{i}.PulseControl." access="readOnly"
       minEntries="0" maxEntries="1" discriminatorParameter="Class"
       version="2.20">
      <description>
        {{object}} provides information to an actuator that sensor changed from one state to another state.
        In addition to the state change, the {{object}} can provide additional information about the type of transition via {{param|Transition}} and the pulse duration via {{param|Duration}}.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="IoTPulseType"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. For example, a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Duration" access="readWrite" mandatory="true">
        <description>
          Some {{object}} instances can provide a duration together with the latest state change.
          The duration is an indication of the time, measured in {{units}}, between the start of the state change and the end of the state change: i.e., returning to its orignal state.
          The original state can be a low state or high state.
        </description>
        <syntax>
            <unsignedInt>
               <range minInclusive="1"/>
               <units value="milliseconds"/>
            </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="Transition" access="readWrite" mandatory="true">
        <description>
          Indicates the moment a pulse is generated. This can be a
          {{enum|RisingEdge}} transition: in case the sensor changes from low to high state.
          {{enum|FallingEdge}} transition: in case the sensor changes from high to low state.
        </description>
        <syntax>
          <string>
            <enumeration value="RisingEdge">
              <description>
                The sensor changes from low to high state.
              </description>
            </enumeration>
            <enumeration value="FallingEdge">
              <description>
                The sensor changes from high to low state.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <command name="TransitionHigh()" async="false">
        <description>
          Generate a Pulse with a {{enum|RisingEdge|Transition}} transition for a duration of {{param|Duration}}.
        </description>
        <input>
          <parameter name="Duration" mandatory="true">
            <description>
               Time between the start of the state change and the return to its original state. {{param}} is measured in {{units}}.
            </description>
            <syntax>
                <unsignedInt>
                    <range minInclusive="1"/>
                    <units value="milliseconds"/>
                </unsignedInt>
            </syntax>
          </parameter>
        </input>
      </command>

      <command name="TransitionLow()" async="false">
        <description>
          Generate a Pulse with a {{enum|FallingEdge|Transition}} transition for a duration of {{param|Duration}}.
        </description>
        <input>

          <parameter name="Duration" mandatory="true">
            <description>
                Time between the start of the state change and the return to its original state. {{param}} is measured in {{units}}.
            </description>
            <syntax>
                <unsignedInt>
                    <range minInclusive="1"/>
                    <units value="milliseconds"/>
                </unsignedInt>
            </syntax>
          </parameter>

        </input>
      </command>

    </object>

    <object name="IoTCapability.{i}.BinarySensor." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.13">
      <description>
        BinarySensor is used to reflect the functionality of a sensor that
        reports a {{param|Value}}. The {{param|Sensitivity}} configures the
        degree of sensitivity that the sensor uses for detection.

        Timed BinarySensor profile - To provide the ability to add time based
        control over the {{param|Value}} attribute. How long the
        {{param|Value}} remains true is controlled by the {{param|HoldTime}}.
        {{param|RestTime}} controls how soon, after being activated, the sensor
        will respond to continuous events.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          Describes the type of functionality that {{object}} is representing.
        </description>
        <syntax>
          <string>
            <enumeration value="CarbonDioxideDetected"/>
            <enumeration value="CarbonMonoxideDetected"/>
            <enumeration value="DoorOpen"/>
            <enumeration value="MotionDetected"/>
            <enumeration value="SmokeDetected"/>
            <enumeration value="WindowOpen"/>
            <enumeration value="WaterDetected"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. e.g. a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Value" access="readOnly">
        <description>
          If the {{object}} has been recently activated, the value would be
          true. For how long the state attribute remain true after being
          activated depends on the underlying sensor reports.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="LastChange" access="readOnly">
        <description>
          The date and time in UTC when {{param|Value}} has been changed to the
          current value.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="LastContactTime" access="readOnly" version="2.18">
        <description>
          The date and time in UTC when the {{object}} has received data.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="Sensitivity" access="readWrite">
        <description>
          A 0 to 100 value indicating how reactive to changes the {{object}}
          should be, 0 being not sensible / disabled and 100 max sensitivity.
        </description>
        <syntax>
          <unsignedInt>
            <range maxInclusive="100"/>
          </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="HoldTime" access="readWrite">
        <description>
          After activation has been detected and the sensing attribute set to
          true, how soon, in {{units}} should the {{param|Value}} be reset to
          {{false}}.
        </description>
        <syntax>
          <unsignedInt>
            <units value="milliseconds"/>
          </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="RestTime" access="readWrite">
        <description>
          After activation has been detected and the {{param|Value}} set to
          {{true}}, how soon, in {{units}} should affected again per subsequent
          event.
        </description>
        <syntax>
          <unsignedInt>
            <units value="milliseconds"/>
          </unsignedInt>
        </syntax>
      </parameter>
    </object>

    <object name="IoTCapability.{i}.LevelSensor." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.13">
      <description>
        LevelSensor is used to reflect the functionality of a sensor that
        reports a {{param|Value}} in {{param|Unit}}.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="IoTLevelType"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. e.g. a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Value" access="readOnly">
        <description>
          The current value reading of this {{object}} in units defined in
          {{param|Unit}}.
        </description>
        <syntax>
          <decimal/>
        </syntax>
      </parameter>

      <parameter name="LastChange" access="readOnly">
        <description>
          The date and time in UTC when {{param|Value}} has been changed to the
          current value.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="LastContactTime" access="readOnly" version="2.18">
        <description>
          The date and time in UTC when the {{object}} has received data.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="Unit" access="readOnly">
        <description>
          {{datatype|expand}}

          Unit in which {{param|Value}} is expressed.
        </description>
        <syntax>
          <dataType ref="IoTUnitType"/>
        </syntax>
      </parameter>

      <parameter name="LowLevel" access="readOnly">
        <description>
          Low level indicator. Is set to {{true}} if {{param|Value}} is equal
          or less than the value defined in {{param|LowLevelThreshold}}.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="LowLevelThreshold" access="readWrite">
        <description>
          The threshold value in for {{param|LowLevel}} expressed in the same
          units like {{param|Value}}.
        </description>
        <syntax>
          <decimal/>
        </syntax>
      </parameter>

      <parameter name="HighLevel" access="readOnly">
        <description>
          High level indicator. Is set to {{true}} if {{param|Value}} is equal
          or higher than the value defined in {{param|HighLevelThreshold}}.
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="HighLevelThreshold" access="readWrite">
        <description>
          The threshold value in for {{param|HighLevel}} expressed in the same
          units like {{param|Value}}.
        </description>
        <syntax>
          <decimal/>
        </syntax>
      </parameter>
    </object>

    <object name="IoTCapability.{i}.MultiLevelSensor." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.13">
      <description>
        MultiLevelSensor is used to reflect the functionality of a sensor that
        reports multiple {{param|Values}} with the same {{param|Unit}}.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          Describes the type of functionality that {{object}} is representing.
        </description>
        <syntax>
          <string>
            <enumeration value="RGB">
              <description>
                RGB color, encoded as integer value between 0 (usually
                represented as 0x000000) and 16777215 (usually represented as
                0xFFFFFF), e.g. Blue would be 255 (usually represented as
                0x0000FF)
              </description>
            </enumeration>
            <enumeration value="Location">
              <description>
                The sensor reports a location with the values of Longitude,
                Latitude, Altitude as decimal values in km.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. e.g. a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Values" access="readOnly">
        <description>
          The current value reading of this {{object}} in units defined in
          {{param|Unit}}.
        </description>
        <syntax>
          <list minItems="2">
            <size/>
          </list>
          <decimal/>
        </syntax>
      </parameter>
  
      <parameter name="ValueNames" access="readOnly">
        <description>
          The names of the values expressed in {{param|Values}}.
        </description>
        <syntax>
          <list minItems="2">
            <size/>
          </list>
          <string/>
        </syntax>
      </parameter>

      <parameter name="LastChange" access="readOnly">
        <description>
          The date and time when {{param|Values}} has been changed to the
          current values.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="LastContactTime" access="readOnly" version="2.18">
        <description>
          The date and time in UTC when the {{object}} has received data.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="Unit" access="readOnly">
        <description>
          {{datatype|expand}}

          Unit in which {{param|Values}} are expressed.
        </description>
        <syntax>
          <dataType ref="IoTUnitType"/>
        </syntax>
      </parameter>
    </object>

    <object name="IoTCapability.{i}.EnumSensor." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.13">
      <description>
        EnumSensor is used to reflect the functionality of a sensor that
        reports explicit non-continuous values.
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="IoTEnumSensorType"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. e.g. a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Value" access="readOnly">
        <description>
          The actual reading value; MUST be a member of the enumeration defined
          in {{param|ValidValues}}.
        </description>
        <syntax>
          <string/>
        </syntax>
      </parameter>

      <parameter name="LastChange" access="readOnly">
        <description>
          The date and time when {{param|Value}} has been changed to the
          current value.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="LastContactTime" access="readOnly" version="2.18">
        <description>
          The date and time in UTC when the {{object}} has received data.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="ValidValues" access="readOnly">
        <description>
          List of valid values reported from the sensor represented by this
          {{object}}.
        </description>
        <syntax>
          <list/>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>
    </object>

    <object name="IoTCapability.{i}.BlobSensor." access="readOnly"
        minEntries="0" maxEntries="1" discriminatorParameter="Class"
        version="2.19">
        <description>
          BlobSensor is a sensor that is able to send specific data as a "string of bytes" depending on its use. For example in case of traffic control Sensors,
          A Sensor can forward an image, a numberplate. RFID-Sensors forward an RFID. They have all in common that a "string of bytes" have been sent. To identify
          the type of bytes, the IoTBlobSensorType provides information about this "string of bytes".
        </description>

        <parameter name="Type" access="readOnly">
            <description>
               {{datatype|expand}}
            </description>
            <syntax>
              <dataType ref="IoTBlobSensorType"/>
            </syntax>
        </parameter>

        <parameter name="Description" access="readOnly">
            <description>
               Human-readable description of the {{object}}. e.g. a more detailed
               description of {{param|Type}}.
               A Blob value is to be considered as a "string of bytes". The {{param|Type}} of this "string of bytes" is intended to be explained by {{param|Type}}.
               Examples do exist for Sensors used in traffic control, such as an image, numberplate, and face recognition, RFID readers and other areas where Sensors produce bytes.
            </description>
            <syntax>
                <string>
                   <size maxLength="256"/>
                </string>
            </syntax>
        </parameter>

        <parameter name="LastChange" access="readOnly">
            <description>
               The date and time in UTC when {{param|Value}} has been changed to the
               current value.
            </description>
            <syntax>
               <dateTime/>
            </syntax>
        </parameter>

      <parameter name="LastContactTime" access="readOnly">
        <description>
          The date and time in UTC when the {{object}} has received data.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

        <parameter name="Value" access="readOnly">
            <description>
               The Value is typically a string of bytes and its meaning is described by {{param|Type}}. A string of bytes will use the base64 type.
               The current value reading of this {{object}}.
            </description>
            <syntax>
              <base64/>
            </syntax>
        </parameter>
    </object>

    <object name="IoTCapability.{i}.Binding.{i}." access="readWrite"
        minEntries="0" maxEntries="unbounded"
        numEntriesParameter="BindingNumberOfEntries" version="2.20">

      <description>
        This {{object}} only exists in a Sensor IoTCapability.
        Adding a {{object}} instance to a Control IoTCapability MUST fail.
        Each entry in this table describes the link between this Sensor IoTCapability and a specific Control IoTCapability.

        When a Sensor IoT Capability is bound to a Control IoT Capability, then for each Value parameter updates of the Sensor IoTCapability, the Agent evaluates the needs to update the Value parameter of the bound Control IoTCapability.
      </description>
      <uniqueKey functional="false">
        <parameter ref="Alias"/>
      </uniqueKey>

      <component ref="Alias"/>

      <parameter name="FriendlyName" access="readWrite">
        <description>
          Friendly name for this binding.
        </description>
        <syntax>
          <string>
            <size maxLength="64"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Description" access="readWrite">
        <description>
          Description of the binding's intent and function.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="Enable" access="readWrite">
        <description>
          When {{true}}, the binding is active; otherwise, no data flow occurs and the Value parameter of {{param|ControlIoTCapability}} is not updated. 
        </description>
        <syntax>
          <boolean/>
        </syntax>
      </parameter>

      <parameter name="ControlIoTCapability" access="readWrite">
        <description>
          A valid {{param}} is a reference to a Control IoTCapability in the {{object|##.IoTCapability}} table.
          Setting {{param}} to a Sensor IoTCapability MUST fail.
          It references the Control IoTCapability to use as the binding destination on which the Agent updates the Value parameter.
          As a mountable object {{object|##.IoTCapability}} may also be mounted on one of the following mountpoints:
          * {{object|##.Node.{i}.}},
          * {{object|##.ProxiedDevice.{i}.}},
          * {{object|##.ProxiedDevice.{i}.Node.{i}.}}
        </description>
        <syntax>
          <string>
            <pathRef refType="strong" targetParent="##.IoTCapability." targetType="row"/>
          </string>
        </syntax>
      </parameter>

    </object>

    <object name="IoTCapability.{i}.PulseSensor." access="readOnly"
      minEntries="0" maxEntries="1" discriminatorParameter="Class"
      version="2.20">
      <description>
        A {{object}} is used to reflect the functionality of a sensor that changed state from low to high or high to low.
        A {{object}} provides a trigger on the rising edge of this state change, which is identified by {{param|Transition}}.
        Some {{object}} instances have the possibility to provide a pulse duration {{param|Duration}} together with the latest state change.       
      </description>

      <parameter name="Type" access="readOnly">
        <description>
          {{datatype|expand}}
        </description>
        <syntax>
          <dataType ref="IoTPulseType"/>
        </syntax>
      </parameter>

      <parameter name="Description" access="readOnly">
        <description>
          Human-readable description of the {{object}}. For example, a more detailed
          description of {{param|Type}}.
        </description>
        <syntax>
          <string>
            <size maxLength="256"/>
          </string>
        </syntax>
      </parameter>

      <parameter name="LastChange" access="readOnly">
        <description>
          The date and time in UTC when {{param|Duration}} or {{param|Transition}}has been changed to the
          current value.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>

      <parameter name="LastContactTime" access="readOnly">
        <description>
          The date and time in UTC when the {{object}} has received data.
        </description>
        <syntax>
          <dateTime/>
        </syntax>
      </parameter>
  
      <parameter name="Duration" access="readOnly">
        <description>
          Some {{object}} instances can provide a duration together with the latest state change.
          The duration is an indication of the time, measured in {{units}}, between the start of the state change and the end of the state change: i.e., returning to its orignal state. 
          The original state can be a low state or high state. 
        </description>
        <syntax>
            <unsignedInt>
               <units value="milliseconds"/>
            </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="Unit" access="readOnly">
        <description>
          Unit in which {{param|Duration}} is expressed in {{units}}.
        </description>
        <syntax>
            <unsignedInt>
               <units value="milliseconds"/>
            </unsignedInt>
        </syntax>
      </parameter>

      <parameter name="Transition" access="readOnly">
        <description>
          Indicates the moment a pulse is generated. This can be a
          {{enum|RisingEdge}} transition: in case the sensor changes from low to high state.
          {{enum|FallingEdge}} transition: in case the sensor changes from high to low state.
         </description>
        <syntax>
          <string>
            <enumeration value="RisingEdge">
              <description>
                The sensor changes from low to high state.
              </description>
            </enumeration>
            <enumeration value="FallingEdge">
              <description>
                The sensor changes from high to low state.
              </description>
            </enumeration>
          </string>
        </syntax>
      </parameter>
  </object>


    <!-- Profiles -->

    <profile name="BinaryControl:1" version="2.13">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.BinaryControl." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Value" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="LevelControl:1" version="2.13">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.LevelControl." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Value" requirement="readWrite"/>
        <parameter ref="Unit" requirement="readOnly"/>
        <parameter ref="MinValue" requirement="readOnly"/>
        <parameter ref="MaxValue" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="LevelControlIntensity:1" extends="LevelControl:1"
        version="2.13">
      <object ref="IoTCapability.{i}.LevelControl." requirement="present">
        <command ref="StepUp()"/>
        <command ref="StepDown()"/>
        <parameter ref="StepValue" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="EnumControl:1" version="2.13">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.EnumControl." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Value" requirement="readWrite"/>
        <parameter ref="ValidValues" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="BinarySensor:1" version="2.13">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.BinarySensor." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Value" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="LevelSensor:1" version="2.13">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.LevelSensor." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Value" requirement="readOnly"/>
        <parameter ref="Unit" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="LevelSensorLowThreshold:1" base="LevelSensor:1"
        dmr:previousProfile="LevelSensor:1" version="2.13">
      <object ref="IoTCapability.{i}.LevelSensor." requirement="present">
        <parameter ref="LowLevel" requirement="readOnly"/>
        <parameter ref="LowLevelThreshold" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="LevelSensorHighThreshold:1" base="LevelSensor:1"
        dmr:previousProfile="LevelSensor:1" version="2.13">
      <object ref="IoTCapability.{i}.LevelSensor." requirement="present">
        <parameter ref="HighLevel" requirement="readOnly"/>
        <parameter ref="HighLevelThreshold" requirement="readWrite"/>
      </object>
    </profile>

    <profile name="MultiLevelSensor:1" version="2.13">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.MultiLevelSensor." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Values" requirement="readOnly"/>
        <parameter ref="ValueNames" requirement="readOnly"/>
        <parameter ref="Unit" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="EnumSensor:1" version="2.13">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.EnumSensor." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Value" requirement="readOnly"/>
        <parameter ref="ValidValues" requirement="readOnly"/>
      </object>
    </profile>

    <profile name="BlobSensor:1" version="2.19">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.BlobSensor." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Value" requirement="readOnly"/>
      </object>
    </profile>

   <profile name="PulseSensor:1" version="2.20">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>
      <object ref="IoTCapability.{i}.PulseSensor." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Duration" requirement="readOnly"/>
        <parameter ref="Transition" requirement="readOnly"/>
      </object>
    </profile>


    <profile name="PulseControl:1" version="2.20">
      <parameter ref="IoTCapabilityNumberOfEntries" requirement="readOnly"/>
      <object ref="IoTCapability.{i}." requirement="present">
        <parameter ref="Class" requirement="readOnly"/>
      </object>  
      <object ref="IoTCapability.{i}.PulseControl." requirement="present">
        <parameter ref="Type" requirement="readOnly"/>
        <parameter ref="Duration" requirement="readWrite"/>
        <parameter ref="Transition" requirement="readWrite"/>
        <command ref="TransitionHigh()">
          <input> 
            <parameter ref="Duration"/>
          </input>
        </command> 
        <command ref="TransitionLow()">
          <input>
            <parameter ref="Duration"/>
          </input>
        </command> 
      </object>
    </profile>
  </component>

  <model name="IoT:2.20">
    <component ref="Root"/>
    <component ref="IoT_ObjectComponent" path="Device."/>
    <component ref="IoT_NodeComponent" path="Device."/>
  </model>
</dm:document>
