/*
* A schema for IAP Data Types.
* (http://json-schema.org)
*
* This file implements the IAP Data Type schema in Javascript for direct
* consumption by JavaScript or Node.JS tools and JSON schema validators.
*
* The schemata defined herein govern meta data for datapoint or property
* types and profiles. Schemata which govern the value for datapoints or
* properties are not defined here but may be derived from meta data that
* implements the schemata defined in this module.
*
* Copyright (c) Echelon Corporation 2018
*/
"use strict";
/*
* Note (A):
*
* Many definitions share the same set of properties, such as a required name
* or optional comment or unit strings for base types. These common properties
* are not declared as inherited properties, because JSON schema cannot inherit
* the "required" designation.
*/
/*
* Note (B):
*
* Comments in the following definitions refer to the presentation and the
* implementation of data. The presentation describes how data is presented
* to a tool or a human, the implementation describes how the same data is
* encoded for communication within the edge protocol. Data implementation is
* sometimes also called "raw data" and data presentation is sometimes known
* as "scaled" or "formatted data."
*/
/*
* Note (C):
*
* Note JSON schema allows all additional properties (those which are not
* governed by the schema) unless explicitly forbidden. Many types described
* with the IAP Data Type language defined here will report additional
* properties not governed by this schema; this IAP Data Type schema defines
* the common denominator of all IAP Data Type languages.
*/
/*
* Note (D):
*
* Several definitions include "name", "id" and "comment" values. In some
* definitions, such as "profile", some keys also define names. These behave
* as follows:
*
* The member name as defined with a key, for example within a profile's
* datapoints and properties listing, is typically but not necessarily the
* same as the "id" value reported within the same member.
* The "id" field is the programmatic name; a C language "typedef struct"
* would include fields named after the "id". The member name can be longer,
* use more human- and documentation-friendly capitalization and spelling.
*
* The "name" key refers to a value which is often the same or similar to
* the member name or "id" value. The "name" value can be more human-friendly
* and documentation-friendly however, and it can be localized for different
* natural (human) languages. The "name" value is a name however, and does not
* include punctuation.
*
* The optional "comment" is a terse human-readable description of the purpose
* of the item to which the comment applies. The comment can be localized into
* different languages.
* The comment consists or one or more complete sentences including correct
* capitalization and punctuation.
*/
/*
* Base types are defined in this section. An application cannot directly
* implement a base type, but datapoint and property types implement a base
* type.
*/
const localizableString = {
/*
* Many definitions support localizable strings, often used to implement
* comments and descriptions, or human-friendly names.
*
* Such a string can be a constant string such as "this is a comment",
* or it an be a reference to a string resource using a string resource
* identifier. The string resource identifier can then be used to locate
* a translation, thus localizing the string.
*
* The localizableString schema describes such a string type.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/localizableString",
title: "localizableString",
description: "A constant string or reference to a localizable string",
oneOf: [{
"type": "string"
},
{
"type": "object",
properties: {
id: {
type: "string"
}
},
required: [
"id"
]
}
]
}; // localizableString
const baseScalar = {
/*
* A base type for integer items.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseScalar",
title: "baseScalar",
description: "An integer data type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "scalar"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* Scalar properties.
*/
min: {
/*
* The numerically smallest valid value for this type.
* This may be greater than the native minimum of the base
* type. The invalid value, if declared, may be numerically
* less than the minimum value.
* The minimum is expressed as implementation data.
*/
type: "number"
},
max: {
/*
* The numerically largest valid value for this type.
* This may be less than the native maximum of the base
* type. The invalid value, if declared, may be numerically
* greater than the maximum value.
* The maximum is expressed as implementation data.
*/
type: "number"
},
invalid: {
/*
* The optional invalid value can be within or outside the
* range defined by min, max so long as it can be stored
* in the base type.
* When an item's value matches the invalid value, the item
* indicates that it does not currently hold a valid value.
* The invalid value is expressed as implementation data.
*/
type: "number"
},
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
base: {
/*
* The base type indicates how the data is implemented in the
* edge protocol. Also see byte-order.
*/
enum: [
"uint8", "int8",
"uint16", "int16",
"uint32", "int32",
"uint64", "int64"
]
},
"byte-order": {
/*
* This describes the implementation byte order. The property
* is optional and defaults to a big endian network byte order.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
},
encoding: {
/*
* A presentation guide.
*/
enum: [
"binary", // present as number to base 2
"decimal", // display as number to base 10
"hex", // display as number to base 16
"base-36", // display as number to base 36 (0-9A-Z)
"base-62", // display as number to base 62 (0-9A-Za-z)
"ascii", // display as character, ASCII encoding
"utf-8", // display as UTF-8 character
"utf-16" // display as UTF-16 character
],
default: "decimal"
},
scaling: {
/*
* The scaling object guides the transformation between
* implementation and presentation.
*/
"$ref": "#/definitions/scaling"
},
values: {
/*
* When present, values enumerates a discrete list of acceptable
* values for this scalar. For example, one property type could
* implement a scalar to represent the number of stop bits in an
* asynchronous serial communications port. This could be described
* as a scalar based on uint8 with scaling factors a, b, c of
* +1, -1, 0 and a discrete value list of [ 1, 1.5, 2 ]
*/
type: "array",
items: {
type: "number"
},
uniqueItems: true
}
}, // properties
required: [
"type", "base"
],
definitions: {
scaling: {
/*
* The scaling object guides the transformation between integer data
* implementation value ("raw value") I and presentation value P using
* scaling factors A, B and C. This is used to implement fixed-point
* arithmetic for precise arithmetic with finite resolution.
*
* P := A * 10^B * (C + I)
* I := P / (A * 10^B) - C
*
* The resolution value s (for "step") equals P(A, B, C, I) for I = 1.
*
* For example, scaling factors A, B, C of +1, -1, 0 support a
* fixed-point presentation value with a resolution of 0.1.
*/
type: "object",
properties: {
a: {
type: "integer",
minimum: -32768,
maximum: 32767,
default: 1
},
b: {
type: "integer",
minimum: -32768,
maximum: 32767,
default: 0
},
c: {
type: "integer",
minimum: -32768,
maximum: 32767,
default: 0
},
s: {
type: "number"
}
}, // scaling properties
required: [
"a", "b", "c"
]
} // scaling
} // definitions
}; // scalar
const baseFloat = {
/*
* A base type for floating point items.
*
* Float types do not support an explicit "invalid value" due to the
* intrinsic difficulty of comparing two floating point values for
* equality. Use NaN (not a number) instead.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseFloat",
title: "baseFloat",
description: "A floating point data type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "float"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* Float properties.
*/
min: {
/*
* The numerically smallest valid value for this type.
* This may be greater than the native minimum of the base
* type.
*/
type: "number"
},
max: {
/*
* The numerically largest valid value for this type.
* This may be less than the native maximum of the base
* type.
*/
type: "number"
},
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
base: {
/*
* The base type indicates how the data is implemented in the
* edge protocol. Also see byte-order.
*/
enum: [
"half", // IEEE 754 half precision
"float", // IEEE 754 single precision
"double", // IEEE 754 double precision
"double double" // IEEE 754 quadruple precision
],
default: "float"
},
"byte-order": {
/*
* This describes the implementation byte order. The property
* is optional and defaults to a big endian network byte order.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
}
}, // properties
required: [
"type", "base"
]
}; // float
const baseEnum = {
/*
* A base type for enumerations. An enumeration is understood as a
* set of literals, each mapping to a numerical value. All enumerations
* map to signed integers.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseEnum",
title: "baseEnum",
description: "An enumeration data type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "enum"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* Enum properties.
*/
min: {
/*
* The numerically smallest valid value for this type.
* This may be greater than the native minimum of the base
* type.
*/
type: "number"
},
max: {
/*
* The numerically largest valid value for this type.
* This may be less than the native maximum of the base
* type.
*/
type: "number"
},
invalid: {
/*
* The optional invalid value can be within or outside the
* range defined by min, max so long as it can be stored
* in the base type.
* When an item's value matches the invalid value, the item
* indicates that it does not currently hold a valid value.
* The invalid value is expressed as implementation data.
*/
type: "number"
},
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
base: {
/*
* The base type indicates how the data is implemented in the
* edge protocol. Also see byte-order.
*/
enum: [
"int8",
"int16",
"int32",
"int64"
],
default: "int8"
},
enum: {
/*
* A type reference to enumeration type.
*/
type: "string",
minLength: 1
},
"byte-order": {
/*
* This describes the implementation byte order. The property
* is optional and defaults to a big endian network byte order.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
}
}, // properties
required: [
"type", "enum"
]
}; // enum
const baseReference = {
/*
* A base type for type references, how one type can be defined to derive from
* another. Such a type can impose further restrictions, for example by
* specifying a minimum value larger than that of the referenced type.
* A referring type should not allow data in violation of the referred type.
*
* A reference may refer to any applicable datapoint type.
*
* Applicable are all datapoint types which are available from the profile's
* definition standpoint of view, subject to protocol-specific visibility rules.
* Data types derived from LonMark Resource Files, for example, define their
* visibility rules through program Id mask and scope selector values.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseReference",
title: "baseReference",
description: "A data type reference",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "reference"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* Reference properties:
*
* min, max and invalid are allowed but have no restrictions
* or data type, because the referenced data type could implement
* a numerical or a non-numerical minimum value, for example.
*/
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
reference: {
/*
* A type reference to the referenced type.
*/
type: "string",
minLength: 1
}
}, // properties
required: [
"type", "reference"
]
}; // reference
const baseBitfield = {
/*
* A base type for bitfields similar to C bitfields.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseBitfield",
title: "baseBitfield",
description: "A bitfield type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "bitfield"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* Bitfield properties:
*/
size: {
/*
* The size of this bit field in bits. A bitfield size of zero
* skips to the next container.
*/
type: "integer",
minimum: 0,
maximum: 64,
default: 1
},
signed: {
/*
* Whether the field implements a signed value.
*/
type: "boolean",
default: false
},
min: {
/*
* Numerically smallest valid value, expressed in implementation
* data.
*/
type: "number"
},
max: {
/*
* Numerically largest valid value, expressed in implementation
* data.
*/
type: "number"
},
invalid: {
/*
* A designated "invalid" value, expressed in implementation data.
* May be outside the min, max range but is subject to size and signed
* constraints.
*/
type: "number"
},
base: {
/*
* The container within which the bitfield is implemented.
*/
enum: [
"uint8",
"uint16",
"uint32",
"uint64"
],
default: "uint8"
},
offset: {
/*
* The bitfield position within the container. Offset 0
* aligns the most significant bitfield bit with the most
* significant container bit for big-endian byte orientation.
* For little-endian orientation, offset 0 aligns the least
* significant bitfield bit with the least significant
* containiner bit.
*/
type: "integer",
minimum: 0,
maximum: 63
},
"byte-order": {
/*
* This describes the implementation byte order. The property
* is optional and defaults to a big endian network byte order.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
},
scaling: {
/*
* The scaling object guides the transformation between
* implementation and presentation.
*/
"$ref": "#/definitions/scaling"
}
}, // properties
required: [
"type", "offset"
],
definitions: {
scaling: {
/*
* The scaling object guides the transformation between integer data
* implementation value I and presentation value P using scaling
* factors A, B and C:
*
* P := A * 10^B + (C + I)
*
* The resolution value s (for "step") equals P(A, B, C, I) for I == 1.
*/
type: "object",
properties: {
a: {
type: "integer",
minimum: -32768,
maximum: 32767,
default: 0
},
b: {
type: "integer",
minimum: -32768,
maximum: 32767,
default: 0
},
c: {
type: "integer",
minimum: -32768,
maximum: 32767,
default: 0
},
s: {
type: "number"
}
}, // scaling properties
required: [
"a", "b", "c"
]
} // scaling
} // definitions
}; // bitfield
const baseBoolean = {
/*
* A base type for simple booleans.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseBoolean",
title: "baseBoolean",
description: "A Boolean type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "boolean"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* Boolean properties:
*/
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
base: {
/*
* The container within which the Boolean is implemented.
*/
enum: [
"int8",
"int16",
"int32",
"int64"
],
default: "int8"
},
"byte-order": {
/*
* This describes the implementation byte order. The property
* is optional and defaults to a big endian network byte order.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
}
}, // properties
required: [
"type"
]
}; // boolean
const baseBCD = {
/*
* A base type for binary encoded decimal numbers (BCD).
* Negative numbers are not supported.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseBCD",
title: "baseBCD",
description: "A BCD type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "bcd"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* BCD properties:
*/
min: {
type: "integer",
default: 0
},
max: {
type: "integer"
},
invalid: {
type: "integer"
},
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
base: {
/*
* The container within which the data is implemented.
*/
enum: [
"uint8",
"uint16",
"uint32",
"uint64"
],
default: "uint16"
},
"byte-order": {
/*
* This describes the implementation byte order. The property
* is optional and defaults to a big endian network byte order.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
},
"nibble-order": {
/*
* In big endian nibble order the most significant BCD digit
* aligns with the most significant nibble in a byte.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
},
packed: {
/*
* Packed BCD uses one nibble per digit, unpacked BCD uses
* a byte per digit.
*/
type: "boolean",
default: true
}
}, // properties
required: [
"type"
]
}; // bcd
const baseString = {
/*
* A base type for strings.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseString",
title: "baseString",
description: "A string type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "string"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* String properties:
*/
min: {
/*
* The minimum string length in characters.
*/
type: "integer",
default: 0
},
max: {
/*
* The maximum string length in characters.
*/
type: "integer"
},
invalid: {
type: "null"
},
regex: {
/*
* A regular expression. The string value must match
* this regular expression.
* The regular expression must conform to the Perl
* programming language, release 5.8.8.
*/
type: "string"
},
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
encoding: {
enum: [
"ascii",
"utf-8",
"utf-16"
],
default: "utf-8"
},
"runtime-encoding": {
/*
* "runtime-encoding" is true if the string encoding may change from
* the default at runtime. The "encoding" property provides the default
* encoding.
* Strings which support different encoding types at runtime require
* comprehension in context with another data field, typically an
* enumeration, which reports the current encoding.
*/
type: "boolean",
default: false
},
termination: {
enum: [
"padded", // string is right-filled with 0x00 to max length
"truncated" // variable length string terminated with 0x00
],
default: "padded"
}
}, // properties
required: [
"type"
]
}; // string
const baseAggregate = {
/*
* A base type for structures and unions.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseAggregate",
title: "baseAggregate",
description: "A structure or union data type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "aggregate"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
/*
* Aggregate properties:
*/
cat: {
enum: [
"oneOf",
"allOf"
]
},
"array-size": {
type: "integer",
minimum: 0, // 0, 1: not an array, 2...max: array
default: 0
},
members: {
type: "array",
items: {
anyOf: [{
"$ref": "http://glp-data-types.echelon.com/schema/baseScalar"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseFloat"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseEnum"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseReference"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBitfield"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBoolean"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBCD"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseString"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseAggregate"
}
]
}
},
packing: {
/*
* Packing controls whether a gap must be inserted between one member A and the
* next member B. The packing value indicates by which value the offset
* address of member B must be divisible without remainder:
*
* Packing of one indicates byte frames, allowing B to appear at any offset.
* Packing of two indicates a 16 bit frame, allowing B only to appear at even
* addresses. A filler of 0x00 bytes may be inserted between A and B.
* Packing of 3 or 4 indicates 32 or 64 byte frames, requiring that B must be
* at an offset address divisible by 4 or 8 without remainder, respectively.
*/
enum: [
1,
2,
4,
8
],
default: 1
},
padding: {
/*
* Padding controls how two adjacent structures A and B within an array are addressed.
* Padding of one indicates byte frames, allowing B to start at any offset address.
* A padding of two indicates a 16-bit word frame, requiring B to start at an offset
* address divisible by 2, and so on.
*/
enum: [
1,
2,
4,
8
],
default: 1
},
alignment : {
/*
* This describes the implementation alignment. The property
* is optional and defaults to a big endian network byte order.
*/
enum: [
"big-endian", "little-endian"
],
default: "big-endian"
},
}, // properties
required: [
"type", "cat", "members"
]
}; // aggregate
const baseInheriting = {
/*
* An inheriting base type for use with property types.
*
* A property defined with an inheriting type has no data type on its
* onw but inherits the data type from the datapoint the property
* applies to. This is useful to define generic semantics such as
* properties for value overrides once for all datapoint types the
* property may apply to.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/baseInheriting",
title: "baseInheriting",
description: "An inheriting property type",
type: "object",
properties: {
/*
* Common properties
*/
type: {
const: "inheriting"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* An optional programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
}
}, // properties
required: [
"type"
]
}; // inheriting
/*
* Enumerations are maps between literals and their numerical value.
* Profiles cannot implement enumerations directly but may implement
* datapoint and property types which in turn may reference or include
* an enumeration.
*/
const enumeration = {
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/enumeration",
title: "enumeration",
description: "An enumeration type",
type: "object",
properties: {
"class": {
const: "enumeration"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
id: {
/*
* A programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
members: {
type: "array",
items: {
"$ref": "#/definitions/member"
}
}
}, // properties
required: [
"id", "members"
],
definitions: {
member: {
type: "object",
properties: {
id: {
type: "string"
},
value: {
type: "integer"
},
comment: {
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
name: {
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
}
}, // properties
required: [
"id", "value"
]
} // member
} // definitions
}; // enumeration
/*
* Datapoint and property types are defined in this section.
*
* Applications implement datapoints and properties through the
* implementation of a profile. Datapoint and property types provide
* semantics and additional detail to the base type they implement,
* profiles group datapoint and properties into units of functionality.
*/
const datapoint = {
/*
* A datapoint type. Datapoints can generally be read and written.
* Because datapoint values can change as an application output or
* due to peer-to-peer datapoint connections, they can be monitored
* for change. Datapoints are typically volatile and do not preserve
* their most recent value over a reset or power cycle.
*
* Datapoint values and fields within datapoints which implement
* an aggregate type can be assigned and may report a value that
* meets the type described with the schema indicated by the "type"
* property.
* Implementations also support the assignment of the keyword "invalid"
* and might present the value with the keyword "invalid" to indicate
* that the item has no valid value. Edge processors translate the
* "invalid" keyword to the designated numeric value where available.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/datapoint",
title: "datapoint",
description: "A datapoint type",
type: "object",
properties: {
/*
* Common properties
*/
"class": {
const: "datapoint"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* A programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
key: {
/*
* A numeric identifier for this type, unique within its type class,
* program ID and scope. For example, a set of type definitions grouped
* under program ID and scope 8001020304050607-4 has a set of datapoint,
* property and profile types. Each datapoint, property and profile
* has a unique key within its class.
* The "key" acts as a key and its numeric value has no other significance.
*
* Some applications require a type key, primarily those which support
* interface changes at runtime (dynamic interfaces or changeable-type
* interfaces) and those which support development of applications or
* related artifacts based on IAP/MQ data types. Those applications
* may be prevented from using a data type unless a "key" is provided.
*/
type: "integer",
minimum: 0
},
type: {
anyOf: [
{
"$ref": "http://glp-data-types.echelon.com/schema/baseScalar"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseFloat"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseEnum"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseReference"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBitfield"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBoolean"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBCD"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseString"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseAggregate"
}
]
},
default: {
/*
* An optional default value, must match type.
* A default value define here overrides a default defined
* with the base type, but must still meet the base type's
* requirements.
*/
},
alarms: {
"$ref": "http://glp-data-types.echelon.com/schema/applicationAlarms"
}
}, // properties
required: [
"class", "id", "type"
]
}; // datapoint
const property = {
/*
* A property is an expansion on a datapoint through the addition of
* semantics. For example, a datapoint might decribe a temperature value.
* A property might implement the same temperature value, typically using
* a reference to the datapoint type, but define the property as the lower
* temperature threshold for a cooler device. Another property might have
* a similar definition, controlling the higher setpoint of a cooler device.
*
* Most properties do not support unsolicited value changes as typically
* is the case for datapoints, but some applications may update certain
* properties.
* Property values are typically changing very infrequently and are preserved
* over a reset or power cycle.
*
* Property values and fields within properties which implement
* an aggregate type can be assigned and may report a value that
* meets the type described with the schema indicated by the "type"
* property.
* Implementations also support the assignment of the keyword "invalid"
* and might present the value with the keyword "invalid" to indicate
* that the item has no valid value. Edge processors translate the
* "invalid" keyword to the designated numeric value where available.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/property",
title: "property",
description: "A property type",
type: "object",
properties: {
/*
* Common properties
*/
"class": {
const: "property"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
unit: {
/*
* An optional unit of measurement.
* Where applicable, the unit should be a non-localizable unit of
* measurement expressed in a SI or derived SI unit such as kg, s
* or m for kilogram, seconds and meters. Non-SI units such as F
* (Fahrenheit) or mph (miles per hour) are acceptable where
* appropriate.
*/
type: "string"
},
id: {
/*
* A programmatic name, a type name for use with software
* code or machine readers. This may differ from the type name, for
* example by using underscore characters where the type name may
* include a space.
*/
type: "string"
},
key: {
/*
* A numeric identifier for this type, unique within its type class,
* program ID and scope. For example, a set of type definitions grouped
* under program ID and scope 8001020304050607-4 has a set of datapoint,
* property and profile types. Each datapoint, property and profile
* has a unique key within its class.
* The "key" acts as a key and its numeric value has no other significance.
*
* Some applications require a type key, primarily those which support
* interface changes at runtime (dynamic interfaces or changeable-type
* interfaces) and those which support development of applications or
* related artifacts based on IAP/MQ data types. Those applications
* may be prevented from using a data type unless a "key" is provided.
*/
type: "integer",
minimum: 0
},
type: {
anyOf: [
// {
// "$ref": "http://glp-data-types.echelon.com/schema/baseFloat"
// },
{
"$ref": "http://glp-data-types.echelon.com/schema/baseScalar"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseFloat"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseEnum"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseReference"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBitfield"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBoolean"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseBCD"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseString"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseAggregate"
},
{
"$ref": "http://glp-data-types.echelon.com/schema/baseInheriting"
}
]
},
default: {
/*
* An optional default value, must match type.
* A default value define here overrides a default defined
* with the base type, but must still meet the base type's
* requirements.
*/
},
min: {
/*
* An optional minimum value override.
* A minimum value overrides the minimum value defined with the
* base type, but must meet the base type's requirements.
* The minimum value override can further restrict but must not
* expand the base type's range.
*/
},
max: {
/*
* An optional maximum value override.
* A maximum value overrides the maximum value defined with the
* base type, but must meet the base type's requirements.
* The maximum value override can further restrict but must not
* expand the base type's range.
*/
},
invalid: {
/*
* An optional invalid value override.
* An invalid value override overrides the invalid value defined
* with the base type, but must meet the base type's requirements.
*/
}
}, // properties
required: [
"class", "id", "type"
]
}; // property
const applicationAlarms = {
/*
* The alarms property lists properties within the object
* described by this schema which indicate simple application-
* specific alarm conditions. Examples include a "day burner"
* alarm from an outdoor lighting device, or a "door
* open" alarm from a cabinet in an application's status object,
* or an alarm condition flag in an output datapoint.
* Tools consider the alarm to be active when the
* property value evaluates to a logical True, and the alarm
* to be inactive when the the property value evaluates to
* a logical False. Simple application-specific alarm
* conditions are generally implemented as Booleans, strings
* or numbers.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/applicationAlarms",
title: "ApplicationAlarms",
description: "Simple application-specific alarm conditions",
type: "array",
items: {
type: "string"
}
}; // applicationAlarms
/*
* Profiles refine datapoints and properties for a specific application as a
* profile datapoint type or profile property type and combine these into a
* profile with well-defined behavior and either a specific application such
* as a indoor electric water heater control unit, or into a generic application
* with well-defined behavior such as a general-purpose PID-T2 digital controller.
*
* Applications implement profiles as blocks. Each block is an implementation of
* a profile including all mandatory profile property and datapoint members and
* any of the optional profile property and datapoint members.
* Implementations of property datapoint and property members are governed by the
* rules defined with the profile.
*/
const memberDatapoint = {
/*
* A profile datapoint member may applicable datapoint types, or may implement
* a wildcard datapoint type.
*
* Applicable are all datapoint types which are available from the profile's
* definition standpoint of view, subject to protocol-specific visibility rules.
* Data types derived from LonMark Resource Files, for example, define their
* visibility rules through program Id mask and scope selector values.
*
* Wildcard types are known as "SNVT_xxx" in LonMark Resource Files. These
* are placeholders within a profile, to be replaced with an actual datapoint
* type when the profile is implemented as a block. Wildcards allow for generic
* profile definitions such as a generic PID controller whose setpoint, process
* value and control value datapoints could implement a temperature datapoint
* type in one block, and a velocity datapoint type in another.
*
* Profiles may declare more than one datapoint member to use the wildcard type,
* but implementations of the profile must use the same datapoint type to
* instantiate all wildcard types within the block.
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/memberDatapoint",
title: "MemberDatapoint",
description: "Profile member datapoint",
type: "object",
properties: {
/*
* Common properties
*/
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
id: {
/*
* A programmatic name, a member name for use with software
* code or machine readers. This may differ from the name, for
* example by using underscore characters where the name may
* include a space.
*/
type: "string"
},
type: {
/*
* The type for a member that is not a wildcard is a simple type reference,
* such as "SNVT_volt".
*
* Member types can also declare wildcard types. Any compatible type
* may be used to implement such a wildcard member.
* Wildcard members report their type with a Perl 5 regular expression,
* embedded within a pair of forward slash characters, such as
* "/SNVT.+/".
*
* The pair of forward slash characters is not part of the regular
* expression, but everything within that character pair is.
*
* The regular expression is case-sensitive. Any type matching the
* regular expression may be used to implement the wildcard
* member.
*/
type: "string",
format: "regex"
},
dir: {
/*
* direction is network-centric: an input datapoint is an input
* from the network into the profile or block, often corresponding
* to a physical output such as a lamp dimmer. An output datapoint
* is an output from the block, often corresponding to a computed
* value or one obtained from a physical input such as a temperature
* sensor.
* A bidirectional datapoint can act as both input and output.
*/
enum: [
"input",
"output",
"inout"
]
},
mandatory: {
/*
* A block implementing a profile must implement all mandatory profile
* members, and may implement any of the optional members. Optional
* members are those reported as not mandatory.
*/
type: "boolean"
},
min: {
/*
* An optional minimum value override.
* A minimum value overrides the minimum value defined with the
* base type, but must meet the base type's requirements.
* The minimum value override can further restrict but must not
* expand the base type's range.
*/
},
max: {
/*
* An optional maximum value override.
* A maximum value overrides the maximum value defined with the
* base type, but must meet the base type's requirements.
* The maximum value override can further restrict but must not
* expand the base type's range.
*/
},
invalid: {
/*
* An optional invalid value override.
* An invalid value override overrides the invalid value defined
* with the base type, but must meet the base type's requirements.
*/
},
descriptor :{
type: "string",
pattern: "^[#|][0-9]+$"
},
unit: {
type: "string"
}
}, // properties
required: [
"id", "type", "mandatory", "dir"
]
}; // memberDatapoint
const memberProperty = {
/*
* A profile property member may implement applicable property types.
* Because properties convey semantics, a wildcard property type cannot
* exist, but inheriting property types automatically derive their type from
* the datapoint they apply to.
*
* Applicable are property types which are available from the profile's
* definition standpoint of view, subject to protocol-specific visibility rules.
* Data types derived from LonMark Resource Files, for example, define their
* visibility rules through program Id mask and scope selector values.
*
*/
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/memberProperty",
title: "MemberProperty",
description: "Profile member property",
type: "object",
properties: {
/*
* Common properties
*/
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
id: {
/*
* A programmatic name, a member name for use with software
* code or machine readers. This may differ from the name, for
* example by using underscore characters where the name may
* include a space.
*/
type: "string"
},
type: {
/*
* The member type is defined as a Perl 5 regular expression, with an implied
* ^ at the start and $ at the end, matching the type for use with this member.
* For example, a value of "SCPTlocation" matches that type exactly.
* The standard resource set identifier is 0000000000000000-0, and is never
* included.
* However, some profile members may not be limited to a specific type.
* ".*" allows for any type to implement the member, but other expressions
* could restrict the choice to a well-defined set of allowed types, or to a
* range of types.
*/
type: "string",
format: "regex"
},
mandatory: {
/*
* A block implementing a profile must implement all mandatory profile
* members, and may implement any of the optional members. Optional
* members are those reported as not mandatory.
*/
type: "boolean"
},
min: {
/*
* An optional minimum value override.
* A minimum value overrides the minimum value defined with the
* base type, but must meet the base type's requirements.
* The minimum value override can further restrict but must not
* expand the base type's range.
*/
},
max: {
/*
* An optional maximum value override.
* A maximum value overrides the maximum value defined with the
* base type, but must meet the base type's requirements.
* The maximum value override can further restrict but must not
* expand the base type's range.
*/
},
invalid: {
/*
* An optional invalid value override.
* An invalid value override overrides the invalid value defined
* with the base type, but must meet the base type's requirements.
*/
},
default: {
/*
* An optional default value override.
* A default value overrides the default value defined with the
* base type, but must meet the base type's requirements.
* The default value override can further restrict but must not
* expand the base type's range.
*/
},
applies: {
/*
* A property applies to the block or to a specific datapoint member
* implemented in the same block. The item to which the property applies
* is also known as the property's application set. The application set
* is defined with this attribute, which lists the profile name
* for properties applying to the block, or the datapoint member name for
* those applying to a datapoint member.
*
* A given property implementation may apply to multiple blocks or to
* multiple datapoints, known as a shared property. Within a profile,
* the property is never explicitly shared but always applies to a single
* item. However, properties which explicitly apply to the block often
* implicitly govern one or more of its members as evident from the
* property's semantics.
*/
type: "string",
minLength: 1
},
array: {
/*
* Member properties are often singletons, but some profiles also
* allow or even require the implementation as a property array.
* Profiles can require a specific size for that array, or can
* define a minimum and maximum array size.
*
* When the array property is not present or null, the property
* may not be implemented as an array. Otherwise the array object
* details the array implementation requirements.
*/
"$ref": "#/definitions/array",
default: null
},
restrictions: {
/*
* Properties may carry flags which restrict their use.
* These are optional; properties not reporting restrictions
* or reporting these as null are unrestricted.
*/
"$ref": "#/definitions/restrictions",
default: null
},
presentation: {
/*
* Simple properties can be presented as plain block members. For
* example a digital output block may include an "invert" option,
* which it might present as a plain Boolean property of the block.
*
* More complex properties might include definitions of default values
* or override values and similar detail. These complex properties would
* be presented with a IAP Datapoint object.
*
* The 'presentation' attribute reports how the property is implemented,
* allowing the generic tool to recognize its implementation within the
* block.
*
* Because a "plain" property does not include a type declaration, tools
* must deduce the type of plain property from the profile.
*/
enum: [
"plain",
"datapoint"
],
default: "datapoint"
},
descriptor :{
type: "string",
pattern: "^[#|][0-9]+$"
},
unit: {
type: "string"
}
}, // properties
required: [
"id", "type", "mandatory"
],
definitions: {
array: {
/*
* The array object details a property member's implementation
* as an array.
*/
type: "object",
properties: {
is: {
enum: [
"prohibited",
"permitted",
"required"
],
default: "prohibited"
},
min: {
/*
* The minimum array size.
*/
type: "integer",
minimum: 2,
default: 2
},
max: {
/*
* The maximum array size. When equal to the minimum size,
* the array must be implemented with this exact number of
* elements. When greater than the minimum size, the array
* may be implemented with any number of elements from min
* to max, both inclusive.
* When a maximum is not defined, the maximum size is infinite.
*/
type: "integer",
minimum: 2
}
},
required: [
"is"
]
}, // array
restrictions: {
type: "object",
properties: {
"device-specific": {
/*
* The application on the device that implements a device-specific
* property may change this property value without notice, for
* example to report calibration data.
* A network tool must not rely upon cached values for this property.
*/
type: "boolean"
},
"manufacturing-only": {
/*
* A manufacturing only property may only be changed during manufacture.
* Network tools do not modify this property during normal operation.
*/
type: "boolean"
},
"reset-required": {
/*
* A property can request that the device or application that implements
* it is reset after a change to the property value and before the new
* value takes effect.
*/
type: "boolean"
},
"offline-required": {
/*
* A property can request that the device or application be put in offline
* mode while the property is modified.
*
* The new property value may not take effect until the device is in online
* mode again. Note that resetting the device also clears offline mode.
*/
type: "boolean"
},
"disable-required": {
/*
* A property can request that the device, application or block that implements
* the property be disabled before the property is changed, and be enabled
* again before the new property value takes effect.
*/
type: "boolean"
},
"const": {
/*
* A constant property cannot be changed and is used to report constant
* properties such as an application version number.
*/
type: "boolean"
}
} // properties
} // restrictions
} // definitions
}; // memberProperty
const profile = {
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/profile",
title: "profile",
description: "Profile",
type: "object",
properties: {
/*
* Common properties
*/
"class": {
const: "profile"
},
name: {
/*
* A type name fit for human consumption and display in a user interface.
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
comment: {
/*
* An optional comment
*/
"$ref": "http://glp-data-types.echelon.com/schema/localizableString"
},
id: {
/*
* A programmatic name, a member name for use with software
* code or machine readers. This may differ from the name, for
* example by using underscore characters where the name may
* include a space.
*/
type: "string"
},
key: {
/*
* A numeric identifier for this type, unique within its type class,
* program ID and scope. For example, a set of type definitions grouped
* under program ID and scope 8001020304050607-4 has a set of datapoint,
* property and profile types. Each datapoint, property and profile
* has a unique key within its class.
* The "key" acts as a key and its numeric value has no other significance.
*
* Some applications require a type key, primarily those which support
* interface changes at runtime (dynamic interfaces or changeable-type
* interfaces) and those which support development of applications or
* related artifacts based on IAP/MQ data types. Those applications
* may be prevented from using a data type unless a "key" is provided.
*/
type: "integer",
minimum: 0
},
inheriting: {
/*
* A profile may inherit from another applicable profile.
* Applicable are profiles which are available from this profile's
* definition standpoint of view, subject to protocol-specific
* visibility rules.
* Data types derived from LonMark Resource Files, for example,
* define their visibility rules through program Id mask and
* scope selector values.
*/
type: "string"
},
principal: {
/*
* A profile may nominate one of its member datapoints as the
* principal datapoint through the member id value.
*
* A principal datapoint nomination can guide generic user
* interfaces and defines the application set for some properties
* which are explicitly applied to the block but semantically
* apply to a datapoint, such as a default value or override
* control property.
*/
type: "string"
},
datapoints: {
type: "object",
additionalProperties: {
"$ref": "http://glp-data-types.echelon.com/schema/memberDatapoint"
}
},
properties: {
type: "object",
additionalProperties: {
"$ref": "http://glp-data-types.echelon.com/schema/memberProperty"
}
}
}, // properties
required: [
"class", "id"
]
}; // profile
/*
* The Application schema describes capabilities of the application, keyed by the
* device type. One application declaration may be shared among different versions
* of the same application, provided that none of the aspects reported for the
* application changes. To facilitate this, the type key is evaluated not as an
* exact match but as a match for the start of the key.
*
* Consider for example a device which reports its type within the feedback channel's
* status object as "type": "80000112345604". This device might be described with a
* type of "8000011234560", matching only the first 15 characters.
*
* Tools prefer a longer type match over a shorter match.
*/
const application = {
"$schema": "http://json-schema.org/draft-06/schema#",
"$id": "http://glp-data-types.echelon.com/schema/application",
title: "application",
description: "Application",
type: "object",
properties: {
"class": {
const: "application"
},
classification: {
/*
* Classification classifies the application as one of several groups.
* This information is optional.
*
* Tools with interfaces to human users might chose this information to
* guide selective display of items according to their classification.
*
*/
enum: [
"infrastructure", // For routers, network adapters, and so on.
"configuration", // For applications to help configure and manage services.
"diagnostics", // For tools for diagnostics and servicing.
"application" // For all other application types.
],
default: "application"
},
description: {
/*
* A short description
*/
type: "string"
},
documentation: {
/*
* A reference to comprehensive documentation in form of a website URL.
*/
type: "string",
format: "uri"
},
interface: {
/*
* An alphanumeric identifier of the application type aimed at a human
* user, often including the device's product name and manufacturer name.
*/
type: "string",
minLength: 1
},
manufacturer: {
type: "string",
minLength: 1
},
multiplicity: {
enum: [
"singleton",
"unlimited"
],
default: "unlimited"
},
product: {
type: "string",
minLength: 1
},
protocol: {
type: "string",
minLength: 1
},
status: {
/*
* The status property reports non-standard items
* which appear in the device's status object.
* Tools accept (and typically ignore) all non-standard
* properties not declared with this property.
*/
"$ref": "#/definitions/status"
},
actions: {
/*
* The actions property reports actions available
* with the "do" request channel endpoint for this
* device type.
* When no actions are defined here, the tools
* assume that the device supports all standard IAP
* actions.
* Actions listed here are in addition to standard
* actions. Standard actions may also be overridden
* by adding additional arguments, but removing or
* re-defining standard actions is not supported.
*/
"$ref": "#/definitions/actions"
}
}, // properties
required: [
"class", "interface", "manufacturer", "product"
],
definitions: {
status: {
type: "object",
properties: {
alarms: {
"$ref": "http://glp-data-types.echelon.com/schema/applicationAlarms"
},
}
}, // status
actions: {
/*
* actions is a list of action objects supported by this device.
* Devices which declare actions are expected only to support
* the actions declared here. Devices which do not declare actions
* are expected to support all standard IAP actions, however,
* devices may still fail an action with an error event if the
* action may not be performed for any reason.
*/
type: "array",
items: {
"$ref": "#/definitions/action"
}
}, // actions
action: {
/*
* Each action is defined with the action name and its arguments.
* Standard actions must support the arguments defined with the
* action in the IAP specification. Implementations of standard
* actions may not remove any of the standard arguments, but
* specific implementations may add additional arguments if
* declared here. When declared, all action arguments including
* the standard action arguments must be declared.
*/
type: "object",
properties: {
id: {
/*
* The action name such as "load", "test", "wink".
*/
type: "string"
},
description: {
/*
* A brief description for human consumption.
*/
type: "string"
},
args: {
/*
* A JSON schema for the action's arguments.
*/
type: "object"
}
}, // properties
required: [
"id"
]
} // action
} // definitions
}; // application
exports.base = {
aggregate: baseAggregate,
bcd: baseBCD,
bitfield: baseBitfield,
boolean: baseBoolean,
enumeration: baseEnum,
float: baseFloat,
reference: baseReference,
scalar: baseScalar,
string: baseString
};
exports.application = application;
exports.datapoint = datapoint;
exports.enum = enumeration;
exports.profile = profile;
exports.property = property;
exports.all = [
localizableString,
baseScalar,
baseFloat,
baseEnum,
baseReference,
baseBitfield,
baseBoolean,
baseBCD,
baseString,
baseAggregate,
baseInheriting,
applicationAlarms,
memberDatapoint,
memberProperty
];
|