<?xml version='1.0' encoding='utf-8'?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="info" consensus="false" docName="draft-onedm-t2trg-sdf-00" indexInclude="true" ipr="trust200902" prepTime="2020-06-05T20:04:56" scripts="Common,Latin" sortRefs="true" submissionType="IETF" symRefs="true" tocDepth="3" tocInclude="true" xml:lang="en">
  <!-- xml2rfc v2v3 conversion 2.45.0 -->
  <front>
    <title abbrev="OneDM SDF">Semantic Definition Format (SDF) for Data and Interactions of Things</title>
    <seriesInfo name="Internet-Draft" value="draft-onedm-t2trg-sdf-00" stream="IETF"/>
    <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
      <organization showOnFrontPage="true">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" showOnFrontPage="true">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 month="06" year="2020" day="05"/>
    <area>Applications</area>
    <workgroup>T2TRG</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract pn="section-abstract">
      <t pn="section-abstract-1">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 pn="section-abstract-2">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 pn="section-abstract-3">A JSON format representation of SDF 1.0 is defined in this document.</t>
    </abstract>
    <note removeInRFC="false" pn="section-note.1">
      <name slugifiedName="name-contributing">Contributing</name>
      <t pn="section-note.1-1">Recent versions of this document are available at its GitHub
repository <eref target="https://github.com/one-data-model/sdf" brackets="none">https://github.com/one-data-model/sdf</eref> -- this also provides an issue
tracker as well as a way to supply "pull requests".</t>
      <t pn="section-note.1-2">General discussion of this SDF Internet-Draft for now will be on the mailing list of the Thing-to-Thing Research group, t2trg@irtf.org (subscribe at <eref target="https://www.irtf.org/mailman/listinfo/t2trg" brackets="none">https://www.irtf.org/mailman/listinfo/t2trg</eref>).</t>
      <t pn="section-note.1-3">The IRTF Note Well applies (<eref target="https://www.ietf.org/about/note-well/" brackets="none">https://www.ietf.org/about/note-well/</eref>).</t>
    </note>
    <boilerplate>
      <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.1">
        <name slugifiedName="name-status-of-this-memo">Status of This Memo</name>
        <t pn="section-boilerplate.1-1">
        This Internet-Draft is submitted in full conformance with the
        provisions of BCP 78 and BCP 79.
        </t>
        <t pn="section-boilerplate.1-2">
        Internet-Drafts are working documents of the Internet Engineering Task
        Force (IETF). Note that other groups may also distribute working
        documents as Internet-Drafts. The list of current Internet-Drafts is
        at <eref target="https://datatracker.ietf.org/drafts/current/" brackets="none"/>.
        </t>
        <t pn="section-boilerplate.1-3">
        Internet-Drafts are draft documents valid for a maximum of six months
        and may be updated, replaced, or obsoleted by other documents at any
        time. It is inappropriate to use Internet-Drafts as reference
        material or to cite them other than as "work in progress."
        </t>
        <t pn="section-boilerplate.1-4">
        This Internet-Draft will expire on 7 December 2020.
        </t>
      </section>
      <section anchor="copyright" numbered="false" removeInRFC="false" toc="exclude" pn="section-boilerplate.2">
        <name slugifiedName="name-copyright-notice">Copyright Notice</name>
        <t pn="section-boilerplate.2-1">
            Copyright (c) 2020 IETF Trust and the persons identified as the
            document authors. All rights reserved.
        </t>
        <t pn="section-boilerplate.2-2">
            This document is subject to BCP 78 and the IETF Trust's Legal
            Provisions Relating to IETF Documents
            (<eref target="https://trustee.ietf.org/license-info" brackets="none"/>) in effect on the date of
            publication of this document. Please review these documents
            carefully, as they describe your rights and restrictions with
            respect to this document. Code Components extracted from this
            document must include Simplified BSD License text as described in
            Section 4.e of the Trust Legal Provisions and are provided without
            warranty as described in the Simplified BSD License.
        </t>
      </section>
    </boilerplate>
    <toc>
      <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" pn="section-toc.1">
        <name slugifiedName="name-table-of-contents">Table of Contents</name>
        <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1">
          <li pn="section-toc.1-1.1">
            <t keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent="1" format="counter" sectionFormat="of" target="section-1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-introduction">Introduction</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.1.2">
              <li pn="section-toc.1-1.1.2.1">
                <t keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derivedContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-terminology-and-conventions">Terminology and Conventions</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.2">
            <t pn="section-toc.1-1.2.1"><xref derivedContent="2" format="counter" sectionFormat="of" target="section-2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-overview">Overview</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.2.2">
              <li pn="section-toc.1-1.2.2.1">
                <t keepWithNext="true" pn="section-toc.1-1.2.2.1.1"><xref derivedContent="2.1" format="counter" sectionFormat="of" target="section-2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-example-definition">Example Definition</xref></t>
              </li>
              <li pn="section-toc.1-1.2.2.2">
                <t pn="section-toc.1-1.2.2.2.1"><xref derivedContent="2.2" format="counter" sectionFormat="of" target="section-2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-elements-of-an-sdf-model">Elements of an SDF model</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.2.2.2.2">
                  <li pn="section-toc.1-1.2.2.2.2.1">
                    <t pn="section-toc.1-1.2.2.2.2.1.1"><xref derivedContent="2.2.1" format="counter" sectionFormat="of" target="section-2.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfobject">sdfObject</xref></t>
                  </li>
                  <li pn="section-toc.1-1.2.2.2.2.2">
                    <t pn="section-toc.1-1.2.2.2.2.2.1"><xref derivedContent="2.2.2" format="counter" sectionFormat="of" target="section-2.2.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfproperty">sdfProperty</xref></t>
                  </li>
                  <li pn="section-toc.1-1.2.2.2.2.3">
                    <t pn="section-toc.1-1.2.2.2.2.3.1"><xref derivedContent="2.2.3" format="counter" sectionFormat="of" target="section-2.2.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfaction">sdfAction</xref></t>
                  </li>
                  <li pn="section-toc.1-1.2.2.2.2.4">
                    <t pn="section-toc.1-1.2.2.2.2.4.1"><xref derivedContent="2.2.4" format="counter" sectionFormat="of" target="section-2.2.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfevent">sdfEvent</xref></t>
                  </li>
                  <li pn="section-toc.1-1.2.2.2.2.5">
                    <t pn="section-toc.1-1.2.2.2.2.5.1"><xref derivedContent="2.2.5" format="counter" sectionFormat="of" target="section-2.2.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfdata">sdfData</xref></t>
                  </li>
                  <li pn="section-toc.1-1.2.2.2.2.6">
                    <t pn="section-toc.1-1.2.2.2.2.6.1"><xref derivedContent="2.2.6" format="counter" sectionFormat="of" target="section-2.2.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfthing">sdfThing</xref></t>
                  </li>
                  <li pn="section-toc.1-1.2.2.2.2.7">
                    <t pn="section-toc.1-1.2.2.2.2.7.1"><xref derivedContent="2.2.7" format="counter" sectionFormat="of" target="section-2.2.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfproduct">sdfProduct</xref></t>
                  </li>
                </ul>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.3">
            <t pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter" sectionFormat="of" target="section-3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdf-structure">SDF structure</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.3.2">
              <li pn="section-toc.1-1.3.2.1">
                <t pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" format="counter" sectionFormat="of" target="section-3.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-information-block">Information block</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.2">
                <t pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" format="counter" sectionFormat="of" target="section-3.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-namespaces-section">Namespaces section</xref></t>
              </li>
              <li pn="section-toc.1-1.3.2.3">
                <t pn="section-toc.1-1.3.2.3.1"><xref derivedContent="3.3" format="counter" sectionFormat="of" target="section-3.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-definitions-section">Definitions section</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.4">
            <t pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter" sectionFormat="of" target="section-4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-names-and-namespaces">Names and namespaces</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2">
              <li pn="section-toc.1-1.4.2.1">
                <t pn="section-toc.1-1.4.2.1.1"><xref derivedContent="4.1" format="counter" sectionFormat="of" target="section-4.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-structure">Structure</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.2">
                <t pn="section-toc.1-1.4.2.2.1"><xref derivedContent="4.2" format="counter" sectionFormat="of" target="section-4.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-contributing-global-names">Contributing global names</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.3">
                <t pn="section-toc.1-1.4.2.3.1"><xref derivedContent="4.3" format="counter" sectionFormat="of" target="section-4.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-referencing-global-names">Referencing global names</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.4">
                <t pn="section-toc.1-1.4.2.4.1"><xref derivedContent="4.4" format="counter" sectionFormat="of" target="section-4.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfref">sdfRef</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.5">
                <t pn="section-toc.1-1.4.2.5.1"><xref derivedContent="4.5" format="counter" sectionFormat="of" target="section-4.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfrequired">sdfRequired</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.4.2.5.2">
                  <li pn="section-toc.1-1.4.2.5.2.1">
                    <t pn="section-toc.1-1.4.2.5.2.1.1"><xref derivedContent="4.5.1" format="counter" sectionFormat="of" target="section-4.5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-optionality-using-the-keywo">Optionality using the keyword "sdfRequired"</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.4.2.6">
                <t pn="section-toc.1-1.4.2.6.1"><xref derivedContent="4.6" format="counter" sectionFormat="of" target="section-4.6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-common-qualities">Common Qualities</xref></t>
              </li>
              <li pn="section-toc.1-1.4.2.7">
                <t pn="section-toc.1-1.4.2.7.1"><xref derivedContent="4.7" format="counter" sectionFormat="of" target="section-4.7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-data-qualities">Data Qualities</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.5">
            <t pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter" sectionFormat="of" target="section-5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-keywords-for-definition-gro">Keywords for definition groups</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.5.2">
              <li pn="section-toc.1-1.5.2.1">
                <t pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" format="counter" sectionFormat="of" target="section-5.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfobject-2">sdfObject</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.2">
                <t pn="section-toc.1-1.5.2.2.1"><xref derivedContent="5.2" format="counter" sectionFormat="of" target="section-5.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfproperty-2">sdfProperty</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.3">
                <t pn="section-toc.1-1.5.2.3.1"><xref derivedContent="5.3" format="counter" sectionFormat="of" target="section-5.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfaction-2">sdfAction</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.4">
                <t pn="section-toc.1-1.5.2.4.1"><xref derivedContent="5.4" format="counter" sectionFormat="of" target="section-5.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfevent-2">sdfEvent</xref></t>
              </li>
              <li pn="section-toc.1-1.5.2.5">
                <t pn="section-toc.1-1.5.2.5.1"><xref derivedContent="5.5" format="counter" sectionFormat="of" target="section-5.5"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfdata-2">sdfData</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.6">
            <t pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter" sectionFormat="of" target="section-6"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-high-level-composition">High Level Composition</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2">
              <li pn="section-toc.1-1.6.2.1">
                <t pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" format="counter" sectionFormat="of" target="section-6.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-paths-in-the-model-namespac">Paths in the model namespaces</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.2">
                <t pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" format="counter" sectionFormat="of" target="section-6.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-modular-composition">Modular Composition</xref></t>
                <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.6.2.2.2">
                  <li pn="section-toc.1-1.6.2.2.2.1">
                    <t pn="section-toc.1-1.6.2.2.2.1.1"><xref derivedContent="6.2.1" format="counter" sectionFormat="of" target="section-6.2.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-use-of-the-sdfref-keyword-t">Use of the "sdfRef" keyword to re-use a definition</xref></t>
                  </li>
                </ul>
              </li>
              <li pn="section-toc.1-1.6.2.3">
                <t pn="section-toc.1-1.6.2.3.1"><xref derivedContent="6.3" format="counter" sectionFormat="of" target="section-6.3"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfthing-2">sdfThing</xref></t>
              </li>
              <li pn="section-toc.1-1.6.2.4">
                <t pn="section-toc.1-1.6.2.4.1"><xref derivedContent="6.4" format="counter" sectionFormat="of" target="section-6.4"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-sdfproduct-2">sdfProduct</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.7">
            <t pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter" sectionFormat="of" target="section-7"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-references">References</xref></t>
            <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-toc.1-1.7.2">
              <li pn="section-toc.1-1.7.2.1">
                <t pn="section-toc.1-1.7.2.1.1"><xref derivedContent="7.1" format="counter" sectionFormat="of" target="section-7.1"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-normative-references">Normative References</xref></t>
              </li>
              <li pn="section-toc.1-1.7.2.2">
                <t pn="section-toc.1-1.7.2.2.1"><xref derivedContent="7.2" format="counter" sectionFormat="of" target="section-7.2"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-informative-references">Informative References</xref></t>
              </li>
            </ul>
          </li>
          <li pn="section-toc.1-1.8">
            <t pn="section-toc.1-1.8.1"><xref derivedContent="Appendix A" format="default" sectionFormat="of" target="section-appendix.a"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-formal-syntax-of-sdf">Formal Syntax of SDF</xref></t>
          </li>
          <li pn="section-toc.1-1.9">
            <t pn="section-toc.1-1.9.1"><xref derivedContent="Appendix B" format="default" sectionFormat="of" target="section-appendix.b"/>.  <xref derivedContent="" format="title" sectionFormat="of" target="name-json-schemaorg-rendition-of">json-schema.org Rendition of SDF Syntax</xref></t>
          </li>
          <li pn="section-toc.1-1.10">
            <t pn="section-toc.1-1.10.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.c"/><xref derivedContent="" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgements</xref></t>
          </li>
          <li pn="section-toc.1-1.11">
            <t pn="section-toc.1-1.11.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.d"/><xref derivedContent="" format="title" sectionFormat="of" target="name-contributors">Contributors</xref></t>
          </li>
          <li pn="section-toc.1-1.12">
            <t pn="section-toc.1-1.12.1"><xref derivedContent="" format="none" sectionFormat="of" target="section-appendix.e"/><xref derivedContent="" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xref></t>
          </li>
        </ul>
      </section>
    </toc>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="include" removeInRFC="false" pn="section-1">
      <name slugifiedName="name-introduction">Introduction</name>
      <t pn="section-1-1">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 pn="section-1-2">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 pn="section-1-3">A JSON format representation of SDF 1.0 is defined in this document.</t>
      <section anchor="terminology-and-conventions" numbered="true" toc="include" removeInRFC="false" pn="section-1.1">
        <name slugifiedName="name-terminology-and-conventions">Terminology and Conventions</name>
        <!-- Note: Should we use RFC 2119? -->

<dl newline="false" spacing="normal" pn="section-1.1-1">
          <dt pn="section-1.1-1.1">Thing:</dt>
          <dd pn="section-1.1-1.2">
  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.</dd>
          <dt pn="section-1.1-1.3">Affordance:</dt>
          <dd pn="section-1.1-1.4">
  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.</dd>
          <dt pn="section-1.1-1.5">Quality:</dt>
          <dd pn="section-1.1-1.6">
  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.</dd>
          <dt pn="section-1.1-1.7">Entry:</dt>
          <dd pn="section-1.1-1.8">
  A key-value pair in a map. (In JSON maps, sometimes also called "member".)</dd>
          <dt pn="section-1.1-1.9">Block:</dt>
          <dd pn="section-1.1-1.10">
  One or more entries in a JSON map that is part of an SDF
specification; these entries together serve a specific function.</dd>
          <dt pn="section-1.1-1.11">Group:</dt>
          <dd pn="section-1.1-1.12">
  An entry in the main SDF map and in certain nested definitions that
either has a Class Name Keyword as its key and a map of definition
entries (Definition Group) or a Parameter Name Keyword as its key
and an array of SDF pointers as a value (Parameter Group).</dd>
          <dt pn="section-1.1-1.13">Class Name Keyword:</dt>
          <dd pn="section-1.1-1.14">
  One of sdfThing, sdfProduct, sdfObject, sdfProperty, sdfAction,
sdfEvent, or sdfData; the Classes for these type keywords are
capitalized and prefixed with <tt>sdf</tt>.</dd>
          <dt pn="section-1.1-1.15">Class:</dt>
          <dd pn="section-1.1-1.16">
  Abstract term for the information that is contained in groups
identified by a Class Name Keyword.</dd>
          <dt pn="section-1.1-1.17">Property:</dt>
          <dd pn="section-1.1-1.18">
  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.)</dd>
          <dt pn="section-1.1-1.19">Action:</dt>
          <dd pn="section-1.1-1.20">
  An affordance that can potentially be used to perform a named operation on an Object.</dd>
          <dt pn="section-1.1-1.21">Event:</dt>
          <dd pn="section-1.1-1.22">
  An affordance that can potentially be used to obtain information about what happened to an Object.</dd>
          <dt pn="section-1.1-1.23">Object:</dt>
          <dd pn="section-1.1-1.24">
  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; properties in other environments; 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.)</dd>
          <dt pn="section-1.1-1.25">Parameter name keyword:</dt>
          <dd pn="section-1.1-1.26">
  One of sdfInputData, sdfOutputData, sdfRequiredInputData, or
