<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.17 -->
<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc comments="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-asdf-sdf-09" category="std" consensus="true" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.11.1 -->
  <front>
    <title abbrev="OneDM SDF">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-09"/>
    <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="2021" month="November" day="06"/>
    <area>Applications</area>
    <workgroup>ASDF</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <t>The Semantic Definition Format (SDF) is a format for domain experts to
use in the creation and maintenance of data and interaction models in
the Internet of Things.  It was created as a common language for use
in the development of the One Data Model liaison organization (OneDM)
definitions.  Tools convert this format to database formats and other
serializations as needed.</t>
      <t>An SDF specification describes definitions of SDF Objects and their
associated interactions (Events, Actions, Properties), as well as the
Data types for the information exchanged in those interactions.</t>
      <t><cref anchor="status">A JSON format representation of SDF 1.0 was defined in
version (-00) of this document; version (-05) was designated as an
<em>implementation draft</em>, labeled SDF 1.1, at the IETF110 meeting of
the ASDF WG (2021-03-11).
The present version (-09) adds a URN namespace for registered
measurement unit names.</cref></t>
    </abstract>
    <note>
      <name>Contributing</name>
      <t>Recent versions of this document are available at its GitHub
repository <eref target="https://github.com/ietf-wg-asdf/SDF">https://github.com/ietf-wg-asdf/SDF</eref> -- this also provides
an issue tracker as well as a way to supply "pull requests".</t>
      <t>General discussion of this SDF Internet-Draft happens on the mailing
