<?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-rfc version 1.6.13 (Ruby 3.1.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-12" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.13.0 -->
  <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-12"/>
    <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="June" day="30"/>
    <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. 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. Tools convert this format to database formats
and other serializations as needed.</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 (-12) collects smaller changes up to 2022-06-30.
It also removes deprecated elements from SDF 1.0.</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>
  </front>
  <middle>
    <section anchor="introduction">
      <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. 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. Tools convert this format to database formats
and other serializations as needed.</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 (-12) collects smaller changes up to 2022-06-30.
It also removes deprecated elements from SDF 1.0.</cref></t>
      <section anchor="terminology-and-conventions">
        <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, 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. Objects are
similar to Things but do not allow nesting, i. e. they cannot contain
other Objects or Things. (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"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
    </section>
    <section anchor="overview">
      <name>Overview</name>
      <section anchor="example-definition">
        <name>Example Definition</name>
        <t>We start with an example for the SDF definition of a simple Object called "Switch" (<xref target="example1"/>).</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"/>, 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">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">
        <name>Elements of an SDF model</name>
        <t>The SDF language uses six predefined Class Name Keywords for modeling connected
Things which are illustrated in <xref target="fig-class-2"/>.</t>
        <figure anchor="fig-class-2">
          <name>Main classes used in SDF models</name>
          <artset>
            <artwork type="svg"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="437px" preserveAspectRatio="none" version="1.1" viewBox="0 0 542 437" width="542px">
                <defs/>
                <g>
                  <!--MD5=[f586c7dc61127226118a576b1af9a47e]
class sdfThing-->
    <g id="elem_sdfThing">
                    <rect fill="white" height="48" id="sdfThing" rx="2.5" ry="2.5" width="93" x="136.38" y="7" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="151.38" cy="23" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M153.8531,29.1431 Q153.2721,29.4419 152.6329,29.5913 Q151.9938,29.7407 151.2882,29.7407 Q148.7814,29.7407 147.4615,28.0889 Q146.1417,26.437 146.1417,23.3159 Q146.1417,20.1865 147.4615,18.5347 Q148.7814,16.8828 151.2882,16.8828 Q151.9938,16.8828 152.6412,17.0322 Q153.2887,17.1816 153.8531,17.4805 L153.8531,20.2031 Q153.2223,19.6221 152.6288,19.3523 Q152.0353,19.0825 151.4044,19.0825 Q150.0597,19.0825 149.3749,20.1492 Q148.6901,21.2158 148.6901,23.3159 Q148.6901,25.4077 149.3749,26.4744 Q150.0597,27.541 151.4044,27.541 Q152.0353,27.541 152.6288,27.2712 Q153.2223,27.0015 153.8531,26.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="165.38" y="28.291">sdfThing</text>
                    <line x1="137.38" x2="228.38" y1="39" y2="39" stroke="black" stroke-width="0.5"/>
                    <line x1="137.38" x2="228.38" y1="47" y2="47" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[c2cb69c003582447ed3e9466f0338261]
class sdfObject-->
    <g id="elem_sdfObject">
                    <rect fill="white" height="48" id="sdfObject" rx="2.5" ry="2.5" width="97" x="205.38" y="132" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="220.38" cy="148" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M222.8531,154.1431 Q222.2721,154.4419 221.6329,154.5913 Q220.9938,154.7407 220.2882,154.7407 Q217.7814,154.7407 216.4615,153.0889 Q215.1417,151.437 215.1417,148.3159 Q215.1417,145.1865 216.4615,143.5347 Q217.7814,141.8828 220.2882,141.8828 Q220.9938,141.8828 221.6412,142.0322 Q222.2887,142.1816 222.8531,142.4805 L222.8531,145.2031 Q222.2223,144.6221 221.6288,144.3523 Q221.0353,144.0825 220.4044,144.0825 Q219.0597,144.0825 218.3749,145.1492 Q217.6901,146.2158 217.6901,148.3159 Q217.6901,150.4077 218.3749,151.4744 Q219.0597,152.541 220.4044,152.541 Q221.0353,152.541 221.6288,152.2712 Q222.2223,152.0015 222.8531,151.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="234.38" y="153.291">sdfObject</text>
                    <line x1="206.38" x2="301.38" y1="164" y2="164" stroke="black" stroke-width="0.5"/>
                    <line x1="206.38" x2="301.38" y1="172" y2="172" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[79be1817db664391ee5ba2fd11c31888]
class sdfProperty-->
    <g id="elem_sdfProperty">
                    <rect fill="white" height="48" id="sdfProperty" rx="2.5" ry="2.5" width="111" x="29.38" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="44.38" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M46.8531,279.1431 Q46.2721,279.4419 45.6329,279.5913 Q44.9938,279.7407 44.2882,279.7407 Q41.7814,279.7407 40.4615,278.0889 Q39.1417,276.437 39.1417,273.3159 Q39.1417,270.1865 40.4615,268.5347 Q41.7814,266.8828 44.2882,266.8828 Q44.9938,266.8828 45.6412,267.0322 Q46.2887,267.1816 46.8531,267.4805 L46.8531,270.2031 Q46.2223,269.6221 45.6288,269.3523 Q45.0353,269.0825 44.4044,269.0825 Q43.0597,269.0825 42.3749,270.1492 Q41.6901,271.2158 41.6901,273.3159 Q41.6901,275.4077 42.3749,276.4744 Q43.0597,277.541 44.4044,277.541 Q45.0353,277.541 45.6288,277.2712 Q46.2223,277.0015 46.8531,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="58.38" y="278.291">sdfProperty</text>
                    <line x1="30.38" x2="139.38" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="30.38" x2="139.38" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[bdacf205fe3695f723a4cfa5db06fd81]
class sdfAction-->
    <g id="elem_sdfAction">
                    <rect fill="white" height="48" id="sdfAction" rx="2.5" ry="2.5" width="97" x="363.38" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="378.38" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M380.8531,279.1431 Q380.2721,279.4419 379.6329,279.5913 Q378.9938,279.7407 378.2882,279.7407 Q375.7814,279.7407 374.4615,278.0889 Q373.1417,276.437 373.1417,273.3159 Q373.1417,270.1865 374.4615,268.5347 Q375.7814,266.8828 378.2882,266.8828 Q378.9938,266.8828 379.6412,267.0322 Q380.2887,267.1816 380.8531,267.4805 L380.8531,270.2031 Q380.2223,269.6221 379.6288,269.3523 Q379.0353,269.0825 378.4044,269.0825 Q377.0597,269.0825 376.3749,270.1492 Q375.6901,271.2158 375.6901,273.3159 Q375.6901,275.4077 376.3749,276.4744 Q377.0597,277.541 378.4044,277.541 Q379.0353,277.541 379.6288,277.2712 Q380.2223,277.0015 380.8531,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="392.38" y="278.291">sdfAction</text>
                    <line x1="364.38" x2="459.38" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="364.38" x2="459.38" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[ccecbd8aeb25c61fe37a32079d0173e2]
class sdfEvent-->
    <g id="elem_sdfEvent">
                    <rect fill="white" height="48" id="sdfEvent" rx="2.5" ry="2.5" width="90" x="175.88" y="257" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="190.88" cy="273" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M193.3531,279.1431 Q192.7721,279.4419 192.1329,279.5913 Q191.4938,279.7407 190.7882,279.7407 Q188.2814,279.7407 186.9615,278.0889 Q185.6417,276.437 185.6417,273.3159 Q185.6417,270.1865 186.9615,268.5347 Q188.2814,266.8828 190.7882,266.8828 Q191.4938,266.8828 192.1412,267.0322 Q192.7887,267.1816 193.3531,267.4805 L193.3531,270.2031 Q192.7223,269.6221 192.1288,269.3523 Q191.5353,269.0825 190.9044,269.0825 Q189.5597,269.0825 188.8749,270.1492 Q188.1901,271.2158 188.1901,273.3159 Q188.1901,275.4077 188.8749,276.4744 Q189.5597,277.541 190.9044,277.541 Q191.5353,277.541 192.1288,277.2712 Q192.7223,277.0015 193.3531,276.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="204.88" y="278.291">sdfEvent</text>
                    <line x1="176.88" x2="264.88" y1="289" y2="289" stroke="black" stroke-width="0.5"/>
                    <line x1="176.88" x2="264.88" y1="297" y2="297" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[154484d28240d22ab997079d2c9ce9cd]
class sdfData-->
    <g id="elem_sdfData">
                    <rect fill="white" height="48" id="sdfData" rx="2.5" ry="2.5" width="84" x="236.88" y="382" stroke="black" stroke-width="0.5"/>
                    <ellipse cx="251.88" cy="398" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                    <path d="M254.3531,404.1431 Q253.7721,404.4419 253.1329,404.5913 Q252.4938,404.7407 251.7882,404.7407 Q249.2814,404.7407 247.9615,403.0889 Q246.6417,401.437 246.6417,398.3159 Q246.6417,395.1865 247.9615,393.5347 Q249.2814,391.8828 251.7882,391.8828 Q252.4938,391.8828 253.1412,392.0322 Q253.7887,392.1816 254.3531,392.4805 L254.3531,395.2031 Q253.7223,394.6221 253.1288,394.3523 Q252.5353,394.0825 251.9044,394.0825 Q250.5597,394.0825 249.8749,395.1492 Q249.1901,396.2158 249.1901,398.3159 Q249.1901,400.4077 249.8749,401.4744 Q250.5597,402.541 251.9044,402.541 Q252.5353,402.541 253.1288,402.2712 Q253.7223,402.0015 254.3531,401.4204 Z " fill="black"/>
                    <text fill="black" font-family="sans-serif" font-size="14" x="265.88" y="403.291">sdfData</text>
                    <line x1="237.88" x2="319.88" y1="414" y2="414" stroke="black" stroke-width="0.5"/>
                    <line x1="237.88" x2="319.88" y1="422" y2="422" stroke="black" stroke-width="0.5"/>
                  </g>
                  <!--MD5=[474ac19abf738d5435f62202b2040a8c]
link sdfThing to sdfObject-->
    <g id="link_sdfThing_sdfObject">
                    <path d="M196.23,55.14 C208.08,75.67 225.41,105.69 237.98,127.46 " fill="none" id="sdfThing-to-sdfObject" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="240.58,131.97,239.5426,122.1759,238.0793,127.6403,232.615,126.177,240.58,131.97" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="222.88" y="98.5684">hasObject</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="216.5869" y="121.1064">0+</text>
                  </g>
                  <!--MD5=[84a99f3e6ba5135b350f4e647ff40b17]
link sdfThing to sdfThing-->
    <g id="link_sdfThing_sdfThing">
                    <path d="M229.78,19.45 C248.59,18.79 264.38,22.64 264.38,31 C264.38,38.57 251.41,42.45 234.98,42.62 " fill="none" id="sdfThing-to-sdfThing" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="229.78,42.55,238.7219,46.6782,234.7795,42.6214,238.8362,38.679,229.78,42.55" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="270.38" y="36.0684">hasThing</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="237.2916" y="40.6834">0+</text>
                  </g>
                  <!--MD5=[aafb040aa9bcf4f28b2a9ddbf948d7af]
link sdfThing to sdfProperty-->
    <g id="link_sdfThing_sdfProperty">
                    <path d="M136.24,47.85 C99.47,63.1 50.71,90.1 27.88,132 C6,172.15 36.48,222.48 60.61,252.89 " fill="none" id="sdfThing-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="63.81,256.86,61.2602,247.3469,60.6657,252.9724,55.0401,252.3779,63.81,256.86" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="28.88" y="161.0684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="38.1046" y="246.3604">0+</text>
                  </g>
                  <!--MD5=[1d7f3d7beec3cd9affa0abce6a6b2567]
link sdfThing to sdfAction-->
    <g id="link_sdfThing_sdfAction">
                    <path d="M229.38,49.49 C250.37,58.49 274.89,70.61 294.88,85 C357.38,129.99 386.13,138.55 414.88,210 C420.13,223.05 420.02,238.6 418.33,251.72 " fill="none" id="sdfThing-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="417.58,256.8,422.8497,248.4795,418.3091,251.8534,414.9352,247.3129,417.58,256.8" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="400.88" y="161.0684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="398.7344" y="246.285">0+</text>
                  </g>
                  <!--MD5=[72d56d283d4f06699a13f84f73fb0c30]
link sdfThing to sdfEvent-->
    <g id="link_sdfThing_sdfEvent">
                    <path d="M164.53,55.07 C136.67,93.12 90.31,170.42 123.88,227 C129.59,236.63 150.24,248.49 171.03,258.55 " fill="none" id="sdfThing-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="175.74,260.8,169.3441,253.3105,171.2286,258.6442,165.8949,260.5287,175.74,260.8" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="121.88" y="161.0684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="149.7882" y="254.3227">0+</text>
                  </g>
                  <!--MD5=[c9f4ee01ef3119b1a79851932bb5a9a6]
link sdfObject to sdfProperty-->
    <g id="link_sdfObject_sdfProperty">
                    <path d="M205.22,177.82 C187.33,186.53 167.43,197.55 150.88,210 C134.41,222.39 118.48,239.1 106.4,253.09 " fill="none" id="sdfObject-to-sdfProperty" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="103.1,256.95,111.9849,252.7006,106.3457,253.1467,105.8996,247.5074,103.1,256.95" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="151.88" y="223.5684">hasProperty</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="87.5779" y="246.081">0+</text>
                  </g>
                  <!--MD5=[ec9a56bd8655f4d1893aa031ec22e05c]
link sdfObject to sdfAction-->
    <g id="link_sdfObject_sdfAction">
                    <path d="M283.59,180.14 C310.52,201.1 350.16,231.95 378.24,253.81 " fill="none" id="sdfObject-to-sdfAction" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="382.29,256.97,377.6481,248.2836,378.3455,253.8973,372.7319,254.5948,382.29,256.97" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="342.88" y="223.5684">hasAction</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="353.9189" y="246.1064">0+</text>
                  </g>
                  <!--MD5=[e82b08c6210a768f8efa9371b7de17ad]
link sdfObject to sdfEvent-->
    <g id="link_sdfObject_sdfEvent">
                    <path d="M247.67,180.14 C242.21,200.49 234.24,230.19 228.41,251.91 " fill="none" id="sdfObject-to-sdfEvent" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="227.06,256.97,233.2411,249.3023,228.3465,252.1384,225.5104,247.2438,227.06,256.97" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="239.88" y="223.5684">hasEvent</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.3021" y="246.1064">0+</text>
                  </g>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M380.75,305.1 C369.18,314.08 356.14,324.68 344.88,335 C330.26,348.4 315.01,364.43 302.85,377.76 " fill="none" id="sdfAction-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="299.18,381.81,308.1824,377.8153,302.5327,378.1006,302.2474,372.451,299.18,381.81" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="345.88" y="348.5684">hasInputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="284.0756" y="371.2976">0+</text>
                  </g>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <g id="link_sdfAction_sdfData">
                    <path d="M429.37,305.05 C438.09,319.54 444.86,338.07 434.88,352 C410.43,386.13 362.73,398.55 326.48,402.93 " fill="none" id="sdfAction-to-sdfData-1" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="321.22,403.52,330.6095,406.4928,326.1889,402.9631,329.7185,398.5425,321.22,403.52" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="439.88" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="328.7606" y="399.6454">0+</text>
                  </g>
                  <!--MD5=[1d999dc69acbeb1774ac85a19f512fd6]
link sdfEvent to sdfData-->
    <g id="link_sdfEvent_sdfData">
                    <path d="M209.53,305.09 C204.25,319.26 200.56,337.41 207.88,352 C213.43,363.07 222.51,372.42 232.35,380.03 " fill="none" id="sdfEvent-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="236.6,383.19,231.746,374.6204,232.5812,380.2152,226.9863,381.0505,236.6,383.19" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="208.88" y="348.5684">hasOutputData</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="210.7478" y="376.1409">0+</text>
                  </g>
                  <!--MD5=[0c4745fb3134cadd1f7ab6e63b3ea9cc]
link sdfProperty to sdfData-->
    <g id="link_sdfProperty_sdfData">
                    <path d="M89.17,305.07 C93.14,320.32 100.52,339.7 113.88,352 C146.15,381.73 195.19,394.79 231.43,400.52 " fill="none" id="sdfProperty-to-sdfData" stroke="black" stroke-width="1.0"/>
                    <polygon fill="black" points="236.68,401.31,228.3744,396.0168,231.7355,400.5669,227.1855,403.928,236.68,401.31" stroke="black" stroke-width="1.0"/>
                    <text fill="black" font-family="sans-serif" font-size="13" x="114.88" y="348.5684">isInstanceOf</text>
                    <text fill="black" font-family="sans-serif" font-size="13" x="220.7394" y="396.8099">1</text>
                  </g>
                  <!--MD5=[27dee1531c147366aefb4bf4059fa9f3]
@startuml

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

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

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

sdfEvent - -> "0+" sdfData : hasOutputData

sdfProperty - -> "1" sdfData : isInstanceOf

class sdfThing {
}

class sdfObject {
}

class sdfProperty {
}

class sdfAction {
}

class sdfEvent {
}

class sdfData {
}

@enduml

PlantUML version 1.2022.5(Sat Apr 30 12:55:52 CEST 2022)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: UTF-8
Language: en
Country: DE
-->
  </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[                  ,--------.           
                  |sdfThing|           
                  |--------|           
                  `--------'           
                                       
                                       
            ,---------.                
            |sdfObject|                
            |---------|                
            `---------'                
                                       
,-----------.  ,---------.   ,--------.
|sdfProperty|  |sdfAction|   |sdfEvent|
|-----------|  |---------|   |--------|
`-----------'  `---------'   `--------'
                    |                  
                                       
                ,-------.              
                |sdfData|              
                |-------|              
                `-------'              
]]></artwork>
          </artset>
        </figure>
        <t>The six main Class Name Keywords are discussed below.</t>
        <section anchor="sdfobject">
          <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"/>, OMA SpecWorks LwM2M
Objects <xref target="OMA"/>, and
OCF Resource Types <xref target="OCF"/>.</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">
          <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 include the definitions from <tt>sdfData</tt> groups, however, they actually also declare a Property with the given qualities to be potentially present in the containing Object.</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"/>.
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">
          <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">
          <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">
          <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">
          <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.
<tt>sdfThing</tt> groups, however, also allow for including interaction
affordances, <tt>sdfData</tt>, as well as <tt>minItems</tt> and <tt>maxItems</tt> qualities.
Therefore, they can be seen as a superset of <tt>sdfObject</tt> groups, additionally
allowing for composition.</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>
      <section anchor="member-names-given-names-and-quality-names">
        <name>Member names: Given Names and Quality Names</name>
        <t>SDF models are JSON objects (maps) that mostly employ JSON objects as
member values, which in turn mostly employ JSON objects as their
member values, and so on.
This nested structure of JSON objects creates a tree, where the edges
are the member names (map keys) used in these JSON objects.
(In certain cases, where member names are not needed, JSON arrays may
be interspersed in this tree.)</t>
        <section anchor="given-names-and-quality-names">
          <name>Given Names and Quality Names</name>
          <t>For any particular JSON object in an SDF model, the set of member
names that are used is either of:</t>
          <ul spacing="normal">
            <li>A set of "<em>Quality Names</em>", where the entries in the object are
Qualities.  Quality Names are defined by the present specification
and its extensions, together with specific semantics to be
associated with the member value given with a certain Quality Name.</li>
            <li>A set of "<em>Given Names</em>", where the entries in the object are separate
entities (definitions, declarations, etc.) that each have names that
are chosen by the SDF model author in order that these names can be
employed by a user of that model.</li>
          </ul>
          <t>In a path from the root of the tree to any leaf, Quality Names and
Given Names roughly alternate (with the information block,
<xref target="information-block"/>, as a prominent exception).</t>
          <t>The meaning of the JSON object that is the member value associated
with a Given Name is derived from the Quality Name that was used as
the member name associated to the parent.
In the CDDL grammar given in <xref target="syntax"/>, JSON objects with member names that are
Given Names are defined using the CDDL generic rule reference <tt>named&lt;objectmembers&gt;</tt>,
where <tt>objectmembers</tt> is in turn the structure of the members of the
JSON object that is the value of the member named by the Given Name.
As quality-named objects and given-named objects roughly alternate in
a path down the tree, <tt>objectmembers</tt> is usually an object built from
Quality Names.</t>
        </section>
        <section anchor="hierarchical-names">
          <name>Hierarchical Names</name>
          <t>From the outside of a specification, Given Names are usually used as
part of a hierarchical name that looks like a JSON pointer <xref target="RFC6901"/>,
itself generally rooted in (used as the fragment identifier in) an
outer namespace that looks like an <tt>https://</tt> URL (see <xref target="names-and-namespaces"/>).</t>
          <t>As Quality Names and Given Names roughly alternate in a path into the
model, the JSON pointer part of the hierarchical name also alternates
between Quality Names and Given Names.</t>
        </section>
        <section anchor="extensibility-of-given-names-and-quality-names">
          <name>Extensibility of Given Names and Quality Names</name>
          <t>In SDF, both Quality Names and Given Names are <em>extension points</em>.
This is more obvious for Quality Names: Extending SDF is mostly done
by defining additional qualities.  To enable non-conflicting third
party extensions to SDF, an extension is planned that will allow the
use of qualified names (names with an embedded colon) as Quality
Names.
Until that extension is defined, Quality Names with (one or more)
embedded colons are reserved and <bcp14>MUST NOT</bcp14> be used in an SDF model.</t>
          <t>Further, to enable Given Names to have a more powerful role in building
global hierarchical names, an extension is planned that makes use of
qualified names for Given Names.
So, until that extension is defined, Given Names with (one or more)
embedded colons are reserved and <bcp14>MUST NOT</bcp14> be used in an SDF model.</t>
        </section>
      </section>
    </section>
    <section anchor="sdf-structure">
      <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>An 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">
        <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"/>.</t>
        <table anchor="infoblockqual">
          <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</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>The version quality is used to indicate version information about the set of definitions in the file.
The version is <bcp14>RECOMMENDED</bcp14> 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"/> <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"/> for an example).
This specification does not give a strict definition for the format of the version string but each using system or organization should define internal structure and semantics to the level needed for their use.
If no further details are provided, a <tt>date-time</tt> or <tt>full-date</tt> in this field can be assumed to indicate the latest update time of the definitions in the file.</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"/> 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">
        <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">
          <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">
        <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"/>:</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">
      <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">
        <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"/>, with a scheme of "https" and a path (<tt>hier-part</tt> in <xref target="RFC3986"/>).
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"/>.</t>
      </section>
      <section anchor="contributing-global-names">
        <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"/>, 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"/>) from the fragment identifier part.</t>
      </section>
      <section anchor="referencing-global-names">
        <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"/> (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"/>
and the prefixes to ASCII characters <xref target="RFC0020"/>.</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"/>.
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">
        <name>sdfRef</name>
        <t>In a JSON map establishing a definition, the keyword "sdfRef" is used
to copy all of the qualities and enclosed definitions 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-01"/>.)</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 or to add new qualities or definitions.</t>
        <t>When processing sdfRef, if the target definition contains also sdfRef (i.e., is based on yet another definition), that <bcp14>MUST</bcp14> be processed as well.</t>
        <t>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"/> 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"/> allows specifying the
null values that are necessary to remove members in a merge-patch.</t>
        <section anchor="resolved-models">
          <name>Resolved models</name>
          <t>A model where all sdfRef references are processed as described in <xref target="sdfref"/> is called a resolved model.</t>
          <t>For example, given the following sdfData definitions:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "sdfRef" : "#/sdfData/Coordinate",
    "description": "Distance from the base of the Thing along the X axis."
  },
  "Non-neg-X-Coordinate" : {
    "sdfRef": "#/sdfData/X-Coordinate",
    "minimum": 0
  }
}
]]></sourcecode>
          <t>After resolving the definitions would look as follows:</t>
          <sourcecode type="json"><![CDATA[
"sdfData": {
  "Coordinate" : {
    "type": "number", "unit": "m"
  },
  "X-Coordinate" : {
    "description": "Distance from the base of the Thing along the X axis.",
    "type": "number", "unit": "m"
  },
  "Non-neg-X-Coordinate" : {
    "description": "Distance from the base of the Thing along the X axis.",
    "minimum": 0, "type": "number", "unit": "m"
  }
}
]]></sourcecode>
        </section>
      </section>
      <section anchor="sdfrequired">
        <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"/> 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">
        <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"/>.  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"/>) of the JSON
pointer to the definition can be used.</t>
        <table anchor="tbl-common-qualities">
          <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"/>)</td>
            </tr>
            <tr>
              <td align="left">sdfRequired</td>
              <td align="left">pointer-list</td>
              <td align="left">(see <xref target="sdfrequired"/>, applies to qualities of properties, of data)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-qualities">
        <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"/> 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"/> lists data qualities defined specifically for the
present specification.</t>
        <table anchor="sdfdataqual2">
          <name>SDF-defined Qualities of 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"/></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">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 (note 3)</td>
              <td align="left">N/A</td>
            </tr>
            <tr>
              <td align="left">sdfType</td>
              <td align="left">string (<xref target="sdftype"/>)</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"/>)</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"/> Registry
or the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="RFC8798"/> Registry in <xref target="IANA.senml"/>
as specified by
Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>, 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"/>); 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>
          <li>The <tt>contentFormat</tt> quality follows the Content-Format-Spec as defined in
<xref section="6" sectionFormat="of" target="RFC9193"/>, allowing for expressing both numeric and string
based Content-Formats.</li>
        </ol>
        <section anchor="sdftype">
          <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-01"/> 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-01"/>, 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"/>.
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">
            <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"/>)</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"/>)</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">
          <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).
Dataqualities that are specified at the same level as the sdfChoice
apply to all choices in the sdfChoice, except those specific choices
where the dataquality is overridden at the choice level.</t>
          <t>sdfChoice merges the functions of two constructs found in <xref target="I-D.handrews-json-schema-validation-01"/>:</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-01"/> 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-01"/> 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-01"/>.</t>
          <t>As a simplification for readers of SDF specifications accustomed to
the <xref target="I-D.handrews-json-schema-validation-01"/> 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">
      <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"/>.</t>
      <section anchor="sdfobject-1">
        <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"/>.
None of these
qualities are required or have default values that are assumed if the
quality is absent.</t>
        <table anchor="sdfobjqual">
          <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"/></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">
        <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"/>, additional qualities are shown in <xref target="sdfpropqual"/>.</t>
        <table anchor="sdfpropqual">
          <name>Qualities of sdfProperty</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">(data)</td>
              <td align="left"> </td>
              <td align="left">
                <xref target="data-qualities"/></td>
              <td align="left"> </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>
          </tbody>
        </table>
      </section>
      <section anchor="sdfaction">
        <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"/>.</t>
        <table anchor="sdfactqual">
          <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"/></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"/>, 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">
        <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"/>.</t>
        <table anchor="sdfevqual">
          <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"/></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"/>, 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">
        <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"/>.</t>
      </section>
    </section>
    <section anchor="high-level-composition">
      <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">
        <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">
        <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">
          <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"/>:  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><![CDATA[
"sdfData":
  "length" : {
    "type": "number",
    "minimum": 0,
    "unit": "m"
    "description": "There can be no negative lengths."
  }
...
  "cable-length" : {
    "sdfRef": "#/sdfData/length"
    "minimum": 5e-2,
    "description": "Cables must be at least 5 cm."
  }
]]></artwork>
          </figure>
        </section>
      </section>
      <section anchor="sdfthing-1">
        <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
(see <xref target="exa-sdfthing-outlet-strip"/> in {outlet-strip-example}} for an example SDF model).</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.
An <tt>sdfThing</tt> can also contain Interaction Affordances and sdfData itself, such
as a status (on/off) for the refrigerator-freezer as a whole (see
<xref target="exa-sdfthing-fridge-freezer"/> in <xref target="fridge-freezer-example"/> for an example SDF
model illustrating these aspects).</t>
        <t>An sdfThing may be composed of sdfObjects and other sdfThings.</t>
        <t>The qualities of sdfThing are shown in <xref target="sdfthingqual"/>.</t>
        <table anchor="sdfthingqual">
          <name>Qualities of sdfThing</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"/></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>
            <tr>
              <td align="left">sdfProperty</td>
              <td align="left">property</td>
              <td align="left">zero or more named property definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfAction</td>
              <td align="left">action</td>
              <td align="left">zero or more named action definitions for this thing</td>
            </tr>
            <tr>
              <td align="left">sdfEvent</td>
              <td align="left">event</td>
              <td align="left">zero or more named event definitions for this thing</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 sdfThing instances in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of sdfThing instances in array</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <section anchor="media-type">
        <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"/></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"/> of RFC XXXX</t>
          </dd>
          <dt>Interoperability considerations:</dt>
          <dd>
            <t>none</t>
          </dd>
          <dt>Published specification:</dt>
          <dd>
            <t><xref target="media-type"/> 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"/>.</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">
        <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"/>" registry, following the template in
<xref target="RFC3553"/>:</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"/> Registry and the <xref section="Secondary Units" relative="#secondary-units" sectionFormat="bare" target="IANA.senml"/> Registry in <xref target="IANA.senml"/> as specified by Sections <xref target="RFC8428" section="4.5.1" sectionFormat="bare"/> and <xref target="RFC8428" section="12.1" sectionFormat="bare"/> of <xref target="RFC8428"/> and <xref section="3" sectionFormat="of" target="RFC8798"/>,
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"/>) is required of
any characters in unit names as required by ABNF rule "pchar" in
<xref section="3.3" sectionFormat="of" target="RFC3986"/>, specifically at the time of writing for the
unit names "%" (deprecated in favor of "/"), "%RH", "%EL".</t>
          </dd>
        </dl>
      </section>
      <section anchor="registries">
        <name>Registries</name>
        <t>(TBD: After future additions, check if we need any.)</t>
      </section>
    </section>
    <section anchor="seccons">
      <name>Security Considerations</name>
      <t>Some wider issues are discussed in <xref target="RFC8576"/>.</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 abbrev="IANA">Internet Assigned Numbers Authority</organization>
            </author>
            <date day="1" month="June" year="2018"/>
          </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 abbrev="IANA">Internet Assigned Numbers Authority</organization>
            </author>
            <date day="19" month="May" year="2003"/>
          </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="RFC9193" target="https://www.rfc-editor.org/info/rfc9193">
          <front>
            <title>Sensor Measurement Lists (SenML) Fields for Indicating Data Value Content-Format</title>
            <author fullname="A. Keränen" initials="A." surname="Keränen">
              <organization/>
            </author>
            <author fullname="C. Bormann" initials="C." surname="Bormann">
              <organization/>
            </author>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Sensor Measurement Lists (SenML) media types support multiple types of values, from numbers to text strings and arbitrary binary Data Values. In order to facilitate processing of binary Data Values, this document specifies a pair of new SenML fields for indicating the content format of those binary Data Values, i.e., their Internet media type, including parameters as well as any content codings applied.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9193"/>
          <seriesInfo name="DOI" value="10.17487/RFC9193"/>
        </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" role="editor"/>
            <author fullname="Shane McCarron" role="editor"/>
            <date day="16" month="December" year="2010"/>
          </front>
          <seriesInfo name="W3C NOTE" value="NOTE-curie-20101216"/>
          <seriesInfo name="W3C" 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-01" target="https://www.ietf.org/archive/id/draft-handrews-json-schema-validation-01.txt">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author fullname="Austin Wright" initials="A." surname="Wright">
         </author>
            <author fullname="Henry Andrews" initials="H." surname="Andrews">
              <organization>Cloudflare, Inc.</organization>
            </author>
            <author fullname="Geraint Luff" initials="G." surname="Luff">
         </author>
            <date day="19" month="March" year="2018"/>
            <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-01"/>
        </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-09.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="26" month="February" year="2022"/>
            <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-09"/>
        </reference>
        <reference anchor="ZCL" target="http://dx.doi.org/10.1016/b978-0-7506-8597-9.00006-9">
          <front>
            <title>The ZigBee Cluster Library</title>
            <author>
              <organization>Elsevier</organization>
            </author>
          </front>
          <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-04.txt">
          <front>
            <title>I-Regexp: An Interoperable Regexp Format</title>
            <author fullname="Carsten Bormann">
              <organization>Universität Bremen TZI</organization>
            </author>
            <author fullname="Tim Bray">
              <organization>Textuality</organization>
            </author>
            <date day="25" month="April" year="2022"/>
            <abstract>
              <t>   This document specifies I-Regexp, a flavor of regular expressions
   that is limited in scope with the goal of interoperation across many
   different regular-expression libraries.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-bormann-jsonpath-iregexp-04"/>
        </reference>
      </references>
    </references>
    <section anchor="syntax">
      <name>Formal Syntax of SDF</name>
      <t>This appendix describes the syntax of SDF using CDDL <xref target="RFC8610"/>.  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"/>.
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
 ? sdfObject: named<objectqualities> ; Object is a set of Properties, Actions, and Events that together perform a particular function
 paedataqualities                 ; Includes Properties, Actions, and Events as well as sdfData
 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
)

arraydefinitionqualities = (
 ? ("minItems" .feature "1.2") => uint
 ? ("maxItems" .feature "1.2") => uint
)

paedataqualities = (
 ? 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
)

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

; for single objects, or for arrays of objects (1.2)
objectqualities = {
 commonqualities
 paedataqualities
 arraydefinitionqualities
 EXTENSION-POINT<"object-ext">
}

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 = {
 commonqualities
 jsonschema
 ? ("units" .feature "1.0") => text
 ? ("unit" .feature "1.1") => text
 ? ("scaleMinimum" .feature "1.0") => number
 ? ("scaleMaximum" .feature "1.0") => number
 ? 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">
}

propertyqualities = {
 ? observable: bool
 ? readable: bool
 ? writable: bool
 ~dataqualities
}

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

jsonschema = (
 ? (("type" => "number" / "string" / "boolean" / "integer" / "array")
    // compound-type
    // (type: text .feature "type-ext")                       ; EXTENSION-POINT
   )
 ? ("sdfChoice" .feature "1.1") => named<dataqualities> ; if present, all other qualities apply to all choices
 ? "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: uint
 ? maxLength: uint
 ? pattern: text                ; regexp
 ? format: "date-time" / "date" / "time"
           / "uri" / "uri-reference" / "uuid"
           / (text .feature "format-ext")                       ; EXTENSION-POINT
 ; array constraints
 ? minItems: uint
 ? maxItems: uint
 ? 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
        // (type: text .feature "itemtype-ext")                       ; EXTENSION-POINT
       )
     ? ("sdfChoice" .feature "1.1") => named<dataqualities>
     ; jso subset
     ? minimum: number
     ? maximum: number
     ? "enum" => [+ text] ; limited to text strings in SDF 1.1
     ? ("enum" .feature "1.0") => [+ any]
     ? format: text
     ? minLength: uint
     ? maxLength: uint
     EXTENSION-POINT<"items-ext">
   }
)
]]></sourcecode>
    </section>
    <section anchor="json-schemaorg-rendition-of-sdf-syntax">
      <name>json-schema.org Rendition of SDF Syntax</name>
      <t>This appendix describes the syntax of SDF defined in <xref target="syntax"/>, but
using a version of the description techniques advertised on
json-schema.org <xref target="I-D.handrews-json-schema-validation-01"/>.</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 -- Generated: 2022-06-30T19:06:20Z",
+  "title": "sdf-framework.cddl -- Generated: 2022-06-30T19:06:20Z",
   "$schema": "http://json-schema.org/draft-07/schema#",
   "$ref": "#/definitions/sdf-syntax",
   "definitions": {
     "sdf-syntax": {
       "type": "object",
       "properties": {
         "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"
           }
         },
         "info": {
           "$ref": "#/definitions/sdfinfo"
         },
         "namespace": {
           "type": "object",
           "additionalProperties": {
             "type": "string"
           }
         },
         "defaultNamespace": {
           "type": "string"
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         }
       },
-      "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": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "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"
           }
         },
         "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": {
         "minItems": {
           "$ref": "#/definitions/uint"
         },
         "maxItems": {
           "$ref": "#/definitions/uint"
         },
         "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"
           }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "propertyqualities": {
       "anyOf": [
         {
           "type": "object",
           "properties": {
             "type": {
               "type": "string",
               "enum": [
                 "number",
                 "string",
                 "boolean",
                 "integer",
                 "array"
               ]
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+            },
             "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"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "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"
               }
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+            },
             "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"
             },
             "observable": {
               "type": "boolean"
             },
             "readable": {
               "type": "boolean"
             },
             "writable": {
               "type": "boolean"
             }
           },
-          "additionalProperties": false
-        }
-      ]
-    },
-    "dataqualities": {
-      "anyOf": [
+          "additionalProperties": {
+          }
+        },
         {
           "type": "object",
           "properties": {
             "type": {
-              "type": "string",
-              "enum": [
-                "number",
-                "string",
-                "boolean",
-                "integer",
-                "array"
-              ]
+              "type": "string"
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
-                }
-              ]
-            },
-            "description": {
-              "type": "string"
-            },
-            "label": {
-              "type": "string"
-            },
-            "$comment": {
-              "type": "string"
-            },
-            "sdfRef": {
-              "$ref": "#/definitions/sdf-pointer"
-            },
-            "sdfRequired": {
-              "$ref": "#/definitions/pointer-list"
-            },
-            "unit": {
-              "type": "string"
-            },
-            "nullable": {
-              "type": "boolean"
-            },
-            "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
-              ]
-            },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+            },
+            "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"
+            },
+            "observable": {
+              "type": "boolean"
+            },
+            "readable": {
+              "type": "boolean"
+            },
+            "writable": {
+              "type": "boolean"
+            }
+          },
+          "additionalProperties": {
+          }
+        }
+      ]
+    },
+    "dataqualities": {
+      "anyOf": [
+        {
+          "type": "object",
+          "properties": {
+            "type": {
+              "type": "string",
+              "enum": [
+                "number",
+                "string",
+                "boolean",
+                "integer",
+                "array"
+              ]
+            },
+            "sdfChoice": {
+              "type": "object",
+              "additionalProperties": {
+                "$ref": "#/definitions/dataqualities"
+              }
+            },
+            "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": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "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": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "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"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+            },
+            "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": {
+          }
+        },
+        {
+          "type": "object",
+          "properties": {
+            "type": {
+              "type": "string",
+              "const": "object"
+            },
+            "required": {
+              "type": "array",
+              "items": {
+                "type": "string"
+              },
+              "minItems": 1
+            },
+            "properties": {
+              "type": "object",
+              "additionalProperties": {
+                "$ref": "#/definitions/dataqualities"
+              }
+            },
+            "sdfChoice": {
+              "type": "object",
+              "additionalProperties": {
+                "$ref": "#/definitions/dataqualities"
+              }
+            },
+            "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": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxLength": {
+              "$ref": "#/definitions/uint"
+            },
+            "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": {
+              "$ref": "#/definitions/uint"
+            },
+            "maxItems": {
+              "$ref": "#/definitions/uint"
+            },
+            "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"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+            },
+            "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": 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"
-              }
+              "type": "string"
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxLength": {
               "$ref": "#/definitions/uint"
             },
             "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": {
               "$ref": "#/definitions/uint"
             },
             "maxItems": {
               "$ref": "#/definitions/uint"
             },
             "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "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"
                     },
                     "sdfChoice": {
                       "type": "object",
                       "additionalProperties": {
                         "$ref": "#/definitions/dataqualities"
                       }
                     },
                     "minimum": {
                       "type": "number"
                     },
                     "maximum": {
                       "type": "number"
                     },
                     "enum": {
                       "type": "array",
-                      "items": {
-                        "type": "string"
-                      },
                       "minItems": 1
                     },
                     "format": {
                       "type": "string"
                     },
                     "minLength": {
                       "$ref": "#/definitions/uint"
                     },
                     "maxLength": {
                       "$ref": "#/definitions/uint"
                     }
                   },
-                  "additionalProperties": false
+                  "additionalProperties": {
+                  }
+                },
+                {
+                  "type": "object",
+                  "properties": {
+                    "type": {
+                      "type": "string"
+                    },
+                    "sdfRef": {
+                      "$ref": "#/definitions/sdf-pointer"
+                    },
+                    "description": {
+                      "type": "string"
+                    },
+                    "$comment": {
+                      "type": "string"
+                    },
+                    "sdfChoice": {
+                      "type": "object",
+                      "additionalProperties": {
+                        "$ref": "#/definitions/dataqualities"
+                      }
+                    },
+                    "minimum": {
+                      "type": "number"
+                    },
+                    "maximum": {
+                      "type": "number"
+                    },
+                    "enum": {
+                      "type": "array",
+                      "minItems": 1
+                    },
+                    "format": {
+                      "type": "string"
+                    },
+                    "minLength": {
+                      "$ref": "#/definitions/uint"
+                    },
+                    "maxLength": {
+                      "$ref": "#/definitions/uint"
+                    }
+                  },
+                  "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"
+            },
             "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": {
+          }
         }
       ]
     },
     "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": {
           }
+        },
+        {
         }
       ]
     },
     "uint": {
       "type": "integer",
       "minimum": 0
     },
     "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": {
+      }
     }
   }
 }
]]></sourcecode>
    </section>
    <section anchor="jso-inspired">
      <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-01"/>.
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">
        <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">
        <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"/> 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"/>, 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"/> 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"/> <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"/> URI or URI Reference, respectively.</li>
          <li>"<tt>uuid</tt>": An <xref target="RFC4122"/> UUID.</li>
        </ul>
      </section>
      <section anchor="type-boolean">
        <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">
        <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">
        <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">
        <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"/> is based on Swagger 2.0 which appears to be based on
"draft-4" <xref target="I-D.wright-json-schema"/> (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 anchor="composition-examples">
      <name>Composition Examples</name>
      <t>This appendix contains two examples illustrating different composition approaches
using the <tt>sdfThing</tt> quality.</t>
      <section anchor="outlet-strip-example">
        <name>Outlet Strip Example</name>
        <figure anchor="exa-sdfthing-outlet-strip">
          <artwork><![CDATA[
{
  "sdfThing": {
    "outlet-strip" : {
      "label": "An outlet Strip",
      "description": "Contains a number of Sockets",
      "sdfObject": {
        "socket": {
          "label": "An array of sockets in the outlet strip",
          "minItems": 2,
          "maxItems": 10
        }
      }
    }
  }
}
]]></artwork>
        </figure>
      </section>
      <section anchor="fridge-freezer-example">
        <name>Refrigerator-Freezer Example</name>
        <figure anchor="exa-sdfthing-fridge-freezer">
          <artwork><![CDATA[
{
  "sdfThing": {
    "refrigerator-freezer" : {
      "label": "A refrigerator combined with a freezer",
      "sdfProperty": {
        "status": {
          "type": "boolean",
          "label": {
            "Indicates if the refrigerator-freezer combination is powered"
          }
        }
      },
      "sdfObject": {
        "refrigerator": {
          "label": "A refrigerator compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": 8
            }
          }
        },
        "freezer": {
          "label": "A freezer compartment",
          "sdfProperty": {
            "temperature": {
              "sdfRef": "#/sdfProproperty/temperature",
              "maximum": -6
            }
          }
        }
      },
    }
  },
  "sdfProperty": {
    "temperature": {
      "label": "The temperature for this compartment",
      "type": "integer",
      "unit": "C"
    }
  }
}
]]></artwork>
        </figure>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgements">
      <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:  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="J." surname="Romann" fullname="Jan Romann">
        <organization>Universität Bremen</organization>
        <address>
          <email>jan.romann@uni-bremen.de</email>
        </address>
      </contact>
      <contact initials="W." surname="van der 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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
APdli1WkY+YM+ti//oouFbGVSbxMkSawb9t6U+cpO7tt0aJWDA0vI9Bz6fKa
nG4enQJqMElLHEh2CfmM5uDp92+fvnxz8upl75tXJy/fDqznGc9fQpvzNOaS
6d5VVXTNJXlQ0LXbWD8+vy6XbBDpdiYJFdEvO6HK5N8TSlxINAi6KdTIS3oF
1kF/317wF6Tu021stRsMhxiFiTx+VOUXMR7HlGIzXXHgNcY48MeI7BgYq1Lq
8d3wWiEteiYzRMdZqQWwEj6r2+nBQnccwPVlp3Otqvol53g1LmdC4VFX3PMR
GJNFZX5DVcQZDPJsymf44SoyvyWtkcwN/NC0Nh9xIFFvTbViIkUVuqw0xsXC
jbJL8aAvLrbdaklRAKgwlLuWk1H3a7QzvsJf6lfSH5EJgr+oGWtfUaOXDN2v
FEL1q9ci2RKyY6ZDFF/lp4loyxynuYgvZRx2EelA/Ko30iM9uuo78FsPoCKV
SL4vs1sdU66ro9wGeGlEwXct0hLBwySsBNJcjJNM7g9eN7B3yFXzEE1t2/66
U+VzorKvomsiDSIBoQvyKbh1kHJE7gFee1egz8U9AgoAErUvNYbD7t14j8wb
TFsYLSoJrNlL+7hCmdSTzD23CCD8e7NzhswGj4y/Sy7ZUvFqhaEN/f1uxGv4
/Vc4G/MJN//NV/A2DFyHa4KtdqDVDjXr6/ae7OIrqDjtAuYpsqq+pToH5Y2l
pfp/w+M9Mn3Q/5L3c76wtSdfQOS/fWWevPqXKCi9/xvz50/8gv8/0HK/efPt
U7R5XPGtM+bTMV2VDroLvoxVNH9LG8/V7PCK/GMq1njGBN2bwT5L59PkP/EW
rf/8S35ZAiG+60P7Pvsb2L3riBBww1vUerGPwssPiDCX3+NAlIGB2uZr+vKK
Cxoe2XPMQAmw4NibXsTQ2uGjTa9ikF3/Opkc+Xi3jxl5R+EFCTTADW5DiEDL
I0+e81c2MLvjik844gOpctghAlzA8NJMi1IsbQajNZiIjOI5p5XFqQs6YHLW
g+1lLbLsRynEcUFbS1PChFwQgAdhZqRDsLcl4NeIQfFfEycdA5rJeuK9jifL
6pe0gAqYYPpZMcTT6/mIr2nQ5KtgeGJ/Ojp5pWuD4/Ds1/bTMrPaMQsUDey4
XjcgslYdL0D8Vx5JkkIbpoGmCY/kVyDl8qWst7GxtOHfI295XGSBuKo7lYee
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
TffbVNjlgKzva5sK63d10zlvU2G3qbDbVNhtKuw2FXbFcNtU2FrP21RYv+E2
FXabk9L+9jYnZdlctzkpLcS1zUnZ5qRsU2Frf9tUWHp1mwq7GThbtWOrdiyf
61bt2Kod1OqfR+1ovHDdDJEFD+qDNPjiGg/nmt5cvtPt+gn46O268oRNvaMN
hMwGfXuKymYDhPlOq0eweUq3Q0KQCbSsK+vwWTvpv3cCyloa36aIr4Gc3t6m
iG9TxDec7TZF3Ad1myLuxvulpYh/SAZmmAq7hoWtzUQOe3Mq0+36WcXybtjV
crlwY3nQ3renMm02QKgyrR7hw1PEm/3cBTL/wVLEw+4CxXBZV1YxXAPaNkX8
Dsa8Awbla+jbhfg7LkQzV/t2vKSWq33L/Rrkat+yryBX+4Z9+V/Djm+cPK0f
ZWG0t5ak7U91hOZ+CHpfqcGvtOKWWm9ridtZyQ0SdMkGzZ+W7xUvuaD5m0u7
bv4madc35z/LTaO1JtEN9LkPMoGu10C/zExYZx547tlNAa1lEtcBbQ6x3PJo
4z1lO8+5OSwtKrBLmv4I3a+wNm+o36ywKm/YU2vS9J1J13bW2AbI+r6WWsc3
ll+tSdP/w+dcS5q+JfmtssY3t4rbyPqj9OsnTd9OVVnu6NgmFt96uG1i8ccY
92dILL4pL/ITi++Ue3yMbuuJxbc0KZaqUx/OQH7+iMxyJ/JyHd82Wa7r2ybr
hlmt+9s2NrF4SZPGQUv+20aWPsYQ28jSsrluI0vbyNKtx2t7/M+bMrCcFhsZ
vDdbvmJFlKcBzLp9scK1smxiS/nTR9l9m6zN/yCmvZXvW/m+4Wy38t0HdSvf
3Xhb+R422qYEbhm733DL2LeMPYRiy9g3A2KbEkittymB0sM2JXCbEhj+/bNl
om1TAu9izDtYiNumBPpfb5ks57399095W+1tbMldXCEwbpOotWbFb5eTtdrC
+4fPjNvm9W0I6Davr737bV7fckDW97XN6/O7uumct3l927y+Dxpzm9e3zevb
5vVt8/q2eX3b8NA2PLTxbLfhIR/UbXjIjffLDw/9AuL+27w+18M2r2/T6W7l
+1a+bzjbrXz3Qd3KdzfeVr6HjbZ5fVvG7jfcMvYtYw+h2DL2zYDY5vVR621e
n/Swzevb5vWFf/9s6WTbvL67GPODFqIB4K2uZfe/Xt/gwvJP1zesJQC2zuHv
f9V4wy25ugp9sarufl27q/9+kwuway3qgNR1xNVQ13C3DG6L93qDpSvcnMdG
JkN9cmsFYB0XYevtfeoNQNdymu196tv71Ffe6vaPebf49j7125Lf9j717X3q
8rdNj9ymR/5PTo+sPdjep76iu+196tv71G8y5vZi0/aG24tNtxebhj1sLzb1
xvsHv9j09sG/NjAaz345cnN7n/rmL2/vU98QnK3asVU7ls91q3Zs1Q5qtVU7
tsmk/tvbZNJtMumGs90mk/qgbpNJ3Xi/tGTS9Y/WubXXqMw3jKK5ZNLb9bNK
xb55+scSO+TG9kd738tt2I2SSesj3FUyadjaJpPWQVyHzH/sZNKwdZBMumyi
SyMe22TSf8gcRj+Z9C4j8z6WW+PlS/GxXf+Nx7yDuOsvMYdVP8rcdE6dMKnM
m0tbGLU9+7XhnVifMNvAy/pXmkxy/TvIfW/0QotHd5kXd5Vz5kbJwx8yZgtd
ffQx26TU7bOkN/EDLi3G2oSjTt6kAvtUrcC427z1F2eC7df3yAghDO9FXze5
pb71VertZvujXaXd8N1lauyGr7errjdSW5v9taurN1NV672eZPNF9QRs9U27
jYt4lrR3/KnfsYIbDvDp+gHaz2vV4X61qO4O8KDn1j5vvTc39ZN4L7SJJScG
NxKBa8XfdW0L17DkaW43cvO06Vm3W/wbdbPM92QZZJ39Jeew1beM65fEuLYM
4E4ZQMT/uY7+9re/RdE9g0gw/6ZgmTQr57iGZnhp/lLmWa8cnSWzuJ8Xp+bq
HjzpaYvrKKJ37ZQMTTYxOE+zKKGPNDNvnjwz8WSSF+M4G0GbuDJxBj+wXxLg
jWb5OJmaKezMaT86NvN8vpjGhbmIL02VG95jw8T88c2rl9w1dsGfvFdNWhrc
qDmMGwHssWE11OQTMy7iSVWaPGvMaOfiLB2dmVE+ncJip9APvFkkUTwcFsl5
GlcwCRjYnCVFsrv7yADUxubaInixhfc8KUqYjrlIzEU6nUZE3fQitru66sHY
19cww9JUZ4k5z0fxEF+8ZFQByDgQzGISz9JpCj3CazNgrzxzmuoUxuji69G8
SErY+6acJ6N0ko4IlWaYF0V+UZoynyU4cRwI9sEM0J6NAdKiosHTIioBA1mV
jkocBZt5KxKgNUuSMYCHE4el7EfRW2g8i2Flx27xL006w95xyXl6nQHuo0Gn
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
CzrJQa97Zyf8/wOm2J6OMUoCAA==

-->

</rfc>