sdfRequired.</dd>
          <dt pn="section-1.1-1.27">Element:</dt>
          <dd pn="section-1.1-1.28">
  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.)</dd>
          <dt pn="section-1.1-1.29">Definition:</dt>
          <dd pn="section-1.1-1.30">
  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.</dd>
          <dt pn="section-1.1-1.31">Declaration:</dt>
          <dd pn="section-1.1-1.32">
  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.</dd>
          <dt pn="section-1.1-1.33">Protocol Binding:</dt>
          <dd pn="section-1.1-1.34">
  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.</dd>
        </dl>
        <!-- XXX -->

<t pn="section-1.1-2">Conventions:</t>
        <ul spacing="normal" bare="false" empty="false" pn="section-1.1-3">
          <li pn="section-1.1-3.1">The singular form is chosen as the preferred one for the keywords defined here.</li>
        </ul>
        <t pn="section-1.1-4">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 14 <xref target="RFC2119" format="default" sectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="default" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      </section>
    </section>
    <section anchor="overview" numbered="true" toc="include" removeInRFC="false" pn="section-2">
      <name slugifiedName="name-overview">Overview</name>
      <section anchor="example-definition" numbered="true" toc="include" removeInRFC="false" pn="section-2.1">
        <name slugifiedName="name-example-definition">Example Definition</name>
        <t pn="section-2.1-1">We start with an example for the SDF definition of a simple Object called "Switch" (<xref target="example1" format="default" sectionFormat="of" derivedContent="Figure 1"/>).</t>
        <figure anchor="example1" align="left" suppress-title="false" pn="figure-1">
          <name slugifiedName="name-a-simple-example-of-an-sdf-">A simple example of an SDF definition file</name>
          <artwork type="json" name="" align="left" alt="" pn="section-2.1-2.1"><![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 on; equivalent to setting value to false."
                },
                "toggle": {
                    "description": "Toggle the switch; equivalent to setting value to its complement."
                }
            }
        }
    }
}
]]></artwork>
        </figure>
        <t pn="section-2.1-3">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 pn="section-2.1-4">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" sectionFormat="of" derivedContent="I-D.irtf-t2trg-rest-iot"/>, describing state.
The <tt>sdfAction</tt> group is the mechanism to describe other interactions in terms of their names, input, and output data (no data are used in the example), as in a POST method in REST or in a remote procedure call.
The example <tt>toggle</tt> is an Action that
changes the state based on the current state of the Property named <tt>value</tt>.
(The third type of affordance is Events, which are not described in this example.)</t>
      </section>
      <section anchor="elements-of-an-sdf-model" numbered="true" toc="include" removeInRFC="false" pn="section-2.2">
        <name slugifiedName="name-elements-of-an-sdf-model">Elements of an SDF model</name>
        <t pn="section-2.2-1">The SDF language uses seven predefined Class Name Keywords for modeling connected
Things, six of which are illustrated in <xref target="fig-class-1" format="default" sectionFormat="of" derivedContent="Figure 2"/> and <xref target="fig-class-2" format="default" sectionFormat="of" derivedContent="Figure 3"/> (the seventh class <tt>sdfProduct</tt> is exactly like <tt>sdfThing</tt>).</t>
        <!-- [^1]: \[Decide which of these figures we want] -->

