<?xml version='1.0' encoding='utf-8'?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.28 -->
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?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-02" category="info" obsoletes="" updates="" submissionType="IETF" xml:lang="en" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.5.0 -->
  <front>
    <title abbrev="OneDM SDF">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-asdf-sdf-02"/>
    <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
      <organization>SmartThings</organization>
      <address>
        <postal>
          <street>665 Clyde Avenue</street>
          <city>Mountain View</city>
          <code>94043</code>
          <country>USA</country>
        </postal>
        <phone>+1-707-502-5136</phone>
        <email>Michael.Koster@smartthings.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="February" day="08"/>
    <area>Applications</area>
    <workgroup>T2TRG</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>A JSON format representation of SDF 1.0 was defined in the previous
(-00) version of this document.  SDF 1.1 is expected to be defined in
a future version; the present document is a <em>candidate implementation
draft</em> for SDF 1.1.  If the ASDF WG reaches consensus on this
candidate, the next version will be SDF 1.1, an SDF implementation
draft.</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>
      <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>A JSON format representation of SDF 1.0 was defined in the previous
(-00) version of this document.  SDF 1.1 is expected to be defined in
a future version; the present document represents a draft on the way
from 1.0 to 1.1.  Hence, this is not an implementation draft.</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 device 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>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 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP&nbsp;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>
          <artwork type="json" name="" align="left" alt=""><![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."
                }
            }
        }
    }
}
]]></artwork>
        </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>
      </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 exactly like <tt>sdfThing</tt>).</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=[f1e406a999c33fc5aaf02f070bbfdb31]
@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.00(Sun Jan 10 11:25:05 CET 2021)
(GPL source distribution)
Java Runtime: OpenJDK Runtime Environment
JVM: OpenJDK 64-Bit Server VM
Default Encoding: US-ASCII
Language: en
Country: DE
-->
  </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" name="" align="left" alt=""><![CDATA[                ,--------.             
                |sdfThing|             
                |--------|             
                `--------'             
                     |                 
                     |                 
               ,---------.             
               |sdfObject|             
               |---------|             
               `---------'             
                     |                 
