<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.25 (Ruby 3.0.3) -->
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-10" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" obsoletes="" updates="" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.11.1 -->
  <front>
    <title abbrev="OneDM SDF">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-10"/>
    <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
      <organization>PassiveLogic</organization>
      <address>
        <postal>
          <street>524 H Street</street>
          <city>Antioch, CA</city>
          <code>94509</code>
          <country>USA</country>
        </postal>
        <phone>+1-707-502-5136</phone>
        <email>michaeljohnkoster@gmail.com</email>
      </address>
    </author>
    <author initials="C." surname="Bormann" fullname="Carsten Bormann" role="editor">
      <organization ascii="Universitaet Bremen TZI">Universität Bremen TZI</organization>
      <address>
        <postal>
          <street>Postfach 330440</street>
          <city>Bremen</city>
          <code>D-28359</code>
          <country>Germany</country>
        </postal>
        <phone>+49-421-218-63921</phone>
        <email>cabo@tzi.org</email>
      </address>
    </author>
    <date year="2022" month="January" day="16"/>
    <area>Applications</area>
    <workgroup>ASDF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things.  It was created as a common language for use
in the development of the One Data Model liaison organization (OneDM)
definitions.  Tools convert this format to database formats and other
serializations as needed.</t>
      <t>An SDF specification describes definitions of SDF Objects and their
associated interactions (Events, Actions, Properties), as well as the
Data types for the information exchanged in those interactions.</t>
      <t><cref anchor="status">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-10) collects a few smaller changes as input