<figure anchor="fig-class-1" align="left" suppress-title="false" pn="figure-2">
          <name slugifiedName="name-main-classes-used-in-sdf-mo">Main classes used in SDF models</name>
          <artset pn="section-2.2-2.1">
            <artwork type="svg" name="" align="left" alt="" pn="section-2.2-2.1.1"><svg xmlns="http://www.w3.org/2000/svg" class="diagram" version="1.1" height="425" width="320" viewBox="0 0 320.0 425.0">
                <g transform="translate(8,16)">
                  <path d="M 128,16 L 200,16" fill="none" stroke="black"/>
                  <path d="M 136,48 L 192,48" fill="none" stroke="black"/>
                  <path d="M 136,64 L 192,64" fill="none" stroke="black"/>
                  <path d="M 128,80 L 200,80" fill="none" stroke="black"/>
                  <path d="M 120,128 L 200,128" fill="none" stroke="black"/>
                  <path d="M 128,160 L 192,160" fill="none" stroke="black"/>
                  <path d="M 128,176 L 192,176" fill="none" stroke="black"/>
                  <path d="M 120,192 L 200,192" fill="none" stroke="black"/>
                  <path d="M 0,224 L 96,224" fill="none" stroke="black"/>
                  <path d="M 120,224 L 200,224" fill="none" stroke="black"/>
                  <path d="M 232,224 L 304,224" fill="none" stroke="black"/>
                  <path d="M 8,256 L 88,256" fill="none" stroke="black"/>
                  <path d="M 128,256 L 192,256" fill="none" stroke="black"/>
                  <path d="M 240,256 L 296,256" fill="none" stroke="black"/>
                  <path d="M 8,272 L 88,272" fill="none" stroke="black"/>
                  <path d="M 128,272 L 192,272" fill="none" stroke="black"/>
                  <path d="M 240,272 L 296,272" fill="none" stroke="black"/>
                  <path d="M 0,288 L 96,288" fill="none" stroke="black"/>
                  <path d="M 120,288 L 200,288" fill="none" stroke="black"/>
                  <path d="M 232,288 L 304,288" fill="none" stroke="black"/>
                  <path d="M 128,336 L 192,336" fill="none" stroke="black"/>
                  <path d="M 136,368 L 184,368" fill="none" stroke="black"/>
                  <path d="M 136,384 L 184,384" fill="none" stroke="black"/>
                  <path d="M 128,400 L 192,400" fill="none" stroke="black"/>
                  <path d="M 0,224 L 0,288" fill="none" stroke="black"/>
                  <path d="M 96,224 L 96,288" fill="none" stroke="black"/>
                  <path d="M 120,128 L 120,192" fill="none" stroke="black"/>
                  <path d="M 120,224 L 120,288" fill="none" stroke="black"/>
                  <path d="M 128,16 L 128,80" fill="none" stroke="black"/>
                  <path d="M 128,336 L 128,400" fill="none" stroke="black"/>
                  <path d="M 168,96 L 168,112" fill="none" stroke="black"/>
                  <path d="M 168,200 L 168,216" fill="none" stroke="black"/>
                  <path d="M 192,336 L 192,400" fill="none" stroke="black"/>
                  <path d="M 200,16 L 200,80" fill="none" stroke="black"/>
                  <path d="M 200,128 L 200,192" fill="none" stroke="black"/>
                  <path d="M 200,224 L 200,288" fill="none" stroke="black"/>
                  <path d="M 232,224 L 232,288" fill="none" stroke="black"/>
                  <path d="M 304,224 L 304,288" fill="none" stroke="black"/>
                  <path d="M 168,88 L 168,96" fill="none" stroke="black"/>
                  <path d="M 168,112 L 168,120" fill="none" stroke="black"/>
                  <path d="M 168,200 L 168,208" fill="none" stroke="black"/>
                  <text text-anchor="middle" font-family="monospace" x="88" y="244" fill="black" font-size="1em">y</text>
                  <text text-anchor="middle" font-family="monospace" x="296" y="244" fill="black" font-size="1em">t</text>
                  <text text-anchor="middle" font-family="monospace" x="136" y="244" fill="black" font-size="1em">d</text>
                  <text text-anchor="middle" font-family="monospace" x="152" y="244" fill="black" font-size="1em">A</text>
                  <text text-anchor="middle" font-family="monospace" x="152" y="36" fill="black" font-size="1em">f</text>
                  <text text-anchor="middle" font-family="monospace" x="56" y="244" fill="black" font-size="1em">p</text>
                  <text text-anchor="middle" font-family="monospace" x="40" y="244" fill="black" font-size="1em">r</text>
                  <text text-anchor="middle" font-family="monospace" x="48" y="244" fill="black" font-size="1em">o</text>
                  <text text-anchor="middle" font-family="monospace" x="192" y="244" fill="black" font-size="1em">n</text>
                  <text text-anchor="middle" font-family="monospace" x="168" y="356" fill="black" font-size="1em">a</text>
                  <text text-anchor="middle" font-family="monospace" x="184" y="356" fill="black" font-size="1em">a</text>
                  <text text-anchor="middle" font-family="monospace" x="136" y="148" fill="black" font-size="1em">d</text>
                  <text text-anchor="middle" font-family="monospace" x="176" y="148" fill="black" font-size="1em">e</text>
                  <text text-anchor="middle" font-family="monospace" x="168" y="244" fill="black" font-size="1em">t</text>
                  <text text-anchor="middle" font-family="monospace" x="248" y="244" fill="black" font-size="1em">d</text>
                  <text text-anchor="middle" font-family="monospace" x="288" y="244" fill="black" font-size="1em">n</text>
                  <text text-anchor="middle" font-family="monospace" x="152" y="356" fill="black" font-size="1em">f</text>
                  <text text-anchor="middle" font-family="monospace" x="160" y="36" fill="black" font-size="1em">T</text>
                  <text text-anchor="middle" font-family="monospace" x="144" y="244" fill="black" font-size="1em">f</text>
                  <text text-anchor="middle" font-family="monospace" x="24" y="244" fill="black" font-size="1em">f</text>
                  <text text-anchor="middle" font-family="monospace" x="32" y="244" fill="black" font-size="1em">P</text>
                  <text text-anchor="middle" font-family="monospace" x="80" y="244" fill="black" font-size="1em">t</text>
                  <text text-anchor="middle" font-family="monospace" x="128" y="244" fill="black" font-size="1em">s</text>
                  <text text-anchor="middle" font-family="monospace" x="240" y="244" fill="black" font-size="1em">s</text>
                  <text text-anchor="middle" font-family="monospace" x="184" y="148" fill="black" font-size="1em">c</text>
                  <text text-anchor="middle" font-family="monospace" x="192" y="148" fill="black" font-size="1em">t</text>
                  <text text-anchor="middle" font-family="monospace" x="168" y="148" fill="black" font-size="1em">j</text>
                  <text text-anchor="middle" font-family="monospace" x="160" y="244" fill="black" font-size="1em">c</text>
                  <text text-anchor="middle" font-family="monospace" x="160" y="356" fill="black" font-size="1em">D</text>
                  <text text-anchor="middle" font-family="monospace" x="144" y="36" fill="black" font-size="1em">d</text>
                  <text text-anchor="middle" font-family="monospace" x="160" y="148" fill="black" font-size="1em">b</text>
                  <text text-anchor="middle" font-family="monospace" x="184" y="36" fill="black" font-size="1em">n</text>
                  <text text-anchor="middle" font-family="monospace" x="192" y="36" fill="black" font-size="1em">g</text>
                  <text text-anchor="middle" font-family="monospace" x="128" y="148" fill="black" font-size="1em">s</text>
                  <text text-anchor="middle" font-family="monospace" x="176" y="244" fill="black" font-size="1em">i</text>
                  <text text-anchor="middle" font-family="monospace" x="256" y="244" fill="black" font-size="1em">f</text>
                  <text text-anchor="middle" font-family="monospace" x="272" y="244" fill="black" font-size="1em">v</text>
                  <text text-anchor="middle" font-family="monospace" x="136" y="36" fill="black" font-size="1em">s</text>
                  <text text-anchor="middle" font-family="monospace" x="168" y="36" fill="black" font-size="1em">h</text>
                  <text text-anchor="middle" font-family="monospace" x="136" y="356" fill="black" font-size="1em">s</text>
                  <text text-anchor="middle" font-family="monospace" x="144" y="356" fill="black" font-size="1em">d</text>
                  <text text-anchor="middle" font-family="monospace" x="152" y="148" fill="black" font-size="1em">O</text>
                  <text text-anchor="middle" font-family="monospace" x="8" y="244" fill="black" font-size="1em">s</text>
                  <text text-anchor="middle" font-family="monospace" x="16" y="244" fill="black" font-size="1em">d</text>
                  <text text-anchor="middle" font-family="monospace" x="64" y="244" fill="black" font-size="1em">e</text>
                  <text text-anchor="middle" font-family="monospace" x="72" y="244" fill="black" font-size="1em">r</text>
                  <text text-anchor="middle" font-family="monospace" x="184" y="244" fill="black" font-size="1em">o</text>
                  <text text-anchor="middle" font-family="monospace" x="176" y="36" fill="black" font-size="1em">i</text>
                  <text text-anchor="middle" font-family="monospace" x="144" y="148" fill="black" font-size="1em">f</text>
                  <text text-anchor="middle" font-family="monospace" x="176" y="356" fill="black" font-size="1em">t</text>
                  <text text-anchor="middle" font-family="monospace" x="264" y="244" fill="black" font-size="1em">E</text>
                  <text text-anchor="middle" font-family="monospace" x="280" y="244" fill="black" font-size="1em">e</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art" name="" align="left" alt="" pn="section-2.2-2.1.2"><![CDATA[
                +--------+
                |sdfThing|
                |--------|
                |--------|
                +--------+
                     |
                     |
               +---------+
               |sdfObject|
               |---------|
               |---------|
               +---------+
                     |
+-----------+  +---------+   +--------+
|sdfProperty|  |sdfAction|   |sdfEvent|
|-----------|  |---------|   |--------|
|-----------|  |---------|   |--------|
+-----------+  +---------+   +--------+


                +-------+
                |sdfData|
                |-------|
                |-------|
                +-------+
]]></artwork>
          </artset>
        </figure>
        <figure anchor="fig-class-2" align="left" suppress-title="false" pn="figure-3">
          <name slugifiedName="name-main-classes-used-in-sdf-mod">Main classes used in SDF models and their relations</name>
          <artset pn="section-2.2-3.1">
            <artwork type="svg" name="" align="left" alt="" pn="section-2.2-3.1.1"><svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="442px" preserveAspectRatio="none" version="1.1" viewBox="0 0 434 442" width="434px">
                <defs/>
                <g>
                  <!--MD5=[f586c7dc61127226118a576b1af9a47e]
class sdfThing-->
    <rect fill="white" height="48" id="sdfThing" width="82" x="171.5" y="8" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="186.5" cy="24" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M188.9731,30.1431 Q188.3921,30.4419 187.7529,30.5913 Q187.1138,30.7407 186.4082,30.7407 Q183.9014,30.7407 182.5815,29.0889 Q181.2617,27.437 181.2617,24.3159 Q181.2617,21.1865 182.5815,19.5347 Q183.9014,17.8828 186.4082,17.8828 Q187.1138,17.8828 187.7612,18.0322 Q188.4087,18.1816 188.9731,18.4805 L188.9731,21.2031 Q188.3423,20.6221 187.7488,20.3523 Q187.1553,20.0825 186.5244,20.0825 Q185.1797,20.0825 184.4949,21.1492 Q183.8101,22.2158 183.8101,24.3159 Q183.8101,26.4077 184.4949,27.4744 Q185.1797,28.541 186.5244,28.541 Q187.1553,28.541 187.7488,28.2712 Q188.3423,28.0015 188.9731,27.4204 Z"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="200.5" y="28.5352">sdfThing</text>
                  <line x1="172.5" x2="252.5" y1="40" y2="40" stroke="black" stroke-width="1.5"/>
                  <line x1="172.5" x2="252.5" y1="48" y2="48" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[c2cb69c003582447ed3e9466f0338261]
class sdfObject-->
    <rect fill="white" height="48" id="sdfObject" width="88" x="168.5" y="133" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="183.5" cy="149" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M185.9731,155.1431 Q185.3921,155.4419 184.7529,155.5913 Q184.1138,155.7407 183.4082,155.7407 Q180.9014,155.7407 179.5815,154.0889 Q178.2617,152.437 178.2617,149.3159 Q178.2617,146.1865 179.5815,144.5347 Q180.9014,142.8828 183.4082,142.8828 Q184.1138,142.8828 184.7612,143.0322 Q185.4087,143.1816 185.9731,143.4805 L185.9731,146.2031 Q185.3423,145.6221 184.7488,145.3523 Q184.1553,145.0825 183.5244,145.0825 Q182.1797,145.0825 181.4949,146.1492 Q180.8101,147.2158 180.8101,149.3159 Q180.8101,151.4077 181.4949,152.4744 Q182.1797,153.541 183.5244,153.541 Q184.1553,153.541 184.7488,153.2712 Q185.3423,153.0015 185.9731,152.4204 Z"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="197.5" y="153.5352">sdfObject</text>
                  <line x1="169.5" x2="255.5" y1="165" y2="165" stroke="black" stroke-width="1.5"/>
                  <line x1="169.5" x2="255.5" y1="173" y2="173" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[79be1817db664391ee5ba2fd11c31888]
class sdfProperty-->
    <rect fill="white" height="48" id="sdfProperty" width="99" x="6" y="258" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="21" cy="274" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M23.4731,280.1431 Q22.8921,280.4419 22.2529,280.5913 Q21.6138,280.7407 20.9082,280.7407 Q18.4014,280.7407 17.0815,279.0889 Q15.7617,277.437 15.7617,274.3159 Q15.7617,271.1865 17.0815,269.5347 Q18.4014,267.8828 20.9082,267.8828 Q21.6138,267.8828 22.2612,268.0322 Q22.9087,268.1816 23.4731,268.4805 L23.4731,271.2031 Q22.8423,270.6221 22.2488,270.3523 Q21.6553,270.0825 21.0244,270.0825 Q19.6797,270.0825 18.9949,271.1492 Q18.3101,272.2158 18.3101,274.3159 Q18.3101,276.4077 18.9949,277.4744 Q19.6797,278.541 21.0244,278.541 Q21.6553,278.541 22.2488,278.2712 Q22.8423,278.0015 23.4731,277.4204 Z"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="35" y="278.5352">sdfProperty</text>
                  <line x1="7" x2="104" y1="290" y2="290" stroke="black" stroke-width="1.5"/>
                  <line x1="7" x2="104" y1="298" y2="298" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[bdacf205fe3695f723a4cfa5db06fd81]