,-----------.  ,---------.   ,--------.
|sdfProperty|  |sdfAction|   |sdfEvent|
|-----------|  |---------|   |--------|
`-----------'  `---------'   `--------'
                    |                  
                                       
                ,-------.              
                |sdfData|              
                |-------|              
                `-------'              
]]></artwork>
          </artset>
        </figure>
        <t>The seven main Class Name Keywords are discussed below.</t>
        <section anchor="sdfobject" numbered="true" toc="default">
          <name>sdfObject</name>
          <t>Objects, the items listed in an <tt>sdfObject</tt> group, are the main "atom" of reusable semantics for model construction.
It aligns in scope with common definition items from many IoT modeling
systems, for example ZigBee Clusters <xref target="ZCL" format="default"/>, OMA SpecWorks LwM2M
Objects <xref target="OMA" format="default"/>, and
OCF Resource Types <xref target="OCF" format="default"/>.</t>
          <t>An <tt>sdfObject</tt> contains a set of <tt>sdfProperty</tt>, <tt>sdfAction</tt>, and
<tt>sdfEvent</tt> definitions that describe the interaction affordances
associated with some scope of functionality.</t>
          <t>For the granularity of definition, <tt>sdfObject</tt> definitions are meant
to be kept narrow enough in scope to enable broad reuse and
interoperability.
For example, defining a light bulb using separate <tt>sdfObject</tt>
definitions for on/off control, dimming, and color control affordances
will enable interoperable functionality to be configured for diverse
product types.
An <tt>sdfObject</tt> definition for a common on/off control may be used to
control may different kinds of Things that require on/off control.</t>
        </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
a number of elements proposed for the drafts 4 and 7 of the json-schema.org "JSON Schema"
format <xref target="I-D.handrews-json-schema-validation" format="default"/>, enhanced by qualities that are specific to SDF.
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>sdfPoperty</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.</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>
        <artwork type="json" name="" align="left" alt=""><![CDATA[
"namespace": {
  "cap": "https://example.com/capability/cap",
  "zcl": "https://zcl.example.com/sdf"
},
"defaultNamespace": "cap",
]]></artwork>
        <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>
          <artwork type="json" name="" align="left" alt=""><![CDATA[
"sdfObject": {
  "foo": {
    "sdfProperty": {
      "bar": {
        "type": "boolean"
      }
    }
  }
}
]]></artwork>
        </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>
        <artwork type="json" name="" align="left" alt=""><![CDATA[
"namespace": {
  "foo": "https://example.com/"
}
]]></artwork>
        <t>Then this reference to that namespace:</t>
        <artwork type="json" name="" align="left" alt=""><![CDATA[
{ "sdfRef": "foo:#/sdfData/temperatureData" }
]]></artwork>
        <t>references the global name:</t>
        <artwork type="json" name="" align="left" alt=""><![CDATA[
"https://example.com/#/sdfData/temperatureData"
]]></artwork>
        <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>
        <artwork type="json" name="" align="left" alt=""><![CDATA[
"temperatureProperty": {
  "sdfRef": "#/sdfData/temperatureData"
}
]]></artwork>
        <t>creates a new definition "temperatureProperty" that contains all of the qualities defined in the definition at /sdfData/temperatureData.</t>
      </section>
      <section anchor="sdfrequired" numbered="true" toc="default">
        <name>sdfRequired</name>
        <t>The value of "sdfRequired" is an array of name references, each
pointing to one declaration the instantiation of which is declared mandatory.</t>
        <section anchor="optionality-using-the-keyword-sdfrequired" numbered="true" toc="default">
          <name>Optionality using the keyword "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 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 "temperatureData", 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>
            <artwork type="json" name="" align="left" alt=""><![CDATA[
{
  "sdfObject": {
    "temperatureWithAlarm": {
      "sdfRequired": [
        "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData",
        "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent"
      ],
      "sdfData":{
        "temperatureData": {
          "type": "number"
        }
      },
      "sdfEvent": {
        "overTemperatureEvent": {
          "sdfOutputData": {
            "type": "object",
            "properties": {
              "alarmType": {
                "sdfRef": "cap:/sdfData/alarmTypes/quantityAlarms",
                "const": "OverTemperatureAlarm"
              },
              "temperature": {
                "sdfRef": "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData"
              }
            }
          }
        }
      }
    }
  }
}
]]></artwork>
          </figure>
        </section>
      </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="sdfdataqual1" format="default"/> lists data qualities borrowed from <xref target="I-D.handrews-json-schema-validation" format="default"/>; the
intention is that these qualities retain their semantics from the
versions of the json-schema.org proposal they were imported from.
A description that starts with a parenthesized term means the quality
is only applicable when <tt>type</tt> has the value of the term.</t>
        <t><xref target="sdfdataqual2" format="default"/> lists data qualities defined specifically for the
present specification.</t>
        <t>The term "allowed types" stands for primitive JSON types, JSON maps ("objects")" as well as
homogeneous arrays of numbers, text, Booleans, or maps.  (This list might be
extended in a future version of SDF.)  An "allowed value" is a value
allowed for one of these types.</t>
        <table anchor="sdfdataqual1" align="center">
          <name>Qualities of sdfProperty and sdfData borrowed from json-schema.org</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">type</td>
              <td align="left">"number" / "string" / "boolean" / "integer" / "array" / "object"</td>
              <td align="left">JSON data type (note 1)</td>
            </tr>
            <tr>
              <td align="left">const</td>
              <td align="left">allowed value</td>
              <td align="left">specifies a constant value for a data item or property</td>
            </tr>
            <tr>
              <td align="left">default</td>
              <td align="left">allowed value</td>
              <td align="left">specifies the default value for initialization</td>
            </tr>
            <tr>
              <td align="left">minimum</td>
              <td align="left">number</td>
              <td align="left">(number) lower limit of value</td>
            </tr>
            <tr>
              <td align="left">maximum</td>
              <td align="left">number</td>
              <td align="left">(number) upper limit of value</td>
            </tr>
            <tr>
              <td align="left">exclusiveMinimum</td>
              <td align="left">number or boolean (jso draft 7/4)</td>
              <td align="left">(number) lower limit of value</td>
            </tr>
            <tr>
              <td align="left">exclusiveMaximum</td>
              <td align="left">number or boolean (jso draft 7/4)</td>
              <td align="left">(number) lower limit of value</td>
            </tr>
            <tr>
              <td align="left">multipleOf</td>
              <td align="left">number</td>
              <td align="left">(number) resolution of the number [NEEDED?]</td>
            </tr>
            <tr>
              <td align="left">minLength</td>
              <td align="left">integer</td>
              <td align="left">(string) shortest length string in octets</td>
            </tr>
            <tr>
              <td align="left">maxLength</td>
              <td align="left">integer</td>
              <td align="left">(string) longest length string in octets</td>
            </tr>
            <tr>
              <td align="left">pattern</td>
              <td align="left">string</td>
              <td align="left">(string) regular expression to constrain a string pattern</td>
            </tr>
            <tr>
              <td align="left">format</td>
              <td align="left">"date-time" / "date" / "time" / "uri" / "uri-reference" / "uuid"</td>
              <td align="left">(string) JSON Schema formats as per <xref target="I-D.handrews-json-schema-validation" format="default"/>, Section 7.3</td>
            </tr>
            <tr>
              <td align="left">minItems</td>
              <td align="left">number</td>
              <td align="left">(array) Minimum number of items in array</td>
            </tr>
            <tr>
              <td align="left">maxItems</td>
              <td align="left">number</td>
              <td align="left">(array) Maximum number of items in array</td>
            </tr>
            <tr>
              <td align="left">uniqueItems</td>
              <td align="left">boolean</td>
              <td align="left">(array) if true, requires items to be all different</td>
            </tr>
            <tr>
              <td align="left">items</td>
              <td align="left">(subset of common/data qualities; see <xref target="syntax" format="default"/></td>
              <td align="left">(array) constraints on array items</td>
            </tr>
            <tr>
              <td align="left">required</td>
              <td align="left">array of strings</td>
              <td align="left">(object) names of properties (note 2) that are required in the JSON map ("object")</td>
            </tr>
            <tr>
              <td align="left">properties</td>
              <td align="left">named set of data qualities</td>
              <td align="left">(object) entries allowed for the JSON map ("object")</td>
            </tr>
          </tbody>
        </table>
        <t>(1) A type value of <tt>integer</tt> means that only integral values of JSON
numbers can be used.</t>
        <t>(2) Note that the term "properties" as used for map entries in <xref target="I-D.handrews-json-schema-validation" format="default"/> is unrelated to sdfProperty.</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">&nbsp;</td>
              <td align="left">
                <xref target="common-qualities" format="default"/></td>
              <td align="left">&nbsp;</td>
            </tr>
            <tr>
              <td align="left">unit</td>
              <td align="left">string</td>
              <td align="left">SenML unit name as per <xref target="IANA.senml" format="default"/>, subregistry SenML Units (note 3)</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</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</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</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>
        <t>(3) note that the quality <tt>unit</tt> was called <tt>units</tt> in SDF 1.0.</t>
        <section anchor="sdftype" numbered="true" toc="default">
          <name>sdfType</name>
          <t>SDF defines a number of basic types beyond those provided by JSON or
<xref target="I-D.handrews-json-schema-validation" format="default"/>.
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 RECOMMENDED
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>
              <artwork type="json" name="" align="left" alt=""><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></artwork>
              <t>
in SDF 1.0, is often best represented as:  </t>
              <artwork type="json" name="" align="left" alt=""><![CDATA[
"sdfChoice": {
  "foo": { "description": "This is a foonly"},
  "bar": { "description": "As defined in the second world congress"},
  "baz": { "description": "From zigbee foobaz"}
}
]]></artwork>
              <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>
              <artwork type="json" name="" align="left" alt=""><![CDATA[
"type": "number",
"enum": [1, 2, 3]
]]></artwork>
              <t>
in SDF 1.0, is represented as:  </t>
              <artwork type="json" name="" align="left" alt=""><![CDATA[
"type": "number",
"sdfChoice": {
  "a-better-name-for-alternative-1": { "const": 1 },
  "alternative-2": { "const": 2 },
  "the-third-alternative": { "const": 3 }
}
]]></artwork>
              <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>
              <artwork type="json" name="" align="left" alt=""><![CDATA[
"anyOf": [
  {"type": "array", "minItems": 3, "maxItems": "3", "items": {
     "sdfRef": "rgbVal"}}
  {"type": "array", "minItems": 4, "maxItems": "4", "items": {
     "sdfRef": "cmykVal"}}
]
]]></artwork>
              <t>
in <xref target="I-D.handrews-json-schema-validation" format="default"/> can be more descriptively notated in SDF as:  </t>
              <artwork type="json" name="" align="left" alt=""><![CDATA[
"sdfChoice": {
  "rgb": {"type": "array", "minItems": 3, "maxItems": "3", "items": {
            "sdfRef": "rgbVal"}}
  "cmyk": {"type": "array", "minItems": 4, "maxItems": "4", "items": {
            "sdfRef": "cmykVal"}}
]
]]></artwork>
            </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>
          <artwork type="json" name="" align="left" alt=""><![CDATA[
"enum": ["foo", "bar", "baz"]
]]></artwork>
          <t>is syntactic sugar for</t>
          <artwork type="json" name="" align="left" alt=""><![CDATA[
"sdfChoice": {
  "foo": { "const": "foo"},
  "bar": { "const": "bar"},
  "baz": { "const": "baz"}
}
]]></artwork>
        </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">&nbsp;</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>
          </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">&nbsp;</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">&nbsp;</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&nbsp;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">&nbsp;</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">&nbsp;</td>
            </tr>
            <tr>
              <td align="left">sdfObject</td>
              <td align="left">object</td>
              <td align="left">&nbsp;</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>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="IANA.senml" target="http://www.iana.org/assignments/senml">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author>
              <organization>IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="I-D.handrews-json-schema-validation" target="http://www.ietf.org/internet-drafts/draft-handrews-json-schema-validation-02.txt">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <author initials="A" surname="Wright" fullname="Austin Wright">
              <organization/>
            </author>
            <author initials="H" surname="Andrews" fullname="Henry Andrews">
              <organization/>
            </author>
            <author initials="B" surname="Hutton" fullname="Ben Hutton">
              <organization/>
            </author>
            <date month="September" day="17" 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="RFC3986" target="https://www.rfc-editor.org/info/rfc3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee">
              <organization/>
            </author>
            <author initials="R." surname="Fielding" fullname="R. Fielding">
              <organization/>
            </author>
            <author initials="L." surname="Masinter" fullname="L. Masinter">
              <organization/>
            </author>
            <date year="2005" month="January"/>
            <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="RFC6901" target="https://www.rfc-editor.org/info/rfc6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <author initials="P." surname="Bryan" fullname="P. Bryan" role="editor">
              <organization/>
            </author>
            <author initials="K." surname="Zyp" fullname="K. Zyp">
              <organization/>
            </author>
            <author initials="M." surname="Nottingham" fullname="M. Nottingham" role="editor">
              <organization/>
            </author>
            <date year="2013" month="April"/>
            <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="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 initials="H." surname="Birkholz" fullname="H. Birkholz">
              <organization/>
            </author>
            <author initials="C." surname="Vigano" fullname="C. Vigano">
              <organization/>
            </author>
            <author initials="C." surname="Bormann" fullname="C. Bormann">
              <organization/>
            </author>
            <date year="2019" month="June"/>
            <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 initials="C." surname="Bormann" fullname="C. Bormann">
              <organization/>
            </author>
            <author initials="P." surname="Hoffman" fullname="P. Hoffman">
              <organization/>
            </author>
            <date year="2020" month="December"/>
            <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 initials="M." surname="Birbeck" fullname="Mark Birbeck">
              <organization/>
            </author>
            <author initials="S." surname="McCarron" fullname="Shane McCarron">
              <organization/>
            </author>
            <date month="December" day="16" 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 initials="V.G." surname="Cerf" fullname="V.G. Cerf">
              <organization/>
            </author>
            <date year="1969" month="October"/>
          </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="http://www.ietf.org/internet-drafts/draft-ietf-cbor-cddl-control-01.txt">
          <front>
            <title>Additional Control Operators for CDDL</title>
            <author initials="C" surname="Bormann" fullname="Carsten Bormann">
              <organization/>
            </author>
            <date month="November" day="17" year="2020"/>
            <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 did not make it into RFC 8610: ".cat"/".plus" 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-01"/>
        </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 initials="S." surname="Bradner" fullname="S. Bradner">
              <organization/>
            </author>
            <date year="1997" month="March"/>
            <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 initials="B." surname="Leiba" fullname="B. Leiba">
              <organization/>
            </author>
            <date year="2017" month="May"/>
            <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>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="I-D.irtf-t2trg-rest-iot" target="http://www.ietf.org/internet-drafts/draft-irtf-t2trg-rest-iot-06.txt">
          <front>
            <title>RESTful Design for Internet of Things Systems</title>
            <author initials="A" surname="Keranen" fullname="Ari Keranen">
              <organization/>
            </author>
            <author initials="M" surname="Kovatsch" fullname="Matthias Kovatsch">
              <organization/>
            </author>
            <author initials="K" surname="Hartke" fullname="Klaus Hartke">
              <organization/>
            </author>
            <date month="May" day="11" year="2020"/>
            <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-06"/>
        </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="RFC3339" target="https://www.rfc-editor.org/info/rfc3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <author initials="G." surname="Klyne" fullname="G. Klyne">
              <organization/>
            </author>
            <author initials="C." surname="Newman" fullname="C. Newman">
              <organization/>
            </author>
            <date year="2002" month="July"/>
            <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>
      </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>
      <artwork type="cddl" name="" align="left" alt=""><![CDATA[
start = sdf-syntax

sdf-syntax = {
 info: sdfinfo                  ; don't *require* this in flexible syntax, though
 ? 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 occurence 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
objectqualities = {
 commonqualities,
 ? 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: number
 ? scaleMaximum: 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">
   }
)
]]></artwork>
    </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>
      <artwork type="jso.json" name="" align="left" alt=""><![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",
       "required": [
         "info"
       ],
       "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"
         },
         "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": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "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": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "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"
             },
             "subtype": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "sdfType": {
-              "type": "string",
-              "enum": [
-                "byte-string",
-                "unix-time"
-              ]
-            },
-            "contentFormat": {
-              "type": "string"
-            }
-          },
-          "additionalProperties": false
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "byte-string"
+                },
+                {
+                  "type": "string",
+                  "const": "unix-time"
+                },
+                {
+                  "type": "string"
+                }
+              ]
+            },
+            "contentFormat": {
+              "type": "string"
+            }
+          },
+          "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"
     }
   }
 }
]]></artwork>
    </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 Ari Keranen'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>Cisco Systems</organization>
        <address>
          <postal>
            <street>Eastpoint Business Park</street>
            <street>Alfie Byrne Road</street>
            <city>Dublin 3</city>
            <country>Ireland</country>
          </postal>
          <email>wovander@cisco.com</email>
        </address>
      </contact>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