list of the IETF ASDF Working Group, asdf@ietf.org (subscribe at
<eref target="https://www.ietf.org/mailman/listinfo/asdf">https://www.ietf.org/mailman/listinfo/asdf</eref>).</t>
      <t>The IETF Note Well applies (<eref target="https://www.ietf.org/about/note-well/">https://www.ietf.org/about/note-well/</eref>).</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <!-- Just copying the abstract, for now... -->

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

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

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

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

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

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

sdfEvent - -> "1+" sdfData : hasOutputData

sdfProperty - -> "1" sdfData : isInstanceOf

class sdfThing {
}

class sdfObject {
}

class sdfProperty {
}

class sdfAction {
}

class sdfEvent {
}

class sdfData {
}

@enduml

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

   The present document defines a number of control operators that were
   not yet ready at the time RFC 8610 was completed: .plus, .cat and
   .det for the construction of constants, .abnf/.abnfb for including
   ABNF (RFC 5234/RFC 7405) in CDDL specifications, and .feature for
   indicating the use of a non-basic feature in an instance.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-cbor-cddl-control-07"/>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner">
              <organization/>
            </author>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba">
              <organization/>
            </author>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol  specifications.  This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the  defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC3553" target="https://www.rfc-editor.org/info/rfc3553">
          <front>
            <title>An IETF URN Sub-namespace for Registered Protocol Parameters</title>
            <author fullname="M. Mealling" initials="M." surname="Mealling">
              <organization/>
            </author>
            <author fullname="L. Masinter" initials="L." surname="Masinter">
              <organization/>
            </author>
            <author fullname="T. Hardie" initials="T." surname="Hardie">
              <organization/>
            </author>
            <author fullname="G. Klyne" initials="G." surname="Klyne">
              <organization/>
            </author>
            <date month="June" year="2003"/>
            <abstract>
              <t>This document describes a new sub-delegation for the 'ietf' URN namespace for registered protocol items.  The 'ietf' URN namespace is defined in RFC 2648 as a root for persistent URIs that refer to IETF- defined resources.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="73"/>
          <seriesInfo name="RFC" value="3553"/>
          <seriesInfo name="DOI" value="10.17487/RFC3553"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.handrews-json-schema-validation" target="https://www.ietf.org/archive/id/draft-handrews-json-schema-validation-02.txt">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author fullname="Austin Wright">
	 </author>
            <author fullname="Henry Andrews">
	 </author>
            <author fullname="Ben Hutton">
              <organization>Wellcome Sanger Institute</organization>
            </author>
            <date day="17" month="September" year="2019"/>
            <abstract>
              <t>   JSON Schema (application/schema+json) has several purposes, one of
   which is JSON instance validation.  This document specifies a
   vocabulary for JSON Schema to describe the meaning of JSON documents,
   provide hints for user interfaces working with JSON data, and to make
   assertions about what a valid document must look like.

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

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

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

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

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

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

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

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

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

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

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

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

productqualities = thingqualities ; ISSUE: get rid of sdfProduct?

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

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

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

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

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

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

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

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

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

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

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false">
      <name>Contributors</name>
      <contact initials="A." surname="Keränen" fullname="Ari Keränen">
        <organization>Ericsson</organization>
        <address>
          <postal>
            <street/>
            <city>Jorvas</city>
            <code>02420</code>
            <country>Finland</country>
          </postal>
          <email>ari.keranen@ericsson.com</email>
        </address>
      </contact>
      <contact initials="W.v.d." surname="Beek" fullname="Wouter van der Beek">
        <organization>Cascoda Ltd.</organization>
        <address>
          <postal>
            <street>Threefield House</street>
            <street>Threefield Lane</street>
            <city>Southampton</city>
            <country>United Kingdom</country>
          </postal>
          <email>w.vanderbeek@cascoda.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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
Tsr31pefBPx+0nK1p79JlH3v4TaJsh9i3F8gUfauMsdPlH1vKXFfXdUTZVf1
1i7HG92tNI/eXVD88sH41dFS6wuvaGC8RNnVTW4bxhgvUXZ1G5sou6LJj+0/
bDYVPsQQm00FH9TNpsKvf1PhHpTjr0k0NzJS77ZkQUbq+9L/DUGCVRNb1XIV
wO/HZeuszZrrTA3vQnnyylqJSauQstFsCvZGs60zwkazNcbYaLYPq9nC1M+N
hN1I2I2E3UjYNcbYSNhNjuVGpN0+wkakhVBsRFqtw/cVafVHtwX4b2HeO+65
uRzL9+vnJma/Y1erJeKdJWF736tDMGvlWN48wrvnWDb7uQ9k/spyLMPuajmW
qzpbc1coyLF8z76CHMv37CvIsXzPvjYZi/cx5j2I4U3G4n2MeQ8L0cxYvJvE
9L+Gnd+5TKp+lGMSmlzZCRPWvKTKtrpO7QVWG8fi/MzN9lcaCZq3v9JM9L79
HZRud3qhpdDGquIaN50KvFN92ncZsyXB9YOP2ZZp//6FeNc50L0yobYJR4O8
x9i5i/b5BL4KrpUH2286Q7QeabefG1rz3VVnhdZ8vf180J3OBjX7az8TdLfz
QPVej7LFsnoSV/G63cZFPE/aO/7U71jBDQf49PYB2m3sOtyvltX9AR703Nrn
e7PVSrhW10Zo0ygulX6tNPpbNdd1jYVrWPJO8Nwpvt9m+bzf4t+pm1WbDla2
1SVXcg6svhFc/0yCayMAPowAKPLJcryCF9onUJ0BPdVnQP3Cf66jf/zjH1H0
kUGsmn/TVibNygUShRldmr+VedYvx2fJPB7kxam5+gie9LXFdRTRu3YEQ4Mn
BhFnliX0kWbm+MkzE0+neTGJszG0iSsTZ/ADRzQBzmieT5KZmQGrzwbRoVnk
i+UsLsxFfGmq3DDTjhLzr8evXnLX2AV/8l41aWmQ83MYNwLYY8MmqcmnZlLE
06o0edaYUffiLB2fmXE+mwH1pNAPvFkkUTwaFcl5GlcwCRjYnCVFsrV1YABq
Y/OYEbzYwnueFCVMx1wk5iKdzSJiF3oR211d9WHs62uYYWmqs8Sc5+N4hC9e
MqoAZBwIZjGN5+kshR7htTnIa545TXUGY/Tw9WhRJCUIE1MuknE6TceESjPK
iyK/KE2ZzxOcOA4EjDUHtGcTgLSoaPC0iErAQFal4xJHwWbeigRozZJkAuDh
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

-->

</rfc>