class sdfAction-->
    <rect fill="white" height="48" id="sdfAction" width="85" x="170" y="258" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="185" cy="274" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M187.4731,280.1431 Q186.8921,280.4419 186.2529,280.5913 Q185.6138,280.7407 184.9082,280.7407 Q182.4014,280.7407 181.0815,279.0889 Q179.7617,277.437 179.7617,274.3159 Q179.7617,271.1865 181.0815,269.5347 Q182.4014,267.8828 184.9082,267.8828 Q185.6138,267.8828 186.2612,268.0322 Q186.9087,268.1816 187.4731,268.4805 L187.4731,271.2031 Q186.8423,270.6221 186.2488,270.3523 Q185.6553,270.0825 185.0244,270.0825 Q183.6797,270.0825 182.9949,271.1492 Q182.3101,272.2158 182.3101,274.3159 Q182.3101,276.4077 182.9949,277.4744 Q183.6797,278.541 185.0244,278.541 Q185.6553,278.541 186.2488,278.2712 Q186.8423,278.0015 187.4731,277.4204 Z"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="199" y="278.5352">sdfAction</text>
                  <line x1="171" x2="254" y1="290" y2="290" stroke="black" stroke-width="1.5"/>
                  <line x1="171" x2="254" y1="298" y2="298" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[ccecbd8aeb25c61fe37a32079d0173e2]
class sdfEvent-->
    <rect fill="white" height="48" id="sdfEvent" width="81" x="314" y="258" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="329" cy="274" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M331.4731,280.1431 Q330.8921,280.4419 330.2529,280.5913 Q329.6138,280.7407 328.9082,280.7407 Q326.4014,280.7407 325.0815,279.0889 Q323.7617,277.437 323.7617,274.3159 Q323.7617,271.1865 325.0815,269.5347 Q326.4014,267.8828 328.9082,267.8828 Q329.6138,267.8828 330.2612,268.0322 Q330.9087,268.1816 331.4731,268.4805 L331.4731,271.2031 Q330.8423,270.6221 330.2488,270.3523 Q329.6553,270.0825 329.0244,270.0825 Q327.6797,270.0825 326.9949,271.1492 Q326.3101,272.2158 326.3101,274.3159 Q326.3101,276.4077 326.9949,277.4744 Q327.6797,278.541 329.0244,278.541 Q329.6553,278.541 330.2488,278.2712 Q330.8423,278.0015 331.4731,277.4204 Z"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="343" y="278.5352">sdfEvent</text>
                  <line x1="315" x2="394" y1="290" y2="290" stroke="black" stroke-width="1.5"/>
                  <line x1="315" x2="394" y1="298" y2="298" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[154484d28240d22ab997079d2c9ce9cd]
class sdfData-->
    <rect fill="white" height="48" id="sdfData" width="77" x="141" y="383" stroke="black" stroke-width="1.5"/>
                  <ellipse cx="156" cy="399" fill="white" rx="11" ry="11" stroke="black" stroke-width="1.0"/>
                  <path d="M158.4731,405.1431 Q157.8921,405.4419 157.2529,405.5913 Q156.6138,405.7407 155.9082,405.7407 Q153.4014,405.7407 152.0815,404.0889 Q150.7617,402.437 150.7617,399.3159 Q150.7617,396.1865 152.0815,394.5347 Q153.4014,392.8828 155.9082,392.8828 Q156.6138,392.8828 157.2612,393.0322 Q157.9087,393.1816 158.4731,393.4805 L158.4731,396.2031 Q157.8423,395.6221 157.2488,395.3523 Q156.6553,395.0825 156.0244,395.0825 Q154.6797,395.0825 153.9949,396.1492 Q153.3101,397.2158 153.3101,399.3159 Q153.3101,401.4077 153.9949,402.4744 Q154.6797,403.541 156.0244,403.541 Q156.6553,403.541 157.2488,403.2712 Q157.8423,403.0015 158.4731,402.4204 Z"/>
                  <text fill="black" font-family="sans-serif" font-size="12" x="170" y="403.5352">sdfData</text>
                  <line x1="142" x2="217" y1="415" y2="415" stroke="black" stroke-width="1.5"/>
                  <line x1="142" x2="217" y1="423" y2="423" stroke="black" stroke-width="1.5"/>
                  <!--MD5=[474ac19abf738d5435f62202b2040a8c]
link sdfThing to sdfObject-->
    <path d="M212.5,56.14 C212.5,76.49 212.5,106.19 212.5,127.91" fill="none" id="sdfThing-_3EsdfObject" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="212.5,132.97,216.5,123.97,212.5,127.97,208.5,123.97,212.5,132.97" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="213.5" y="99.5684">hasObject</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="192.0813" y="122.1064">0+</text>
                  <!--MD5=[84a99f3e6ba5135b350f4e647ff40b17]
link sdfThing to sdfThing-->
    <path d="M253.55,20.58 C272.25,19.41 288.5,23.22 288.5,32 C288.5,39.96 275.15,43.83 258.73,43.62" fill="none" id="sdfThing-_3EsdfThing" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="253.55,43.42,262.3953,47.7513,258.5466,43.6056,262.6923,39.7568,253.55,43.42" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="294.5" y="37.0684">hasThing</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="261.5267" y="41.6379">0+</text>
                  <!--MD5=[c9f4ee01ef3119b1a79851932bb5a9a6]
link sdfObject to sdfProperty-->
    <path d="M172.07,181.22 C157.87,189.97 142.08,200.38 128.5,211 C111.81,224.05 94.64,240.35 81.14,253.93" fill="none" id="sdfObject-_3EsdfProperty" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="77.44,257.69,86.6036,254.0805,80.9469,254.1261,80.9013,248.4694,77.44,257.69" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="129.5" y="224.5684">hasProperty</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="62.7559" y="247.1468">0+</text>
                  <!--MD5=[ec9a56bd8655f4d1893aa031ec22e05c]
link sdfObject to sdfAction-->
    <path d="M212.5,181.14 C212.5,201.49 212.5,231.19 212.5,252.91" fill="none" id="sdfObject-_3EsdfAction" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="212.5,257.97,216.5,248.97,212.5,252.97,208.5,248.97,212.5,257.97" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="213.5" y="224.5684">hasAction</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="192.0813" y="247.1064">0+</text>
                  <!--MD5=[e82b08c6210a768f8efa9371b7de17ad]
link sdfObject to sdfEvent-->
    <path d="M246.28,181.26 C258.62,190.17 272.49,200.68 284.5,211 C300.11,224.41 316.43,240.59 329.38,254.02" fill="none" id="sdfObject-_3EsdfEvent" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="332.94,257.73,329.5912,248.4679,329.4767,254.1236,323.821,254.0091,332.94,257.73" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="303.5" y="224.5684">hasEvent</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="307.109" y="247.1971">0+</text>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <path d="M169.82,294.49 C148.97,302.5 125.77,315.51 113.5,336 C102.81,353.85 118.15,370.91 136.72,383.71" fill="none" id="sdfAction-_3EsdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="140.98,386.54,135.7103,378.2195,136.8197,383.7665,131.2727,384.8759,140.98,386.54" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="114.5" y="349.5684">hasInputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="115.1095" y="379.5032">1+</text>
                  <!--MD5=[7eee11d65eceecf8b941af956a7f2b88]
link sdfAction to sdfData-->
    <path d="M211.27,306.04 C210.1,319.86 207.85,337.68 203.5,353 C201.12,361.37 197.63,370.11 194.04,378.01" fill="none" id="sdfAction-_3EsdfData-1" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="191.8,382.82,199.2318,376.3572,193.9152,378.2894,191.9829,372.9728,191.8,382.82" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="207.5" y="349.5684">hasOutputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="174.6456" y="372.3101">0+</text>
                  <!--MD5=[1d999dc69acbeb1774ac85a19f512fd6]
link sdfEvent to sdfData-->
    <path d="M344.94,306.15 C337.7,321.24 326.43,340.4 311.5,353 C286.09,374.44 250.9,387.99 223.25,396.01" fill="none" id="sdfEvent-_3EsdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="218.18,397.45,227.9277,398.858,222.9924,396.0934,225.7571,391.1581,218.18,397.45" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="327.5" y="349.5684">hasOutputData</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="226.077" y="392.2202">1+</text>
                  <!--MD5=[0c4745fb3134cadd1f7ab6e63b3ea9cc]
link sdfProperty to sdfData-->
    <path d="M31.44,306.12 C19.65,320.29 10.01,338.45 20.5,353 C46.45,389 97.9,400.92 135.27,404.67" fill="none" id="sdfProperty-_3EsdfData" stroke="black" stroke-width="1.0"/>
                  <polygon fill="black" points="140.68,405.16,132.0828,400.3549,135.7009,404.7035,131.3524,408.3215,140.68,405.16" stroke="black" stroke-width="1.0"/>
                  <text fill="black" font-family="sans-serif" font-size="13" x="21.5" y="349.5684">isInstanceOf</text>
                  <text fill="black" font-family="sans-serif" font-size="13" x="125.0527" y="401.0923">1</text>
                  <!--MD5=[d24c505f72f8af8cfe339bc6ea689654]