to the 2022-01-17 ASDF WG interim.</cref></t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-asdf-sdf/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        A Semantic Definition Format for Data and Interactions of Things (ASDF) Working Group mailing list (<eref target="mailto:asdf@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/asdf/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/ietf-wg-asdf/SDF"/>.</t>
    </note>
    <note>
      <name>Contributing</name>
      <t>Recent versions of this document are available at its GitHub
repository <eref target="https://github.com/ietf-wg-asdf/SDF">https://github.com/ietf-wg-asdf/SDF</eref> -- this also provides
an issue tracker as well as a way to supply "pull requests".</t>
      <t>General discussion of this SDF Internet-Draft happens on the mailing
list of the IETF ASDF Working Group, asdf@ietf.org (subscribe at
<eref target="https://www.ietf.org/mailman/listinfo/asdf">https://www.ietf.org/mailman/listinfo/asdf</eref>).</t>
      <t>The IETF Note Well applies (<eref target="https://www.ietf.org/about/note-well/">https://www.ietf.org/about/note-well/</eref>).</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <!-- Just copying the abstract, for now... -->

<t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things.  It was created as a common language for use
in the development of the One Data Model liaison organization (OneDM)
definitions.  Tools convert this format to database formats and other
serializations as needed.</t>
      <t>An SDF specification describes definitions of SDF Objects and their
associated interactions (Events, Actions, Properties), as well as the
Data types for the information exchanged in those interactions.</t>
      <t><cref anchor="status_1">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-10) collects a few smaller changes as input
to the 2022-01-17 ASDF WG interim.</cref></t>
      <section anchor="terminology-and-conventions" numbered="true" toc="default">
        <name>Terminology and Conventions</name>
        <!-- Note: Should we use RFC 2119? -->

<dl>
          <dt>
Thing:  </dt>
          <dd>
            <t>A physical item that is also made available in the Internet of
Things.  The term is used here for Things that are notable for their
interaction with the physical world beyond interaction with humans;
a temperature sensor or a light might be a Thing, but a router that
employs both temperature sensors and indicator lights might exhibit
less Thingness, as the effects of its functioning are mostly on the
digital side.</t>
          </dd>
          <dt>
Affordance:  </dt>
          <dd>
            <t>An element of an interface offered for interaction, defining its
possible uses or making clear how it can or should be used.  The
term is used here for the digital interfaces of a Thing only; it
might also have physical affordances such as buttons, dials, and
displays.</t>
          </dd>
          <dt>
Quality:  </dt>
          <dd>
            <t>A metadata item in a definition or declaration which says something
about that definition or declaration.  A quality is represented in
SDF as an entry in a JSON map (object) that serves as a definition
or declaration.</t>
          </dd>
          <dt>
Entry:  </dt>
          <dd>
            <t>A key-value pair in a map. (In JSON maps, sometimes also called "member".)</t>
          </dd>
          <dt>
Block:  </dt>
          <dd>
            <t>One or more entries in a JSON map that is part of an SDF
specification; these entries together serve a specific function.</t>
          </dd>
          <dt>
Group:  </dt>
          <dd>
            <t>An entry in the main SDF map and in certain nested definitions that
has a Class Name Keyword as its key and a map of definition
entries (Definition Group) as a value.</t>
          </dd>
          <dt>
Class Name Keyword:  </dt>
          <dd>
            <t>One of sdfThing, sdfProduct, sdfObject, sdfProperty, sdfAction,
sdfEvent, or sdfData; the Classes for these type keywords are
capitalized and prefixed with <tt>sdf</tt>.</t>
          </dd>
          <dt>
Class:  </dt>
          <dd>
            <t>Abstract term for the information that is contained in groups
identified by a Class Name Keyword.</t>
          </dd>
          <dt>
Property:  </dt>
          <dd>
            <t>An affordance that can potentially be used to read, write, and/or
observe state on an Object.  (Note that Entries are often called
properties in other environments; in this document, the term
Property is specifically reserved for affordances, even if the map
key "properties" might be imported from a data definition language
with the other semantics.)</t>
          </dd>
          <dt>
Action:  </dt>
          <dd>
            <t>An affordance that can potentially be used to perform a named operation on an Object.</t>
          </dd>
          <dt>
Event:  </dt>
          <dd>
            <t>An affordance that can potentially be used to obtain information about what happened to an Object.</t>
          </dd>
          <dt>
Object:  </dt>
          <dd>
            <t>A grouping of Property, Action, and Event definitions; the main
"atom" of reusable semantics for model construction.  (Note that
JSON maps are often called JSON objects due to JSON's JavaScript
heritage; in this document, the
term Object is specifically reserved for the above grouping, even if
the type name "object" might be imported from a data definition
language with the other semantics.)</t>
          </dd>
          <dt>
Element:  </dt>
          <dd>
            <t>A part or an aspect of something abstract; used here in its usual English definition.
(Occasionally, also used specifically for the elements of JSON arrays.)</t>
          </dd>
          <dt>
Definition:  </dt>
          <dd>
            <t>An entry in a Definition Group; the entry creates a new semantic
term for use in SDF models and associates it with a set of
qualities.</t>
          </dd>
          <dt>
Declaration:  </dt>
          <dd>
            <t>A reference to and a use of a definition within an enclosing
definition, intended to create component instances within that
enclosing definition.  Every declaration can also be used as a
definition for reference in a different place.</t>
          </dd>
          <dt>
Protocol Binding:  </dt>
          <dd>
            <t>A companion document to an SDF specification that defines how to map
the abstract concepts in the specification into the protocols in use
in a specific ecosystem.  Might supply URL components, numeric IDs,
and similar details.</t>
          </dd>
        </dl>
        <!-- XXX -->

<t>The term "byte" is used in its now-customary sense as a synonym for
"octet".</t>
        <t>Conventions:</t>
        <ul spacing="normal">
          <li>The singular form is chosen as the preferred one for the keywords defined here.</li>
        </ul>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
    </section>
    <section anchor="overview" numbered="true" toc="default">
      <name>Overview</name>
      <section anchor="example-definition" numbered="true" toc="default">
        <name>Example Definition</name>
        <t>We start with an example for the SDF definition of a simple Object called "Switch" (<xref target="example1" format="default"/>).</t>
        <figure anchor="example1">
          <name>A simple example of an SDF definition file</name>
          <sourcecode type="json"><![CDATA[
{
    "info": {
        "title": "Example file for OneDM Semantic Definition Format",
        "version": "2019-04-24",
        "copyright": "Copyright 2019 Example Corp. All rights reserved.",
        "license": "https://example.com/license"
    },
    "namespace": {
        "cap": "https://example.com/capability/cap"
    },
    "defaultNamespace": "cap",
    "sdfObject": {
        "Switch": {
            "sdfProperty": {
                "value": {
                    "description": "The state of the switch; false for off and true for on.",
                    "type": "boolean"
                }
            },
            "sdfAction": {
                "on": {
                    "description": "Turn the switch on; equivalent to setting value to true."
                },
                "off": {
                    "description": "Turn the switch off; equivalent to setting value to false."
                },
                "toggle": {
                    "description": "Toggle the switch; equivalent to setting value to its complement."
                }
            }
        }
    }
}
]]></sourcecode>
        </figure>
        <t>This is a model of a switch.
The state <tt>value</tt> declared in the <tt>sdfProperty</tt> group, represented by a Boolean, will be true for "on" and will be false for "off".
The actions <tt>on</tt> or <tt>off</tt> declared in the <tt>sdfAction</tt> group are redundant with setting the <tt>value</tt> and are in the example to illustrate that there are often different ways of achieving the same effect.
The action <tt>toggle</tt> will invert the value of the sdfProperty value, so that 2-way switches can be created; having such action will avoid the need for first retrieving the current value and then applying/setting the inverted value.</t>
        <t>The <tt>sdfObject</tt> group lists the affordances of instances of this object.
The <tt>sdfProperty</tt> group lists the property affordances described by the model; these represent various perspectives on the state of the object.
Properties can have additional qualities to describe the state more precisely.
Properties can be annotated to be read, write or read/write; how this is actually done by the underlying transfer protocols is not described in the SDF model but left to companion protocol bindings.
Properties are often used with RESTful paradigms <xref target="I-D.irtf-t2trg-rest-iot" format="default"/>, describing state.
The <tt>sdfAction</tt> group is the mechanism to describe other interactions in terms of their names, input, and output data (no data are used in the example), as in a POST method in REST or in a remote procedure call.
The example <tt>toggle</tt> is an Action that
changes the state based on the current state of the Property named <tt>value</tt>.
(The third type of affordance is Events, which are not described in this example.)</t>
        <t>In the JSON representation, note how (with the exception of the <tt>info</tt>
group) maps that have keys taken from the SDF vocabulary (<tt>info</tt>,
<tt>namespace</tt>, <tt>sdfObject</tt>) alternate in nesting with maps that have keys
that are freely defined by the model writer (<tt>Switch</tt>, <tt>value</tt>, <tt>on</tt>,
etc.); the latter usually use the <tt>named&lt;&gt;</tt> production in the <xref target="syntax" format="default">formal
syntax of SDF</xref>, while the former SDF-defined vocabulary items
are often, but not always, called <em>qualities</em>.</t>
      </section>
      <section anchor="elements-of-an-sdf-model" numbered="true" toc="default">
        <name>Elements of an SDF model</name>
        <t>The SDF language uses seven predefined Class Name Keywords for modeling connected
Things, six of which are illustrated in <xref target="fig-class-2" format="default"/> (the seventh
class <tt>sdfProduct</tt> is similar enough to <tt>sdfThing</tt> that it would look
the same in the figure).</t>
        <figure anchor="fig-class-2">
          <name>Main classes used in SDF models</name>
          <artset>
            <artwork type="svg" name="" align="left" alt=""><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="444px" preserveAspectRatio="none" version="1.1" viewBox="0 0 431 444" width="431px">
                <defs/>
                <g>
                  <!--MD5=[f586c7dc61127226118a576b1af9a47e]
class sdfThing-->
    <rect fill="white" height="48" id="sdfThing" width="82" x="172.5" y="7" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="187.5" cy="23" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M189.9731,29.1431 Q189.3921,29.4419 188.7529,29.5913 Q188.1138,29.7407 187.4082,29.7407 Q184.9014,29.7407 183.5815,28.0889 Q182.2617,26.437 182.2617,23.3159 Q182.2617,20.1865 183.5815,18.5347 Q184.9014,16.8828 187.4082,16.8828 Q188.1138,16.8828 188.7612,17.0322 Q189.4087,17.1816 189.9731,17.4805 L189.9731,20.2031 Q189.3423,19.6221 188.7488,19.3523 Q188.1553,19.0825 187.5244,19.0825 Q186.1797,19.0825 185.4949,20.1492 Q184.8101,21.2158 184.8101,23.3159 Q184.8101,25.4077 185.4949,26.4744 Q186.1797,27.541 187.5244,27.541 Q188.1553,27.541 188.7488,27.2712 Q189.3423,27.0015 189.9731,26.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="201.5" y="27.5352">sdfThing</text>
                  <line x1="173.5" x2="253.5" y1="39" y2="39" stroke="black" stroke-width="1.5"/>
                  <line x1="173.5" x2="253.5" y1="47" y2="47" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[c2cb69c003582447ed3e9466f0338261]
class sdfObject-->
    <rect fill="white" height="48" id="sdfObject" width="88" x="169.5" y="132" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="184.5" cy="148" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M186.9731,154.1431 Q186.3921,154.4419 185.7529,154.5913 Q185.1138,154.7407 184.4082,154.7407 Q181.9014,154.7407 180.5815,153.0889 Q179.2617,151.437 179.2617,148.3159 Q179.2617,145.1865 180.5815,143.5347 Q181.9014,141.8828 184.4082,141.8828 Q185.1138,141.8828 185.7612,142.0322 Q186.4087,142.1816 186.9731,142.4805 L186.9731,145.2031 Q186.3423,144.6221 185.7488,144.3523 Q185.1553,144.0825 184.5244,144.0825 Q183.1797,144.0825 182.4949,145.1492 Q181.8101,146.2158 181.8101,148.3159 Q181.8101,150.4077 182.4949,151.4744 Q183.1797,152.541 184.5244,152.541 Q185.1553,152.541 185.7488,152.2712 Q186.3423,152.0015 186.9731,151.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="198.5" y="152.5352">sdfObject</text>
                  <line x1="170.5" x2="256.5" y1="164" y2="164" stroke="black" stroke-width="1.5"/>
                  <line x1="170.5" x2="256.5" y1="172" y2="172" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[79be1817db664391ee5ba2fd11c31888]
class sdfProperty-->
    <rect fill="white" height="48" id="sdfProperty" width="99" x="7" y="257" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="22" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M24.4731,279.1431 Q23.8921,279.4419 23.2529,279.5913 Q22.6138,279.7407 21.9082,279.7407 Q19.4014,279.7407 18.0815,278.0889 Q16.7617,276.437 16.7617,273.3159 Q16.7617,270.1865 18.0815,268.5347 Q19.4014,266.8828 21.9082,266.8828 Q22.6138,266.8828 23.2612,267.0322 Q23.9087,267.1816 24.4731,267.4805 L24.4731,270.2031 Q23.8423,269.6221 23.2488,269.3523 Q22.6553,269.0825 22.0244,269.0825 Q20.6797,269.0825 19.9949,270.1492 Q19.3101,271.2158 19.3101,273.3159 Q19.3101,275.4077 19.9949,276.4744 Q20.6797,277.541 22.0244,277.541 Q22.6553,277.541 23.2488,277.2712 Q23.8423,277.0015 24.4731,276.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="36" y="277.5352">sdfProperty</text>
                  <line x1="8" x2="105" y1="289" y2="289" stroke="black" stroke-width="1.5"/>
                  <line x1="8" x2="105" y1="297" y2="297" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[bdacf205fe3695f723a4cfa5db06fd81]
class sdfAction-->
    <rect fill="white" height="48" id="sdfAction" width="85" x="171" y="257" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="186" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M188.4731,279.1431 Q187.8921,279.4419 187.2529,279.5913 Q186.6138,279.7407 185.9082,279.7407 Q183.4014,279.7407 182.0815,278.0889 Q180.7617,276.437 180.7617,273.3159 Q180.7617,270.1865 182.0815,268.5347 Q183.4014,266.8828 185.9082,266.8828 Q186.6138,266.8828 187.2612,267.0322 Q187.9087,267.1816 188.4731,267.4805 L188.4731,270.2031 Q187.8423,269.6221 187.2488,269.3523 Q186.6553,269.0825 186.0244,269.0825 Q184.6797,269.0825 183.9949,270.1492 Q183.3101,271.2158 183.3101,273.3159 Q183.3101,275.4077 183.9949,276.4744 Q184.6797,277.541 186.0244,277.541 Q186.6553,277.541 187.2488,277.2712 Q187.8423,277.0015 188.4731,276.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="200" y="277.5352">sdfAction</text>
                  <line x1="172" x2="255" y1="289" y2="289" stroke="black" stroke-width="1.5"/>
                  <line x1="172" x2="255" y1="297" y2="297" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[ccecbd8aeb25c61fe37a32079d0173e2]
class sdfEvent-->
    <rect fill="white" height="48" id="sdfEvent" width="81" x="315" y="257" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="330" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M332.4731,279.1431 Q331.8921,279.4419 331.2529,279.5913 Q330.6138,279.7407 329.9082,279.7407 Q327.4014,279.7407 326.0815,278.0889 Q324.7617,276.437 324.7617,273.3159 Q324.7617,270.1865 326.0815,268.5347 Q327.4014,266.8828 329.9082,266.8828 Q330.6138,266.8828 331.2612,267.0322 Q331.9087,267.1816 332.4731,267.4805 L332.4731,270.2031 Q331.8423,269.6221 331.2488,269.3523 Q330.6553,269.0825 330.0244,269.0825 Q328.6797,269.0825 327.9949,270.1492 Q327.3101,271.2158 327.3101,273.3159 Q327.3101,275.4077 327.9949,276.4744 Q328.6797,277.541 330.0244,277.541 Q330.6553,277.541 331.2488,277.2712 Q331.8423,277.0015 332.4731,276.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="344" y="277.5352">sdfEvent</text>
                  <line x1="316" x2="395" y1="289" y2="289" stroke="black" stroke-width="1.5"/>
                  <line x1="316" x2="395" y1="297" y2="297" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[154484d28240d22ab997079d2c9ce9cd]
class sdfData-->
    <rect fill="white" height="48" id="sdfData" width="77" x="142" y="382" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="157" cy="398" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M159.4731,404.1431 Q158.8921,404.4419 158.2529,404.5913 Q157.6138,404.7407 156.9082,404.7407 Q154.4014,404.7407 153.0815,403.0889 Q151.7617,401.437 151.7617,398.3159 Q151.7617,395.1865 153.0815,393.5347 Q154.4014,391.8828 156.9082,391.8828 Q157.6138,391.8828 158.2612,392.0322 Q158.9087,392.1816 159.4731,392.4805 L159.4731,395.2031 Q158.8423,394.6221 158.2488,394.3523 Q157.6553,394.0825 157.0244,394.0825 Q155.6797,394.0825 154.9949,395.1492 Q154.3101,396.2158 154.3101,398.3159 Q154.3101,400.4077 154.9949,401.4744 Q155.6797,402.541 157.0244,402.541 Q157.6553,402.541 158.2488,402.2712 Q158.8423,402.0015 159.4731,401.4204 Z " fill="black"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="171" y="402.5352">sdfData</text>
                  <line x1="143" x2="218" y1="414" y2="414" stroke="black" stroke-width="1.5"/>
                  <line x1="143" x2="218" y1="422" y2="422" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[474ac19abf738d5435f62202b2040a8c]
link sdfThing to sdfObject-->
    <path d="M213.5,55.14 C213.5,75.49 213.5,105.19 213.5,126.91 " fill="none" id="sdfThing-to-sdfObject" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="213.5,131.97,217.5,122.97,213.5,126.97,209.5,122.97,213.5,131.97" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="214.5" y="98.5684">hasObject</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="193.0813" y="121.1064">0+</text>
                  <!--MD5=[84a99f3e6ba5135b350f4e647ff40b17]
link sdfThing to sdfThing-->
    <path d="M254.55,19.58 C273.25,18.41 289.5,22.22 289.5,31 C289.5,38.96 276.15,42.83 259.73,42.62 " fill="none" id="sdfThing-to-sdfThing" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="254.55,42.42,263.3953,46.7513,259.5466,42.6056,263.6923,38.7568,254.55,42.42" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="295.5" y="36.0684">hasThing</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="262.5267" y="40.6379">0+</text>
                  <!--MD5=[c9f4ee01ef3119b1a79851932bb5a9a6]
link sdfObject to sdfProperty-->
    <path d="M173.07,180.22 C158.87,188.97 143.08,199.38 129.5,210 C112.81,223.05 95.64,239.35 82.14,252.93 " fill="none" id="sdfObject-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="78.44,256.69,87.6036,253.0805,81.9469,253.1261,81.9013,247.4694,78.44,256.69" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="130.5" y="223.5684">hasProperty</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="63.7559" y="246.1468">0+</text>
                  <!--MD5=[ec9a56bd8655f4d1893aa031ec22e05c]
link sdfObject to sdfAction-->
    <path d="M213.5,180.14 C213.5,200.49 213.5,230.19 213.5,251.91 " fill="none" id="sdfObject-to-sdfAction" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="213.5,256.97,217.5,247.97,213.5,251.97,209.5,247.97,213.5,256.97" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="214.5" y="223.5684">hasAction</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="193.0813" y="246.1064">0+</text>
                  <!--MD5=[e82b08c6210a768f8efa9371b7de17ad]
link sdfObject to sdfEvent-->
    <path d="M247.28,180.26 C259.62,189.17 273.49,199.68 285.5,210 C301.11,223.41 317.43,239.59 330.38,253.02 " fill="none" id="sdfObject-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="333.94,256.73,330.5912,247.4679,330.4767,253.1236,324.821,253.0091,333.94,256.73" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="304.5" y="223.5684">hasEvent</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="308.109" y="246.1971">0+</text>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <path d="M170.82,293.49 C149.97,301.5 126.77,314.51 114.5,335 C103.81,352.85 119.15,369.91 137.72,382.71 " fill="none" id="sdfAction-to-sdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="141.98,385.54,136.7103,377.2195,137.8197,382.7665,132.2727,383.8759,141.98,385.54" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="115.5" y="348.5684">hasInputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="116.1095" y="378.5032">1+</text>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <path d="M212.27,305.04 C211.1,318.86 208.85,336.68 204.5,352 C202.12,360.37 198.63,369.11 195.04,377.01 " fill="none" id="sdfAction-to-sdfData-1" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="192.8,381.82,200.2318,375.3572,194.9152,377.2894,192.9829,371.9728,192.8,381.82" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="208.5" y="348.5684">hasOutputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="175.6456" y="371.3101">0+</text>
                  <!--MD5=[1d999dc69acbeb1774ac85a19f512fd6]
link sdfEvent to sdfData-->
    <path d="M345.94,305.15 C338.7,320.24 327.43,339.4 312.5,352 C287.09,373.44 251.9,386.99 224.25,395.01 " fill="none" id="sdfEvent-to-sdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="219.18,396.45,228.9277,397.858,223.9924,395.0934,226.7571,390.1581,219.18,396.45" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="328.5" y="348.5684">hasOutputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="227.077" y="391.2202">1+</text>
                  <!--MD5=[0c4745fb3134cadd1f7ab6e63b3ea9cc]
link sdfProperty to sdfData-->
    <path d="M32.44,305.12 C20.65,319.29 11.01,337.45 21.5,352 C47.45,388 98.9,399.92 136.27,403.67 " fill="none" id="sdfProperty-to-sdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="141.68,404.16,133.0828,399.3549,136.7009,403.7035,132.3524,407.3215,141.68,404.16" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="22.5" y="348.5684">isInstanceOf</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="126.0527" y="400.0923">1</text>
                  <!--MD5=[13611df9e1c30c0c1987cc20e5910dc8]
@startuml

sdfThing - -> "0+" sdfObject : hasObject
sdfThing - -> "0+" sdfThing : hasThing

sdfObject - -> "0+" sdfProperty : hasProperty
sdfObject - -> "0+" sdfAction : hasAction
sdfObject - -> "0+" sdfEvent : hasEvent

sdfAction - -> "1+" sdfData : hasInputData
sdfAction - -> "0+" sdfData : hasOutputData

sdfEvent - -> "1+" sdfData : hasOutputData

sdfProperty - -> "1" sdfData : isInstanceOf

class sdfThing {
}

class sdfObject {
}

class sdfProperty {
}

class sdfAction {
}

class sdfEvent {
}

class sdfData {
}

@enduml

PlantUML version 1.2021.16(Wed Dec 08 18:25:22 CET 2021)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: US-ASCII
Language: en
Country: DE
-->
  </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" name="" align="left" alt=""><![CDATA[                ,--------.             
                |sdfThing|             
                |--------|             
                `--------'             
                     |                 
                     |                 
               ,---------.             
               |sdfObject|             
               |---------|             
               `---------'             
                     |                 
,-----------.  ,---------.   ,--------.
|sdfProperty|  |sdfAction|   |sdfEvent|
|-----------|  |---------|   |--------|
`-----------'  `---------'   `--------'
                    |                  
                                       
                ,-------.              
                |sdfData|              
                |-------|              
                `-------'              
]]></artwork>
          </artset>
        </figure>
        <t>The seven main Class Name Keywords are discussed below.</t>
        <section anchor="sdfobject" numbered="true" toc="default">
          <name>sdfObject</name>
          <t>Objects, the items listed in an <tt>sdfObject</tt> group, are the main "atom" of reusable semantics for model construction.
It aligns in scope with common definition items from many IoT modeling
systems, for example ZigBee Clusters <xref target="ZCL" format="default"/>, OMA SpecWorks LwM2M
Objects <xref target="OMA" format="default"/>, and
OCF Resource Types <xref target="OCF" format="default"/>.</t>
          <t>An <tt>sdfObject</tt> contains a set of <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and
<tt>sdfEvent</tt> definitions that describe the interaction affordances
associated with some scope of functionality.</t>
          <t>For the granularity of definition, <tt>sdfObject</tt> definitions are meant
to be kept narrow enough in scope to enable broad reuse and
interoperability.
For example, defining a light bulb using separate <tt>sdfObject</tt>
definitions for on/off control, dimming, and color control affordances
will enable interoperable functionality to be configured for diverse
product types.
An <tt>sdfObject</tt> definition for a common on/off control may be used to
control may different kinds of Things that require on/off control.</t>
          <t>Optional qualities "minItems" and "maxItems" can be used to define
sdfObjects as arrays.</t>
        </section>
        <section anchor="sdfproperty" numbered="true" toc="default">
          <name>sdfProperty</name>
          <t><tt>sdfProperty</tt> is used to model elements of state within <tt>sdfObject</tt> instances.</t>
          <t>An instance of <tt>sdfProperty</tt> may be associated with some protocol
affordance to enable the application to obtain the state variable and,
optionally, modify the state variable.
Additionally, some protocols provide for in-time reporting of state
changes.
(These three aspects are described by the qualities <tt>readable</tt>,
<tt>writable</tt>, and <tt>observable</tt> defined for an <tt>sdfProperty</tt>.)</t>
          <t>Definitions in <tt>sdfProperty</tt> groups look like definitions in <tt>sdfData</tt> groups, however, they actually also declare a Property with the given qualities to be potentially present in the containing Object.
(Qualities beyond those of <tt>sdfData</tt> definitions could be defined for <tt>sdfProperty</tt> declarations
but currently aren't; this means that even Property qualities
such as <tt>readable</tt> and <tt>writable</tt> can be associated with definitions in <tt>sdfData</tt> groups, as well.)</t>
          <t>For definitions in <tt>sdfProperty</tt> and <tt>sdfData</tt>, SDF provides qualities that can
constrain the structure and values of data allowed in an instance of
these data, as well as qualities that associate semantics to these
data, for engineering units and unit scaling information.</t>
          <t>For the data definition within <tt>sdfProperty</tt> or <tt>sdfData</tt>, SDF borrows
some vocabulary proposed for the drafts 4 and 7 of the
json-schema.org "JSON Schema"
format (collectively called JSO here), enhanced by qualities that are specific to SDF.
Details about the former are in <xref target="jso-inspired" format="default"/>.
For the current version of SDF, data are constrained to be of
simple types (number, string, Boolean),
JSON maps composed of named data ("objects"), and arrays of these types.
Syntax extension points are provided that can be used to provide
richer types in future versions of this specification (possibly more
of which can be borrowed from json-schema.org).</t>
          <t>Note that <tt>sdfProperty</tt> definitions (and <tt>sdfData</tt> definitions in
general) are not intended to constrain the formats of data used for
communication over network interfaces.
Where needed, data definitions for payloads of protocol messages are
expected to be part of the protocol binding.</t>
        </section>
        <section anchor="sdfaction-overview" numbered="true" toc="default">
          <name>sdfAction</name>
          <t>The <tt>sdfAction</tt> group contains declarations of Actions, model affordances that, when triggered,
have more effect than just reading, updating, or observing Thing
state, often resulting in some outward physical effect (which, itself,
cannot be modeled in SDF).  From a programmer's perspective, they
might be considered to be roughly analogous to method calls.</t>
          <t>Actions may have data parameters; these are modeled as a single item of input
data and output data, each.  (Where multiple parameters need to be
modeled, an "object" type can be used to combine these parameters into one.)
<!-- (using `sdfData` definitions, i.e., the same entries as for `sdfProperty` declarations). -->
Actions may be long-running, that is to say that the effects may not
take place immediately as would be expected for an update to an
<tt>sdfProperty</tt>; the effects may play out over time and emit action
results.
Actions may also not always complete and may result in application
errors, such as an item blocking the closing of an automatic door.</t>
          <t>Actions may have (or lack) qualities of idempotency and side-effect safety.</t>
          <t>The current version of SDF only provides data constraint modeling and semantics for the input and output data of definitions in <tt>sdfAction</tt> groups.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfevent-overview" numbered="true" toc="default">
          <name>sdfEvent</name>
          <t>The <tt>sdfEvent</tt> group contains declarations of Events, which can model
affordances that inform about "happenings" associated with an instance
of an Object; these may result in a signal being stored or emitted as
a result.</t>
          <t>Note that there is a trivial overlap with sdfProperty state changes,
which may also be defined as events but are not generally required to
be defined as such.
However, Events may exhibit certain ordering, consistency, and
reliability requirements that are expected to be supported in various
implementations of <tt>sdfEvent</tt> that do distinguish sdfEvent from
sdfProperty.
For instance, while a state change may simply be superseded by another
state change, some events are "precious" and need to be preserved even
if further events follow.</t>
          <t>The current version of SDF only provides data constraint modeling and
semantics for the output data of Event affordances.
Again, data definitions for payloads of protocol messages, and
detailed protocol settings for invoking the action, are expected to be
part of the protocol binding.</t>
        </section>
        <section anchor="sdfdata" numbered="true" toc="default">
          <name>sdfData</name>
          <t>Definitions in <tt>sdfData</tt> groups are provided separately from those in
<tt>sdfProperty</tt> groups to enable common
modeling patterns, data constraints, and semantic anchor concepts to
be factored out for data items that make up <tt>sdfProperty</tt> items and
serve as input and output data for <tt>sdfAction</tt> and <tt>sdfEvent</tt> items.</t>
          <t>It is a common use case for such a data definition to be shared
between an <tt>sdfProperty</tt> item and input or output parameters of an
<tt>sdfAction</tt> or output data provided by an <tt>sdfEvent</tt>.
<tt>sdfData</tt> definitions also enable factoring out extended application
data types such as mode and machine state enumerations to be reused
across multiple definitions that have similar basic characteristics
and requirements.</t>
        </section>
        <section anchor="sdfthing" numbered="true" toc="default">
          <name>sdfThing</name>
          <t>Back at the top level, the <tt>sdfThing</tt> groups enables definition of models for
complex devices that will use one or more <tt>sdfObject</tt> definitions.</t>
          <t>A definition in an <tt>sdfThing</tt> group can refine the metadata of the definitions it
is composed from: other definitions in <tt>sdfThing</tt> groups definitions in <tt>sdfObject</tt> groups.</t>
        </section>
        <section anchor="sdfproduct" numbered="true" toc="default">
          <name>sdfProduct</name>
          <t><tt>sdfThing</tt> has a derived class <tt>sdfProduct</tt>, which can be used to
indicate a top level inventory item with a Stock-Keeping Unit (SKU)
identifier and other particular metadata.
Structurally, there is no difference between definitions in either
group; semantically, a definition in an <tt>sdfProduct</tt> group is intended
to describe a class of complete Things.</t>
        </section>
      </section>
    </section>
    <section anchor="sdf-structure" numbered="true" toc="default">
      <name>SDF structure</name>
      <t>SDF definitions are contained in SDF files.  One or more SDF files can
work together to provide the definitions and declarations that are the
payload of the SDF format.</t>
      <t>A SDF definition file contains a single JSON map (JSON object).
This object has three blocks: the information block, the namespaces block, and the definitions block.</t>
      <section anchor="information-block" numbered="true" toc="default">
        <name>Information block</name>
        <t>The information block contains generic meta data for the file itself and all included definitions.
To enable tool integration, the information block is optional in the grammar
of SDF; most processes for working with SDF files will have policies
that only SDF models with an info block can be processed.
It is therefore <bcp14>RECOMMENDED</bcp14> that SDF validator tools emit a warning
when no information block is found.</t>
        <t>The keyword (map key) that defines an information block is "info". Its
value is a JSON map in turn, with a set of entries that represent qualities that apply to the included definition.</t>
        <t>Qualities of the information block are shown in <xref target="infoblockqual" format="default"/>.</t>
        <table anchor="infoblockqual" align="center">
          <name>Qualities of the Information Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">title</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">A short summary to be displayed in search results, etc.</td>
            </tr>
            <tr>
              <td align="left">version</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">The incremental version of the definition, format TBD</td>
            </tr>
            <tr>
              <td align="left">copyright</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing a copyright notice</td>
            </tr>
            <tr>
              <td align="left">license</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Link to text or embedded text containing license terms</td>
            </tr>
          </tbody>
        </table>
        <t>While the format of the version string is marked as TBD, it is intended to be lexicographically increasing over the life of a model: a newer model always has a version string that string-compares higher than all previous versions.
This is easily achieved by following the convention to start the version with an <xref target="RFC3339" format="default"/> <tt>date-time</tt> or, if new versions are generated less frequently than once a day, just the <tt>full-date</tt> (i.e., YYYY-MM-DD); in many cases, that will be all that is needed (see <xref target="example1" format="default"/> for an example).</t>
        <t>The license string is preferably either a URI that points to a web page with an unambiguous definition of the license, or an <xref target="SPDX" format="default"/> license identifier.
(For models to be handled by the One Data Model liaison group, this will typically be "BSD-3-Clause".)</t>
      </section>
      <section anchor="namespaces-block" numbered="true" toc="default">
        <name>Namespaces block</name>
        <t>The namespaces block contains the namespace map and the defaultNamespace setting.</t>
        <t>The namespace map is a map from short names for URIs to the namespace URIs
themselves.</t>
        <t>The defaultNamespace setting selects one of the entries in the
namespace map by giving its short name.  The associated URI (value of
this entry) becomes the default namespace for the SDF definition file.</t>
        <table anchor="nssec" align="center">
          <name>Namespaces Block</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Required</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">namespace</td>
              <td align="left">map</td>
              <td align="left">no</td>
              <td align="left">Defines short names mapped to namespace URIs, to be used as identifier prefixes</td>
            </tr>
            <tr>
              <td align="left">defaultNamespace</td>
              <td align="left">string</td>
              <td align="left">no</td>
              <td align="left">Identifies one of the prefixes in the namespace map to be used as a default in resolving identifiers</td>
            </tr>
          </tbody>
        </table>
        <t>The following example declares a set of namespaces and defines <tt>cap</tt>
as the default namespace.
By convention, the values in the namespace map contain full URIs
without a fragment identifier, and the fragment identifier is then
added, if needed, where the namespace entry is used.</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "cap": "https://example.com/capability/cap",
  "zcl": "https://zcl.example.com/sdf"
},
"defaultNamespace": "cap"
]]></sourcecode>
        <t>If no defaultNamespace setting is given, the SDF definition file does not
contribute to a global namespace.  As the defaultNamespace is set by giving a
namespace short name, its presence requires a namespace map that contains a
mapping for that namespace short name.</t>
        <t>If no namespace map is given, no short names for namespace URIs are
set up, and no defaultNamespace can be given.</t>
      </section>
      <section anchor="definitions-block" numbered="true" toc="default">
        <name>Definitions block</name>
        <t>The Definitions block contains one or more groups, each identified by a Class Name Keyword (there can only be one group per keyword; the actual grouping is just a shortcut and does not carry any specific semantics).
The value of each group is a JSON map (object), the keys of which serve for naming the individual definitions in this group, and the corresponding values provide a set of qualities (name-value pairs) for the individual definition.
(In short, we speak of the map entries as "named sets of qualities".)</t>
        <t>Each group may contain zero or more definitions.
Each identifier defined creates a new type and term in the target namespace.
Declarations have a scope of the current definition block. <!-- what exactly does this mean? -->
        </t>
        <t>A definition may in turn contain other definitions. Each definition is a named set of qualities, i.e., it consists of the newly defined identifier and a set of key-value pairs that represent the defined qualities and contained definitions.</t>
        <t>An example for an Object definition is given in <xref target="exobject" format="default"/>:</t>
        <figure anchor="exobject">
          <name>Example Object definition</name>
          <sourcecode type="json"><![CDATA[
"sdfObject": {
  "foo": {
    "sdfProperty": {
      "bar": {
        "type": "boolean"
      }
    }
  }
}
]]></sourcecode>
        </figure>
        <t>This example defines an Object "foo" that is defined in the default namespace (full address: <tt>#/sdfObject/foo</tt>), containing a property that can be addressed as
<tt>#/sdfObject/foo/sdfProperty/bar</tt>, with data of type boolean.
<!-- we could define a URN-style namespace that looks exactly that way -->
        </t>
        <t>Some of the definitions are also declarations: the definition of the entry "bar" in the property "foo" means that each instance of a "foo" can have zero or one instance of a "bar".  Entries within <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and <tt>sdfEvent</tt>, within <tt>sdfObject</tt> entries, are declarations.  Similarly, entries within an <tt>sdfThing</tt> describe instances of <tt>sdfObject</tt> (or nested <tt>sdfThing</tt>) that form part of instances of the Thing.</t>
      </section>
    </section>
    <section anchor="names-and-namespaces" numbered="true" toc="default">
      <name>Names and namespaces</name>
      <t>SDF definition files may contribute to a global namespace, and may
reference elements from that global namespace.
(An SDF definition file that does not set a defaultNamespace does not
contribute to a global namespace.)</t>
      <section anchor="structure" numbered="true" toc="default">
        <name>Structure</name>
        <t>Global names look exactly like <tt>https://</tt> URIs with attached fragment identifiers.</t>
        <t>There is no intention to require that these URIs can be dereferenced.
<!-- Looking things up there is a convenience -->
(However, as future versions of SDF might find a use for dereferencing
global names, the URI should be chosen in such a way that this may
become possible in the future.)</t>
        <t>The absolute URI of a global name should be a URI as per <xref section="3" sectionFormat="of" target="RFC3986" format="default"/>, with a scheme of "https" and a path (<tt>hier-part</tt> in <xref target="RFC3986" format="default"/>).
For the present version of this specification, the query part should
not be used (it might be used in later versions).</t>
        <t>The fragment identifier is constructed as per <xref section="6" sectionFormat="of" target="RFC6901" format="default"/>.</t>
      </section>
      <section anchor="contributing-global-names" numbered="true" toc="default">
        <name>Contributing global names</name>
        <t>The fragment identifier part of a global name defined in an SDF
definition file is constructed from a JSON pointer that selects the
element defined for this name in the SDF definition file.</t>
        <t>The absolute URI part is a copy of the default namespace, i.e., the
default namespace is always the target namespace for a name for which
a definition is contributed.
When emphasizing that name definitions are contributed to the default namespace,
we therefore also call it the "target namespace" of the SDF definition file.</t>
        <t>E.g., in <xref target="example1" format="default"/>, definitions for the following global names are contributed:</t>
        <ul spacing="normal">
          <li>https://example.com/capability/cap#/sdfObject/Switch</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfProperty/value</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/on</li>
          <li>https://example.com/capability/cap#/sdfObject/Switch/sdfAction/off</li>
        </ul>
        <t>Note the <tt>#</tt>, which separates the absolute-URI part (<xref section="4.3" sectionFormat="of" target="RFC3986" format="default"/>) from the fragment identifier part.</t>
      </section>
      <section anchor="referencing-global-names" numbered="true" toc="default">
        <name>Referencing global names</name>
        <t>A name reference takes the form of the production <tt>curie</tt> in
<xref target="W3C.NOTE-curie-20101216" format="default"/> (note that this excludes the production <tt>safe-curie</tt>),
but also limiting the IRIs involved in that production to URIs as per <xref target="RFC3986" format="default"/>
and the prefixes to ASCII characters <xref target="RFC0020" format="default"/>.</t>
        <t>A name that is contributed by the current SDF definition file can be
referenced by a Same-Document Reference as per <xref section="4.4" sectionFormat="of" target="RFC3986" format="default"/>.
As there is little point in referencing the entire SDF definition
file, this will be a <tt>#</tt> followed by a JSON pointer.
This is the only kind of name reference to itself that is possible in an SDF
definition file that does not set a default namespace.</t>
        <t>Name references that point outside the current SDF definition file
need to contain curie prefixes.  These then reference namespace
declarations in the namespaces block.</t>
        <t>For example, if a namespace prefix is defined:</t>
        <sourcecode type="json"><![CDATA[
"namespace": {
  "foo": "https://example.com/"
}
]]></sourcecode>
        <t>Then this reference to that namespace:</t>
        <sourcecode type="json"><![CDATA[
{ "sdfRef": "foo:#/sdfData/temperatureData" }
]]></sourcecode>
        <t>references the global name:</t>
        <sourcecode type="json"><![CDATA[
"https://example.com/#/sdfData/temperatureData"
]]></sourcecode>
        <t>Note that there is no way to provide a URI scheme name in a curie, so
all references outside of the document need to go through the
namespace map.</t>
        <t>Name references occur only in specific elements of the syntax of SDF:</t>
        <ul spacing="normal">
          <li>copying elements via sdfRef values</li>
          <li>pointing to elements via sdfRequired value elements</li>
        </ul>
      </section>
      <section anchor="sdfref" numbered="true" toc="default">
        <name>sdfRef</name>
        <t>In a JSON map establishing a definition, the keyword "sdfRef" is used
to copy all of the qualities of the referenced definition, indicated
by the included name reference, into the newly formed definition.
(This can be compared to the processing of the "$ref" keyword in <xref target="I-D.handrews-json-schema-validation" format="default"/>.)</t>
        <t>For example, this reference:</t>
        <sourcecode type="json"><![CDATA[
"temperatureProperty": {
  "sdfRef": "#/sdfData/temperatureData"
}
]]></sourcecode>
        <t>creates a new definition "temperatureProperty" that contains all of the qualities defined in the definition at /sdfData/temperatureData.</t>
        <t>The sdfRef member need not be the only member of a map.
Additional members may be present with the intention to override parts
of the referenced map.
More formally, for a JSON map that contains an
sdfRef member, the semantics is defined to be as if the following steps were performed:</t>
        <ol spacing="normal" type="1"><li>The JSON map that contains the sdfRef member is copied into a
variable named "patch".</li>
          <li>The sdfRef member of the copy in "patch" is removed.</li>
          <li>the JSON pointer that is the value of the sdfRef member is
dereferenced and the result is copied into a variable named "original".</li>
          <li>The JSON Merge Patch algorithm <xref target="RFC7396" format="default"/> is applied to patch
the contents of "original" with the contents of "patch".</li>
          <li>The result of the Merge Patch is used in place of the value of the
original JSON map.</li>
        </ol>
        <t>TODO: Make sure that the grammar in <xref target="syntax" format="default"/> allows specifying the
null values that are necessary to remove members in a merge-patch.</t>
      </section>
      <section anchor="sdfrequired" numbered="true" toc="default">
        <name>sdfRequired</name>
        <t>The keyword "sdfRequired" is provided to apply a constraint that
defines for which declarations corresponding data are mandatory in an
instance conforming the current definition.</t>
        <t>The value of "sdfRequired" is an array of name references (JSON pointers), each
indicating one declaration that is mandatory to be represented.</t>
        <t>The example in <xref target="example-req" format="default"/> shows two required elements in the sdfObject definition for "temperatureWithAlarm", the sdfProperty "currentTemperature", and the sdfEvent "overTemperatureEvent". The example also shows the use of JSON pointer with "sdfRef" to use a pre-existing definition in this definition, for the "alarmType" data (sdfOutputData) produced by the sdfEvent "overTemperatureEvent".</t>
        <figure anchor="example-req">
          <name>Using sdfRequired</name>
          <sourcecode type="json"><![CDATA[
{
  "sdfObject": {
    "temperatureWithAlarm": {
      "sdfRequired": [
        "#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature",
        "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent"
      ],
      "sdfData":{
        "temperatureData": {
          "type": "number"
        }
      },
      "sdfProperty": {
        "currentTemperature": {
          "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
        }
      },
      "sdfEvent": {
        "overTemperatureEvent": {
          "sdfOutputData": {
            "type": "object",
            "properties": {
              "alarmType": {
                "sdfRef": "cap:#/sdfData/alarmTypes/quantityAlarms",
                "const": "OverTemperatureAlarm"
              },
              "temperature": {
                "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
              }
            }
          }
        }
      }
    }
  }
}
]]></sourcecode>
        </figure>
      </section>
      <section anchor="common-qualities" numbered="true" toc="default">
        <name>Common Qualities</name>
        <t>Definitions in SDF share a number of qualities that provide metadata for
them.  These are listed in <xref target="tbl-common-qualities" format="default"/>.  None of these
qualities are required or have default values that are assumed if the
quality is absent.
If a label is required for an application and no label is given in the SDF model, the
last part (<tt>reference-token</tt>, <xref section="3" sectionFormat="of" target="RFC6901" format="default"/>) of the JSON
pointer to the definition can be used.</t>
        <table anchor="tbl-common-qualities" align="center">
          <name>Common Qualities</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">description</td>
              <td align="left">text</td>
              <td align="left">long text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">label</td>
              <td align="left">text</td>
              <td align="left">short text (no constraints)</td>
            </tr>
            <tr>
              <td align="left">$comment</td>
              <td align="left">text</td>
              <td align="left">source code comments only, no semantics</td>
            </tr>
            <tr>
              <td align="left">sdfRef</td>
              <td align="left">sdf-pointer</td>
              <td align="left">(see <xref target="sdfref" format="default"/>)</td>
            </tr>
            <tr>
              <td align="left">sdfRequired</td>
              <td align="left">pointer-list</td>
              <td align="left">(see <xref target="sdfrequired" format="default"/>, applies to qualities of properties, of data)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-qualities" numbered="true" toc="default">
        <name>Data Qualities</name>
        <t>Data qualities are used in <tt>sdfData</tt> and <tt>sdfProperty</tt> definitions,
which are named sets of data qualities (abbreviated as <tt>named-sdq</tt>).</t>
        <t><xref target="jso-inspired" format="default"/> lists data qualities inspired by the various
proposals at json-schema.org; the
intention is that these (information model level) qualities are
compatible with the (data model) semantics from the
versions of the json-schema.org proposal they were imported from.</t>
        <t><xref target="sdfdataqual2" format="default"/> lists data qualities defined specifically for the
present specification.</t>
        <table anchor="sdfdataqual2" align="center">
          <name>SDF-defined Qualities of sdfProperty and sdfData</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities" format="default"/></td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">unit</td>
              <td align="left">string</td>
              <td align="left">unit name (note 1)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">scaleMinimum</td>
              <td align="left">number</td>
              <td align="left">lower limit of value in units given by unit (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">scaleMaximum</td>
              <td align="left">number</td>
              <td align="left">upper limit of value in units given by unit (note 2)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">readable</td>
              <td align="left">boolean</td>
              <td align="left">Reads are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">writable</td>
              <td align="left">boolean</td>
              <td align="left">Writes are allowed</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">observable</td>
              <td align="left">boolean</td>
              <td align="left">flag to indicate asynchronous notification is available</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">nullable</td>
              <td align="left">boolean</td>
              <td align="left">indicates a null value is available for this type</td>
              <td align="left">true</td>
            </tr>
            <tr>
              <td align="left">contentFormat</td>
              <td align="left">string</td>
              <td align="left">content type (IANA media type string plus parameters), encoding</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfType</td>
              <td align="left">string (<xref target="sdftype" format="default"/>)</td>
              <td align="left">sdfType enumeration (extensible)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfChoice</td>
              <td align="left">named set of data qualities (<xref target="sdfchoice" format="default"/>)</td>
              <td align="left">named alternatives</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">enum</td>
              <td align="left">array of strings</td>
              <td align="left">abbreviation for string-valued named alternatives</td>
              <td align="left">N/A</td>
            </tr>
          </tbody>
        </table>
        <ol spacing="normal" type="1"><li>
            <t>Note that the quality <tt>unit</tt> was called <tt>units</tt> in SDF 1.0.
The unit name <bcp14>SHOULD</bcp14> be as
per the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="RFC8428" format="default"/> Registry
or the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="RFC8798" format="default"/> Registry in <xref target="IANA.senml" format="default"/>
as specified by
Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare" format="default"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare" format="default"/> of <xref target="RFC8428" format="default"/> and <xref section="3" sectionFormat="of" target="RFC8798" format="default"/>, respectively.  </t>
            <t>
Exceptionally, if a registration in these registries cannot be
obtained or would be inappropriate, the unit name can also be a URI
that is pointing to a definition of the unit.  Note that SDF
processors are not expected to (and normally <bcp14>SHOULD NOT</bcp14>)
dereference these URIs; they may be useful to humans, though.
A URI unit name is distinguished from a registered unit name by the
presence of a colon; registered unit names that contain a colon (at
the time of writing, none) can therefore not be used in SDF.  </t>
            <t>
For use by translators into ecosystems that require URIs for unit
names, the URN sub-namespace "urn:ietf:params:unit" is provided
(<xref target="unit-urn" format="default"/>); URNs from this sub-namespace <bcp14>MUST NOT</bcp14> be used in a
<tt>unit</tt> quality, in favor of simply notating the unit name (e.g.,
<tt>kg</tt> instead of <tt>urn:ietf:params:unit:kg</tt>).</t>
          </li>
          <li>these qualities were included in SDF 1.0, but were not fully
 defined; they are not included in SDF 1.1.  In 1.next, they will
 be replaced by qualities to express scaling that are more aligned
 with the processes that combine ecosystem and instance specific
 information with an SDF model.</li>
        </ol>
        <section anchor="sdftype" numbered="true" toc="default">
          <name>sdfType</name>
          <t>SDF defines a number of basic types beyond those provided by JSON or
JSO.  These types are identified by the <tt>sdfType</tt> quality, which
is a text string from a set of type names defined by SDF.</t>
          <t>To aid interworking with <xref target="I-D.handrews-json-schema-validation" format="default"/> implementations, it is <bcp14>RECOMMENDED</bcp14>
that <tt>sdfType</tt> is always used in conjunction with the <tt>type</tt> quality
inherited from <xref target="I-D.handrews-json-schema-validation" format="default"/>, in such a way as to yield a common
representation of the type's values in JSON.</t>
          <t>Values for <tt>sdfType</tt> that are defined in SDF 1.1 are shown in
<xref target="sdftype1" format="default"/>.
This table also gives a description of the semantics of the sdfType,
the conventional value for <tt>type</tt> to be used with the <tt>sdfType</tt> value,
and a conventional JSON representation for values of the type.</t>
          <table anchor="sdftype1" align="center">
            <name>Values defined in SDF 1.1 for sdfType quality</name>
            <thead>
              <tr>
                <th align="left">sdfType</th>
                <th align="left">Description</th>
                <th align="left">type</th>
                <th align="left">JSON Representation</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left">byte-string</td>
                <td align="left">A sequence of zero or more bytes</td>
                <td align="left">string</td>
                <td align="left">base64url without padding (<xref section="3.4.5.2" sectionFormat="of" target="RFC8949" format="default"/>)</td>
              </tr>
              <tr>
                <td align="left">unix-time</td>
                <td align="left">A point in civil time (note 1)</td>
                <td align="left">number</td>
                <td align="left">POSIX time (<xref section="3.4.2" sectionFormat="of" target="RFC8949" format="default"/>)</td>
              </tr>
            </tbody>
          </table>
          <t>(1) Note that the definition of <tt>unix-time</tt> does not imply the
capability to represent points in time that fall on leap seconds.
More date/time-related sdfTypes are likely to be added in future versions
of this specification.</t>
          <t>In SDF 1.0, a similar concept was called <tt>subtype</tt>.</t>
        </section>
        <section anchor="sdfchoice" numbered="true" toc="default">
          <name>sdfChoice</name>
          <t>Data can be a choice of named alternatives, called <tt>sdfChoice</tt>.
Each alternative is identified by a name (string, key in the JSON
object used to represent the choice) and a set of dataqualities
(object, the value in the JSON object used to represent the choice).</t>
          <t>sdfChoice merges the functions of two constructs found in <xref target="I-D.handrews-json-schema-validation" format="default"/>:</t>
          <ul spacing="normal">
            <li>
              <t><tt>enum</tt>  </t>
              <t>
What would have been  </t>
              <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
              <t>
in SDF 1.0, is often best represented as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "description": "This is a foonly"},
  "bar": { "description": "As defined in the second world congress"},
  "baz": { "description": "From zigbee foobaz"}
}
]]></sourcecode>
              <t>
This allows the placement of other dataqualities such as
<tt>description</tt> in the example.  </t>
              <t>
If an enum needs to use a data type different from text string,
e.g. what would have been  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"enum": [1, 2, 3]
]]></sourcecode>
              <t>
in SDF 1.0, is represented as:  </t>
              <sourcecode type="json"><![CDATA[
"type": "number",
"sdfChoice": {
  "a-better-name-for-alternative-1": { "const": 1 },
  "alternative-2": { "const": 2 },
  "the-third-alternative": { "const": 3 }
}
]]></sourcecode>
              <t>
where the string names obviously would be chosen in a way that is
descriptive for what these numbers actually stand for; sdfChoice
also makes it easy to add number ranges into the mix.  </t>
              <t>
(Note that <tt>const</tt> can also be used for strings as in the previous
example, e.g., if the actual string value is indeed a crucial
element for the data model.)</t>
            </li>
            <li>
              <t>anyOf  </t>
              <t><xref target="I-D.handrews-json-schema-validation" format="default"/> provides a type union called <tt>anyOf</tt>, which provides a
choice between anonymous alternatives.  </t>
              <t>
What could have been  </t>
              <sourcecode type="json"><![CDATA[
"anyOf": [
  {"type": "array", "minItems": 3, "maxItems": "3", "items": {
     "$ref": "#/sdfData/rgbVal"}},
  {"type": "array", "minItems": 4, "maxItems": "4", "items": {
     "$ref": "#/sdfData/cmykVal"}}
]
]]></sourcecode>
              <t>
in <xref target="I-D.handrews-json-schema-validation" format="default"/> can be more descriptively notated in SDF as:  </t>
              <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "rgb": {"type": "array", "minItems": 3, "maxItems": "3", "items": {
            "sdfRef": "#/sdfData/rgbVal"}},
  "cmyk": {"type": "array", "minItems": 4, "maxItems": "4", "items": {
            "sdfRef": "#/sdfData/cmykVal"}}
}
]]></sourcecode>
            </li>
          </ul>
          <t>Note that there is no need in SDF for the type intersection construct
<tt>allOf</tt> or the peculiar type-xor construct <tt>oneOf</tt> found in <xref target="I-D.handrews-json-schema-validation" format="default"/>.</t>
          <t>As a simplification for readers of SDF specifications accustomed to
the <xref target="I-D.handrews-json-schema-validation" format="default"/> enum keyword, this is retained, but limited to a choice
of text string values, such that</t>
          <sourcecode type="json"><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></sourcecode>
          <t>is syntactic sugar for</t>
          <sourcecode type="json"><![CDATA[
"sdfChoice": {
  "foo": { "const": "foo"},
  "bar": { "const": "bar"},
  "baz": { "const": "baz"}
}
]]></sourcecode>
        </section>
      </section>
    </section>
    <section anchor="keywords-for-definition-groups" numbered="true" toc="default">
      <name>Keywords for definition groups</name>
      <t>The following SDF keywords are used to create definition groups in the target namespace.
All these definitions share some common qualities as discussed in <xref target="common-qualities" format="default"/>.</t>
      <section anchor="sdfobject-1" numbered="true" toc="default">
        <name>sdfObject</name>
        <t>The sdfObject keyword denotes a group of zero or more Object definitions.
Object definitions may contain or include definitions of Properties, Actions, Events declared for the object, as well as data types (sdfData group) to be used in this or other Objects.</t>
        <t>The qualities of an sdfObject include the common qualities, additional qualities are shown in <xref target="sdfobjqual" format="default"/>.
None of these
qualities are required or have default values that are assumed if the
quality is absent.</t>
        <table anchor="sdfobjqual" align="center">
          <name>Qualities of sdfObject</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities" format="default"/></td>
            </tr>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this object</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of sdfObject instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfObject instances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfproperty-1" numbered="true" toc="default">
        <name>sdfProperty</name>
        <t>The sdfProperty keyword denotes a group of zero or more Property definitions.</t>
        <t>Properties are used to model elements of state.</t>
        <t>The qualities of a Property definition include the data qualities (and
thus the common qualities), see <xref target="data-qualities" format="default"/>.</t>
      </section>
      <section anchor="sdfaction" numbered="true" toc="default">
        <name>sdfAction</name>
        <t>The sdfAction keyword denotes a group of zero or more Action definitions.</t>
        <t>Actions are used to model commands and methods which are invoked. Actions have parameter data that are supplied upon invocation.</t>
        <t>The qualities of an Action definition include the common qualities, additional qualities are shown in <xref target="sdfactqual" format="default"/>.</t>
        <table anchor="sdfactqual" align="center">
          <name>Qualities of sdfAction</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities" format="default"/></td>
            </tr>
            <tr>
              <td align="left">sdfInputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the input data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Action</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfInputData</tt> defines the input data of the action.  <tt>sdfOutputData</tt>
defines the output data of the action.
As discussed in <xref target="sdfaction-overview" format="default"/>, a set of data qualities with
type "object" can be used to substructure either data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfevent" numbered="true" toc="default">
        <name>sdfEvent</name>
        <t>The sdfEvent keyword denotes zero or more Event definitions.</t>
        <t>Events are used to model asynchronous occurrences that may be communicated proactively. Events have data elements which are communicated upon the occurrence of the event.</t>
        <t>The qualities of sdfEvent include the common qualities, additional qualities are shown in <xref target="sdfevqual" format="default"/>.</t>
        <table anchor="sdfevqual" align="center">
          <name>Qualities of sdfEvent</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities" format="default"/></td>
            </tr>
            <tr>
              <td align="left">sdfOutputData</td>
              <td align="left">map</td>
              <td align="left">data qualities of the output data for an Event</td>
            </tr>
            <tr>
              <td align="left">sdfData</td>
              <td align="left">named-sdq</td>
              <td align="left">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t><tt>sdfOutputData</tt> defines the output data of the action.
As discussed in <xref target="sdfevent-overview" format="default"/>, a set of data qualities with
type "object" can be used to substructure the output data item, with
optionality indicated by the data quality <tt>required</tt>.</t>
      </section>
      <section anchor="sdfdata-1" numbered="true" toc="default">
        <name>sdfData</name>
        <t>The sdfData keyword denotes a group of zero or more named data type
definitions (named-sdq).</t>
        <t>An sdfData definition provides a reusable semantic identifier for a
type of data item and describes the constraints on the defined type.
It is not itself a declaration, i.e., it does not cause any of these
data items to be included in an affordance definition.</t>
        <t>The qualities of sdfData include the data qualities (and thus the common qualities), see <xref target="data-qualities" format="default"/>.</t>
      </section>
    </section>
    <section anchor="high-level-composition" numbered="true" toc="default">
      <name>High Level Composition</name>
      <t>The requirements for high level composition include the following:</t>
      <ul spacing="normal">
        <li>The ability to represent products, standardized product types, and modular products while maintaining the atomicity of Objects.</li>
        <li>The ability to compose a reusable definition block from Objects, for example a single plug unit of an outlet strip with on/off control, energy monitor, and optional dimmer objects, while retaining the atomicity of the individual objects.</li>
        <li>The ability to compose Objects and other definition blocks into a higher level thing that represents a product, while retaining the atomicity of objects.</li>
        <li>The ability to enrich and refine a base definition to have product-specific qualities and quality values, e.g. unit, range, and scale settings.</li>
        <li>The ability to reference items in one part of a complex definition from another part of the same definition, for example to summarize the energy readings from all plugs in an outlet strip.</li>
      </ul>
      <section anchor="paths-in-the-model-namespaces" numbered="true" toc="default">
        <name>Paths in the model namespaces</name>
        <t>The model namespace is organized according to terms that are defined in the definition files that are present in the namespace. For example, definitions that originate from an organization or vendor are expected to be in a namespace that is specific to that organization or vendor. There is expected to be an SDF namespace for common SDF definitions used in OneDM.</t>
        <t>The structure of a path in a namespace is defined by the JSON Pointers to the definitions in the files in that namespace. For example, if there is a file defining an object "Switch" with an action "on", then the reference to the action would be "ns:/sdfObject/Switch/sdfAction/on" where <tt>ns</tt> is the namespace prefix (short name for the namespace).</t>
      </section>
      <section anchor="modular-composition" numbered="true" toc="default">
        <name>Modular Composition</name>
        <t>Modular composition of definitions enables an existing definition (could be in the same file or another file) to become part of a new definition by including a reference to the existing definition within the model namespace.</t>
        <section anchor="use-of-the-sdfref-keyword-to-re-use-a-definition" numbered="true" toc="default">
          <name>Use of the "sdfRef" keyword to re-use a definition</name>
          <t>An existing definition may be used as a template for a new definition, that is, a new definition is created in the target namespace which uses the defined qualities of some existing definition. This pattern will use the keyword "sdfRef" as a quality of a new definition with a value consisting of a reference to the existing definition that is to be used as a template.</t>
          <t>In the definition that uses "sdfRef", new qualities may be added
and existing qualities from the referenced definition may be
overridden.  (Note that JSON maps (objects) do not have a defined
order, so the SDF processor may see these overrides before seeing the
<tt>sdfRef</tt>.)</t>
          <t>As a convention, overrides are intended to be used only for further restricting
the set of data values, as shown in <xref target="exa-sdfref" format="default"/>:  any value for a
<tt>cable-length</tt> also is a valid value for a <tt>length</tt>, with the
additional restriction that the length cannot be smaller than 5 cm.
(This is labeled as a convention as it cannot be checked in the
general case; a quality of implementation consideration for a tool
might be to provide at least some form of checking.)
Note that a description is provided that overrides the description of
the referenced definition; as this quality is intended for human
consumption there is no conflict with the intended goal.</t>
          <figure anchor="exa-sdfref">
            <artwork name="" type="" align="left" alt=""><![CDATA[
"sdfData":
  "length" : {
    "type": "number",
    "minimum": 0,
    "unit": "m"
    "description": "There can be no negative lengths."
  }
...
  "cable-length" : {
    "sdfRef": "#/sdfData/length"
    "minimum": 0.05,
    "description": "Cables must be at least 5 cm."
  }
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="sdfthing-1" numbered="true" toc="default">
        <name>sdfThing</name>
        <t>An sdfThing is a set of declarations and qualities that may be part of a more complex model. For example, the object declarations that make up the definition of a single socket of an outlet strip could be encapsulated in an sdfThing, and the socket-thing itself could be used in a declaration in the sdfThing definition for the outlet strip.</t>
        <t>sdfThing definitions carry semantic meaning, such as a defined refrigerator compartment and a defined freezer compartment, making up a combination refrigerator-freezer product.</t>
        <t>An sdfThing may be composed of sdfObjects and other sdfThings.</t>
        <t>The qualities of sdfThing are shown in <xref target="sdfthingqual" format="default"/>.</t>
        <table anchor="sdfthingqual" align="center">
          <name>Qualities of sdfThing and sdfProduct</name>
          <thead>
            <tr>
              <th align="left">Quality</th>
              <th align="left">Type</th>
              <th align="left">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">(common)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="common-qualities" format="default"/></td>
            </tr>
            <tr>
              <td align="left">sdfThing</td>
              <td align="left">thing</td>
              <td align="left"> </td>
            </tr>
            <tr>
              <td align="left">sdfObject</td>
              <td align="left">object</td>
              <td align="left"> </td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfproduct-1" numbered="true" toc="default">
        <name>sdfProduct</name>
        <t>An sdfProduct provides the level of abstraction for representing a unique product or a profile for a standardized type of product, for example a "device type" definition with required minimum functionality.</t>
        <t>Products may be composed of Objects and Things at the high level, and may include their own definitions of Properties, Actions, and Events that can be used to extend or complete the included Object definitions.</t>
        <t>Product definitions may set optional defaults and constant values for specific use cases, for example units, range, and scale settings for properties, or available parameters for Actions.</t>
        <t>The qualities of sdfProduct are the same as for sdfThing and are shown in <xref target="sdfthingqual" format="default"/>.</t>
      </section>
    </section>
    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <section anchor="media-type" numbered="true" toc="default">
        <name>Media Type</name>
        <t>IANA is requested to add the following Media-Type to the "Media Types" registry.</t>
        <table align="left">
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="left">Template</th>
              <th align="left">Reference</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">sdf+json</td>
              <td align="left">application/sdf+json</td>
              <td align="left">RFC XXXX, <xref target="media-type" format="default"/></td>
            </tr>
          </tbody>
        </table>
        <t>// RFC Ed.: please replace RFC XXXX with this RFC number and remove this note.</t>
        <dl spacing="compact">
          <dt>
Type name:  </dt>
          <dd>
            <t>application</t>
          </dd>
          <dt>
Subtype name:  </dt>
          <dd>
            <t>sdf+json</t>
          </dd>
          <dt>
Required parameters:  </dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>
Optional parameters:  </dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>
Encoding considerations:  </dt>
          <dd>
            <t>binary (JSON is UTF-8-encoded text)</t>
          </dd>
          <dt>
Security considerations:  </dt>
          <dd>
            <t><xref target="seccons" format="default"/> of RFC XXXX</t>
          </dd>
          <dt>
Interoperability considerations:  </dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>
Published specification:  </dt>
          <dd>
            <t><xref target="media-type" format="default"/> of RFC XXXX</t>
          </dd>
          <dt>
Applications that use this media type:  </dt>
          <dd>
            <t>Tools for data and interaction modeling in the Internet of Things</t>
          </dd>
          <dt>
Fragment identifier considerations:  </dt>
          <dd>
            <t>A JSON Pointer fragment identifier may be used, as defined in
<xref section="6" sectionFormat="of" target="RFC6901" format="default"/>.</t>
          </dd>
          <dt>
Person &amp; email address to contact for further information:  </dt>
          <dd>
            <t>ASDF WG mailing list (asdf@ietf.org),
or IETF Applications and Real-Time Area (art@ietf.org)</t>
          </dd>
          <dt>
Intended usage:  </dt>
          <dd>
            <t>COMMON</t>
          </dd>
          <dt>
Restrictions on usage:  </dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>
Author/Change controller:  </dt>
          <dd>
            <t>IETF</t>
          </dd>
          <dt>
Provisional registration:  </dt>
          <dd>
            <t>no</t>
          </dd>
        </dl>
      </section>
      <section anchor="unit-urn" numbered="true" toc="default">
        <name>IETF URN Sub-namespace for Unit Names (urn:ietf:params:unit)</name>
        <t>IANA is requested to register the following value in the "<xref section="IETF URN Sub-namespace for Registered Protocol Parameter Identifiers" relative="#params-1" sectionFormat="bare" target="IANA.params" format="default"/>" registry, following the template in
<xref target="RFC3553" format="default"/>:</t>
        <dl>
          <dt>
Registry name:  </dt>
          <dd>
            <t>unit</t>
          </dd>
          <dt>
Specification:  </dt>
          <dd>
            <t>RFC XXXX</t>
          </dd>
          <dt>
Repository:  </dt>
          <dd>
            <t>combining the symbol values from the <xref section="SenML Units" relative="#senml-units" sectionFormat="bare" target="IANA.senml" format="default"/> Registry and the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="IANA.senml" format="default"/> Registry in <xref target="IANA.senml" format="default"/> as specified by Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare" format="default"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare" format="default"/> of <xref target="RFC8428" format="default"/> and <xref section="3" sectionFormat="of" target="RFC8798" format="default"/>,
respectively (which by the registration policy are guaranteed to be
non-overlapping).</t>
          </dd>
          <dt>
Index value:  </dt>
          <dd>
            <t>Percent-encoding (<xref section="2.1" sectionFormat="of" target="RFC3986" format="default"/>) is required of
any characters in unit names as required by ABNF rule "pchar" in
<xref section="3.3" sectionFormat="of" target="RFC3986" format="default"/>, specifically at the time of writing for the
unit names "%" (deprecated in favor of "/"), "%RH", "%EL".</t>
          </dd>
        </dl>
      </section>
      <section anchor="registries" numbered="true" toc="default">
        <name>Registries</name>
        <t>(TBD: After future additions, check if we need any.)</t>
      </section>
    </section>
    <section anchor="seccons" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>Some wider issues are discussed in <xref target="RFC8576" format="default"/>.</t>
      <t>(Specifics: TBD.)</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="IANA.senml" target="https://www.iana.org/assignments/senml">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="IANA.params" target="https://www.iana.org/assignments/params">
          <front>
            <title>Uniform Resource Name (URN) Namespace for IETF Use</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <author fullname="C. Newman" initials="C." surname="Newman">
              <organization/>
            </author>
            <date month="July" year="2002"/>
            <abstract>
              <t>This document defines a date and time format for use in Internet protocols that is a profile of the ISO 8601 standard for representation of dates and times using the Gregorian calendar.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3339"/>
          <seriesInfo name="DOI" value="10.17487/RFC3339"/>
        </reference>
        <reference anchor="RFC8428" target="https://www.rfc-editor.org/info/rfc8428">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Jennings" initials="C." surname="Jennings">
              <organization/>
            </author>
            <author fullname="Z. Shelby" initials="Z." surname="Shelby">
              <organization/>
            </author>
            <author fullname="J. Arkko" initials="J." surname="Arkko">
              <organization/>
            </author>
            <author fullname="A. Keranen" initials="A." surname="Keranen">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="August" year="2018"/>
            <abstract>
              <t>This specification defines a format for representing simple sensor measurements and device parameters in Sensor Measurement Lists (SenML).  Representations are defined in JavaScript Object Notation (JSON), Concise Binary Object Representation (CBOR), Extensible Markup Language (XML), and Efficient XML Interchange (EXI), which share the common SenML data model.  A simple sensor, such as a temperature sensor, could use one of these media types in protocols such as HTTP or the Constrained Application Protocol (CoAP) to transport the measurements of the sensor or to be configured.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8428"/>
          <seriesInfo name="DOI" value="10.17487/RFC8428"/>
        </reference>
        <reference anchor="RFC8798" target="https://www.rfc-editor.org/info/rfc8798">
          <front>
            <title>Additional Units for Sensor Measurement Lists (SenML)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2020"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media type supports the indication of units for a quantity represented.  This short document registers a number of additional unit names in the IANA registry for units in SenML.  It also defines a registry for secondary units that cannot be in SenML's main registry, as they are derived by linear transformation from units already in that registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8798"/>
          <seriesInfo name="DOI" value="10.17487/RFC8798"/>
        </reference>
        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee">
              <organization/>
            </author>
            <author fullname="R. Fielding" initials="R." surname="Fielding">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource.  This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet.  The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier.  This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC4122" target="https://www.rfc-editor.org/info/rfc4122">
          <front>
            <title>A Universally Unique IDentifier (UUID) URN Namespace</title>
            <author fullname="P. Leach" initials="P." surname="Leach">
              <organization/>
            </author>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="R. Salz" initials="R." surname="Salz">
              <organization/>
            </author>
            <date month="July" year="2005"/>
            <abstract>
              <t>This specification defines a Uniform Resource Name namespace for UUIDs (Universally Unique IDentifier), also known as GUIDs (Globally Unique IDentifier).  A UUID is 128 bits long, and can guarantee uniqueness across space and time.  UUIDs were originally used in the Apollo Network Computing System and later in the Open Software Foundation\'s (OSF) Distributed Computing Environment (DCE), and then in Microsoft Windows platforms.</t>
              <t>This specification is derived from the DCE specification with the kind permission of the OSF (now known as The Open Group).  Information from earlier versions of the DCE specification have been incorporated into this document.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4122"/>
          <seriesInfo name="DOI" value="10.17487/RFC4122"/>
        </reference>
        <reference anchor="RFC6901" target="https://www.rfc-editor.org/info/rfc6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author fullname="P. Bryan" initials="P." role="editor" surname="Bryan">
              <organization/>
            </author>
            <author fullname="K. Zyp" initials="K." surname="Zyp">
              <organization/>
            </author>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham">
              <organization/>
            </author>
            <date month="April" year="2013"/>
            <abstract>
              <t>JSON Pointer defines a string syntax for identifying a specific value within a JavaScript Object Notation (JSON) document.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6901"/>
          <seriesInfo name="DOI" value="10.17487/RFC6901"/>
        </reference>
        <reference anchor="RFC7396" target="https://www.rfc-editor.org/info/rfc7396">
          <front>
            <title>JSON Merge Patch</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <author fullname="J. Snell" initials="J." surname="Snell">
              <organization/>
            </author>
            <date month="October" year="2014"/>
            <abstract>
              <t>This specification defines the JSON merge patch format and processing rules.  The merge patch format is primarily intended for use with the HTTP PATCH method as a means of describing a set of modifications to a target resource's content.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7396"/>
          <seriesInfo name="DOI" value="10.17487/RFC7396"/>
        </reference>
        <reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <author fullname="H. Birkholz" initials="H." surname="Birkholz">
              <organization/>
            </author>
            <author fullname="C. Vigano" initials="C." surname="Vigano">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2019"/>
            <abstract>
              <t>This document proposes a notational convention to express Concise Binary Object Representation (CBOR) data structures (RFC 7049).  Its main goal is to provide an easy and unambiguous way to express structures for protocol messages and data formats that use CBOR or JSON.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8610"/>
          <seriesInfo name="DOI" value="10.17487/RFC8610"/>
        </reference>
        <reference anchor="RFC8949" target="https://www.rfc-editor.org/info/rfc8949">
          <front>
            <title>Concise Binary Object Representation (CBOR)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman">
              <organization/>
            </author>
            <date month="December" year="2020"/>
            <abstract>
              <t>The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. These design goals make it different from earlier binary serializations such as ASN.1 and MessagePack.</t>
              <t>This document obsoletes RFC 7049, providing editorial improvements, new details, and errata fixes while keeping full compatibility with the interchange format of RFC 7049.  It does not create a new version of the format.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="94"/>
          <seriesInfo name="RFC" value="8949"/>
          <seriesInfo name="DOI" value="10.17487/RFC8949"/>
        </reference>
        <reference anchor="W3C.NOTE-curie-20101216" target="https://www.w3.org/TR/2010/NOTE-curie-20101216">
          <front>
            <title>CURIE Syntax 1.0</title>
            <author fullname="Mark Birbeck" initials="M." surname="Birbeck">
              <organization/>
            </author>
            <author fullname="Shane McCarron" initials="S." surname="McCarron">
              <organization/>
            </author>
            <date day="16" month="December" year="2010"/>
          </front>
          <seriesInfo name="World Wide Web Consortium NOTE" value="NOTE-curie-20101216"/>
        </reference>
        <reference anchor="RFC0020" target="https://www.rfc-editor.org/info/rfc20">
          <front>
            <title>ASCII format for network interchange</title>
            <author fullname="V.G. Cerf" initials="V.G." surname="Cerf">
              <organization/>
            </author>
            <date month="October" year="1969"/>
          </front>
          <seriesInfo name="STD" value="80"/>
          <seriesInfo name="RFC" value="20"/>
          <seriesInfo name="DOI" value="10.17487/RFC0020"/>
        </reference>
        <reference anchor="SPDX" target="https://spdx.org/licenses/">
          <front>
            <title>SPDX License List</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC9165" target="https://www.rfc-editor.org/info/rfc9165">
          <front>
            <title>Additional Control Operators for the Concise Data Definition Language (CDDL)</title>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="December" year="2021"/>
            <abstract>
              <t>The Concise Data Definition Language (CDDL), standardized in RFC 8610, provides "control operators" as its main language extension point.</t>
              <t>The present document defines a number of control operators that were not yet ready at the time RFC 8610 was completed: , , and  for the construction of constants; / for including ABNF (RFC 5234 and RFC 7405) in CDDL specifications; and for indicating the use of a non-basic feature in an instance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9165"/>
          <seriesInfo name="DOI" value="10.17487/RFC9165"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC3553" target="https://www.rfc-editor.org/info/rfc3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <author fullname="T. Hardie" initials="T." surname="Hardie">
              <organization/>
            </author>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items.  The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.handrews-json-schema-validation" target="https://www.ietf.org/archive/id/draft-handrews-json-schema-validation-02.txt">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author fullname="Austin Wright">
	 </author>
            <author fullname="Henry Andrews">
	 </author>
            <author fullname="Ben Hutton">
              <organization>Wellcome Sanger Institute</organization>
            </author>
            <date day="17" month="September" year="2019"/>
            <abstract>
              <t>   JSON Schema (application/schema+json) has several purposes, one of
   which is JSON instance validation.  This document specifies a
   vocabulary for JSON Schema to describe the meaning of JSON documents,
   provide hints for user interfaces working with JSON data, and to make
   assertions about what a valid document must look like.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-handrews-json-schema-validation-02"/>
        </reference>
        <reference anchor="I-D.wright-json-schema" target="https://www.ietf.org/archive/id/draft-wright-json-schema-01.txt">
          <front>
            <title>JSON Schema: A Media Type for Describing JSON Documents</title>
            <author fullname="Austin Wright">
	 </author>
            <author fullname="Henry Andrews">
	 </author>
            <date day="16" month="April" year="2017"/>
            <abstract>
              <t>   JSON Schema defines the media type "application/schema+json", a JSON-
   based format for describing the structure of JSON data.  JSON Schema
   asserts what a JSON document must look like, ways to extract
   information from it, and how to interact with it, ideal for
   annotating existing JSON APIs that would not otherwise have
   hypermedia controls or be machine-readable.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-wright-json-schema-01"/>
        </reference>
        <reference anchor="I-D.irtf-t2trg-rest-iot" target="https://www.ietf.org/archive/id/draft-irtf-t2trg-rest-iot-08.txt">
          <front>
            <title>Guidance on RESTful Design for Internet of Things Systems</title>
            <author fullname="Ari Keranen">
              <organization>Ericsson</organization>
            </author>
            <author fullname="Matthias Kovatsch">
              <organization>Huawei Technologies</organization>
            </author>
            <author fullname="Klaus Hartke">
	 </author>
            <date day="25" month="August" year="2021"/>
            <abstract>
              <t>   This document gives guidance for designing Internet of Things (IoT)
   systems that follow the principles of the Representational State
   Transfer (REST) architectural style.  This document is a product of
   the IRTF Thing-to-Thing Research Group (T2TRG).

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-irtf-t2trg-rest-iot-08"/>
        </reference>
        <reference anchor="ZCL">
          <front>
            <title>The ZigBee Cluster Library</title>
            <author>
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="Zigbee Wireless Networking" value="pp. 239-271"/>
          <seriesInfo name="DOI" value="10.1016/b978-0-7506-8597-9.00006-9"/>
        </reference>
        <reference anchor="OMA" target="http://www.openmobilealliance.org/wp/omna/lwm2m/lwm2mregistry.html">
          <front>
            <title>OMA LightweightM2M (LwM2M) Object and Resource Registry</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="OCF" target="https://openconnectivity.org/specs/OCF_Resource_Type_Specification.pdf">
          <front>
            <title>OCF Resource Type Specification</title>
            <author>
              <organization/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC8576" target="https://www.rfc-editor.org/info/rfc8576">
          <front>
            <title>Internet of Things (IoT) Security: State of the Art and Challenges</title>
            <author fullname="O. Garcia-Morchon" initials="O." surname="Garcia-Morchon">
              <organization/>
            </author>
            <author fullname="S. Kumar" initials="S." surname="Kumar">
              <organization/>
            </author>
            <author fullname="M. Sethi" initials="M." surname="Sethi">
              <organization/>
            </author>
            <date month="April" year="2019"/>
            <abstract>
              <t>The Internet of Things (IoT) concept refers to the usage of standard Internet protocols to allow for human-to-thing and thing-to-thing communication.  The security needs for IoT systems are well recognized, and many standardization steps to provide security have been taken -- for example, the specification of the Constrained Application Protocol (CoAP) secured with Datagram Transport Layer Security (DTLS).  However, security challenges still exist, not only because there are some use cases that lack a suitable solution, but also because many IoT devices and systems have been designed and deployed with very limited security capabilities.  In this document, we first discuss the various stages in the lifecycle of a thing. Next, we document the security threats to a thing and the challenges that one might face to protect against these threats.  Lastly, we discuss the next steps needed to facilitate the deployment of secure IoT systems.  This document can be used by implementers and authors of IoT specifications as a reference for details about security considerations while documenting their specific security challenges, threat models, and mitigations.</t>
              <t>This document is a product of the IRTF Thing-to-Thing Research Group (T2TRG).</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8576"/>
          <seriesInfo name="DOI" value="10.17487/RFC8576"/>
        </reference>
        <reference anchor="ECMA-262" target="https://www.ecma-international.org/wp-content/uploads/ECMA-262.pdf">
          <front>
            <title>ECMAScript 2020 Language Specification</title>
            <author>
              <organization>Ecma International</organization>
            </author>
            <date year="2020" month="June"/>
          </front>
          <seriesInfo name="ECMA" value="Standard ECMA-262, 11th Edition"/>
        </reference>
        <reference anchor="I-D.bormann-jsonpath-iregexp" target="https://www.ietf.org/archive/id/draft-bormann-jsonpath-iregexp-01.txt">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <date day="13" month="November" year="2021"/>
            <abstract>
              <t>   "Regular expressions" (regexps) are a set of related, widely
   implemented pattern languages used in data modeling formats and query
   languages that is available in many dialects.  This specification
   defines an interoperable flavor of regexps, I-Regexp.

   The present version -01 of this document is a slight update of the
   original trial balloon, meant to determine whether this approach is
   useful for the JSONPath WG.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-jsonpath-iregexp-01"/>
        </reference>
      </references>
    </references>
    <section anchor="syntax" numbered="true" toc="default">
      <name>Formal Syntax of SDF</name>
      <t>This appendix describes the syntax of SDF using CDDL <xref target="RFC8610" format="default"/>.  Note
that this appendix was derived from Ari Keranen's "alt-schema" and
Michael Koster's "schema", with a view of covering the syntax that is
currently in use at the One Data Model <tt>playground</tt> repository.</t>
      <t>This appendix shows the framework syntax only, i.e., a syntax with liberal extension points.
Since this syntax is nearly useless in finding typos in an SDF
specification, a second syntax, the validation syntax, is defined that
does not include the extension points.
The validation syntax can be generated from the framework syntax by
leaving out all lines containing the string <tt>EXTENSION-POINT</tt>; as this
is trivial, the result is not shown here.</t>
      <t>This appendix makes use of CDDL "features" as defined in <xref section="4" sectionFormat="of" target="RFC9165" format="default"/>.
A feature named "1.0" is used to indicate parts of the syntax being
deprecated towards SDF 1.1, and a feature named "1.1" is used to
indicate new syntax intended for SDF 1.1.
Features whose names end in "-ext" indicate extension points for
further evolution.</t>
      <sourcecode type="cddl"><![CDATA[
start = sdf-syntax

sdf-syntax = {
 ? info: sdfinfo                  ; This will be required in most process policies, but not a syntax error
 ? namespace: named<text>
 ? defaultNamespace: text
 ? sdfThing: named<thingqualities>       ; Thing is a composition of objects that work together in some way
 ? sdfProduct: named<productqualities>   ; Product is a composition of things and objects that can model a SKU-level instance of a product
 ? sdfObject: named<objectqualities>     ; Object is a set of Properties, Actions, and Events that together perform a particular function
 ? sdfProperty: named<propertyqualities> ; Property represents the state of an instance of an object
 ? sdfAction: named<actionqualities>     ; Action is a directive to invoke an application layer verb associated with an object
 ? sdfEvent: named<eventqualities>       ; Event represents an occurrence of something associated with an object
 ? sdfData: named<dataqualities>         ; Data represents a piece of information that can be the state of a property or a parameter to an action or a signal in an event
 EXTENSION-POINT<"top-ext">
}

sdfinfo = {
 ? title: text
 ? version: text
 ? copyright: text
 ? license: text
 EXTENSION-POINT<"info-ext">
}

; Shortcut for a map that gives names to instances of X (has text keys and values of type X)
named<X> = { * text => X }

EXTENSION-POINT<f> = ( * (text .feature f) => any ) ; only used in framework syntax

sdf-pointer = text ; .regexp curie-regexp -- TO DO!
pointer-list = [* sdf-pointer]  ; ISSUE: no point in having an empty list, no? but used for sdfRequired in odmobject-multiple_axis_joystick.sdf.json

commonqualities = (
 ? description: text            ; long text (no constraints)
 ? label: text                  ; short text (no constraints); default to key
 ? $comment: text               ; source code comments only, no semantics
 ? sdfRef: sdf-pointer
 ? sdfRequired: pointer-list    ; applies to qualities of properties, of data
)

; for building hierarchy
thingqualities = {
 commonqualities
 ? sdfObject: named<objectqualities>
 ? sdfThing: named<thingqualities>
 EXTENSION-POINT<"thing-ext">
}

productqualities = thingqualities ; ISSUE: get rid of sdfProduct?

; for single objects, or for arrays of objects (1.2)
objectqualities = {
 commonqualities
 ? ("minItems" .feature "1.2") => number
 ? ("maxItems" .feature "1.2") => number
 ? sdfProperty: named<propertyqualities>
 ? sdfAction: named<actionqualities>
 ? sdfEvent: named<eventqualities>
 ? sdfData: named<dataqualities>
 EXTENSION-POINT<"object-ext">
}

propertyqualities = dataqualities ; the definitions in sdfData are declarations in sdfProperty

parameter-list =
  pointer-list .feature (["1.0", "pointerlist-as-parameter"]) /
  dataqualities .feature (["1.1", "dataqualities-as-parameter"])

actionqualities = {
 commonqualities
 ? sdfInputData: parameter-list   ; sdfRequiredInputData applies here (a bit redundant)
 ? ("sdfRequiredInputData" .feature "1.0") => pointer-list
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ? sdfData: named<dataqualities>         ; zero or more named data type definitions that might be used in the above
 EXTENSION-POINT<"action-ext">
}

eventqualities = {
 commonqualities
 ? sdfOutputData: parameter-list  ; sdfRequired applies here
 ? sdfData: named<dataqualities>         ; zero or more named data type definitions that might be used in the above
 EXTENSION-POINT<"event-ext">
}

dataqualities = {               ; also propertyqualities
 commonqualities
 jsonschema
 ? ("units" .feature "1.0") => text
 ? ("unit" .feature "1.1") => text
 ? ("scaleMinimum" .feature "1.0") => number
 ? ("scaleMaximum" .feature "1.0") => number
 ? observable: bool
 ? readable: bool
 ? writable: bool
 ? nullable: bool
 ? ("subtype" .feature "1.0") => "byte-string" / "unix-time"
            / (text .feature "subtype-ext")                       ; EXTENSION-POINT
 ? ("sdfType" .feature "1.1") => "byte-string" / "unix-time"
            / (text .feature "sdftype-ext")                       ; EXTENSION-POINT
 ? contentFormat: text
 EXTENSION-POINT<"data-ext">
}

allowed-types = number / text / bool / null
              / [* number] / [* text] / [* bool]
              / {* text => any}
              / (any .feature "allowed-ext")                     ; EXTENSION-POINT

compound-type = (
  "type" => ("object" .feature "1.1")
  ? required: [+text]
  ? properties: named<dataqualities>
)

choice-type = (
  ("sdfChoice" .feature "1.1") => named<dataqualities>
)

jsonschema = (
 ? (("type" => "number" / "string" / "boolean" / "integer" / "array")
    // compound-type
    // choice-type
    // (type: text .feature "type-ext")                       ; EXTENSION-POINT
   )
 ? "enum" => [+ text]               ; limited to text strings in SDF 1.1
 ? ("enum" .feature "1.0") => [+ allowed-types]    ; should validate against type
 ? const: allowed-types                            ; should validate against type
 ? default: allowed-types                          ; should validate against type
 ; number/integer constraints
 ? minimum: number
 ? maximum: number
 ? exclusiveMinimum: bool / number      ; jso draft 4/7
 ? exclusiveMaximum: bool / number      ; jso draft 4/7
 ? multipleOf: number                   ; ISSUE: Do we need this?
 ; text string constraints
 ? minLength: number
 ? maxLength: number
 ? pattern: text                ; regexp
 ? format: "date-time" / "date" / "time"
           / "uri" / "uri-reference" / "uuid"
           / (text .feature "format-ext")                       ; EXTENSION-POINT
 ; array constraints
 ? minItems: number
 ? maxItems: number
 ? uniqueItems: bool
 ? items: { ;;; ultimately, this will be mostly recursive, but, for now
            ;;; let's find out what we actually need
     ? sdfRef: sdf-pointer          ; import limited to the subset that we allow here...
     ? description: text            ; long text (no constraints)
     ? $comment: text               ; source code comments only, no semantics
     ; commonqualities, ; -- ISSUE: should leave this out for non-complex data types, but need the above three
     ? ((type: "number" / "string" / "boolean" / "integer") ; no "array"
        // compound-type
        // choice-type              ; do we really need arrays of choices?
        // (type: text .feature "itemtype-ext")                       ; EXTENSION-POINT
       )
     ; jso subset
     ? minimum: number
     ? maximum: number
     ? "enum" => [+ text] ; limited to text strings in SDF 1.1
     ? ("enum" .feature "1.0") => [+ any]
     ? format: text
     ? minLength: number
     ? maxLength: number
     EXTENSION-POINT<"items-ext">
   }
)
]]></sourcecode>
    </section>
    <section anchor="json-schemaorg-rendition-of-sdf-syntax" numbered="true" toc="default">
      <name>json-schema.org Rendition of SDF Syntax</name>
      <t>This appendix describes the syntax of SDF defined in <xref target="syntax" format="default"/>, but
using a version of the description techniques advertised on
json-schema.org <xref target="I-D.handrews-json-schema-validation" format="default"/>.</t>
      <t>The appendix shows both the validation and the framework syntax.
Since most of the lines are the same between these two files, those lines are shown only once, with a leading space, in the form of a unified diff.
Lines leading with a <tt>-</tt> are part of the validation syntax, and lines leading with a <tt>+</tt> are part of the framework syntax.</t>
      <sourcecode type="jso.json"><![CDATA[
 {
-  "title": "sdf-validation.cddl",
+  "title": "sdf-framework.cddl",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$ref": "#/definitions/sdf-syntax",
   "definitions": {
     "sdf-syntax": {
       "type": "object",
       "properties": {
         "info": {
           "$ref": "#/definitions/sdfinfo"
         },
         "namespace": {
           "type": "object",
           "additionalProperties": {
             "type": "string"
           }
         },
         "defaultNamespace": {
           "type": "string"
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "sdfProduct": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/productqualities"
           }
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdfinfo": {
       "type": "object",
       "properties": {
         "title": {
           "type": "string"
         },
         "version": {
           "type": "string"
         },
         "copyright": {
           "type": "string"
         },
         "license": {
           "type": "string"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "thingqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "sdf-pointer": {
       "type": "string"
     },
     "pointer-list": {
       "type": "array",
       "items": {
         "$ref": "#/definitions/sdf-pointer"
       }
     },
     "objectqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "minItems": {
           "type": "number"
         },
         "maxItems": {
           "type": "number"
         },
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "propertyqualities": {
       "$ref": "#/definitions/dataqualities"
     },
     "dataqualities": {
       "anyOf": [
         {
           "type": "object",
           "properties": {
             "type": {
               "type": "string",
               "enum": [
                 "number",
                 "string",
                 "boolean",
                 "integer",
                 "array"
               ]
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "exclusiveMaximum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
-              "type": "string",
-              "enum": [
-                "date-time",
-                "date",
-                "time",
-                "uri",
-                "uri-reference",
-                "uuid"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minItems": {
               "type": "number"
             },
             "maxItems": {
               "type": "number"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "type": {
               "type": "string",
               "const": "object"
             },
             "required": {
               "type": "array",
               "items": {
                 "type": "string"
               },
               "minItems": 1
             },
             "properties": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "exclusiveMaximum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
-              "type": "string",
-              "enum": [
-                "date-time",
-                "date",
-                "time",
-                "uri",
-                "uri-reference",
-                "uuid"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minItems": {
               "type": "number"
             },
             "maxItems": {
               "type": "number"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "nullable": {
               "type": "boolean"
             },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         {
           "type": "object",
           "properties": {
             "sdfChoice": {
               "type": "object",
               "additionalProperties": {
                 "$ref": "#/definitions/dataqualities"
               }
             },
             "enum": {
               "type": "array",
               "items": {
-                "type": "string"
+                "$ref": "#/definitions/allowed-types"
               },
               "minItems": 1
             },
             "const": {
               "$ref": "#/definitions/allowed-types"
             },
             "default": {
               "$ref": "#/definitions/allowed-types"
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "exclusiveMinimum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "exclusiveMaximum": {
               "anyOf": [
                 {
                   "type": "boolean"
                 },
                 {
                   "type": "number"
                 }
               ]
             },
             "multipleOf": {
               "type": "number"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             },
             "pattern": {
               "type": "string"
             },
             "format": {
-              "type": "string",
-              "enum": [
-                "date-time",
-                "date",
-                "time",
-                "uri",
-                "uri-reference",
-                "uuid"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minItems": {
               "type": "number"
             },
             "maxItems": {
               "type": "number"
             },
             "uniqueItems": {
               "type": "boolean"
             },
             "items": {
               "anyOf": [
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "enum": [
                         "number",
                         "string",
                         "boolean",
                         "integer"
                       ]
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "type": {
                       "type": "string",
                       "const": "object"
                     },
                     "required": {
                       "type": "array",
                       "items": {
                         "type": "string"
                       },
                       "minItems": 1
                     },
                     "properties": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
                 },
                 {
                   "type": "object",
                   "properties": {
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "sdfRef": {
                       "$ref": "#/definitions/sdf-pointer"
                     },
                     "description": {
                       "type": "string"
                     },
                     "$comment": {
                       "type": "string"
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "type": "number"
                     },
                     "maxLength": {
                       "type": "number"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
                 }
               ]
             },
             "description": {
               "type": "string"
             },
             "label": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "sdfRequired": {
               "$ref": "#/definitions/pointer-list"
             },
+            "units": {
+              "type": "string"
+            },
             "unit": {
               "type": "string"
             },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             },
             "nullable": {
               "type": "boolean"
             },
-            "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
-              ]
-            },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "sdfType": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
             "contentFormat": {
               "type": "string"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "type": {
+              "type": "string"
+            },
+            "enum": {
+              "type": "array",
+              "items": {
+                "$ref": "#/definitions/allowed-types"
+              },
+              "minItems": 1
+            },
+            "const": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "default": {
+              "$ref": "#/definitions/allowed-types"
+            },
+            "minimum": {
+              "type": "number"
+            },
+            "maximum": {
+              "type": "number"
+            },
+            "exclusiveMinimum": {
+              "anyOf": [
+                {
+                  "type": "boolean"
+                },
+                {
+                  "type": "number"
+                }
+              ]
+            },
+            "exclusiveMaximum": {
+              "anyOf": [
+                {
+                  "type": "boolean"
+                },
+                {
+                  "type": "number"
+                }
+              ]
+            },
+            "multipleOf": {
+              "type": "number"
+            },
+            "minLength": {
+              "type": "number"
+            },
+            "maxLength": {
+              "type": "number"
+            },
+            "pattern": {
+              "type": "string"
+            },
+            "format": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "date-time"
+                },
+                {
+                  "type": "string",
+                  "const": "date"
+                },
+                {
+                  "type": "string",
+                  "const": "time"
+                },
+                {
+                  "type": "string",
+                  "const": "uri"
+                },
+                {
+                  "type": "string",
+                  "const": "uri-reference"
+                },
+                {
+                  "type": "string",
+                  "const": "uuid"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "minItems": {
+              "type": "number"
+            },
+            "maxItems": {
+              "type": "number"
+            },
+            "uniqueItems": {
+              "type": "boolean"
+            },
+            "items": {
+              "anyOf": [
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "enum": [
+                        "number",
+                        "string",
+                        "boolean",
+                        "integer"
+                      ]
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string",
+                      "const": "object"
+                    },
+                    "required": {
+                      "type": "array",
+                      "items": {
+                        "type": "string"
+                      },
+                      "minItems": 1
+                    },
+                    "properties": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "type": "number"
+                    },
+                    "maxLength": {
+                      "type": "number"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                }
+              ]
+            },
+            "description": {
+              "type": "string"
+            },
+            "label": {
+              "type": "string"
+            },
+            "$comment": {
+              "type": "string"
+            },
+            "sdfRef": {
+              "$ref": "#/definitions/sdf-pointer"
+            },
+            "sdfRequired": {
+              "$ref": "#/definitions/pointer-list"
+            },
+            "units": {
+              "type": "string"
+            },
+            "unit": {
+              "type": "string"
+            },
+            "scaleMinimum": {
+              "type": "number"
+            },
+            "scaleMaximum": {
+              "type": "number"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            },
+            "nullable": {
+              "type": "boolean"
+            },
+            "subtype": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "sdfType": {
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "additionalProperties": {
+          }
         }
       ]
     },
     "allowed-types": {
       "anyOf": [
         {
           "type": "number"
         },
         {
           "type": "string"
         },
         {
           "type": "boolean"
         },
         {
           "type": "null"
         },
         {
           "type": "array",
           "items": {
             "type": "number"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "string"
           }
         },
         {
           "type": "array",
           "items": {
             "type": "boolean"
           }
         },
         {
           "type": "object",
           "additionalProperties": {
           }
+        },
+        {
         }
       ]
     },
     "actionqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfInputData": {
           "$ref": "#/definitions/parameter-list"
         },
+        "sdfRequiredInputData": {
+          "$ref": "#/definitions/pointer-list"
+        },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "parameter-list": {
-      "$ref": "#/definitions/dataqualities"
+      "anyOf": [
+        {
+          "$ref": "#/definitions/pointer-list"
+        },
+        {
+          "$ref": "#/definitions/dataqualities"
+        }
+      ]
     },
     "eventqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/parameter-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "productqualities": {
       "$ref": "#/definitions/thingqualities"
     }
   }
 }
]]></sourcecode>
    </section>
    <section anchor="jso-inspired" numbered="true" toc="default">
      <name>Data Qualities inspired by json-schema.org</name>
      <t>Data qualities define data used in SDF affordances at an information
model level.
A popular way to describe JSON data at a data model level is proposed
by a number of drafts on json-schema.org (which collectively are
abbreviated JSO here)); for reference to a popular version we will
point here to <xref target="I-D.handrews-json-schema-validation" format="default"/>.
As the vocabulary used by JSO is familiar to many JSON modellers, the
present specification borrows some of the terms and ports their
semantics to the information model level needed for SDF.</t>
      <t>The main data quality imported is the "<tt>type</tt>".
In SDF, this can take one of six (text string) values, which are
discussed in the following subsections (note that the JSO type
"<tt>null</tt>" is not supported as a value of this data quality in SDF).</t>
      <t>The additional quality "<tt>const</tt>" restricts the data to one specific
value (given as the value of the <tt>const</tt> quality).</t>
      <t>Similarly, the additional quality "<tt>default</tt>" provides data that can
be used in the absence of the data (given as the value of the <tt>const</tt>
quality); this is mainly documentary and not very well-defined for SDF
as no process is defined that would add default values to an instance
of something.</t>
      <section anchor="type-number-type-integer" numbered="true" toc="default">
        <name>type "<tt>number</tt>", type "<tt>integer</tt>"</name>
        <t>The types "<tt>number</tt>" and "<tt>integer</tt>" are associated with floating point
and integer numbers, as they are available in JSON.
A type value of <tt>integer</tt> means that only integer values of JSON
numbers can be used (note that <tt>10.0</tt> is an integer value, even if it
is in a notation that would also allow non-zero decimal fractions).</t>
        <t>The additional data qualities "<tt>minimum</tt>", "<tt>maximum</tt>",
"<tt>exclusiveMinimum</tt>", "<tt>exclusiveMaximum</tt>" provide number values that
serve as inclusive/exclusive lower/upper bounds for the number.
(Note that the Boolean form of
"<tt>exclusiveMinimum</tt>"/"<tt>exclusiveMaximum</tt>" found in earlier JSO drafts
is not used.)</t>
        <t>The data quality "<tt>multipleOf</tt>" gives a positive number that
constrains the data value to be an integer multiple of the number
given.
(Type "<tt>integer</tt>" can also be expressed as a "<tt>multipleOf</tt>" quality of
value 1, unless another "<tt>multipleOf</tt>" quality is present.)</t>
      </section>
      <section anchor="type-string" numbered="true" toc="default">
        <name>type "<tt>string</tt>"</name>
        <t>The type "<tt>string</tt>" is associated with Unicode text string values as
they are available in JSON.</t>
        <t>The length (as measured in characters) can be constrained by the
additional data qualities "<tt>minLength</tt>" and "<tt>maxLength</tt>", which are
inclusive bounds.
Note that the previous version of the present document explained
text string length values in bytes, which however is not meaningful
unless bound to a specific encoding (which could be UTF-8, if this
unusual behavior is to be restored).</t>
        <t>The data quality "<tt>pattern</tt>" takes a string value that is interpreted
as an <xref target="ECMA-262" format="default"/> regular expression in Unicode mode that constrain the
string (note that these are not anchored by default, so unless <tt>^</tt> and
<tt>$</tt> anchors are employed, ECMA-262 regular expressions match any string that <em>contains</em> a match).
The JSO proposals acknowledge that regular expression support is
rather diverse in various platforms, so the suggestion is to limit
them to:</t>
        <ul spacing="compact">
          <li>characters;</li>
          <li>character classes in square brackets, including ranges; their complements;</li>
          <li>simple quantifiers <tt>*</tt>, <tt>+</tt>, <tt>?</tt>, and range quantifiers <tt>{n}</tt>,
<tt>{n,m}</tt>, and <tt>{n,}</tt>;</li>
          <li>grouping parentheses;</li>
          <li>the choice operator <tt>|</tt>;</li>
          <li>and anchors (beginning-of-input <tt>^</tt> and end-of-input <tt>$</tt>).</li>
        </ul>
        <t>Note that this subset is somewhat similar to the subset introduced by
iregexps <xref target="I-D.bormann-jsonpath-iregexp" format="default"/>, which however are anchored
regular expressions, and which include certain backslash escapes for
characters and character classes.</t>
        <t>The additional data quality "<tt>format</tt>" can take one of the following
values.  Note that, at an information model level, the presence of
this data quality changes the type from being a simple text string to
the abstract meaning of the format given (i.e., the format "date-time"
is less about the specific syntax employed in <xref target="RFC3339" format="default"/> than about the usage
as an absolute point in civil time).</t>
        <ul spacing="compact">
          <li>"<tt>date-time</tt>", "<tt>date</tt>", "<tt>time</tt>":
An <xref target="RFC3339" format="default"/> <tt>date-time</tt>, <tt>full-date</tt>, or <tt>full-time</tt>, respectively.</li>
          <li>"<tt>uri</tt>", "<tt>uri-reference</tt>":
An <xref target="RFC3986" format="default"/> URI or URI Reference, respectively.</li>
          <li>"<tt>uuid</tt>": An <xref target="RFC4122" format="default"/> UUID.</li>
        </ul>
      </section>
      <section anchor="type-boolean" numbered="true" toc="default">
        <name>type "<tt>boolean</tt>"</name>
        <t>The type "<tt>boolean</tt>" can take the values "<tt>true</tt>" or "<tt>false</tt>".</t>
      </section>
      <section anchor="type-array" numbered="true" toc="default">
        <name>type "<tt>array</tt>"</name>
        <t>The type "<tt>array</tt>" is associated with arrays as they are available in
JSON.</t>
        <t>The additional quality "<tt>items</tt>" gives the type that each of the
elements of the array must match.</t>
        <t>The number of elements in the array can be constrained by the additional
data qualities "<tt>minItems</tt>" and "<tt>maxItems</tt>", which are inclusive
bounds.</t>
        <t>The additional data quality "<tt>uniqueItems</tt>" gives a Boolean value
that, if true, requires the elements to be all different.</t>
      </section>
      <section anchor="type-object" numbered="true" toc="default">
        <name>type "<tt>object</tt>"</name>
        <t>The type "<tt>object</tt>" is associated with maps, from strings to values, as
they are available in JSON ("objects").</t>
        <t>The additional quality "<tt>properties</tt>" is a map the entries of which
describe entries in the specified JSON object: The key gives an
allowable map key for the specified JSON object, and the value is a
map with a named set of data qualities giving the type for the
corresponding value in the specified JSON object.</t>
        <t>All entries specified this way are optional, unless they are listed in
the value of the additional quality "<tt>required</tt>", which is an array of
string values that give the key names of required entries.</t>
        <t>Note that the term "properties" as an additional quality for
defining map entries is unrelated to sdfProperty.</t>
      </section>
      <section anchor="implementation-notes" numbered="true" toc="default">
        <name>Implementation notes</name>
        <t>JSO-based keywords are also used in the specification techniques of a
number of ecosystems, but some adjustments may be required.</t>
        <t>E.g., <xref target="OCF" format="default"/> is based on Swagger 2.0 which appears to be based on
"draft-4" <xref target="I-D.wright-json-schema" format="default"/> (also called draft-5, but semantically intended to
be equivalent to draft-4).
The "<tt>exclusiveMinimum</tt>" and "<tt>exclusiveMaximum</tt>" keywords use the
Boolean form there, so on import to SDF their values have to be
replaced by the values of the respective "<tt>minimum</tt>"/"<tt>maximum</tt>"
keyword, which are themselves then removed; the reverse transformation
applies on export.</t>
        <t>TBD: add any useful implementation notes we can find for other
ecosystems that use JSO.</t>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements" toc="default">
      <name>Acknowledgements</name>
      <t>This draft is based on <tt>sdf.md</tt> and <tt>sdf-schema.json</tt> in the old
one-data-model <tt>language</tt> repository, as well as <contact fullname="Ari Keränen"/>'s
"alt-schema" from the Ericsson Research <tt>ipso-odm</tt> repository (which
is now under subdirectory <tt>sdflint</tt> in the one-data model <tt>tools</tt>
repository).</t>
      <!--  LocalWords:  SDF namespace defaultNamespace instantiation OMA
 -->
<!--  LocalWords:  affordances ZigBee LWM OCF sdfObject sdfThing
 -->
<!--  LocalWords:  idempotency Thingness sdfProperty sdfEvent sdfRef
 -->
<!--  LocalWords:  namespaces sdfRequired Optionality sdfAction
 -->
<!--  LocalWords:  sdfProduct dereferenced dereferencing atomicity
 -->
<!--  LocalWords:  interworking
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="A." surname="Keränen" fullname="Ari Keränen">
        <organization>Ericsson</organization>
        <address>
          <postal>
            <street/>
            <city>Jorvas</city>
            <code>02420</code>
            <country>Finland</country>
          </postal>
          <email>ari.keranen@ericsson.com</email>
        </address>
      </contact>
      <contact initials="W.v.d." surname="Beek" fullname="Wouter van der Beek">
        <organization>Cascoda Ltd.</organization>
        <address>
          <postal>
            <street>Threefield House</street>
            <street>Threefield Lane</street>
            <city>Southampton</city>
            <country>United Kingdom</country>
          </postal>
          <email>w.vanderbeek@cascoda.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
1huAS7KClAa6SFBK32LmiQ8bJnqSWcYD9m0xobBOsnIvdWNTeBVXqMdROLne
Eo962Ls920ByCai8e9ELmiVevUZ3DaGrdUAJaZm7CM/mQIUVCENiIuaN9TOA
9FkfYhKRm9YlwZIuzAFqK4Vx+JTG/PnbuDqzPmlW8vyKsifNp5QMUJzGGW26
eDwGViSZvnx3UVu6WC0RhivT2oa6setFvgYmqCjUkNBSb6RKFIkKmOS6YdXO
bILMvXnxLgV1a/WRvWQXW9OrvUeqG8HBoFq/khIZFqQUtlq/DFAVi5dZ8vi5
lhGy8pgIhkqg1mBNg2RFm3LyrRT3aJ4ztgvMeNcKfqvwzC5mLVfLlytQX3TF
rnoGO1xQsWMzQcVn2QHDjbJieMhalTRVblyQvZOV+zeXeuxIyH6YlUOtz9Oo
8dZ1dyLY0IFttMXE/lzEQSCs9KEvlPLwwnG9XZSuU2oW+eiOXcK827mEN9Jb
eWvjd4lPcJVdyxRq1atGlyIUuaJYA4FtIEgp6pZNLLlX35XWcrLVS1QNI8bV
lwQUV7yQq8Q3x3Kp9HJXC5Y/mNEu5NqrwXR6urV6zZlinSQKk1ke0Sjnyobh
skxKR9PJpKbl0GXUTUgHnMQjtxa7216rRuWfaYdnonKgbVmkVjEnRUgdf6mM
tuYi2fpSeTv+OLeuxirpJZq/gtojyBwGZD0oj48SXe3Yro0tTNpaUk66iKSs
GCjGgyDNRMs5lXojRrmFF5Cj9ir3Mci6RHQ1OpYIpMGQ39kTHXzLeKJnM7SE
GSaB0zEG+EnLPQ15pkNMJTl0JbOZnNyL7IUN7qgjpFKtNaRFvWkcxAtIvDHi
JOKcMWcuqciPS9/yB17Y10P3+4a0c5d4HEfDMTKE/izJTquzIafeELOkOzP9
pmYojXo2OznyXA8WMl1pBI/fcOdzTInnXfQSvE//9/8az7VwH1YmxToISkre
DXcx5RW5TsZnyfi13WkR31k3o/vlDkLSD9PamdYnesKOZ4U3gkbWQPZLR1aY
j1pWvCm1Zi2NjbXrt7x0ijATPCi6RYLXrjPvCD9pPFpJygeUBY+o8SKklkjI
DsGDP1hyHvSnhSDe5XVgFa4ZLEit8B6+fJrHM66xFLmaQ5hSwOvVMa7KUjMx
zlCuCoaQ4IcdeULHZaCdlK1pZkfqBTmjhHNOTjnZlQcsBx3KUxkM8PRSxydJ
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
jmqStxcLgNso+IzPoRqKaPXs+UM5D0IJwZSTgmWOB9Ez6k/fkS6G/SGfDvXO
xLbEjXGms9b3P2m+30SH1phkdy5Y6X1Uo9GbjwcfkFG7MQcYWuz0ok/qTWy3
2sJgwVbJDIA2Z1W12N/eri3rNukR/Z3Pt/nZPX3RVnr1bPNtF72UZt6PrsJp
x2vmV49ddavzygudKfxQr5y6GjRq7Zr69y53bOiz0d1Nd0133DGpb2+4dNr2
IQzf//V6BUD1iOtKuBp9Bt2oE/mDTKsd06GPea3Jern9vx6cdff4upDW7qv/
8IDW/Ol3wGjzTvgPjtLQZ7YurFJM69eDtOaFXhfOtsvqPySYoYd2XSj52N+v
BmTgN1kJo34EYPs3jzqNZ2WCAuxm0D4JOlYcdJTRv5tkUdH5NjxXtKm3fNtG
4d/yfQnZ3+HtX2tlaoLh3RYoPP35VojCCPZbvqum6NtLZT7wuqbmoob4jf2x
u3TNTv3Q1g29/rPIut+ojvMr8jxLIm3bKqBG+1ZAA22vyRUG9nnLTQV3oNk6
0PWl3vCD3zg/8C6yaJ+kuLZWve4uvnib1zca7c2QbjTa/6oabZMG2+/cuW0G
tsPwR7+z8OYh+rsDzlcxZ//N+i03DRbZazTQu1nqP5ha9ZLwp1XdwU/qbG/7
TZ3vbb/VHPHyVwutX9feVPBXT7wmZh0ollv2G6DU5conjRYruIQfBm1MpQ57
yPR3b5mo3lbTnOndYWl0Lv6wD9W9qzCzep0a8qm9J0nFefee6lHi1i5bdqz+
NRoHMOgmaDZqUsFtfbXOh7q682apRbj/O8zZReffB/lpcOr9kPJ760ti/+tI
gFt64pBcG19sipJ6AytKmhzVpRo0XpNfW39Y+QbmI6x47uUntLagfIUaR/eI
vsHrr5qP2pDR1sjeMOam32x33fLu+xrzVxzuV54dEsCvOppHVr/iuG3E+g7D
tXR1Z366wk4NhlubA76vrrxsnxt7a5dRje5W3Rr5DtKxTae3jW7S7es9rfh5
DV3fNlyt89smq3V/2+S2YW62BWwbtQlWNakn18pfm07BYLW6e4Imd3H9rDXm
Df6xoN2NsvjWUVb5wd7jEDdo6o0RVupoN4+wWvV8TyOsMgkb3atp2FASpN0N
JmKjL0X3ipargL3RBrztZV9ZWxe+uw1wo77bGOOtCeK9jdH2+Lp1gddyJq3z
QqvcbQHk7jbQb0liWI1EgLrjGhcr/OWtwKzw2Nh2K4Xz6omtavlhtuU6a7Pm
OlPD9bytwSt39bwG89oIXAV7I3DXGWEjcG+A724DbATurS/8lgVuWbukvr3V
hvFvGP+G8fvtNox/w/hvfWEF438P3lHLiNsaLW6Fwbe0Wn9exxG7CnJ62+O0
qwZYg9Pebcw6p/0wMws47YcZwue0t42gRH/HETxO+2FGsJz2tu6V065qF/DA
u8Hg8cAPtlAef/pgS/XexmjlR+1M5F112fqj26I0t6hJdwwKtyZvvkU/N6lV
d+xqte55Z52zve/VDqu7JXnKCME6SymblvW/eQe1hb3eDpkhOEFJnJugat0P
K7pbzRNv7S5s7Qrr3DjVNUN7WpLnffSlxXzeR19aBujt+qotgJQPasP9B850
8GsB/Ypxcldx6MMGy2uPfrqFdLVs0vtOp/Gx3JrkshIfm/Vfe8z3kCwR1Kl6
C0btfw2tq7WtqrVUjxXJ4f/ns5Nvjju1MPcbxPb6GcGm/nebcf9uqb03uxZv
dRfewU34Vu7B61vA36Rgb1Kw36qnTQr2f485b1KwNynYQYtNCvYmBXuTgm27
ujM/3aRgb1KwqckmBdt2uEkMWH+ETWJA2MMmMeC/YmJAGxiNZ/88EmOTgr3+
y5sU7DXB2QjcjcAN2m0E7kbg3vrCb1ngblKw1wJnw/g3jD9ot2H8G8Z/6wub
FOxNCvYmBfuW7jcp2LeMsUnBNrcJq00K9iYFu727TQp20HyTgq2N/ruk4G5S
sP97r3/twSYFW3+8MQX7RrfYJsV4k2K8STH+r5Juu0kxflfy26QYb1KMGbJN
inE43CbF+EOMu0kx3qQY13rapBjT3ybw/SGG2AS+vXabwPcm8H3rC7/ljKdN
ivEmxXiTabYRuBuB6/ewEbgbgRsMtEkx5r8N47dgbxj/OiNsGP8N8N1tgA3j
v/WFTYrxJsV4k2J8S/ebFONbxtikGJvbhNUmxXiTYtze3SbFOGj+20kxDvSu
30Jma+3Hn8IHm6To305SdG0hPNLZLMT/wez0f57s5E+8YeznoM2NhtaNBtZK
w+pWQRl2s0p/vk1v9jwTb5kEXHutSVI3qOSNabgk4Hond4el0bmfBPwBur/B
DLujfnGDuXXHnlqTgN8b27PS+j0wlpWWyJ05fGsS8H/xOdeSgN+R/G4yU+9O
yu+tLz8J+N245WpLf5Mo+87DbRJlP8S4v0Ki7F15jp8o+85c4n11VU+UXdVb
Ox9vdLdSPXp7RvHrO+NXe0utLbyigfESZVc3uW0YY7xE2dVtbKLsiiY/tf+w
CSp8iCE2QQUf1E1Q4bcfVHgPwvG3xJobGal3W7IgI/Vd6f8GJ8Gqia1quQrg
d9tl66zNmutMDe9CefLKWolJq5CykWwK9kayrTPCRrI1xthItg8r2cLUzw2H
3XDYDYfdcNg1xthw2E2O5Yal3T7ChqWFUGxYWq3Dd2Vp9Ue3Ofhv2bx3jLm5
HMt36+emzX7HrlZzxDtzwva+V7tg1sqxvHmEt8+xbPbzPpD5G8uxDLur5Viu
6mzNqFCQY/mOfQU5lu/YV5Bj+Y59bTIW38eY74ENbzIW38eY72EhmhmLd+OY
/tew8zuXSdWPckxCkys7YcKal1TZVtepvcBq41icn7nZ/kojQfP2V5qJ3re/
g9ztTi+0FNpYVVzjplOBd6pP+zZjtiS4fvAx2zLt370Q7zoHulcm1DbhaJD3
GDt33j6fwFfBtfJg+01niNYj7fZzQ2u+u+qs0Jqvt58PutPZoGZ/7WeC7nYe
qN7rUbZYVo/jKl6327iI50l7x5/4HSu44QCf3D5Au45dh/vlsnp/gAc9t/b5
zttqJVyrayO0SRSXSr9WGv2tkuu6toVrWPJO8NzJv9+m+bzb4t+pm1VBB8vb
6pwrOYetvmFc/0yMa8MAPgwDKPLJcrxiL7RPoDoDeqrPgPqF/1xH//jHP6Lo
nkGsmn/TVibNygUShRldmr+VedYvx2fJPB7kxam5ugdP+triOoroXTuCocET
g4gzyxL6SDNz/PipiafTvJjE2RjaxJWJM/iBPZoAZzTPJ8nMzGCrzwbRoVnk
i+UsLsxFfGmq3PCmHSXmz8cvX3DX2AV/8l41aWlw5+cwbgSwx4ZVUpNPzaSI
p1Vp8qwxo+7FWTo+M+N8NgPqSaEfeLNIong0KpLzNK5gEjCwOUuKZGvrwADU
xuYxI3ixhfc8KUqYjrlIzEU6m0W0XehFbHd11Yexr69hhqWpzhJzno/jEb54
yagCkHEgmMU0nqezFHqE1+bAr3nmNNUZjNHD16NFkZTATEy5SMbpNB0TKs0o
L4r8ojRlPk9w4jgQbKw5oD2bAKRFRYOnRVQCBrIqHZc4CjbzViRAa5YkEwAP
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

-->

</rfc>
