rfc9880v1.txt   rfc9880.txt 
skipping to change at line 129 skipping to change at line 129
Appendix C. Data Qualities Inspired by json-schema.org Appendix C. Data Qualities Inspired by json-schema.org
C.1. type "number", type "integer" C.1. type "number", type "integer"
C.2. type "string" C.2. type "string"
C.3. type "boolean" C.3. type "boolean"
C.4. type "array" C.4. type "array"
C.5. type "object" C.5. type "object"
C.6. Implementation Notes C.6. Implementation Notes
Appendix D. Composition Examples Appendix D. Composition Examples
D.1. Outlet Strip Example D.1. Outlet Strip Example
D.2. Refrigerator-Freezer Example D.2. Refrigerator-Freezer Example
Appendix E. Some Changes From Earlier Drafts Appendix E. Some Changes from Earlier Draft Versions of this
Specification
List of Figures List of Figures
List of Tables List of Tables
Acknowledgements Acknowledgements
Contributors Contributors
Authors' Addresses Authors' Addresses
1. Introduction 1. Introduction
The Semantic Definition Format (SDF) is concerned with Things, namely The Semantic Definition Format (SDF) is concerned with Things, namely
physical objects that are available for interaction over a network. physical objects that are available for interaction over a network.
skipping to change at line 273 skipping to change at line 274
interaction opportunities offered by one or more kinds of Things, interaction opportunities offered by one or more kinds of Things,
represented by Groupings (sdfObjects and sdfThings). An SDF Model represented by Groupings (sdfObjects and sdfThings). An SDF Model
can be fully contained in a single SDF Document, or it can be can be fully contained in a single SDF Document, or it can be
built from an SDF Document that references definitions and built from an SDF Document that references definitions and
declarations from additional SDF documents. declarations from additional SDF documents.
Block: One or more entries in a JSON map that is part of an SDF Block: One or more entries in a JSON map that is part of an SDF
specification. These entries can be described as a Block to specification. These entries can be described as a Block to
emphasize that they serve a specific function together. emphasize that they serve a specific function together.
Group: An entry in the main JSON map that represents the SDF Group: An entry in the top-level JSON map that represents the SDF
document, and in certain nested definitions. A group has a Class document. Groups also can be used in certain nested definitions.
Name Keyword as its key and a map of named definition entries A group has a Class Name Keyword as its key and a map of named
(Definition Group) as a value. definition entries (Definition Group) as a value.
Class Name Keyword: One of sdfThing, sdfObject, sdfProperty, Class Name Keyword: One of sdfThing, sdfObject, sdfProperty,
sdfAction, sdfEvent, or sdfData. The Classes for these type sdfAction, sdfEvent, or sdfData. The Classes for these type
keywords are capitalized and prefixed with sdf. keywords are capitalized and prefixed with sdf.
Class: Abstract term for the information that is contained in groups Class: Abstract term for the information that is contained in groups
identified by a Class Name Keyword. identified by a Class Name Keyword.
Quality: A metadata item in a definition or declaration that says Quality: A metadata item in a definition or declaration that says
something about that definition or declaration. A quality is something about that definition or declaration. A quality is
skipping to change at line 550 skipping to change at line 551
interactions modeled by them. It also provides qualities that interactions modeled by them. It also provides qualities that
associate semantics to this data, such as engineering units and unit associate semantics to this data, such as engineering units and unit
scaling information. scaling information.
For the data definition within sdfProperty or sdfData, SDF borrows For the data definition within sdfProperty or sdfData, SDF borrows
some vocabulary proposed for drafts 4 [JSO4] [JSO4V] and 7 [JSO7] some vocabulary proposed for drafts 4 [JSO4] [JSO4V] and 7 [JSO7]
[JSO7V] of the json-schema.org "JSON Schema" format (collectively [JSO7V] of the json-schema.org "JSON Schema" format (collectively
called JSO here), enhanced by qualities that are specific to SDF. called JSO here), enhanced by qualities that are specific to SDF.
Details about the JSO-inspired vocabulary are in Appendix C. For Details about the JSO-inspired vocabulary are in Appendix C. For
base SDF, data are constrained to be of simple types (number, string, base SDF, data are constrained to be of simple types (number, string,
Boolean), JSON maps composed of named data, and arrays of these boolean), JSON maps composed of named data, and arrays of these
types. Syntax extension points are provided that can be used to types. Syntax extension points are provided that can be used to
provide richer types in a future extension of this specification provide richer types in a future extension of this specification
(possibly more of which can be borrowed from json-schema.org). (possibly more of which can be borrowed from json-schema.org).
Note that sdfProperty definitions (and sdfData definitions in Note that sdfProperty definitions (and sdfData definitions in
general) are not intended to constrain the formats of data used for general) are not intended to constrain the formats of data used for
communication over network interfaces. Where needed, data communication over network interfaces. Where needed, data
definitions for payloads of protocol messages are expected to be part definitions for payloads of protocol messages are expected to be part
of the protocol binding. of the protocol binding.
skipping to change at line 703 skipping to change at line 704
defined using the CDDL generic rule reference named<membervalues>, defined using the CDDL generic rule reference named<membervalues>,
where membervalues is in turn the structure of the member values of where membervalues is in turn the structure of the member values of
the JSON map, i.e., the value of the member named by the Given Name. the JSON map, i.e., the value of the member named by the Given Name.
As quality-named maps and given-named maps roughly alternate in a As quality-named maps and given-named maps roughly alternate in a
path down the tree, membervalues is usually a map built from Quality path down the tree, membervalues is usually a map built from Quality
Names as keys. Names as keys.
2.3.2. Hierarchical Names 2.3.2. Hierarchical Names
From the outside of a specification, Given Names are usually used as From the outside of a specification, Given Names are usually used as
part of a hierarchical name that looks like a JSON pointer [RFC6901], part of a hierarchical name that looks like a JSON Pointer [RFC6901].
itself generally rooted in (used as the fragment identifier in) an These hierarchical names are generally rooted in (used as the
outer namespace that looks like an https:// URL (see Section 4). fragment identifier in) an outer namespace that looks like an
https:// URL (see Section 4).
As Quality Names and Given Names roughly alternate in a path into the As Quality Names and Given Names roughly alternate in a path into the
model, the JSON pointer part of the hierarchical name also alternates model, the JSON Pointer part of the hierarchical name also alternates
between Quality Names and Given Names. between Quality Names and Given Names.
Note that the actual Given Names may need to be encoded when Note that the actual Given Names may need to be encoded when
specified via the JSON pointer fragment identifier syntax. There are specified via the JSON Pointer fragment identifier syntax. There are
two layers of such encoding: tilde encoding of ~ and / as per two layers of such encoding: tilde encoding of ~ and / as per
Section 3 of [RFC6901], as well as percent encoding of the tilde- Section 3 of [RFC6901], as well as percent encoding of the tilde-
encoded name into a valid URI fragment as per Section 6 of [RFC6901]. encoded name into a valid URI fragment as per Section 6 of [RFC6901].
For example, when a model is using the Given Name For example, when a model is using the Given Name
warning/danger alarm warning/danger alarm
(with an embedded slash and a space) for an sdfObject, that sdfObject (with an embedded slash and a space) for an sdfObject, that sdfObject
may need to be referenced as may need to be referenced as
skipping to change at line 808 skipping to change at line 810
The information block contains generic metadata for the SDF document The information block contains generic metadata for the SDF document
itself and all included definitions. To enable tool integration, the itself and all included definitions. To enable tool integration, the
information block is optional in the grammar of SDF; most processes information block is optional in the grammar of SDF; most processes
for working with SDF documents will have policies that only SDF for working with SDF documents will have policies that only SDF
documents with an info block can be processed. It is therefore documents with an info block can be processed. It is therefore
RECOMMENDED that SDF validator tools emit a warning when no RECOMMENDED that SDF validator tools emit a warning when no
information block is found. information block is found.
The keyword (map key) that defines an information block is "info". 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 The keyword's value is a nested JSON map with a set of entries that
qualities that apply to the included definition. represent qualities that apply to the included definitions.
Qualities of this map are shown in Table 1. None of these qualities Qualities of this map are shown in Table 1. None of these qualities
are required or have default values that are assumed if the quality are required or have default values that are assumed if the quality
is absent. is absent.
+=============+==========+=================================+ +=============+==========+=================================+
| Quality | Type | Description | | Quality | Type | Description |
+=============+==========+=================================+ +=============+==========+=================================+
| title | string | A short summary to be displayed | | title | string | A short summary to be displayed |
| | | in search results, etc. | | | | in search results, etc. |
skipping to change at line 854 skipping to change at line 856
The version quality is used to indicate version information about the The version quality is used to indicate version information about the
set of definitions in the SDF document. The version is RECOMMENDED set of definitions in the SDF document. The version is RECOMMENDED
to be lexicographically increasing over the life of a model; a newer to be lexicographically increasing over the life of a model; a newer
model always has a version string that string-compares higher than model always has a version string that string-compares higher than
all previous versions. This is easily achieved by following the all previous versions. This is easily achieved by following the
convention to start the version with a date-time as defined in convention to start the version with a date-time as defined in
[RFC3339] or, if new versions are generated less frequently than once [RFC3339] or, if new versions are generated less frequently than once
a day, just the full-date (i.e., YYYY-MM-DD); in many cases, that a day, just the full-date (i.e., YYYY-MM-DD); in many cases, that
will be all that is needed (see Figure 1 for an example). This will be all that is needed (see Figure 1 for an example). This
specification does not give a strict definition for the format of the specification does not give a strict definition for the format of the
version string but each using system or organization should define version string, but each system or organization using the version
internal structure and semantics to the level needed for their use. string should define internal structure and semantics to the level
If no further details are provided, a date-time or full-date in this needed for their use. If no further details are provided, a date-
field can be assumed to indicate the latest update time of the time or full-date in this field can be assumed to indicate the latest
definitions in the SDF document. update time of the definitions in the SDF document.
The modified quality can be used with a value using date-time as The modified quality can be used with a value using date-time as
defined in [RFC3339] (with Z for time-zone) or full-date format to defined in [RFC3339] (with Z for time-zone) or full-date format to
express time of the latest revision of the definitions. express time of the latest revision of the definitions.
The license string is preferably either a URI that points to a web The license string is preferably either a URI that points to a web
page with an unambiguous definition of the license or an [SPDX] page with an unambiguous definition of the license or an [SPDX]
license identifier. (As an example, for models to be handled by the license identifier. (As an example, for models to be handled by the
One Data Model liaison group, this license identifier will typically One Data Model liaison group, this license identifier will typically
be "BSD-3-Clause".) be "BSD-3-Clause".)
skipping to change at line 1026 skipping to change at line 1028
The absolute-URI of a global name should be a URI as per Section 3 of The absolute-URI of a global name should be a URI as per Section 3 of
RFC 3986 [STD66] with a scheme of "https" and a path (hier-part in RFC 3986 [STD66] with a scheme of "https" and a path (hier-part in
[STD66]). For base SDF, the query part should not be used (it might [STD66]). For base SDF, the query part should not be used (it might
be used in extensions). be used in extensions).
The fragment identifier is constructed as per Section 6 of [RFC6901]. The fragment identifier is constructed as per Section 6 of [RFC6901].
4.2. Contributing Global Names 4.2. Contributing Global Names
The fragment identifier part of a global name defined in an SDF The fragment identifier part of a global name defined in an SDF
document is constructed from a JSON pointer that selects the element document is constructed from a JSON Pointer that selects the element
defined for this name in the SDF document. The absolute-URI part is defined for this name in the SDF document. The absolute-URI part is
a copy of the default namespace. a copy of the default namespace.
As a result, the default namespace is always the target namespace for As a result, the default namespace is always the target namespace for
a name for which a definition is contributed. In order to emphasize a name for which a definition is contributed. In order to emphasize
that name definitions are contributed to the default namespace, this that name definitions are contributed to the default namespace, this
namespace is also termed the "target namespace" of the SDF document. namespace is also termed the "target namespace" of the SDF document.
For instance, in Figure 1, definitions for the following global names For instance, in Figure 1, definitions for the following global names
are contributed: are contributed:
skipping to change at line 1062 skipping to change at line 1064
A name reference takes the form of the production curie in Section 3 A name reference takes the form of the production curie in Section 3
of [W3C.NOTE-curie-20101216], but limiting the IRIs involved in that of [W3C.NOTE-curie-20101216], but limiting the IRIs involved in that
grammar to URIs as per [STD66] and the prefixes to ASCII characters grammar to URIs as per [STD66] and the prefixes to ASCII characters
[STD80]. (Note that this definition does not make use of the [STD80]. (Note that this definition does not make use of the
production safe-curie in [W3C.NOTE-curie-20101216].) production safe-curie in [W3C.NOTE-curie-20101216].)
A name that is contributed by the current SDF document can be A name that is contributed by the current SDF document can be
referenced by a Same-Document Reference as per Section 4.4 of RFC referenced by a Same-Document Reference as per Section 4.4 of RFC
3986 [STD66]. As there is little point in referencing the entire SDF 3986 [STD66]. As there is little point in referencing the entire SDF
document, this will be a # followed by a JSON pointer. This is the document, this will be a # followed by a JSON Pointer. This is the
only kind of name reference to itself that is possible in an SDF only kind of name reference to itself that is possible in an SDF
document that does not set a default namespace. document that does not set a default namespace.
Name references that point outside the current SDF document need to Name references that point outside the current SDF document need to
contain curie prefixes. These then reference namespace declarations contain CURIE prefixes. These then reference namespace declarations
in the namespaces block. in the namespaces block.
For example, if a namespace prefix is defined: For example, if a namespace prefix is defined:
"namespace": { "namespace": {
"foo": "https://example.com/" "foo": "https://example.com/"
} }
then this reference to that namespace: then this reference to that namespace:
"sdfRef": "foo:#/sdfData/temperatureData" "sdfRef": "foo:#/sdfData/temperatureData"
references the global name: references the global name:
"https://example.com/#/sdfData/temperatureData" "https://example.com/#/sdfData/temperatureData"
Note that there is no way to provide a URI scheme name in a curie, so Note that there is no way to provide a URI scheme name in a CURIE, so
all references to outside of the document need to go through the all references to outside of the document need to go through the
namespace map. namespace map.
Name references occur only in specific elements of the syntax of SDF: Name references occur only in specific elements of the syntax of SDF:
* copying elements via sdfRef values * copying elements via sdfRef values
* pointing to elements via sdfRequired value elements * pointing to elements via sdfRequired value elements
4.4. sdfRef 4.4. sdfRef
skipping to change at line 1131 skipping to change at line 1133
well. well.
More formally, for a JSON map that contains an sdfRef member, the More formally, for a JSON map that contains an sdfRef member, the
semantics are defined to be as if the following steps were performed: semantics are defined to be as if the following steps were performed:
1. The JSON map that contains the sdfRef member is copied into a 1. The JSON map that contains the sdfRef member is copied into a
variable named "patch". variable named "patch".
2. The sdfRef member of the copy in "patch" is removed. 2. The sdfRef member of the copy in "patch" is removed.
3. The JSON pointer that is the value of the sdfRef member is 3. The JSON Pointer that is the value of the sdfRef member is
dereferenced and the result is copied into a variable named dereferenced and the result is copied into a variable named
"original". "original".
4. The JSON Merge Patch algorithm [RFC7396] is applied to patch the 4. The JSON Merge Patch algorithm [RFC7396] is applied to patch the
contents of "original" with the contents of "patch". contents of "original" with the contents of "patch".
5. The result of the Merge Patch is used in place of the value of 5. The result of the Merge Patch is used in place of the value of
the original JSON map. the original JSON map.
Note that the formal syntaxes given in Appendices A and B generally Note that the formal syntaxes given in Appendices A and B generally
skipping to change at line 1275 skipping to change at line 1277
declarations, one per affordance type. declarations, one per affordance type.
- The same applies to groupings made mandatory within groupings - The same applies to groupings made mandatory within groupings
containing them. containing them.
* The Boolean value true. The affordance or grouping itself that * The Boolean value true. The affordance or grouping itself that
carries the sdfRequired keyword is declared to be mandatory to be carries the sdfRequired keyword is declared to be mandatory to be
represented. represented.
Note that referenceable-names are not subject to the encoding JSON Note that referenceable-names are not subject to the encoding JSON
pointers require as discussed in Section 2.3.2. To ensure that Pointers require as discussed in Section 2.3.2. To ensure that
referenceable-names are reliably distinguished from JSON pointers, referenceable-names are reliably distinguished from JSON Pointers,
they are defined such that they cannot contain ":" or "#" characters they are defined such that they cannot contain ":" or "#" characters
(see rule referenceable-name in Appendix A). (If these characters (see rule referenceable-name in Appendix A). (If these characters
are indeed contained in a Given Name, a JSON pointer needs to be are indeed contained in a Given Name, a JSON pointer needs to be
formed instead in order to reference it in "sdfRequired", potentially formed instead in order to reference it in "sdfRequired", potentially
requiring further path elements as well as JSON pointer encoding. requiring further path elements as well as JSON Pointer encoding.
The need for this is best avoided by choosing Given Names without The need for this is best avoided by choosing Given Names without
these characters.) these characters.)
The example in Figure 4 shows two required elements in the sdfObject The example in Figure 4 shows two required elements in the sdfObject
definition for "temperatureWithAlarm", the sdfProperty definition for "temperatureWithAlarm", the sdfProperty
"currentTemperature", and the sdfEvent "overTemperatureEvent". The "currentTemperature", and the sdfEvent "overTemperatureEvent". The
example also shows the use of JSON pointer with "sdfRef" to use a example also shows the use of JSON Pointers with "sdfRef" to use a
pre-existing definition for the sdfProperty "currentTemperature" and pre-existing definition for the sdfProperty "currentTemperature" and
for the sdfOutputData produced by the sdfEvent for the sdfOutputData produced by the sdfEvent
"overTemperatureEvent". "overTemperatureEvent".
"sdfObject": { "sdfObject": {
"temperatureWithAlarm": { "temperatureWithAlarm": {
"sdfRequired": [ "sdfRequired": [
"#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature", "#/sdfObject/temperatureWithAlarm/sdfProperty/currentTemperature",
"#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent" "#/sdfObject/temperatureWithAlarm/sdfEvent/overTemperatureEvent"
], ],
skipping to change at line 1342 skipping to change at line 1344
} }
4.6. Common Qualities 4.6. Common Qualities
Definitions in SDF share a number of qualities that provide metadata Definitions in SDF share a number of qualities that provide metadata
for them. These are listed in Table 3. None of these qualities are for them. These are listed in Table 3. None of these qualities are
required or have default values that are assumed if the quality is required or have default values that are assumed if the quality is
absent. If a short textual description is required for an absent. If a short textual description is required for an
application and no label is given in the SDF model, applications application and no label is given in the SDF model, applications
could use the last part (the last reference-token, Section 3 of could use the last part (the last reference-token, Section 3 of
[RFC6901]) of the JSON pointer to the definition in its place. [RFC6901]) of the JSON Pointer to the definition in its place.
+=============+==============+=============================+ +=============+==============+=============================+
| Quality | Type | Description | | Quality | Type | Description |
+=============+==============+=============================+ +=============+==============+=============================+
| description | string | long text (no constraints) | | description | string | long text (no constraints) |
+-------------+--------------+-----------------------------+ +-------------+--------------+-----------------------------+
| label | string | short text (no constraints) | | label | string | short text (no constraints) |
+-------------+--------------+-----------------------------+ +-------------+--------------+-----------------------------+
| $comment | string | source code comments only, | | $comment | string | source code comments only, |
| | | no semantics | | | | no semantics |
skipping to change at line 1410 skipping to change at line 1412
| | (Section | | | | | (Section | | |
| | 4.7.2) | | | | | 4.7.2) | | |
+---------------+----------------+--------------------+---------+ +---------------+----------------+--------------------+---------+
| enum | array of | abbreviation for | N/A | | enum | array of | abbreviation for | N/A |
| | strings | string-valued | | | | strings | string-valued | |
| | | named alternatives | | | | | named alternatives | |
+---------------+----------------+--------------------+---------+ +---------------+----------------+--------------------+---------+
Table 4: SDF-Defined Qualities of sdfData and sdfProperty Table 4: SDF-Defined Qualities of sdfData and sdfProperty
1. The unit name SHOULD be as per the SenML Units registry or the 1. The unit name SHOULD be as per the "SenML Units" registry or the
Secondary Units registry in [IANA.senml] as specified by Sections "Secondary Units" registry in [IANA.senml] as specified by
4.5.2 and 12.1 of [RFC8428] and Section 3 of [RFC8798], Sections 4.5.1 and 12.1 of [RFC8428] and Section 3 of [RFC8798],
respectively. respectively.
Exceptionally, if a registration in these registries cannot be Exceptionally, if a registration in these registries cannot be
obtained or would be inappropriate, the unit name can also be a obtained or would be inappropriate, the unit name can also be a
URI that is pointing to a definition of the unit. Note that SDF URI that is pointing to a definition of the unit. Note that SDF
processors are not expected to, and normally SHOULD NOT, processors are not expected to, and normally SHOULD NOT,
dereference these URIs; the definition pointed to may be useful dereference these URIs; the definition pointed to may be useful
to humans, though. (See [DEREF-ID-PATTERN] for a more extensive to humans, though. (See [DEREF-ID-PATTERN] for a more extensive
discussion of dereferenceable identifiers). discussion of dereferenceable identifiers).
skipping to change at line 1986 skipping to change at line 1988
Repository: Combining the symbol values from the "SenML Units" Repository: Combining the symbol values from the "SenML Units"
registry and the "Secondary Units" registry in the "Sensor registry and the "Secondary Units" registry in the "Sensor
Measurement Lists (SenML)" registry group [IANA.senml] as Measurement Lists (SenML)" registry group [IANA.senml] as
specified by Sections 4.5.2 and 12.1 of [RFC8428] and Section 3 of specified by Sections 4.5.2 and 12.1 of [RFC8428] and Section 3 of
[RFC8798], respectively (which, by the registration policy, are [RFC8798], respectively (which, by the registration policy, are
guaranteed to be non-overlapping). guaranteed to be non-overlapping).
Index value: Percent-encoding (Section 2.1 of RFC 3986 [STD66]) is Index value: Percent-encoding (Section 2.1 of RFC 3986 [STD66]) is
required of any characters in unit names except for the set required of any characters in unit names except for the set
"unreserved" (Section 2.3 of RFC 3986 [STD66]), the set "sub- "unreserved" (Section 2.3 of RFC 3986 [STD66]), the set "sub-
delims" (Section 2.3 of RFC 3986 [STD66]), and ":" or "@" (i.e., delims" (Section 2.2 of RFC 3986 [STD66]), and ":" or "@" (i.e.,
the result must match the ABNF rule "pchar" in Section 3.3 of RFC the result must match the ABNF rule "pchar" in Section 3.3 of RFC
3986 [STD66]). 3986 [STD66]).
7.4. SenML Registry Group 7.4. SenML Registry Group
IANA has added the following note to the "Sensor Measurement Lists IANA has added the following note to the "Sensor Measurement Lists
(SenML)" registry group [IANA.senml]: (SenML)" registry group [IANA.senml]:
| In SDF [RFC9880], a URI unit name is distinguished from a | In SDF [RFC9880], a URI unit name is distinguished from a
| registered unit name by the presence of a colon; any registered | registered unit name by the presence of a colon; any registered
skipping to change at line 2290 skipping to change at line 2292
an attack) cause. More generally speaking, implementations should an attack) cause. More generally speaking, implementations should
strive to be robust against expected and unexpected limitations of strive to be robust against expected and unexpected limitations of
the model-based input validation mechanisms and their the model-based input validation mechanisms and their
implementations. implementations.
Similarly, implementations that rely on model-based augmentation may Similarly, implementations that rely on model-based augmentation may
generate false data from their inputs; this is an integrity violation generate false data from their inputs; this is an integrity violation
in any case, but also can possibly be exploited for further attacks. in any case, but also can possibly be exploited for further attacks.
In applications that dynamically acquire models and obtain modules In applications that dynamically acquire models and obtain modules
from module references in these, the security considerations of from module references in these models, the security considerations
dereferenceable identifiers apply (see [DEREF-ID-PATTERN] for a more of dereferenceable identifiers apply (see [DEREF-ID-PATTERN] for a
extensive discussion of dereferenceable identifiers). more extensive discussion of dereferenceable identifiers).
There may be confidentiality requirements on SDF models, both on There may be confidentiality requirements on SDF models, both on
their content and on the fact that a specific model is used in a their content and on the fact that a specific model is used in a
particular Thing or environment. The present specification does not particular Thing or environment. The present specification does not
discuss model discovery or define an access control model for SDF discuss model discovery or define an access control model for SDF
models, nor does it define a way to obtain selective disclosure where models, nor does it define a way to obtain selective disclosure where
that may be required. It is likely that these definitions require that may be required. It is likely that these definitions require
additional context from underlying ecosystems and the characteristics additional context from underlying ecosystems and the characteristics
of the protocols employed there; therefore, this is left as future of the protocols employed there; therefore, this is left as future
work (e.g., for documents such as [SDF-MAPPING]). work (e.g., for documents such as [SDF-MAPPING]).
skipping to change at line 2465 skipping to change at line 2467
"Camel Case", December 2014, "Camel Case", December 2014,
<http://wiki.c2.com/?CamelCase>. <http://wiki.c2.com/?CamelCase>.
[DEREF-ID-PATTERN] [DEREF-ID-PATTERN]
Bormann, C. and C. Amsüss, "The "dereferenceable Bormann, C. and C. Amsüss, "The "dereferenceable
identifier" pattern", Work in Progress, Internet-Draft, identifier" pattern", Work in Progress, Internet-Draft,
draft-bormann-t2trg-deref-id-06, 30 August 2025, draft-bormann-t2trg-deref-id-06, 30 August 2025,
<https://datatracker.ietf.org/doc/html/draft-bormann- <https://datatracker.ietf.org/doc/html/draft-bormann-
t2trg-deref-id-06>. t2trg-deref-id-06>.
[ECMA-262] Ecma International, "ECMAScript 2024 Language [ECMA-262] Ecma International, "ECMAScript 2025 Language
Specification", 15th Edition, ECMA Standard ECMA-262, June Specification", 16th Edition, ECMA Standard ECMA-262, June
2024, <https://www.ecma-international.org/wp- 2025, <https://ecma-international.org/wp-content/uploads/
content/uploads/ECMA-262.pdf>. ECMA-262_16th_edition_june_2025.pdf>.
[JSO4] Galiegue, F., Ed., Zyp, K., Ed., and G. Court, "JSON [JSO4] Galiegue, F., Ed., Zyp, K., Ed., and G. Court, "JSON
Schema: core definitions and terminology", Work in Schema: core definitions and terminology", Work in
Progress, Internet-Draft, draft-zyp-json-schema-04, 31 Progress, Internet-Draft, draft-zyp-json-schema-04, 31
January 2013, <https://datatracker.ietf.org/doc/html/ January 2013, <https://datatracker.ietf.org/doc/html/
draft-zyp-json-schema-04>. draft-zyp-json-schema-04>.
[JSO4V] Zyp, K. and G. Court, "JSON Schema: interactive and non [JSO4V] Zyp, K. and G. Court, "JSON Schema: interactive and non
interactive validation", Work in Progress, Internet-Draft, interactive validation", Work in Progress, Internet-Draft,
draft-fge-json-schema-validation-00, 31 January 2013, draft-fge-json-schema-validation-00, 31 January 2013,
skipping to change at line 2505 skipping to change at line 2507
[KebabCase] [KebabCase]
"Kebab Case", August 2014, "Kebab Case", August 2014,
<http://wiki.c2.com/?KebabCase>. <http://wiki.c2.com/?KebabCase>.
[OCF] Open Connectivity Foundation, "OCF Resource Type [OCF] Open Connectivity Foundation, "OCF Resource Type
Specification", Version 2.2.7, November 2023, Specification", Version 2.2.7, November 2023,
<https://openconnectivity.org/specs/ <https://openconnectivity.org/specs/
OCF_Resource_Type_Specification.pdf>. OCF_Resource_Type_Specification.pdf>.
[OMA] Open Mobile Alliance, "OMA LightweightM2M (LwM2M) Object [OMA] Open Mobile Alliance, "LwM2M OBJECTS",
and Resource Registry", <https://www.openmobilealliance.org/specifications/
<http://www.openmobilealliance.org/wp/omna/lwm2m/ registries/objects>.
lwm2mregistry.html>.
[REST-IOT] Keränen, A., Kovatsch, M., and K. Hartke, "Guidance on [REST-IOT] Keränen, A., Kovatsch, M., and K. Hartke, "Guidance on
RESTful Design for Internet of Things Systems", Work in RESTful Design for Internet of Things Systems", Work in
Progress, Internet-Draft, draft-irtf-t2trg-rest-iot-17, 20 Progress, Internet-Draft, draft-irtf-t2trg-rest-iot-17, 20
October 2025, <https://datatracker.ietf.org/doc/html/ October 2025, <https://datatracker.ietf.org/doc/html/
draft-irtf-t2trg-rest-iot-17>. draft-irtf-t2trg-rest-iot-17>.
[RFC8576] Garcia-Morchon, O., Kumar, S., and M. Sethi, "Internet of [RFC8576] Garcia-Morchon, O., Kumar, S., and M. Sethi, "Internet of
Things (IoT) Security: State of the Art and Challenges", Things (IoT) Security: State of the Art and Challenges",
RFC 8576, DOI 10.17487/RFC8576, April 2019, RFC 8576, DOI 10.17487/RFC8576, April 2019,
skipping to change at line 2723 skipping to change at line 2724
/ (sdftype-name .feature "sdftype-ext") ; EXTENSION-POINT / (sdftype-name .feature "sdftype-ext") ; EXTENSION-POINT
? contentFormat: text ? contentFormat: text
* $$SDF-EXTENSION-DATA * $$SDF-EXTENSION-DATA
EXTENSION-POINT<"data-ext"> EXTENSION-POINT<"data-ext">
} }
propertyqualities = { propertyqualities = {
? observable: bool ? observable: bool
? readable: bool ? readable: bool
? writable: bool ? writable: bool
* $$SDF-EXTENSION-PROPERTY
~dataqualities ~dataqualities
} }
allowed-types = number / text / bool / null allowed-types = number / text / bool / null
/ [* number] / [* text] / [* bool] / [* number] / [* text] / [* bool]
/ {* text => any} / {* text => any}
/ $SDF-EXTENSION-ALLOWED / $SDF-EXTENSION-ALLOWED
/ (any .feature "allowed-ext") ; EXTENSION-POINT / (any .feature "allowed-ext") ; EXTENSION-POINT
compound-type = ( compound-type = (
skipping to change at line 2835 skipping to change at line 2837
Appendix A, but uses a version of the description techniques Appendix A, but uses a version of the description techniques
advertised on json-schema.org [JSO7] [JSO7V]. advertised on json-schema.org [JSO7] [JSO7V].
The appendix shows both the validation and the framework syntax. The appendix shows both the validation and the framework syntax.
Since most of the lines are the same between these two files, those 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 lines are shown only once, with a leading space, in the form of a
unified diff. Lines leading with a - are part of the validation unified diff. Lines leading with a - are part of the validation
syntax and lines leading with a + are part of the framework syntax. syntax and lines leading with a + are part of the framework syntax.
{ {
- "title": "sdf-validation.cddl -- Generated: 2024-02-29T07:42:35Z", - "title": "sdf-validation.cddl -- Generated: 2025-10-13T08:43:18Z",
+ "title": "sdf-framework.cddl -- Generated: 2024-02-29T07:42:52Z", + "title": "sdf-framework.cddl -- Generated: 2025-10-13T08:43:29Z",
"$schema": "http://json-schema.org/draft-07/schema#", "$schema": "http://json-schema.org/draft-07/schema#",
"$ref": "#/definitions/sdf-syntax", "$ref": "#/definitions/sdf-syntax",
"definitions": { "definitions": {
"sdf-syntax": { "sdf-syntax": {
"type": "object", "type": "object",
"properties": { "properties": {
"info": { "info": {
"$ref": "#/definitions/sdfinfo" "$ref": "#/definitions/sdfinfo"
}, },
"namespace": { "namespace": {
skipping to change at line 2881 skipping to change at line 2883
"$ref": "#/definitions/sdfAction-" "$ref": "#/definitions/sdfAction-"
}, },
"sdfEvent": { "sdfEvent": {
"$ref": "#/definitions/sdfEvent-" "$ref": "#/definitions/sdfEvent-"
}, },
"sdfData": { "sdfData": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
} }
}, },
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"additionalProperties": false "additionalProperties": false
}, },
"sdfinfo": { "sdfinfo": {
"type": "object", "type": "object",
"properties": { "properties": {
"title": { "title": {
"type": "string" "type": "string"
}, },
"description": { "description": {
skipping to change at line 2917 skipping to change at line 2918
"features": { "features": {
- "type": "array", - "type": "array",
- "maxItems": 0 - "maxItems": 0
+ "type": "array" + "type": "array"
}, },
"$comment": { "$comment": {
"type": "string" "type": "string"
} }
}, },
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"additionalProperties": false "additionalProperties": false
}, },
"modified-date-time": { "modified-date-time": {
"type": "string" "type": "string"
}, },
"thingqualities": { "thingqualities": {
"type": "object", "type": "object",
"properties": { "properties": {
"description": { "description": {
skipping to change at line 2975 skipping to change at line 2975
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
}, },
"minItems": { "minItems": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
}, },
"maxItems": { "maxItems": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
} }
}, },
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"additionalProperties": false "additionalProperties": false
}, },
"sdf-pointer": { "sdf-pointer": {
"anyOf": [ "anyOf": [
{ {
"$ref": "#/definitions/global" "$ref": "#/definitions/global"
}, },
{ {
"$ref": "#/definitions/same-object" "$ref": "#/definitions/same-object"
skipping to change at line 3052 skipping to change at line 3051
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
}, },
"minItems": { "minItems": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
}, },
"maxItems": { "maxItems": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
} }
}, },
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"additionalProperties": false "additionalProperties": false
}, },
"propertyqualities": { "propertyqualities": {
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
"$ref": "#/definitions/type-" "$ref": "#/definitions/type-"
}, },
"sdfChoice": { "sdfChoice": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
}, },
"observable": { "observable": {
"type": "boolean" "type": "boolean"
skipping to change at line 3159 skipping to change at line 3156
}, },
"contentFormat": { "contentFormat": {
"type": "string" "type": "string"
} }
}, },
"additionalProperties": false "additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ },
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "object"
+ },
+ "required": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "properties": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+ },
+ "sdfChoice": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+ },
+ "observable": {
+ "type": "boolean"
+ },
+ "readable": {
+ "type": "boolean"
+ },
+ "writable": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "sdfRef": {
+ "$ref": "#/definitions/sdf-pointer"
+ },
+ "sdfRequired": {
+ "$ref": "#/definitions/pointer-list"
+ },
+ "const": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "default": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "multipleOf": {
+ "type": "number"
+ },
+ "minLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "format": {
+ "$ref": "#/definitions/format-"
+ },
+ "minItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "uniqueItems": {
+ "type": "boolean"
+ },
+ "items": {
+ "$ref": "#/definitions/jso-items"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "nullable": {
+ "type": "boolean"
+ },
+ "sdfType": {
+ "$ref": "#/definitions/sdfType-"
+ },
+ "contentFormat": {
+ "type": "string"
+ }
+ }, + },
+ "additionalProperties": false "properties": {
+ }, "type": {
+ { "type": "string",
+ "type": "object", "const": "object"
},
"required": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
},
"properties": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-"
},
"sdfChoice": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-"
},
"observable": {
"type": "boolean"
},
"readable": {
"type": "boolean"
},
"writable": {
"type": "boolean"
},
"description": {
"type": "string"
},
"label": {
"type": "string"
},
"$comment": {
"type": "string"
},
"sdfRef": {
"$ref": "#/definitions/sdf-pointer"
},
"sdfRequired": {
"$ref": "#/definitions/pointer-list"
},
"const": {
"$ref": "#/definitions/allowed-types"
},
"default": {
"$ref": "#/definitions/allowed-types"
},
"minimum": {
"type": "number"
},
"maximum": {
"type": "number"
},
"exclusiveMinimum": {
"type": "number"
},
"exclusiveMaximum": {
"type": "number"
},
"multipleOf": {
"type": "number"
},
"minLength": {
"$ref": "#/definitions/uint"
},
"maxLength": {
"$ref": "#/definitions/uint"
},
"pattern": {
"type": "string"
},
"format": {
"$ref": "#/definitions/format-"
},
"minItems": {
"$ref": "#/definitions/uint"
},
"maxItems": {
"$ref": "#/definitions/uint"
},
"uniqueItems": {
"type": "boolean"
},
"items": {
"$ref": "#/definitions/jso-items"
},
"unit": {
"type": "string"
},
"nullable": {
"type": "boolean"
},
"sdfType": {
"$ref": "#/definitions/sdfType-"
},
"contentFormat": {
"type": "string"
}
},
"additionalProperties": false
},
{
"type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
+ "properties": { + "properties": {
+ "type": { + "type": {
+ "type": "string" + "type": "string"
+ }, + },
+ "sdfChoice": { + "sdfChoice": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-" + "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+ }, + },
+ "observable": { + "observable": {
+ "type": "boolean" + "type": "boolean"
skipping to change at line 3364 skipping to change at line 3359
+ }, + },
+ "contentFormat": { + "contentFormat": {
+ "type": "string" + "type": "string"
+ } + }
+ }, + },
+ "additionalProperties": false + "additionalProperties": false
+ }, + },
+ { + {
+ "type": "object", + "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ },
+ "properties": {
+ "type": {
+ "$ref": "#/definitions/type-"
+ },
+ "enum": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "observable": {
+ "type": "boolean"
+ },
+ "readable": {
+ "type": "boolean"
+ },
+ "writable": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "sdfRef": {
+ "$ref": "#/definitions/sdf-pointer"
+ },
+ "sdfRequired": {
+ "$ref": "#/definitions/pointer-list"
+ },
+ "const": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "default": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "multipleOf": {
+ "type": "number"
+ },
+ "minLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "format": {
+ "$ref": "#/definitions/format-"
+ },
+ "minItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "uniqueItems": {
+ "type": "boolean"
+ },
+ "items": {
+ "$ref": "#/definitions/jso-items"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "nullable": {
+ "type": "boolean"
+ },
+ "sdfType": {
+ "$ref": "#/definitions/sdfType-"
+ },
+ "contentFormat": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+ }
+ },
+ "properties": {
+ "type": {
+ "type": "string",
+ "const": "object"
+ },
+ "required": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "properties": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+ },
+ "enum": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "observable": {
+ "type": "boolean"
+ },
+ "readable": {
+ "type": "boolean"
+ },
+ "writable": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "sdfRef": {
+ "$ref": "#/definitions/sdf-pointer"
+ },
+ "sdfRequired": {
+ "$ref": "#/definitions/pointer-list"
+ },
+ "const": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "default": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "multipleOf": {
+ "type": "number"
+ },
+ "minLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "format": {
+ "$ref": "#/definitions/format-"
+ },
+ "minItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "uniqueItems": {
+ "type": "boolean"
+ },
+ "items": {
+ "$ref": "#/definitions/jso-items"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "nullable": {
+ "type": "boolean"
+ },
+ "sdfType": {
+ "$ref": "#/definitions/sdfType-"
+ },
+ "contentFormat": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
- "type": "string", "$ref": "#/definitions/type-"
- "const": "object"
+ "type": "string"
}, },
- "required": { "enum": {
+ "enum": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string"
}, },
"minItems": 1 "minItems": 1
}, },
- "properties": {
- "$ref": "#/definitions/sdfData-sdfChoice-properties-"
- },
- "sdfChoice": {
- "$ref": "#/definitions/sdfData-sdfChoice-properties-"
- },
"observable": { "observable": {
"type": "boolean" "type": "boolean"
}, },
"readable": { "readable": {
"type": "boolean" "type": "boolean"
}, },
"writable": { "writable": {
"type": "boolean" "type": "boolean"
}, },
"description": { "description": {
skipping to change at line 3683 skipping to change at line 3455
"type": "boolean" "type": "boolean"
}, },
"sdfType": { "sdfType": {
"$ref": "#/definitions/sdfType-" "$ref": "#/definitions/sdfType-"
}, },
"contentFormat": { "contentFormat": {
"type": "string" "type": "string"
} }
}, },
"additionalProperties": false "additionalProperties": false
- },
+ }
+ ]
+ },
+ "dataqualities": {
+ "anyOf": [
{
"type": "object",
+ "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {
+ }
+ },
"properties": {
"type": {
"$ref": "#/definitions/type-"
},
- "enum": {
- "type": "array",
- "items": {
- "type": "string"
- },
- "minItems": 1
- },
- "observable": {
- "type": "boolean"
- },
- "readable": {
- "type": "boolean"
- },
- "writable": {
- "type": "boolean"
+ "sdfChoice": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-"
},
"description": {
"type": "string"
},
"label": {
"type": "string"
},
"$comment": {
"type": "string"
},
"sdfRef": {
"$ref": "#/definitions/sdf-pointer"
},
"sdfRequired": {
"$ref": "#/definitions/pointer-list"
},
"const": {
"$ref": "#/definitions/allowed-types"
},
"default": {
"$ref": "#/definitions/allowed-types"
},
"minimum": {
"type": "number"
},
"maximum": {
"type": "number"
},
"exclusiveMinimum": {
"type": "number"
},
"exclusiveMaximum": {
"type": "number"
},
"multipleOf": {
"type": "number"
},
"minLength": {
"$ref": "#/definitions/uint"
},
"maxLength": {
"$ref": "#/definitions/uint"
},
"pattern": {
"type": "string"
},
"format": {
"$ref": "#/definitions/format-"
},
"minItems": {
"$ref": "#/definitions/uint"
},
"maxItems": {
"$ref": "#/definitions/uint"
},
"uniqueItems": {
"type": "boolean"
},
"items": {
"$ref": "#/definitions/jso-items"
},
"unit": {
"type": "string"
},
"nullable": {
"type": "boolean"
},
"sdfType": {
"$ref": "#/definitions/sdfType-"
},
"contentFormat": {
"type": "string"
}
},
"additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
"type": "string", "type": "string",
"const": "object" "const": "object"
}, },
"required": { "required": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string"
}, },
"minItems": 1 "minItems": 1
}, },
"properties": { "properties": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
}, },
- "enum": { "enum": {
- "type": "array", "type": "array",
- "items": { "items": {
- "type": "string" "type": "string"
- }, },
- "minItems": 1 "minItems": 1
- }, },
- "observable": { "observable": {
- "type": "boolean" "type": "boolean"
- }, },
- "readable": { "readable": {
- "type": "boolean" "type": "boolean"
- }, },
- "writable": { "writable": {
- "type": "boolean" "type": "boolean"
+ "sdfChoice": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-"
}, },
"description": { "description": {
"type": "string" "type": "string"
}, },
"label": { "label": {
"type": "string" "type": "string"
}, },
"$comment": { "$comment": {
"type": "string" "type": "string"
}, },
skipping to change at line 3905 skipping to change at line 3566
"type": "boolean" "type": "boolean"
}, },
"sdfType": { "sdfType": {
"$ref": "#/definitions/sdfType-" "$ref": "#/definitions/sdfType-"
}, },
"contentFormat": { "contentFormat": {
"type": "string" "type": "string"
} }
}, },
"additionalProperties": false "additionalProperties": false
- }
- ]
- },
- "dataqualities": {
- "anyOf": [
+ }, + },
+ {
+ "type": "object",
+ "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ },
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "enum": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "observable": {
+ "type": "boolean"
+ },
+ "readable": {
+ "type": "boolean"
+ },
+ "writable": {
+ "type": "boolean"
+ },
+ "description": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "sdfRef": {
+ "$ref": "#/definitions/sdf-pointer"
+ },
+ "sdfRequired": {
+ "$ref": "#/definitions/pointer-list"
+ },
+ "const": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "default": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "multipleOf": {
+ "type": "number"
+ },
+ "minLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "format": {
+ "$ref": "#/definitions/format-"
+ },
+ "minItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "uniqueItems": {
+ "type": "boolean"
+ },
+ "items": {
+ "$ref": "#/definitions/jso-items"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "nullable": {
+ "type": "boolean"
+ },
+ "sdfType": {
+ "$ref": "#/definitions/sdfType-"
+ },
+ "contentFormat": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
}
]
},
"dataqualities": {
"anyOf": [
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
- "$ref": "#/definitions/type-" "$ref": "#/definitions/type-"
+ "type": "string"
}, },
"sdfChoice": { "sdfChoice": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
}, },
"description": { "description": {
"type": "string" "type": "string"
}, },
"label": { "label": {
"type": "string" "type": "string"
}, },
skipping to change at line 4003 skipping to change at line 3761
}, },
"contentFormat": { "contentFormat": {
"type": "string" "type": "string"
} }
}, },
"additionalProperties": false "additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
- "type": "string", "type": "string",
- "const": "object" "const": "object"
+ "$ref": "#/definitions/type-"
}, },
- "required": { "required": {
+ "enum": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string"
}, },
"minItems": 1 "minItems": 1
}, },
- "properties": { "properties": {
- "$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
- }, },
- "sdfChoice": { "sdfChoice": {
- "$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
- }, },
"description": { "description": {
"type": "string" "type": "string"
}, },
"label": { "label": {
"type": "string" "type": "string"
}, },
"$comment": { "$comment": {
"type": "string" "type": "string"
}, },
"sdfRef": { "sdfRef": {
skipping to change at line 4104 skipping to change at line 3859
}, },
"contentFormat": { "contentFormat": {
"type": "string" "type": "string"
} }
}, },
"additionalProperties": false "additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ },
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "sdfChoice": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+ },
+ "description": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "sdfRef": {
+ "$ref": "#/definitions/sdf-pointer"
+ },
+ "sdfRequired": {
+ "$ref": "#/definitions/pointer-list"
+ },
+ "const": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "default": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "multipleOf": {
+ "type": "number"
+ },
+ "minLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "format": {
+ "$ref": "#/definitions/format-"
+ },
+ "minItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "uniqueItems": {
+ "type": "boolean"
+ },
+ "items": {
+ "$ref": "#/definitions/jso-items"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "nullable": {
+ "type": "boolean"
+ },
+ "sdfType": {
+ "$ref": "#/definitions/sdfType-"
+ },
+ "contentFormat": {
+ "type": "string"
+ } + }
+ }, + },
+ "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ },
"properties": { "properties": {
"type": { "type": {
- "$ref": "#/definitions/type-" "$ref": "#/definitions/type-"
+ "type": "string",
+ "const": "object"
+ },
+ "required": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "properties": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-"
}, },
"enum": { "enum": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string"
}, },
"minItems": 1 "minItems": 1
}, },
"description": { "description": {
"type": "string" "type": "string"
skipping to change at line 4208 skipping to change at line 4037
}, },
"contentFormat": { "contentFormat": {
"type": "string" "type": "string"
} }
}, },
"additionalProperties": false "additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
- "type": "string", "type": "string",
- "const": "object" "const": "object"
- }, },
- "required": { "required": {
- "type": "array", "type": "array",
- "items": { "items": {
- "type": "string" "type": "string"
- }, },
- "minItems": 1 "minItems": 1
- }, },
- "properties": { "properties": {
- "$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+ "type": "string"
}, },
"enum": { "enum": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string"
}, },
"minItems": 1 "minItems": 1
}, },
"description": { "description": {
"type": "string" "type": "string"
skipping to change at line 4308 skipping to change at line 4135
"type": "boolean" "type": "boolean"
}, },
"sdfType": { "sdfType": {
"$ref": "#/definitions/sdfType-" "$ref": "#/definitions/sdfType-"
}, },
"contentFormat": { "contentFormat": {
"type": "string" "type": "string"
} }
}, },
"additionalProperties": false "additionalProperties": false
+ },
+ {
+ "type": "object",
+ "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ },
+ "properties": {
+ "type": {
+ "type": "string"
+ },
+ "enum": {
+ "type": "array",
+ "items": {
+ "type": "string"
+ },
+ "minItems": 1
+ },
+ "description": {
+ "type": "string"
+ },
+ "label": {
+ "type": "string"
+ },
+ "$comment": {
+ "type": "string"
+ },
+ "sdfRef": {
+ "$ref": "#/definitions/sdf-pointer"
+ },
+ "sdfRequired": {
+ "$ref": "#/definitions/pointer-list"
+ },
+ "const": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "default": {
+ "$ref": "#/definitions/allowed-types"
+ },
+ "minimum": {
+ "type": "number"
+ },
+ "maximum": {
+ "type": "number"
+ },
+ "exclusiveMinimum": {
+ "type": "number"
+ },
+ "exclusiveMaximum": {
+ "type": "number"
+ },
+ "multipleOf": {
+ "type": "number"
+ },
+ "minLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxLength": {
+ "$ref": "#/definitions/uint"
+ },
+ "pattern": {
+ "type": "string"
+ },
+ "format": {
+ "$ref": "#/definitions/format-"
+ },
+ "minItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "maxItems": {
+ "$ref": "#/definitions/uint"
+ },
+ "uniqueItems": {
+ "type": "boolean"
+ },
+ "items": {
+ "$ref": "#/definitions/jso-items"
+ },
+ "unit": {
+ "type": "string"
+ },
+ "nullable": {
+ "type": "boolean"
+ },
+ "sdfType": {
+ "$ref": "#/definitions/sdfType-"
+ },
+ "contentFormat": {
+ "type": "string"
+ }
+ },
+ "additionalProperties": false
} }
] ]
}, },
"allowed-types": { "allowed-types": {
"anyOf": [ "anyOf": [
{ {
"type": "number" "type": "number"
}, },
{ {
"type": "string" "type": "string"
skipping to change at line 4345 skipping to change at line 4263
} }
}, },
{ {
"type": "array", "type": "array",
"items": { "items": {
"type": "boolean" "type": "boolean"
} }
}, },
{ {
"type": "object", "type": "object",
"additionalProperties": { "additionalProperties": {}
} - }
+ }, + },
+ { + {}
}
] ]
}, },
"uint": { "uint": {
"type": "integer", "type": "integer",
"minimum": 0 "minimum": 0
}, },
"jso-items": { "jso-items": {
"anyOf": [ "anyOf": [
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
"type": "string", "type": "string",
"enum": [ "enum": [
"number", "number",
"string", "string",
"boolean", "boolean",
"integer" "integer"
] ]
skipping to change at line 4407 skipping to change at line 4323
}, },
"maxLength": { "maxLength": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
} }
}, },
"additionalProperties": false "additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
"type": "string", "type": "string",
"const": "object" "const": "object"
}, },
"required": { "required": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string"
skipping to change at line 4458 skipping to change at line 4373
}, },
"maxLength": { "maxLength": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
} }
}, },
"additionalProperties": false "additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
+ "properties": { + "properties": {
+ "type": { + "type": {
+ "type": "string" + "type": "string"
+ }, + },
+ "sdfChoice": { + "sdfChoice": {
+ "$ref": "#/definitions/sdfData-sdfChoice-properties-" + "$ref": "#/definitions/sdfData-sdfChoice-properties-"
+ }, + },
+ "sdfRef": { + "sdfRef": {
+ "$ref": "#/definitions/sdf-pointer" + "$ref": "#/definitions/sdf-pointer"
skipping to change at line 4498 skipping to change at line 4412
+ }, + },
+ "maxLength": { + "maxLength": {
+ "$ref": "#/definitions/uint" + "$ref": "#/definitions/uint"
+ } + }
+ }, + },
+ "additionalProperties": false + "additionalProperties": false
+ }, + },
+ { + {
+ "type": "object", + "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
"type": "string", "type": "string",
"enum": [ "enum": [
"number", "number",
"string", "string",
"boolean", "boolean",
"integer" "integer"
] ]
skipping to change at line 4548 skipping to change at line 4461
}, },
"maxLength": { "maxLength": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
} }
}, },
"additionalProperties": false "additionalProperties": false
}, },
{ {
"type": "object", "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"properties": { "properties": {
"type": { "type": {
"type": "string", "type": "string",
"const": "object" "const": "object"
}, },
"required": { "required": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string" "type": "string"
skipping to change at line 4603 skipping to change at line 4515
}, },
"maxLength": { "maxLength": {
"$ref": "#/definitions/uint" "$ref": "#/definitions/uint"
} }
}, },
"additionalProperties": false "additionalProperties": false
+ }, + },
+ { + {
+ "type": "object", + "type": "object",
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
+ "properties": { + "properties": {
+ "type": { + "type": {
+ "type": "string" + "type": "string"
+ }, + },
+ "enum": { + "enum": {
+ "type": "array", + "type": "array",
+ "items": { + "items": {
+ "type": "string" + "type": "string"
+ }, + },
skipping to change at line 4679 skipping to change at line 4590
"$ref": "#/definitions/parameter-list" "$ref": "#/definitions/parameter-list"
}, },
"sdfOutputData": { "sdfOutputData": {
"$ref": "#/definitions/parameter-list" "$ref": "#/definitions/parameter-list"
}, },
"sdfData": { "sdfData": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
} }
}, },
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"additionalProperties": false "additionalProperties": false
}, },
"parameter-list": { "parameter-list": {
"$ref": "#/definitions/dataqualities" "$ref": "#/definitions/dataqualities"
}, },
"eventqualities": { "eventqualities": {
"type": "object", "type": "object",
"properties": { "properties": {
"description": { "description": {
skipping to change at line 4713 skipping to change at line 4623
"$ref": "#/definitions/pointer-list" "$ref": "#/definitions/pointer-list"
}, },
"sdfOutputData": { "sdfOutputData": {
"$ref": "#/definitions/parameter-list" "$ref": "#/definitions/parameter-list"
}, },
"sdfData": { "sdfData": {
"$ref": "#/definitions/sdfData-sdfChoice-properties-" "$ref": "#/definitions/sdfData-sdfChoice-properties-"
} }
}, },
+ "patternProperties": { + "patternProperties": {
+ "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": { + "^(?:[a-z][a-z0-9]*:)?[a-z$][A-Za-z$0-9]*$": {}
+ }
+ }, + },
"additionalProperties": false "additionalProperties": false
}, },
"format-": { "format-": {
- "type": "string", - "type": "string",
- "enum": [ - "enum": [
- "date-time", - "date-time",
- "date", - "date",
- "time", - "time",
- "uri", - "uri",
skipping to change at line 4788 skipping to change at line 4697
"type-": { "type-": {
"type": "string", "type": "string",
"enum": [ "enum": [
"number", "number",
"string", "string",
"boolean", "boolean",
"integer", "integer",
"array" "array"
] ]
}, },
- "sdfAction-": { - "sdfEvent-": {
+ "sdfEvent-": { + "sdfProperty-": {
"type": "object", "type": "object",
"additionalProperties": { "additionalProperties": {
- "$ref": "#/definitions/actionqualities" - "$ref": "#/definitions/eventqualities"
+ "$ref": "#/definitions/eventqualities" + "$ref": "#/definitions/propertyqualities"
} }
}, },
- "sdfProperty-": { "sdfAction-": {
+ "sdfAction-": {
"type": "object", "type": "object",
"additionalProperties": { "additionalProperties": {
- "$ref": "#/definitions/propertyqualities" "$ref": "#/definitions/actionqualities"
+ "$ref": "#/definitions/actionqualities"
} }
}, },
- "sdfEvent-": { - "sdfProperty-": {
+ "sdfProperty-": { + "sdfEvent-": {
"type": "object", "type": "object",
"additionalProperties": { "additionalProperties": {
- "$ref": "#/definitions/eventqualities" - "$ref": "#/definitions/propertyqualities"
+ "$ref": "#/definitions/propertyqualities" + "$ref": "#/definitions/eventqualities"
} }
- }, - },
- "sdfType-": { - "sdfType-": {
- "type": "string", - "type": "string",
- "enum": [ - "enum": [
- "byte-string", - "byte-string",
- "unix-time" - "unix-time"
- ] - ]
} }
} }
skipping to change at line 4844 skipping to change at line 4751
The main data quality imported is the "type". In SDF, this can take The main data quality imported is the "type". In SDF, this can take
one of six (text string) values, which are discussed in the following one of six (text string) values, which are discussed in the following
subsections (note that the JSO type "null" is not supported as a subsections (note that the JSO type "null" is not supported as a
value of this data quality in SDF). value of this data quality in SDF).
The additional quality "const" restricts the data to one specific The additional quality "const" restricts the data to one specific
value (given as the value of the const quality). value (given as the value of the const quality).
Similarly, the additional quality "default" provides data that can be Similarly, the additional quality "default" provides data that can be
used in the absence of the data (given as the value of the const used in the absence of the data (given as the value of the default
quality); this is mainly documentary and not very well-defined for quality); this is mainly documentary and not very well-defined for
SDF as no process is defined that would add default values to an SDF as no process is defined that would add default values to an
instance of some interaction data. instance of some interaction data.
Other qualities that are inspired by JSO are "$comment" and Other qualities that are inspired by JSO are "$comment" and
"description", both of which are also available in the information "description", both of which are also available in the information
block. block.
C.1. type "number", type "integer" C.1. type "number", type "integer"
skipping to change at line 5033 skipping to change at line 4940
"type": "boolean", "type": "boolean",
"description": "description":
"Indicates if the refrigerator-freezer is powered" "Indicates if the refrigerator-freezer is powered"
} }
}, },
"sdfObject": { "sdfObject": {
"refrigerator": { "refrigerator": {
"description": "A refrigerator compartment", "description": "A refrigerator compartment",
"sdfProperty": { "sdfProperty": {
"temperature": { "temperature": {
"sdfRef": "#/sdfProproperty/temperature", "sdfRef": "#/sdfProperty/temperature",
"maximum": 8 "maximum": 8
} }
} }
}, },
"freezer": { "freezer": {
"label": "A freezer compartment", "label": "A freezer compartment",
"sdfProperty": { "sdfProperty": {
"temperature": { "temperature": {
"sdfRef": "#/sdfProproperty/temperature", "sdfRef": "#/sdfProperty/temperature",
"maximum": -6 "maximum": -6
} }
} }
} }
} }
} }
}, },
"sdfProperty": { "sdfProperty": {
"temperature": { "temperature": {
"description": "The temperature for this compartment", "description": "The temperature for this compartment",
"type": "number", "type": "number",
"unit": "Cel" "unit": "Cel"
} }
} }
} }
Figure 8: Refrigerator-Freezer Example Figure 8: Refrigerator-Freezer Example
Appendix E. Some Changes From Earlier Drafts Appendix E. Some Changes from Earlier Draft Versions of this
Specification
This appendix is informative. This appendix is informative.
The present document provides the SDF base definition. Previous The present document provides the SDF base definition. Previous
revisions of SDF have been in use for several years, and both revisions of SDF have been in use for several years, and both
significant collections of older SDF models and older SDF conversion significant collections of older SDF models and older SDF conversion
tools are available today. This appendix provides a brief checklist tools are available today. This appendix provides a brief checklist
that can aid in upgrading these to the standard. that can aid in upgrading these to the standard.
* The quality unit was previously called units. * The quality unit was previously called units.
 End of changes. 73 change blocks. 
603 lines changed or deleted 511 lines changed or added

This html diff was produced by rfcdiff 1.48.