{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://example.com/telemetry.schema.json", "title": "Telemetry Message", "description": "Schema describing a telemetry message exchanged by devices.", "type": "object", "additionalProperties": false, "properties": { "version": { "type": "integer", "minimum": 1, "description": "Protocol semantic version (integer)." }, "msg_type": { "type": "string", "enum": [ "telemetry" ], "description": "Currently only the literal string 'telemetry' is supported." }, "dev_id": { "$ref": "#/$defs/uuid" }, "dev_type": { "description": "Device type identifier (string or one-of helper objects).", "oneOf": [ { "type": "string" }, { "type": "object", "required": [ "type_id" ], "additionalProperties": false, "properties": { "type_id": { "$ref": "#/$defs/uuid" } } }, { "type": "object", "required": [ "type_name" ], "additionalProperties": false, "properties": { "type_name": { "type": "string" } } } ] }, "timestamp": { "$ref": "#/$defs/timestamp" }, "fields": { "type": "array", "description": "Array of discrete or batch field objects.", "items": { "oneOf": [ { "$ref": "#/$defs/discrete_field" }, { "$ref": "#/$defs/batch_field" } ] } }, "enum": { "type": "array", "items": { "$ref": "#/$defs/enum_definition" } }, "location": { "$ref": "#/$defs/location" }, "battery": { "type": "integer", "minimum": 0, "maximum": 100, "description": "Battery percentage (0-100)." }, "sqe": { "type": "integer", "minimum": 0, "maximum": 4294967295, "description": "Sample sequence counter (uint32)." } }, "required": [ "version", "msg_type", "dev_id", "dev_type", "timestamp", "fields" ], "$defs": { "uuid": { "type": "string", "pattern": "^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}$", "description": "UUID v4 string." }, "timestamp": { "description": "UNIX epoch (seconds) or an object with a single alternative timestamp representation.", "oneOf": [ { "type": "number" }, { "type": "object", "minProperties": 1, "maxProperties": 1, "additionalProperties": false, "properties": { "unix_ns": { "type": "number" }, "unix_us": { "type": "number" }, "unix_ms": { "type": "number" }, "unix_s": { "type": "number" }, "iso8601": { "type": "string", "format": "date-time" } } } ] }, "sample_interval": { "oneOf": [ { "type": "number", "description": "Interval in seconds." }, { "type": "object", "additionalProperties": false, "properties": { "ms": { "type": "number" }, "s": { "type": "number" }, "m": { "type": "number" }, "h": { "type": "number" }, "d": { "type": "number" }, "w": { "type": "number" } } } ] }, "confidence": { "oneOf": [ { "type": "number", "minimum": 0, "maximum": 1 }, { "type": "array", "items": { "type": "number", "minimum": 0, "maximum": 1 } } ] }, "discrete_field": { "type": "object", "additionalProperties": false, "required": [ "name", "data_type", "value", "timestamp" ], "properties": { "name": { "type": "string" }, "data_type": { "type": "string" }, "value": { "oneOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" } ] }, "timestamp": { "$ref": "#/$defs/timestamp" }, "unit": { "type": "string" }, "confidence": { "$ref": "#/$defs/confidence" } } }, "batch_field": { "type": "object", "additionalProperties": false, "required": [ "name", "array_type", "value", "timestamp" ], "properties": { "name": { "type": "string" }, "array_type": { "type": "string" }, "value": { "type": "array", "items": { "oneOf": [ { "type": "string" }, { "type": "number" }, { "type": "boolean" } ] } }, "timestamp": { "$ref": "#/$defs/timestamp" }, "sample_interval": { "$ref": "#/$defs/sample_interval" }, "unit": { "type": "string" }, "confidence": { "$ref": "#/$defs/confidence" } } }, "enum_definition": { "type": "object", "additionalProperties": false, "required": [ "identifier", "value" ], "properties": { "identifier": { "type": "string" }, "value": { "type": "object", "additionalProperties": { "type": "number" } } } }, "location": { "type": "object", "additionalProperties": false, "required": [ "coordinates" ], "properties": { "coordinates": { "type": "array", "minItems": 2, "maxItems": 2, "items": [ { "type": "number", "minimum": -90, "maximum": 90 }, { "type": "number", "minimum": -180, "maximum": 180 } ] }, "coordinate_system": { "type": "string", "enum": [ "wgs84", "gcj02", "bd09" ], "default": "gcj02" }, "accuracy": { "type": "number", "minimum": 0 }, "altitude": { "type": "number" } } } } }