@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.2020.11(Sat May 30 12:13:43 CEST 2020)
(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="" pn="section-2.2-3.1.2"><![CDATA[
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 {
}
]]></artwork>
          </artset>
        </figure>
        <t pn="section-2.2-4">The seven main Class Name Keywords are discussed below.</t>
        <section anchor="sdfobject" numbered="true" toc="include" removeInRFC="false" pn="section-2.2.1">
          <name slugifiedName="name-sdfobject">sdfObject</name>
          <t pn="section-2.2.1-1">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" sectionFormat="of" derivedContent="ZCL"/>, OMA SpecWorks LwM2M
Objects <xref target="OMA" format="default" sectionFormat="of" derivedContent="OMA"/>, and
OCF Resource Types <xref target="OCF" format="default" sectionFormat="of" derivedContent="OCF"/>.</t>
          <t pn="section-2.2.1-2">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 pn="section-2.2.1-3">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="include" removeInRFC="false" pn="section-2.2.2">
          <name slugifiedName="name-sdfproperty">sdfProperty</name>
          <t pn="section-2.2.2-1"><tt>sdfProperty</tt> is used to model elements of state within <tt>sdfObject</tt> instances.</t>
          <t pn="section-2.2.2-2">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 pn="section-2.2.2-3">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 pn="section-2.2.2-4">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 pn="section-2.2.2-5">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" sectionFormat="of" derivedContent="I-D.handrews-json-schema-validation"/>, enhanced by qualities that are specific to SDF.
However, for the current version of SDF, data are constrained to be of
simple types (number, string, Boolean) 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 pn="section-2.2.2-6">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" numbered="true" toc="include" removeInRFC="false" pn="section-2.2.3">
          <name slugifiedName="name-sdfaction">sdfAction</name>
          <t pn="section-2.2.3-1">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 pn="section-2.2.3-2">Actions may have multiple data parameters; these are modeled as input
data and output data (using <tt>sdfData</tt> definitions, i.e., the same entries as for
<tt>sdfProperty</tt> 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 pn="section-2.2.3-3">Actions may have (or lack) qualities of idempotency and side-effect safety.</t>
          <t pn="section-2.2.3-4">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" numbered="true" toc="include" removeInRFC="false" pn="section-2.2.4">
          <name slugifiedName="name-sdfevent">sdfEvent</name>
          <t pn="section-2.2.4-1">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 pn="section-2.2.4-2">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 pn="section-2.2.4-3">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="include" removeInRFC="false" pn="section-2.2.5">
          <name slugifiedName="name-sdfdata">sdfData</name>
          <t pn="section-2.2.5-1">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 pn="section-2.2.5-2">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="include" removeInRFC="false" pn="section-2.2.6">
          <name slugifiedName="name-sdfthing">sdfThing</name>
          <t pn="section-2.2.6-1">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 pn="section-2.2.6-2">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="include" removeInRFC="false" pn="section-2.2.7">
          <name slugifiedName="name-sdfproduct">sdfProduct</name>
          <t pn="section-2.2.7-1"><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="include" removeInRFC="false" pn="section-3">
      <name slugifiedName="name-sdf-structure">SDF structure</name>
      <t pn="section-3-1">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 pn="section-3-2">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="include" removeInRFC="false" pn="section-3.1">
        <name slugifiedName="name-information-block">Information block</name>
        <t pn="section-3.1-1">The information block contains generic meta data for the file itself and all included definitions.</t>
        <t pn="section-3.1-2">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 pn="section-3.1-3">Qualities of the information block are shown in <xref target="infoblockqual" format="default" sectionFormat="of" derivedContent="Table 1"/>.</t>
        <table anchor="infoblockqual" align="center" pn="table-1">
          <name slugifiedName="name-qualities-of-the-informatio">Qualities of the Information Block</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Required</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">title</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">yes</td>
              <td align="left" colspan="1" rowspan="1">A short summary to be displayed in search results, etc.</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">version</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">yes</td>
              <td align="left" colspan="1" rowspan="1">The incremental version of the definition, format TBD</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">copyright</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">yes</td>
              <td align="left" colspan="1" rowspan="1">Link to text or embedded text containing a copyright notice</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">license</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">yes</td>
              <td align="left" colspan="1" rowspan="1">Link to text or embedded text containing license terms</td>
            </tr>
          </tbody>
        </table>
        <t pn="section-3.1-5">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" sectionFormat="of" derivedContent="RFC3339"/> <tt>date-time</tt> or, if new versions are generated less frequently than once a day, just the <tt>full-date</tt> (i.e., YYYY-MM-DD); in many cases, that will be all that is needed (see <xref target="example1" format="default" sectionFormat="of" derivedContent="Figure 1"/> for an example).</t>
        <t pn="section-3.1-6">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" sectionFormat="of" derivedContent="SPDX"/> license identifier.
(For models to be handled by the One Data Model liaison group, this will typically be "BSD-3-Clause".)</t>
      </section>
      <section anchor="namespaces-section" numbered="true" toc="include" removeInRFC="false" pn="section-3.2">
        <name slugifiedName="name-namespaces-section">Namespaces section</name>
        <t pn="section-3.2-1">The namespaces section contains the namespace map and the defaultNamespace setting.</t>
        <t pn="section-3.2-2">The namespace map is a map from short names for URIs to the namespace URIs
themselves.</t>
        <t pn="section-3.2-3">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" pn="table-2">
          <name slugifiedName="name-namespaces-section-2">Namespaces Section</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Required</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">namespace</td>
              <td align="left" colspan="1" rowspan="1">map</td>
              <td align="left" colspan="1" rowspan="1">no</td>
              <td align="left" colspan="1" rowspan="1">Defines short names mapped to namespace URIs, to be used as identifier prefixes</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">defaultNamespace</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">no</td>
              <td align="left" colspan="1" rowspan="1">Identifies one of the prefixes in the namespace map to be used as a default in resolving identifiers</td>
            </tr>
          </tbody>
        </table>
        <t pn="section-3.2-5">The following example declares a set of namespaces and defines <tt>cap</tt> as the default namespace.</t>
        <artwork type="json" name="" align="left" alt="" pn="section-3.2-6"><![CDATA[
"namespace": {
  "cap": "https://example.com/capability/cap",
  "zcl": "https://zcl.example.com/sdf"
},
"defaultNamespace": "cap",
]]></artwork>
        <t pn="section-3.2-7">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 pn="section-3.2-8">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="include" removeInRFC="false" pn="section-3.3">
        <name slugifiedName="name-definitions-section">Definitions section</name>
        <t pn="section-3.3-1">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 the qualities (name-value pairs) for the individual definition.</t>
        <t pn="section-3.3-2">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.</t>
        <t pn="section-3.3-3">A definition may in turn contain other definitions. Each definition consists of the newly defined identifier and a set of key-value pairs that represent the defined qualities and contained definitions.</t>
        <t pn="section-3.3-4">An example for an Object definition is given in <xref target="exobject" format="default" sectionFormat="of" derivedContent="Figure 4"/>:</t>
        <figure anchor="exobject" align="left" suppress-title="false" pn="figure-4">
          <name slugifiedName="name-example-object-definition">Example Object definition</name>
          <artwork type="json" name="" align="left" alt="" pn="section-3.3-5.1"><![CDATA[
"sdfObject": {
  "foo": {
    "sdfProperty": {
      "bar": {
        "type": "boolean"
      }
    }
  }
}
]]></artwork>
        </figure>
        <t pn="section-3.3-6">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 pn="section-3.3-7">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="include" removeInRFC="false" pn="section-4">
      <name slugifiedName="name-names-and-namespaces">Names and namespaces</name>
      <t pn="section-4-1">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="include" removeInRFC="false" pn="section-4.1">
        <name slugifiedName="name-structure">Structure</name>
        <t pn="section-4.1-1">Global names look exactly like https:// URIs with attached fragment identifiers.</t>
        <t pn="section-4.1-2">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 pn="section-4.1-3">The absolute URI of a global name should be a URI as per Section 3 of
<xref target="RFC3986" format="default" sectionFormat="of" derivedContent="RFC3986"/>, with a scheme of "https" and a path (<tt>hier-part</tt> in <xref target="RFC3986" format="default" sectionFormat="of" derivedContent="RFC3986"/>).
For the present version of this specification, the query part should
not be used (it might be used in later versions).</t>
        <t pn="section-4.1-4">The fragment identifier is constructed as per Section 6 of
<xref target="RFC6901" format="default" sectionFormat="of" derivedContent="RFC6901"/>.</t>
      </section>
      <section anchor="contributing-global-names" numbered="true" toc="include" removeInRFC="false" pn="section-4.2">
        <name slugifiedName="name-contributing-global-names">Contributing global names</name>
        <t pn="section-4.2-1">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 pn="section-4.2-2">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 pn="section-4.2-3">E.g., in <xref target="example1" format="default" sectionFormat="of" derivedContent="Figure 1"/>, definitions for the following global names are contributed:</t>
        <ul spacing="normal" bare="false" empty="false" pn="section-4.2-4">
          <li pn="section-4.2-4.1">https://example.com/capability/cap#/sdfObject/Switch</li>
          <li pn="section-4.2-4.2">https://example.com/capability/cap#/sdfObject/Switch/sdfProperty/value</li>
          <li pn="section-4.2-4.3">https://example.com/capability/cap#/sdfObject/Switch/sdfAction/on</li>
          <li pn="section-4.2-4.4">https://example.com/capability/cap#/sdfObject/Switch/sdfAction/off</li>
        </ul>
        <t pn="section-4.2-5">Note the "#", which separates the base part from the fragment
identifier part.</t>
      </section>
      <section anchor="referencing-global-names" numbered="true" toc="include" removeInRFC="false" pn="section-4.3">
        <name slugifiedName="name-referencing-global-names">Referencing global names</name>
        <t pn="section-4.3-1">A name reference takes the form of the production <tt>curie</tt> in
<xref target="W3C.NOTE-curie-20101216" format="default" sectionFormat="of" derivedContent="W3C.NOTE-curie-20101216"/> (note that this excludes the production <tt>safe-curie</tt>),
but also limiting the IRIs involved in that production to URIs as per <xref target="RFC3986" format="default" sectionFormat="of" derivedContent="RFC3986"/>
and the prefixes to ASCII characters <xref target="RFC0020" format="default" sectionFormat="of" derivedContent="RFC0020"/>.</t>
        <t pn="section-4.3-2">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" sectionFormat="of" derivedContent="RFC3986"/>.
As there is little point in referencing the entire SDF definition
file, this will be a "#" followed by a JSON pointer.
This is the only kind of name reference that is possible in an SDF
definition file that does not set a default namespace.</t>
        <t pn="section-4.3-3">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 pn="section-4.3-4">For example, if a namespace prefix is defined:</t>
        <artwork type="json" name="" align="left" alt="" pn="section-4.3-5"><![CDATA[
"namespace": {
  "foo": "https://example.com/#"
}
]]></artwork>
        <t pn="section-4.3-6">Then this reference to that namespace:</t>
        <artwork type="json" name="" align="left" alt="" pn="section-4.3-7"><![CDATA[
{ "sdfRef": "foo:/sdfData/temperatureData" }
]]></artwork>
        <t pn="section-4.3-8">references the global name:</t>
        <artwork type="json" name="" align="left" alt="" pn="section-4.3-9"><![CDATA[
"https://example.com/#/sdfData/temperatureData"
]]></artwork>
        <t pn="section-4.3-10">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 pn="section-4.3-11">Name references occur only in specific elements of the syntax of SDF:</t>
        <ul spacing="normal" bare="false" empty="false" pn="section-4.3-12">
          <li pn="section-4.3-12.1">copying elements via sdfRef values</li>
          <li pn="section-4.3-12.2">pointing to elements via sdfRequired value elements or as
sdfInput/OutputData etc.</li>
        </ul>
      </section>
      <section anchor="sdfref" numbered="true" toc="include" removeInRFC="false" pn="section-4.4">
        <name slugifiedName="name-sdfref">sdfRef</name>
        <t pn="section-4.4-1">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" sectionFormat="of" derivedContent="I-D.handrews-json-schema-validation"/>.)</t>
        <t pn="section-4.4-2">For example, this reference:</t>
        <artwork type="json" name="" align="left" alt="" pn="section-4.4-3"><![CDATA[
"temperatureProperty": {
  "sdfRef": "#/sdfData/temperatureData"
}
]]></artwork>
        <t pn="section-4.4-4">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="include" removeInRFC="false" pn="section-4.5">
        <name slugifiedName="name-sdfrequired">sdfRequired</name>
        <t pn="section-4.5-1">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="include" removeInRFC="false" pn="section-4.5.1">
          <name slugifiedName="name-optionality-using-the-keywo">Optionality using the keyword "sdfRequired"</name>
          <t pn="section-4.5.1-1">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 pn="section-4.5.1-2">The value of "sdfRequired" is an array of JSON pointers, each
indicating one declaration that is mandatory to be represented.</t>
          <t pn="section-4.5.1-3">The example in <xref target="example-req" format="default" sectionFormat="of" derivedContent="Figure 5"/> 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" align="left" suppress-title="false" pn="figure-5">
            <name slugifiedName="name-using-sdfrequired">Using sdfRequired</name>
            <artwork type="json" name="" align="left" alt="" pn="section-4.5.1-4.1"><![CDATA[
{
  "sdfObject": {
    "temperatureWithAlarm": {
      "sdfRequired": [
        "#/sdfObject/temperatureWithAlarm/sdfData/temperatureData",
        "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent"
      ],
      "sdfData":{
        "temperatureData": {
          "type": "number"
        }
      },
      "sdfEvent": {
        "overTemperatureEvent": {
          "sdfOutputData": {
            "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="include" removeInRFC="false" pn="section-4.6">
        <name slugifiedName="name-common-qualities">Common Qualities</name>
        <t pn="section-4.6-1">Definitions in SDF share a number of qualities that provide metadata for
them.  These are listed in <xref target="tbl-common-qualities" format="default" sectionFormat="of" derivedContent="Table 3"/>.  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, the
last part (<tt>reference-token</tt>, Section 3 of <xref target="RFC6901" format="default" sectionFormat="of" derivedContent="RFC6901"/>) of the JSON
pointer to the definition can be used.</t>
        <table anchor="tbl-common-qualities" align="center" pn="table-3">
          <name slugifiedName="name-common-qualities-2">Common Qualities</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">description</td>
              <td align="left" colspan="1" rowspan="1">text</td>
              <td align="left" colspan="1" rowspan="1">long text (no constraints)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">label</td>
              <td align="left" colspan="1" rowspan="1">text</td>
              <td align="left" colspan="1" rowspan="1">short text (no constraints)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">$comment</td>
              <td align="left" colspan="1" rowspan="1">text</td>
              <td align="left" colspan="1" rowspan="1">source code comments only, no semantics</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfRef</td>
              <td align="left" colspan="1" rowspan="1">sdf-pointer</td>
              <td align="left" colspan="1" rowspan="1">(see <xref target="sdfref" format="default" sectionFormat="of" derivedContent="Section 4.4"/>)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfRequired</td>
              <td align="left" colspan="1" rowspan="1">pointer-list</td>
              <td align="left" colspan="1" rowspan="1">(see <xref target="sdfrequired" format="default" sectionFormat="of" derivedContent="Section 4.5"/>, applies to qualities of properties, of data)</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="data-qualities" numbered="true" toc="include" removeInRFC="false" pn="section-4.7">
        <name slugifiedName="name-data-qualities">Data Qualities</name>
        <t pn="section-4.7-1">Data qualities are used in <tt>sdfData</tt> and <tt>sdfProperty</tt> definitions.</t>
        <t pn="section-4.7-2"><xref target="sdfdataqual1" format="default" sectionFormat="of" derivedContent="Table 4"/> lists data qualities borrowed from <xref target="I-D.handrews-json-schema-validation" format="default" sectionFormat="of" derivedContent="I-D.handrews-json-schema-validation"/>; the
intention is that these qualities retain their semantics from the
versions of the json-schema.org proposal they were imported from.</t>
        <t pn="section-4.7-3"><xref target="sdfdataqual2" format="default" sectionFormat="of" derivedContent="Table 5"/> lists data qualities defined specifically for the
present specification.</t>
        <t pn="section-4.7-4">The term "allowed types" stands for primitive JSON types as well as
homogeneous arrays of numbers, text, or Booleans.  (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" pn="table-4">
          <name slugifiedName="name-qualities-of-sdfproperty-an">Qualities of sdfProperty and sdfData borrowed from json-schema.org</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">type</td>
              <td align="left" colspan="1" rowspan="1">"number" / "string" / "boolean" / "integer" / "array"</td>
              <td align="left" colspan="1" rowspan="1">JSON data type</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">enum</td>
              <td align="left" colspan="1" rowspan="1">array of allowed values</td>
              <td align="left" colspan="1" rowspan="1">enumeration constraint</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">const</td>
              <td align="left" colspan="1" rowspan="1">allowed value</td>
              <td align="left" colspan="1" rowspan="1">specifies a constant value for a data item or property</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">default</td>
              <td align="left" colspan="1" rowspan="1">allowed value</td>
              <td align="left" colspan="1" rowspan="1">specifies the default value for initialization</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">minimum</td>
              <td align="left" colspan="1" rowspan="1">number</td>
              <td align="left" colspan="1" rowspan="1">lower limit of value</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">maximum</td>
              <td align="left" colspan="1" rowspan="1">number</td>
              <td align="left" colspan="1" rowspan="1">upper limit of value</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">exclusiveMinimum</td>
              <td align="left" colspan="1" rowspan="1">number or boolean (jso draft 7/4)</td>
              <td align="left" colspan="1" rowspan="1">lower limit of value</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">exclusiveMaximum</td>
              <td align="left" colspan="1" rowspan="1">number or boolean (jso draft 7/4)</td>
              <td align="left" colspan="1" rowspan="1">lower limit of value</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">multipleOf</td>
              <td align="left" colspan="1" rowspan="1">number</td>
              <td align="left" colspan="1" rowspan="1">resolution of the number [NEEDED?]</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">minLength</td>
              <td align="left" colspan="1" rowspan="1">integer</td>
              <td align="left" colspan="1" rowspan="1">shortest length string in octets</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">maxLength</td>
              <td align="left" colspan="1" rowspan="1">integer</td>
              <td align="left" colspan="1" rowspan="1">longest length string in octets</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">pattern</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">regular expression to constrain a string pattern</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">format</td>
              <td align="left" colspan="1" rowspan="1">"date-time" / "date" / "time" / "uri" / "uri-reference" / "uuid"</td>
              <td align="left" colspan="1" rowspan="1">JSON Schema formats as per <xref target="I-D.handrews-json-schema-validation" format="default" sectionFormat="of" derivedContent="I-D.handrews-json-schema-validation"/>, Section 7.3</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">minItems</td>
              <td align="left" colspan="1" rowspan="1">number</td>
              <td align="left" colspan="1" rowspan="1">Minimum number of items in array</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">maxItems</td>
              <td align="left" colspan="1" rowspan="1">number</td>
              <td align="left" colspan="1" rowspan="1">Maximum number of items in array</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">uniqueItems</td>
              <td align="left" colspan="1" rowspan="1">boolean</td>
              <td align="left" colspan="1" rowspan="1">if true, requires items to be all different</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">items</td>
              <td align="left" colspan="1" rowspan="1">(subset of common/data qualities; see <xref target="syntax" format="default" sectionFormat="of" derivedContent="Appendix A"/></td>
              <td align="left" colspan="1" rowspan="1">constraints on array items</td>
            </tr>
          </tbody>
        </table>
        <table anchor="sdfdataqual2" align="center" pn="table-5">
          <name slugifiedName="name-sdf-defined-qualities-of-sd">SDF-defined Qualities of sdfProperty and sdfData</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
              <th align="left" colspan="1" rowspan="1">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">(common)</td>
              <td align="left" colspan="1" rowspan="1"> </td>
              <td align="left" colspan="1" rowspan="1">
                <xref target="common-qualities" format="default" sectionFormat="of" derivedContent="Section 4.6"/></td>
              <td align="left" colspan="1" rowspan="1"> </td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">units</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">SenML unit name as per <xref target="IANA.senml" format="default" sectionFormat="of" derivedContent="IANA.senml"/>, subregistry SenML Units</td>
              <td align="left" colspan="1" rowspan="1">N/A</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">scaleMinimum</td>
              <td align="left" colspan="1" rowspan="1">number</td>
              <td align="left" colspan="1" rowspan="1">lower limit of value in units</td>
              <td align="left" colspan="1" rowspan="1">N/A</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">scaleMaximum</td>
              <td align="left" colspan="1" rowspan="1">number</td>
              <td align="left" colspan="1" rowspan="1">upper limit of value in units</td>
              <td align="left" colspan="1" rowspan="1">N/A</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">readable</td>
              <td align="left" colspan="1" rowspan="1">boolean</td>
              <td align="left" colspan="1" rowspan="1">Reads are allowed</td>
              <td align="left" colspan="1" rowspan="1">true</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">writable</td>
              <td align="left" colspan="1" rowspan="1">boolean</td>
              <td align="left" colspan="1" rowspan="1">Writes are allowed</td>
              <td align="left" colspan="1" rowspan="1">true</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">observable</td>
              <td align="left" colspan="1" rowspan="1">boolean</td>
              <td align="left" colspan="1" rowspan="1">flag to indicate asynchronous notification is available</td>
              <td align="left" colspan="1" rowspan="1">true</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">nullable</td>
              <td align="left" colspan="1" rowspan="1">boolean</td>
              <td align="left" colspan="1" rowspan="1">indicates a null value is available for this type</td>
              <td align="left" colspan="1" rowspan="1">true</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">contentFormat</td>
              <td align="left" colspan="1" rowspan="1">string</td>
              <td align="left" colspan="1" rowspan="1">content type (IANA media type string plus parameters), encoding</td>
              <td align="left" colspan="1" rowspan="1">N/A</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">subtype</td>
              <td align="left" colspan="1" rowspan="1">"byte-string" / "unix-time"</td>
              <td align="left" colspan="1" rowspan="1">subtype enumeration</td>
              <td align="left" colspan="1" rowspan="1">N/A</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="keywords-for-definition-groups" numbered="true" toc="include" removeInRFC="false" pn="section-5">
      <name slugifiedName="name-keywords-for-definition-gro">Keywords for definition groups</name>
      <t pn="section-5-1">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" sectionFormat="of" derivedContent="Section 4.6"/>.</t>
      <section anchor="sdfobject-1" numbered="true" toc="include" removeInRFC="false" pn="section-5.1">
        <name slugifiedName="name-sdfobject-2">sdfObject</name>
        <t pn="section-5.1-1">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 pn="section-5.1-2">The qualities of an sdfObject include the common qualities, additional qualities are shown in <xref target="sdfobjqual" format="default" sectionFormat="of" derivedContent="Table 6"/>.
None of these
qualities are required or have default values that are assumed if the
quality is absent.</t>
        <table anchor="sdfobjqual" align="center" pn="table-6">
          <name slugifiedName="name-qualities-of-sdfobject">Qualities of sdfObject</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">(common)</td>
              <td align="left" colspan="1" rowspan="1"> </td>
              <td align="left" colspan="1" rowspan="1">
                <xref target="common-qualities" format="default" sectionFormat="of" derivedContent="Section 4.6"/></td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfProperty</td>
              <td align="left" colspan="1" rowspan="1">property</td>
              <td align="left" colspan="1" rowspan="1">zero or more named property definitions for this object</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfAction</td>
              <td align="left" colspan="1" rowspan="1">action</td>
              <td align="left" colspan="1" rowspan="1">zero or more named action definitions for this object</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfEvent</td>
              <td align="left" colspan="1" rowspan="1">event</td>
              <td align="left" colspan="1" rowspan="1">zero or more named event definitions for this object</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfData</td>
              <td align="left" colspan="1" rowspan="1">data</td>
              <td align="left" colspan="1" rowspan="1">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="include" removeInRFC="false" pn="section-5.2">
        <name slugifiedName="name-sdfproperty-2">sdfProperty</name>
        <t pn="section-5.2-1">The sdfProperty keyword denotes a group of zero or more Property definitions.</t>
        <t pn="section-5.2-2">Properties are used to model elements of state.</t>
        <t pn="section-5.2-3">The qualities of a Property definition include the common qualities and the data qualities, see <xref target="data-qualities" format="default" sectionFormat="of" derivedContent="Section 4.7"/>.</t>
      </section>
      <section anchor="sdfaction-1" numbered="true" toc="include" removeInRFC="false" pn="section-5.3">
        <name slugifiedName="name-sdfaction-2">sdfAction</name>
        <t pn="section-5.3-1">The sdfAction keyword denotes a group of zero or more Action definitions.</t>
        <t pn="section-5.3-2">Actions are used to model commands and methods which are invoked. Actions have parameter data that are supplied upon invocation.</t>
        <t pn="section-5.3-3">The qualities of an Action definition include the common qualities, additional qualities are shown in <xref target="sdfactqual" format="default" sectionFormat="of" derivedContent="Table 7"/>.</t>
        <table anchor="sdfactqual" align="center" pn="table-7">
          <name slugifiedName="name-qualities-of-sdfaction">Qualities of sdfAction</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">(common)</td>
              <td align="left" colspan="1" rowspan="1"> </td>
              <td align="left" colspan="1" rowspan="1">
                <xref target="common-qualities" format="default" sectionFormat="of" derivedContent="Section 4.6"/></td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfInputData</td>
              <td align="left" colspan="1" rowspan="1">array</td>
              <td align="left" colspan="1" rowspan="1">Array of JSON Pointers to Data items in the input data for an Action</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfRequiredInputData</td>
              <td align="left" colspan="1" rowspan="1">array</td>
              <td align="left" colspan="1" rowspan="1">Array of JSON Pointers to mandatory Data items in the input data for an Action</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfOutputData</td>
              <td align="left" colspan="1" rowspan="1">array</td>
              <td align="left" colspan="1" rowspan="1">Array of JSON Pointers to Data items in the Output data for an Action (mandatory items are listed under sdfRequired)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfData</td>
              <td align="left" colspan="1" rowspan="1">data</td>
              <td align="left" colspan="1" rowspan="1">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t pn="section-5.3-5"><tt>sdfInputData</tt>, as refined by <tt>sdfRequiredInputData</tt>, define the input data
of the action.  <tt>sdfOutputData</tt>, as refined by <tt>sdfRequired,</tt> (a quality
defined in <xref target="tbl-common-qualities" format="default" sectionFormat="of" derivedContent="Table 3"/>) define the output data of the
action.</t>
      </section>
      <section anchor="sdfevent-1" numbered="true" toc="include" removeInRFC="false" pn="section-5.4">
        <name slugifiedName="name-sdfevent-2">sdfEvent</name>
        <t pn="section-5.4-1">The sdfEvent keyword denotes zero or more Event definitions.</t>
        <t pn="section-5.4-2">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 pn="section-5.4-3">The qualities of sdfEvent include the common qualities, additional qualities are shown in <xref target="sdfevqual" format="default" sectionFormat="of" derivedContent="Table 8"/>.</t>
        <table anchor="sdfevqual" align="center" pn="table-8">
          <name slugifiedName="name-qualities-of-sdfevent">Qualities of sdfEvent</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">(common)</td>
              <td align="left" colspan="1" rowspan="1"> </td>
              <td align="left" colspan="1" rowspan="1">
                <xref target="common-qualities" format="default" sectionFormat="of" derivedContent="Section 4.6"/></td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfOutputData</td>
              <td align="left" colspan="1" rowspan="1">array</td>
              <td align="left" colspan="1" rowspan="1">Array of JSON Pointers to Data items in the Output data for an Action (mandatory items are listed under sdfRequired)</td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfData</td>
              <td align="left" colspan="1" rowspan="1">data</td>
              <td align="left" colspan="1" rowspan="1">zero or more named data type definitions that might be used in the above</td>
            </tr>
          </tbody>
        </table>
        <t pn="section-5.4-5"><tt>sdfOutputData</tt>, as refined by <tt>sdfRequired</tt> (a quality
defined in <xref target="tbl-common-qualities" format="default" sectionFormat="of" derivedContent="Table 3"/>), define the output data of the
action.</t>
      </section>
      <section anchor="sdfdata-1" numbered="true" toc="include" removeInRFC="false" pn="section-5.5">
        <name slugifiedName="name-sdfdata-2">sdfData</name>
        <t pn="section-5.5-1">The sdfData keyword denotes a group of zero or more Data type definitions.</t>
        <t pn="section-5.5-2">An sdfData definition provides a semantic identifier for a data item and describes the constraints on the defined data item.</t>
        <t pn="section-5.5-3">sdfData is used for Action parameters, for Event output data, and for
reusable constraints in Property definitions.</t>
        <t pn="section-5.5-4">The qualities of sdfData include the common qualities and the data qualities, see <xref target="data-qualities" format="default" sectionFormat="of" derivedContent="Section 4.7"/>.</t>
      </section>
    </section>
    <section anchor="high-level-composition" numbered="true" toc="include" removeInRFC="false" pn="section-6">
      <name slugifiedName="name-high-level-composition">High Level Composition</name>
      <t pn="section-6-1">The requirements for high level composition include the following:</t>
      <ul spacing="normal" bare="false" empty="false" pn="section-6-2">
        <li pn="section-6-2.1">The ability to represent products, standardized product types, and modular products while maintaining the atomicity of Objects.</li>
        <li pn="section-6-2.2">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 pn="section-6-2.3">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 pn="section-6-2.4">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 pn="section-6-2.5">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="include" removeInRFC="false" pn="section-6.1">
        <name slugifiedName="name-paths-in-the-model-namespac">Paths in the model namespaces</name>
        <t pn="section-6.1-1">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 pn="section-6.1-2">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 ns is the namespace prefix (short name for the namespace).</t>
      </section>
      <section anchor="modular-composition" numbered="true" toc="include" removeInRFC="false" pn="section-6.2">
        <name slugifiedName="name-modular-composition">Modular Composition</name>
        <t pn="section-6.2-1">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="include" removeInRFC="false" pn="section-6.2.1">
          <name slugifiedName="name-use-of-the-sdfref-keyword-t">Use of the "sdfRef" keyword to re-use a definition</name>
          <t pn="section-6.2.1-1">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. Optionally, new qualities may be added and values of optional qualities and quality values may be defined.</t>
          <t pn="section-6.2.1-2">ISSUE: Do we want to enable qualities from the source definition to be overridden in future versions?
The above only says "added".
(Yes, we do want to enable overriding, but need to warn specifiers not
to use this in a way that contradicts the referenced semantics.)</t>
          <artwork name="" type="" align="left" alt="" pn="section-6.2.1-3"><![CDATA[
"sdfData":
  "length" : {
    "type": "number",
    "minimum": 0,
    "units": "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>
        </section>
      </section>
      <section anchor="sdfthing-1" numbered="true" toc="include" removeInRFC="false" pn="section-6.3">
        <name slugifiedName="name-sdfthing-2">sdfThing</name>
        <t pn="section-6.3-1">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 pn="section-6.3-2">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 pn="section-6.3-3">An sdfThing may be composed of sdfObjects and other sdfThings.</t>
        <t pn="section-6.3-4">The qualities of sdfThing are shown in <xref target="sdfthingqual" format="default" sectionFormat="of" derivedContent="Table 9"/>.</t>
        <table anchor="sdfthingqual" align="center" pn="table-9">
          <name slugifiedName="name-qualities-of-sdfthing-and-s">Qualities of sdfThing and sdfProduct</name>
          <thead>
            <tr>
              <th align="left" colspan="1" rowspan="1">Quality</th>
              <th align="left" colspan="1" rowspan="1">Type</th>
              <th align="left" colspan="1" rowspan="1">Description</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left" colspan="1" rowspan="1">(common)</td>
              <td align="left" colspan="1" rowspan="1"> </td>
              <td align="left" colspan="1" rowspan="1">
                <xref target="common-qualities" format="default" sectionFormat="of" derivedContent="Section 4.6"/></td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfThing</td>
              <td align="left" colspan="1" rowspan="1">thing</td>
              <td align="left" colspan="1" rowspan="1"> </td>
            </tr>
            <tr>
              <td align="left" colspan="1" rowspan="1">sdfObject</td>
              <td align="left" colspan="1" rowspan="1">object</td>
              <td align="left" colspan="1" rowspan="1"> </td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="sdfproduct-1" numbered="true" toc="include" removeInRFC="false" pn="section-6.4">
        <name slugifiedName="name-sdfproduct-2">sdfProduct</name>
        <t pn="section-6.4-1">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 pn="section-6.4-2">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 pn="section-6.4-3">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 pn="section-6.4-4">The qualities of sdfProduct are the same as for sdfThing and are shown in <xref target="sdfthingqual" format="default" sectionFormat="of" derivedContent="Table 9"/>.</t>
      </section>
    </section>
  </middle>
  <back>
    <references pn="section-7">
      <name slugifiedName="name-references">References</name>
      <references pn="section-7.1">
        <name slugifiedName="name-normative-references">Normative References</name>
        <reference anchor="I-D.handrews-json-schema-validation" target="http://www.ietf.org/internet-drafts/draft-handrews-json-schema-validation-02.txt" quoteTitle="true" derivedAnchor="I-D.handrews-json-schema-validation">
          <front>
            <title>JSON Schema Validation: A Vocabulary for Structural Validation of JSON</title>
            <seriesInfo name="Internet-Draft" value="draft-handrews-json-schema-validation-02"/>
            <author initials="A" surname="Wright" fullname="Austin Wright">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="H" surname="Andrews" fullname="Henry Andrews">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="B" surname="Hutton" fullname="Ben Hutton">
              <organization showOnFrontPage="true"/>
            </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>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="IANA.senml" target="http://www.iana.org/assignments/senml" quoteTitle="true" derivedAnchor="IANA.senml">
          <front>
            <title>Sensor Measurement Lists (SenML)</title>
            <author>
              <organization showOnFrontPage="true">IANA</organization>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC0020" target="https://www.rfc-editor.org/info/rfc20" quoteTitle="true" derivedAnchor="RFC0020">
          <front>
            <title>ASCII format for network interchange</title>
            <seriesInfo name="STD" value="80"/>
            <seriesInfo name="RFC" value="20"/>
            <seriesInfo name="DOI" value="10.17487/RFC0020"/>
            <author initials="V.G." surname="Cerf" fullname="V.G. Cerf">
              <organization showOnFrontPage="true"/>
            </author>
            <date year="1969" month="October"/>
          </front>
        </reference>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" quoteTitle="true" derivedAnchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="2119"/>
            <seriesInfo name="DOI" value="10.17487/RFC2119"/>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization showOnFrontPage="true"/>
            </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>
        </reference>
        <reference anchor="RFC3986" target="https://www.rfc-editor.org/info/rfc3986" quoteTitle="true" derivedAnchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <seriesInfo name="STD" value="66"/>
            <seriesInfo name="RFC" value="3986"/>
            <seriesInfo name="DOI" value="10.17487/RFC3986"/>
            <author initials="T." surname="Berners-Lee" fullname="T. Berners-Lee">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="R." surname="Fielding" fullname="R. Fielding">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="L." surname="Masinter" fullname="L. Masinter">
              <organization showOnFrontPage="true"/>
            </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>
        </reference>
        <reference anchor="RFC6901" target="https://www.rfc-editor.org/info/rfc6901" quoteTitle="true" derivedAnchor="RFC6901">
          <front>
            <title>JavaScript Object Notation (JSON) Pointer</title>
            <seriesInfo name="RFC" value="6901"/>
            <seriesInfo name="DOI" value="10.17487/RFC6901"/>
            <author initials="P." surname="Bryan" fullname="P. Bryan" role="editor">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="K." surname="Zyp" fullname="K. Zyp">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M." surname="Nottingham" fullname="M. Nottingham" role="editor">
              <organization showOnFrontPage="true"/>
            </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>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" quoteTitle="true" derivedAnchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <seriesInfo name="BCP" value="14"/>
            <seriesInfo name="RFC" value="8174"/>
            <seriesInfo name="DOI" value="10.17487/RFC8174"/>
            <author initials="B." surname="Leiba" fullname="B. Leiba">
              <organization showOnFrontPage="true"/>
            </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>
        </reference>
        <reference anchor="RFC8610" target="https://www.rfc-editor.org/info/rfc8610" quoteTitle="true" derivedAnchor="RFC8610">
          <front>
            <title>Concise Data Definition Language (CDDL): A Notational Convention to Express Concise Binary Object Representation (CBOR) and JSON Data Structures</title>
            <seriesInfo name="RFC" value="8610"/>
            <seriesInfo name="DOI" value="10.17487/RFC8610"/>
            <author initials="H." surname="Birkholz" fullname="H. Birkholz">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="C." surname="Vigano" fullname="C. Vigano">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="C." surname="Bormann" fullname="C. Bormann">
              <organization showOnFrontPage="true"/>
            </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>
        </reference>
        <reference anchor="SPDX" target="https://spdx.org/licenses/" quoteTitle="true" derivedAnchor="SPDX">
          <front>
            <title>SPDX License List</title>
            <author>
              <organization showOnFrontPage="true"/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="W3C.NOTE-curie-20101216" target="http://www.w3.org/TR/2010/NOTE-curie-20101216" quoteTitle="true" derivedAnchor="W3C.NOTE-curie-20101216">
          <front>
            <title>CURIE Syntax 1.0</title>
            <seriesInfo name="World Wide Web Consortium NOTE" value="NOTE-curie-20101216"/>
            <author initials="M." surname="Birbeck" fullname="Mark Birbeck">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="S." surname="McCarron" fullname="Shane McCarron">
              <organization showOnFrontPage="true"/>
            </author>
            <date month="December" day="16" year="2010"/>
          </front>
        </reference>
      </references>
      <references pn="section-7.2">
        <name slugifiedName="name-informative-references">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" quoteTitle="true" derivedAnchor="I-D.irtf-t2trg-rest-iot">
          <front>
            <title>RESTful Design for Internet of Things Systems</title>
            <seriesInfo name="Internet-Draft" value="draft-irtf-t2trg-rest-iot-06"/>
            <author initials="A" surname="Keranen" fullname="Ari Keranen">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="M" surname="Kovatsch" fullname="Matthias Kovatsch">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="K" surname="Hartke" fullname="Klaus Hartke">
              <organization showOnFrontPage="true"/>
            </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>
          <refcontent>Work in Progress</refcontent>
        </reference>
        <reference anchor="OCF" target="https://openconnectivity.org/specs/OCF_Resource_Type_Specification.pdf" quoteTitle="true" derivedAnchor="OCF">
          <front>
            <title>OCF Resource Type Specification</title>
            <author>
              <organization showOnFrontPage="true"/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="OMA" target="http://www.openmobilealliance.org/wp/omna/lwm2m/lwm2mregistry.html" quoteTitle="true" derivedAnchor="OMA">
          <front>
            <title>OMA LightweightM2M (LwM2M) Object and Resource Registry</title>
            <author>
              <organization showOnFrontPage="true"/>
            </author>
            <date/>
          </front>
        </reference>
        <reference anchor="RFC3339" target="https://www.rfc-editor.org/info/rfc3339" quoteTitle="true" derivedAnchor="RFC3339">
          <front>
            <title>Date and Time on the Internet: Timestamps</title>
            <seriesInfo name="RFC" value="3339"/>
            <seriesInfo name="DOI" value="10.17487/RFC3339"/>
            <author initials="G." surname="Klyne" fullname="G. Klyne">
              <organization showOnFrontPage="true"/>
            </author>
            <author initials="C." surname="Newman" fullname="C. Newman">
              <organization showOnFrontPage="true"/>
            </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>
        </reference>
        <reference anchor="ZCL" quoteTitle="true" target="https://doi.org/10.1016/b978-0-7506-8597-9.00006-9" derivedAnchor="ZCL">
          <front>
            <title>The ZigBee Cluster Library</title>
            <seriesInfo name="DOI" value="10.1016/b978-0-7506-8597-9.00006-9"/>
            <seriesInfo name="Zigbee Wireless Networking" value="pp. 239-271"/>
            <author>
              <organization showOnFrontPage="true"/>
            </author>
            <date year="2008"/>
          </front>
        </reference>
      </references>
    </references>
    <section anchor="syntax" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.a">
      <name slugifiedName="name-formal-syntax-of-sdf">Formal Syntax of SDF</name>
      <t pn="section-appendix.a-1">This appendix describes the syntax of SDF using CDDL <xref target="RFC8610" format="default" sectionFormat="of" derivedContent="RFC8610"/>.  Note
that this appendix was derived from Ari Keranen's "alt-schema" and
Michael Koster's "schema", with a view of covering the syntax that is
currently in use at the One Data Model <tt>playground</tt> repository.</t>
      <t pn="section-appendix.a-2">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>
      <artwork type="cddl" name="" align="left" alt="" pn="section-appendix.a-3"><![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
}

sdfinfo = {
 title: text
 version: text
 copyright: text
 license: text
 EXTENSION-POINT
}

; 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 = ( * text => 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
}

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
}

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

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

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

dataqualities = {               ; also propertyqualities
 commonqualities,
 jsonschema,
 ? units: text
 ? scaleMinimum: number
 ? scaleMaximum: number
 ? observable: bool
 ? readable: bool
 ? writable: bool
 ? nullable: bool
 ? subtype: "byte-string" / "unix-time"
           / text                       ; EXTENSION-POINT
 ? contentFormat: text
 EXTENSION-POINT
}

allowed-types = number / text / bool / null
              / [* number] / [* text] / [* bool]
              / any                     ; EXTENSION-POINT

jsonschema = (
 ? type: "number" / "string" / "boolean" / "integer" / "array" ; / "object"
           / text                       ; EXTENSION-POINT
 ? enum: [+ allowed-types]                                              ; should validate against type
 ? const: allowed-types
 ? default: allowed-types
 ; 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                       ; EXTENSION-POINT
           ; expand on demand
 ; 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" / "object"
           / text                       ; EXTENSION-POINT
     ; jso subset
     ? minimum: number
     ? maximum: number
     ? enum: [+ any]
     ? format: text
     ? minLength: number
     ? maxLength: number
     EXTENSION-POINT
   }
)
]]></artwork>
    </section>
    <section anchor="json-schemaorg-rendition-of-sdf-syntax" numbered="true" toc="include" removeInRFC="false" pn="section-appendix.b">
      <name slugifiedName="name-json-schemaorg-rendition-of">json-schema.org Rendition of SDF Syntax</name>
      <t pn="section-appendix.b-1">This appendix describes the syntax of SDF defined in <xref target="syntax" format="default" sectionFormat="of" derivedContent="Appendix A"/>, but
using a version of the description techniques advertised on
json-schema.org <xref target="I-D.handrews-json-schema-validation" format="default" sectionFormat="of" derivedContent="I-D.handrews-json-schema-validation"/>.</t>
      <t pn="section-appendix.b-2">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="" pn="section-appendix.b-3"><![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": {
+      }
+    },
+    "EXTENSION-POINT": {
+      "type": "object",
+      "additionalProperties": {
+      }
     },
     "thingqualities": {
       "type": "object",
       "properties": {
         "sdfObject": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/objectqualities"
           }
         },
         "sdfThing": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/thingqualities"
           }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "commonqualities": {
       "type": "object",
       "properties": {
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
       "additionalProperties": false
     },
     "sdf-pointer": {
       "type": "string"
     },
     "pointer-list": {
       "type": "array",
       "items": {
         "$ref": "#/definitions/sdf-pointer"
       }
     },
     "objectqualities": {
       "type": "object",
       "properties": {
         "sdfProperty": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/propertyqualities"
           }
         },
         "sdfAction": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/actionqualities"
           }
         },
         "sdfEvent": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/eventqualities"
           }
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "propertyqualities": {
       "$ref": "#/definitions/dataqualities"
     },
     "dataqualities": {
       "type": "object",
       "properties": {
         "units": {
           "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"
+            }
           ]
         },
         "contentFormat": {
           "type": "string"
         },
         "type": {
-          "type": "string",
-          "enum": [
-            "number",
-            "string",
-            "boolean",
-            "integer",
-            "array"
+          "anyOf": [
+            {
+              "type": "string",
+              "const": "number"
+            },
+            {
+              "type": "string",
+              "const": "string"
+            },
+            {
+              "type": "string",
+              "const": "boolean"
+            },
+            {
+              "type": "string",
+              "const": "integer"
+            },
+            {
+              "type": "string",
+              "const": "array"
+            },
+            {
+              "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": {
-          "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": {
           "type": "object",
           "properties": {
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "description": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "type": {
-              "type": "string",
-              "enum": [
-                "number",
-                "string",
-                "boolean",
-                "integer"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "number"
+                },
+                {
+                  "type": "string",
+                  "const": "string"
+                },
+                {
+                  "type": "string",
+                  "const": "boolean"
+                },
+                {
+                  "type": "string",
+                  "const": "integer"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "enum": {
               "type": "array",
               "minItems": 1
             },
             "format": {
               "type": "string"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "jsonschema": {
       "type": "object",
       "properties": {
         "type": {
-          "type": "string",
-          "enum": [
-            "number",
-            "string",
-            "boolean",
-            "integer",
-            "array"
+          "anyOf": [
+            {
+              "type": "string",
+              "const": "number"
+            },
+            {
+              "type": "string",
+              "const": "string"
+            },
+            {
+              "type": "string",
+              "const": "boolean"
+            },
+            {
+              "type": "string",
+              "const": "integer"
+            },
+            {
+              "type": "string",
+              "const": "array"
+            },
+            {
+              "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": {
-          "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": {
           "type": "object",
           "properties": {
             "sdfRef": {
               "$ref": "#/definitions/sdf-pointer"
             },
             "description": {
               "type": "string"
             },
             "$comment": {
               "type": "string"
             },
             "type": {
-              "type": "string",
-              "enum": [
-                "number",
-                "string",
-                "boolean",
-                "integer"
+              "anyOf": [
+                {
+                  "type": "string",
+                  "const": "number"
+                },
+                {
+                  "type": "string",
+                  "const": "string"
+                },
+                {
+                  "type": "string",
+                  "const": "boolean"
+                },
+                {
+                  "type": "string",
+                  "const": "integer"
+                },
+                {
+                  "type": "string"
+                }
               ]
             },
             "minimum": {
               "type": "number"
             },
             "maximum": {
               "type": "number"
             },
             "enum": {
               "type": "array",
               "minItems": 1
             },
             "format": {
               "type": "string"
             },
             "minLength": {
               "type": "number"
             },
             "maxLength": {
               "type": "number"
             }
           },
-          "additionalProperties": false
+          "additionalProperties": {
+          }
         }
       },
       "additionalProperties": false
     },
     "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"
           }
+        },
+        {
         }
       ]
     },
     "actionqualities": {
       "type": "object",
       "properties": {
         "sdfInputData": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfRequiredInputData": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfOutputData": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "eventqualities": {
       "type": "object",
       "properties": {
         "sdfOutputData": {
           "$ref": "#/definitions/pointer-list"
         },
         "sdfData": {
           "type": "object",
           "additionalProperties": {
             "$ref": "#/definitions/dataqualities"
           }
         },
         "description": {
           "type": "string"
         },
         "label": {
           "type": "string"
         },
         "$comment": {
           "type": "string"
         },
         "sdfRef": {
           "$ref": "#/definitions/sdf-pointer"
         },
         "sdfRequired": {
           "$ref": "#/definitions/pointer-list"
         }
       },
-      "additionalProperties": false
+      "additionalProperties": {
+      }
     },
     "productqualities": {
       "$ref": "#/definitions/thingqualities"
     }
   }
 }
]]></artwork>
    </section>
    <section numbered="false" anchor="acknowledgements" toc="include" removeInRFC="false" pn="section-appendix.c">
      <name slugifiedName="name-acknowledgements">Acknowledgements</name>
      <t pn="section-appendix.c-1">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
 -->

</section>
    <section anchor="contributors" numbered="false" toc="include" removeInRFC="false" pn="section-appendix.d">
      <name slugifiedName="name-contributors">Contributors</name>
      <contact initials="A." surname="Keränen" fullname="Ari Keränen">
        <organization showOnFrontPage="true">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 showOnFrontPage="true">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>
    <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc="include" pn="section-appendix.e">
      <name slugifiedName="name-authors-addresses">Authors' Addresses</name>
      <author initials="M." surname="Koster" fullname="Michael Koster" role="editor">
        <organization showOnFrontPage="true">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" showOnFrontPage="true">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>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
