{
"$schema": "http://json-schema.org/draft-07/schema#",
"title": "Buttplug Message Schema",
"version": 3,
"description": "The JSON Protocol format for the Buttplug Protocol.",
"components": {
"ClientId": {
"description": "User-set id for the message. 0 denotes system message and is reserved.",
"type": "integer",
"minimum": 1,
"maximum": 4294967295
},
"ServerId": {
"description": "User-set id for the message. 0 denotes system message and is reserved.",
"type": "integer",
"minimum": 0,
"maximum": 4294967295
},
"SystemId": {
"description": "Used for non-direct-reply messages that can only be sent from server to client, using the reserved system message Id of 0.",
"type": "integer",
"minimum": 0,
"maximum": 0
},
"DeviceName": {
"description": "Name of the device",
"type": "string"
},
"DeviceIndex": {
"description": "Index used for referencing the device in device messages.",
"type": "integer",
"minimum": 0
},
"ClientIdMessage": {
"description": "Message types that are expected to have an Id and nothing else.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
}
},
"additionalProperties": false,
"minProperties": 1,
"maxProperties": 1,
"required": [
"Id"
]
},
"ServerIdMessage": {
"description": "Message types that are expected to have an Id and nothing else, from the server side, which may be either a reply or an event (id 0).",
"properties": {
"Id": {
"$ref": "#/components/ServerId"
}
},
"additionalProperties": false,
"minProperties": 1,
"maxProperties": 1,
"required": [
"Id"
]
},
"SystemIdMessage": {
"description": "Message sent by the server that is not in direct reply to a message send from the client, and always uses system Id.",
"properties": {
"Id": {
"$ref": "#/components/SystemId"
}
},
"additionalProperties": false,
"required": [
"Id"
]
},
"SystemIdDeviceIndexMessage": {
"properties": {
"Id": {
"$ref": "#/components/SystemId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex"
]
},
"ClientIdDeviceIndexMessage": {
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex"
]
},
"DeviceMessages": {
"description": "A list of the messages a device will accept on this server implementation.",
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
},
"NullMessageAttributes": {
"description": "Attributes for device message that have no attributes.",
"type": "object",
"additionalProperties": false,
"minProperties": 0,
"maxProperties": 0
},
"GenericMessageAttributesV3": {
"description": "Attributes for device messages.",
"type": "object",
"properties": {
"FeatureDescriptor": {
"type": "string"
},
"StepCount": {
"$ref": "#/components/StepCountV3"
},
"ActuatorType": {
"description": "Denotes type of actuator (Vibrator, Linear, Oscillator, etc...)",
"type": "string"
}
},
"additionalProperties": false,
"minProperties": 0
},
"GenericMessageAttributesV2": {
"description": "Attributes for device messages.",
"type": "object",
"properties": {
"FeatureCount": {
"$ref": "#/components/FeatureCount"
},
"StepCount": {
"$ref": "#/components/StepCountV2"
}
},
"additionalProperties": false,
"minProperties": 0
},
"GenericMessageAttributesV1": {
"description": "Attributes for device messages.",
"type": "object",
"properties": {
"FeatureCount": {
"$ref": "#/components/FeatureCount"
}
},
"additionalProperties": false,
"minProperties": 0
},
"RawMessageAttributes": {
"description": "Attributes for raw device messages.",
"type": "object",
"properties": {
"Endpoints": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
}
},
"additionalProperties": false,
"minProperties": 0
},
"RangeInclusive": {
"description": "Serialization of Rust's RangeInclusive Type",
"type": "array",
"items": {
"type": "integer",
"minItems": 2,
"maxItems": 2
}
},
"SensorMessageAttributes": {
"description": "Attributes for sensor device messages.",
"type": "object",
"properties": {
"SensorType": {
"type": "string"
},
"FeatureDescriptor": {
"type": "string"
},
"SensorRange": {
"type": "array",
"items": {
"$ref": "#/components/RangeInclusive"
},
"minItems": 1
}
},
"additionalProperties": false,
"required": [
"SensorType",
"FeatureDescriptor",
"SensorRange"
]
},
"DeviceMessagesV3": {
"description": "A list of the messages a device will accept on this server implementation.",
"type": "object",
"properties": {
"StopDeviceCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"ScalarCmd": {
"type": "array",
"items": {
"$ref": "#/components/GenericMessageAttributesV3"
},
"minItems": 1
},
"LinearCmd": {
"type": "array",
"items": {
"$ref": "#/components/GenericMessageAttributesV3",
"minItems": 1
}
},
"RotateCmd": {
"type": "array",
"items": {
"$ref": "#/components/GenericMessageAttributesV3",
"minItems": 1
}
},
"SensorReadCmd": {
"type": "array",
"items": {
"$ref": "#/components/SensorMessageAttributes",
"minItems": 1
}
},
"SensorSubscribeCmd": {
"type": "array",
"items": {
"$ref": "#/components/SensorMessageAttributes",
"minItems": 1
}
},
"RawReadCmd": {
"$ref": "#/components/RawMessageAttributes"
},
"RawWriteCmd": {
"$ref": "#/components/RawMessageAttributes"
},
"RawSubscribeCmd": {
"$ref": "#/components/RawMessageAttributes"
}
},
"additionalProperties": false
},
"DeviceMessagesV2": {
"description": "A list of the messages a device will accept on this server implementation.",
"type": "object",
"properties": {
"StopDeviceCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"VibrateCmd": {
"$ref": "#/components/GenericMessageAttributesV2"
},
"LinearCmd": {
"$ref": "#/components/GenericMessageAttributesV2"
},
"RotateCmd": {
"$ref": "#/components/GenericMessageAttributesV2"
},
"BatteryLevelCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"RSSILevelCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"RawReadCmd": {
"$ref": "#/components/RawMessageAttributes"
},
"RawWriteCmd": {
"$ref": "#/components/RawMessageAttributes"
},
"RawSubscribeCmd": {
"$ref": "#/components/RawMessageAttributes"
},
"RawUnsubscribeCmd": {
"$ref": "#/components/RawMessageAttributes"
}
},
"additionalProperties": false
},
"DeviceMessagesV1": {
"description": "A list of the messages a device will accept on this server implementation.",
"type": "object",
"properties": {
"StopDeviceCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"VibrateCmd": {
"$ref": "#/components/GenericMessageAttributesV1"
},
"LinearCmd": {
"$ref": "#/components/GenericMessageAttributesV1"
},
"RotateCmd": {
"$ref": "#/components/GenericMessageAttributesV1"
},
"LovenseCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"VorzeA10CycloneCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"KiirooCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"SingleMotorVibrateCmd": {
"$ref": "#/components/NullMessageAttributes"
},
"FleshlightLaunchFW12Cmd": {
"$ref": "#/components/NullMessageAttributes"
}
},
"additionalProperties": false
},
"DeviceMessagesV0": {
"description": "A list of the messages a device will accept on this server implementation.",
"type": "array",
"items": {
"type": "string",
"enum": [
"FleshlightLaunchFW12Cmd",
"SingleMotorVibrateCmd",
"StopDeviceCmd",
"KiirooCmd",
"LovenseCmd",
"VorzeA10CycloneCmd"
]
},
"additionalProperties": false
},
"FeatureCount": {
"description": "Number of features on device.",
"type": "integer",
"minimum": 1
},
"StepCountV2": {
"description": "Specifies granularity of each feature on the device.",
"type": "array",
"items": {
"minimum": 1,
"type": "integer"
},
"minItems": 1
},
"StepCountV3": {
"description": "Specifies granularity of each feature on the device.",
"minimum": 1,
"type": "integer"
},
"DeviceFeatureV4": {
"description": "Specifies feature for a device.",
"type": "object",
"properties": {
"FeatureDescription": {
"type": "string"
},
"FeatureIndex": {
"type": "integer"
},
"Output": {
"type": "object",
"patternProperties": {
"^(Vibrate|Rotate|Oscillate|Constrict|Spray|Position|Temperature|Led)$": {
"type": "object",
"properties": {
"Value": {
"$ref": "#/components/RangeInclusive"
}
},
"required": [
"Value"
]
},
"HwPositionWithDuration": {
"type": "object",
"properties": {
"Value": {
"$ref": "#/components/RangeInclusive"
},
"Duration": {
"$ref": "#/components/RangeInclusive"
}
},
"required": [
"Value",
"Duration"
]
}
}
},
"Input": {
"type": "object",
"patternProperties": {
"^.*$": {
"type": "object",
"properties": {
"Value": {
"type": "array",
"items": {
"type": "array",
"items": {
"type": "integer"
}
}
},
"Command": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"Value",
"Command"
]
}
}
}
},
"required": [
"FeatureDescription",
"FeatureIndex"
]
}
},
"messages": {
"SpecV4Messages": {
"OutputCmd": {
"type": "object",
"description": "Sends a generic value set command to a device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"FeatureIndex": {
"$ref": "#/components/DeviceIndex"
},
"Command": {
"type": "object",
"patternProperties": {
"^(Vibrate|Rotate|Oscillate|Constrict|Spray|Position|Temperature|Led)$": {
"type": "object",
"properties": {
"Value": {
"type": "number"
}
},
"required": [
"Value"
]
},
"^HwPositionWithDuration$": {
"type": "object",
"properties": {
"Value": {
"type": "number",
"minimum": 0
},
"Duration": {
"type": "number",
"minimum": 0
}
},
"required": [
"Value",
"Duration"
]
}
}
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"FeatureIndex",
"Command"
]
},
"InputCmd": {
"type": "object",
"description": "Sends a request to read a sensor value.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"FeatureIndex": {
"type": "integer"
},
"Type": {
"type": "string"
},
"Command": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"FeatureIndex",
"Type",
"Command"
]
},
"InputReading": {
"type": "object",
"description": "Returns from either a sensor read request or a subscribed sensor event.",
"properties": {
"Id": {
"$ref": "#/components/ServerId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"FeatureIndex": {
"type": "integer"
},
"Reading": {
"type": "object",
"patternProperties": {
"^Battery|Rssi|Pressure|Button": {
"type": "object"
}
},
"maxProperties": 1
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"FeatureIndex",
"Reading"
]
},
"DeviceList": {
"type": "object",
"description": "List of all available devices known to the system.",
"properties": {
"Id": {
"$ref": "#/components/ServerId"
},
"Devices": {
"description": "Array of device ids and names.",
"type": "object",
"patternProperties": {
"^[0-9]*": {
"type": "object",
"properties": {
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceDisplayName": {
"type": "string"
},
"DeviceMessageTimingGap": {
"type": "integer"
},
"DeviceFeatures": {
"type": "object",
"patternProperties": {
"^[0-9]*": {
"$ref": "#/components/DeviceFeatureV4"
}
}
}
},
"additionalProperties": false,
"required": [
"DeviceName",
"DeviceIndex",
"DeviceMessageTimingGap",
"DeviceFeatures"
]
}
}
}
},
"additionalProperties": false,
"required": [
"Id",
"Devices"
]
},
"RequestServerInfo": {
"type": "object",
"description": "Request server version, and relay client name.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"ClientName": {
"description": "Name of the client software.",
"type": "string"
},
"ProtocolVersionMajor": {
"description": "Message template version of the server software.",
"type": "integer",
"minimum": 0
},
"ProtocolVersionMinor": {
"description": "Message template version of the server software.",
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false,
"required": [
"Id",
"ClientName",
"ProtocolVersionMajor",
"ProtocolVersionMinor"
]
},
"ServerInfo": {
"type": "object",
"description": "Server version information, with API version in Major.Minor format.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"ServerName": {
"description": "Name of the server. Can be 0-length.",
"type": "string"
},
"ProtocolVersionMajor": {
"description": "Message template version of the server software.",
"type": "integer",
"minimum": 0
},
"ProtocolVersionMinor": {
"description": "Message template version of the server software.",
"type": "integer",
"minimum": 0
},
"MaxPingTime": {
"description": "Maximum time (in milliseconds) the server will wait between ping messages from client before shutting down.",
"type": "integer",
"minimum": 0
}
}
},
"StopCmd": {
"type": "object",
"description": "Stops actions currently being taken by all devices, a single device, or a feature.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"FeatureIndex": {
"$ref": "#/components/DeviceIndex"
},
"Inputs": {
"type": "boolean"
},
"Outputs": {
"type": "boolean"
}
},
"additionalProperties": false,
"required": [
"Id"
]
}
},
"SpecV3Messages": {
"DeviceList": {
"type": "object",
"description": "List of all available devices known to the system.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"Devices": {
"description": "Array of device ids and names.",
"type": "array",
"items": {
"type": "object",
"properties": {
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceDisplayName": {
"type": "string"
},
"DeviceMessageTimingGap": {
"type": "integer"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV3"
}
},
"additionalProperties": false,
"required": [
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
}
}
},
"additionalProperties": false,
"required": [
"Id",
"Devices"
]
},
"DeviceAdded": {
"type": "object",
"description": "Notifies client that a device of a certain type has been added to the server.",
"properties": {
"Id": {
"$ref": "#/components/SystemId"
},
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceDisplayName": {
"type": "string"
},
"DeviceMessageTimingGap": {
"type": "integer"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV3"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
},
"ScalarCmd": {
"type": "object",
"description": "Sends a generic scalar command to a device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Scalars": {
"description": "Device actution scalar (floating point, range can vary) keyed on acutator index, stepping will be device specific.",
"type": "array",
"items": {
"type": "object",
"properties": {
"Index": {
"description": "Actuator index.",
"type": "integer",
"minimum": 0
},
"Scalar": {
"description": "Actuator scalar (floating point, range can vary), stepping will be device specific.",
"type": "number"
},
"ActuatorType": {
"description": "Actuator type that is expected to be controlled with this subcommand.",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Index",
"Scalar",
"ActuatorType"
]
},
"minItems": 1
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Scalars"
]
},
"SensorReadCmd": {
"type": "object",
"description": "Sends a request to read a sensor value.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"SensorIndex": {
"type": "integer"
},
"SensorType": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"SensorIndex",
"SensorType"
]
},
"SensorReading": {
"type": "object",
"description": "Returns from either a sensor read request or a subscribed sensor event.",
"properties": {
"Id": {
"$ref": "#/components/ServerId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"SensorIndex": {
"type": "integer"
},
"SensorType": {
"type": "string"
},
"Data": {
"type": "array",
"items": {
"type": "integer",
"minimum": 0,
"maximum": 255
}
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"SensorIndex",
"SensorType",
"Data"
]
},
"SensorSubscribeCmd": {
"type": "object",
"description": "Sends a request to subscribe for updates to a sensor value.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"SensorIndex": {
"type": "integer"
},
"SensorType": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"SensorIndex",
"SensorType"
]
},
"SensorUnsubscribeCmd": {
"type": "object",
"description": "Sends a request to subscribe for updates to a sensor value.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"SensorIndex": {
"type": "integer"
},
"SensorType": {
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"SensorIndex",
"SensorType"
]
}
},
"SpecV2Messages": {
"DeviceList": {
"type": "object",
"description": "List of all available devices known to the system.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"Devices": {
"description": "Array of device ids and names.",
"type": "array",
"items": {
"type": "object",
"properties": {
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV2"
}
},
"additionalProperties": false,
"required": [
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
}
}
},
"additionalProperties": false,
"required": [
"Id",
"Devices"
]
},
"DeviceAdded": {
"type": "object",
"description": "Notifies client that a device of a certain type has been added to the server.",
"properties": {
"Id": {
"$ref": "#/components/SystemId"
},
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV2"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
},
"BatteryLevelCmd": {
"type": "object",
"description": "Requests that a BatteryLevel be retreived.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex"
]
},
"BatteryLevelReading": {
"type": "object",
"description": "Returns a BatteryLevel read from a device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"BatteryLevel": {
"description": "Battery Level",
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"BatteryLevel"
]
},
"RSSILevelCmd": {
"type": "object",
"description": "Requests that a RSSI level be retreived.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex"
]
},
"RSSILevelReading": {
"type": "object",
"description": "Returns a BatteryLevel read from a device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"RSSILevel": {
"description": "RSSI Level",
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"RSSILevel"
]
},
"RawWriteCmd": {
"type": "object",
"description": "Sends a raw byte array to a device. Should only be used for testing/development.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Endpoint": {
"type": "string",
"description": "Endpoint (from device config file) to send command to."
},
"Data": {
"description": "Raw byte string to send to device.",
"type": "array",
"minItems": 1,
"items": {
"type": "integer",
"minimum": 0,
"maximum": 255
}
},
"WriteWithResponse": {
"type": "boolean",
"description": "If true, BLE writes will use WriteWithResponse. Value ignored for all other types."
}
},
"additionalProperties": false,
"required": [
"Id",
"Endpoint",
"DeviceIndex",
"Data",
"WriteWithResponse"
]
},
"RawReadCmd": {
"type": "object",
"description": "Request a raw byte array from a device. Should only be used for testing/development.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Endpoint": {
"type": "string",
"description": "Endpoint (from device config file) from which the data was retrieved."
},
"Length": {
"type": "integer",
"description": "Amount of data to read from device, 0 to exhaust whatever is in immediate buffer",
"minimum": 0
},
"WaitForData": {
"type": "boolean",
"description": "If true, then wait until Length amount of data is available."
}
},
"additionalProperties": false,
"required": [
"Id",
"Endpoint",
"DeviceIndex",
"Length",
"WaitForData"
]
},
"RawSubscribeCmd": {
"type": "object",
"description": "Subscribe to an endpoint on a device to receive raw info back.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Endpoint": {
"type": "string",
"description": "Endpoint (from device config file) from which the data was retrieved."
}
},
"additionalProperties": false,
"required": [
"Id",
"Endpoint",
"DeviceIndex"
]
},
"RawUnsubscribeCmd": {
"type": "object",
"description": "Unsubscribe to an endpoint on a device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Endpoint": {
"type": "string",
"description": "Endpoint (from device config file) from which the data was retrieved."
}
},
"additionalProperties": false,
"required": [
"Id",
"Endpoint",
"DeviceIndex"
]
},
"RawReading": {
"type": "object",
"description": "Raw byte array received from a device. Should only be used for testing/development.",
"properties": {
"Id": {
"$ref": "#/components/ServerId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Endpoint": {
"type": "string",
"description": "Endpoint (from device config file) from which the data was retrieved."
},
"Data": {
"description": "Raw byte string received from device.",
"type": "array",
"minItems": 1,
"items": {
"type": "integer",
"minimum": 0,
"maximum": 255
}
}
},
"additionalProperties": false,
"required": [
"Id",
"Endpoint",
"DeviceIndex",
"Data"
]
},
"ServerInfo": {
"type": "object",
"description": "Server version information, in Major.Minor.Build format.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"ServerName": {
"description": "Name of the server. Can be 0-length.",
"type": "string"
},
"MessageVersion": {
"description": "Message template version of the server software.",
"type": "integer",
"minimum": 0
},
"MaxPingTime": {
"description": "Maximum time (in milliseconds) the server will wait between ping messages from client before shutting down.",
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false,
"required": [
"Id",
"MessageVersion",
"MaxPingTime",
"ServerName"
]
}
},
"SpecV1Messages": {
"DeviceList": {
"type": "object",
"description": "List of all available devices known to the system.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"Devices": {
"description": "Array of device ids and names.",
"type": "array",
"items": {
"type": "object",
"properties": {
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV1"
}
},
"additionalProperties": false,
"required": [
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
}
}
},
"additionalProperties": false,
"required": [
"Id",
"Devices"
]
},
"DeviceAdded": {
"type": "object",
"description": "Notifies client that a device of a certain type has been added to the server.",
"properties": {
"Id": {
"$ref": "#/components/SystemId"
},
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV1"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
},
"VibrateCmd": {
"type": "object",
"description": "Sends a vibrate command to a device that supports vibration.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Speeds": {
"description": "Device vibration speeds (floating point, 0 < x < 1) keyed on vibrator number, stepping will be device specific.",
"type": "array",
"items": {
"type": "object",
"properties": {
"Index": {
"description": "Vibrator number.",
"type": "integer",
"minimum": 0
},
"Speed": {
"description": "Vibration speed (floating point, 0 < x < 1), stepping will be device specific.",
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"additionalProperties": false,
"required": [
"Index",
"Speed"
]
},
"minItems": 1
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Speeds"
]
},
"RotateCmd": {
"type": "object",
"description": "Sends a rotate command to a device that supports rotation.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Rotations": {
"description": "Device rotation speeds (floating point, 0 < x < 1) keyed on rotator number, stepping will be device specific.",
"type": "array",
"items": {
"type": "object",
"properties": {
"Index": {
"description": "Rotator number.",
"type": "integer",
"minimum": 0
},
"Speed": {
"description": "Rotation speed (floating point, 0 < x < 1), stepping will be device specific.",
"type": "number",
"minimum": 0,
"maximum": 1
},
"Clockwise": {
"description": "Rotation direction (boolean). Not all devices have a concept of actual clockwise.",
"type": "boolean"
}
},
"additionalProperties": false,
"required": [
"Index",
"Speed",
"Clockwise"
]
},
"minItems": 1
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Rotations"
]
},
"LinearCmd": {
"type": "object",
"description": "Sends a linear movement command to a device that supports linear movements.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Vectors": {
"description": "Device linear movement times (milliseconds) and positions (floating point, 0 < x < 1) keyed on linear actuator number, stepping will be device specific.",
"type": "array",
"items": {
"type": "object",
"properties": {
"Index": {
"description": "Linear actuator number.",
"type": "integer",
"minimum": 0
},
"Duration": {
"description": "Linear movement time in milliseconds.",
"type": "number",
"minimum": 0
},
"Position": {
"description": "Linear movement position (floating point, 0 < x < 1), stepping will be device specific.",
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"additionalProperties": false,
"required": [
"Index",
"Duration",
"Position"
]
}
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Vectors"
]
},
"ServerInfo": {
"type": "object",
"description": "Server version information, in Major.Minor.Build format.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"ServerName": {
"description": "Name of the server. Can be 0-length.",
"type": "string"
},
"MessageVersion": {
"description": "Message template version of the server software.",
"type": "integer",
"minimum": 0
},
"MajorVersion": {
"description": "Major version of server.",
"type": "integer",
"minimum": 0
},
"MinorVersion": {
"description": "Minor version of server.",
"type": "integer",
"minimum": 0
},
"BuildVersion": {
"description": "Build version of server.",
"type": "integer",
"minimum": 0
},
"MaxPingTime": {
"description": "Maximum time (in milliseconds) the server will wait between ping messages from client before shutting down.",
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false,
"required": [
"Id",
"MessageVersion",
"MaxPingTime",
"MajorVersion",
"MinorVersion",
"BuildVersion",
"ServerName"
]
},
"RequestServerInfo": {
"type": "object",
"description": "Request server version, and relay client name.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"ClientName": {
"description": "Name of the client software.",
"type": "string"
},
"MessageVersion": {
"description": "Message template version of the client software.",
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false,
"required": [
"Id",
"ClientName",
"MessageVersion"
]
}
},
"SpecV0Messages": {
"DeviceList": {
"type": "object",
"description": "List of all available devices known to the system.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"Devices": {
"description": "Array of device ids and names.",
"type": "array",
"items": {
"type": "object",
"properties": {
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV0"
}
},
"additionalProperties": false,
"required": [
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
}
}
},
"additionalProperties": false,
"required": [
"Id",
"Devices"
]
},
"DeviceAdded": {
"type": "object",
"description": "Notifies client that a device of a certain type has been added to the server.",
"properties": {
"Id": {
"$ref": "#/components/SystemId"
},
"DeviceName": {
"$ref": "#/components/DeviceName"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"DeviceMessages": {
"$ref": "#/components/DeviceMessagesV0"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceName",
"DeviceIndex",
"DeviceMessages"
]
},
"StopDeviceCmd": {
"type": "object",
"description": "Stops the all actions currently being taken by a device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex"
]
},
"StopAllDevices": {
"type": "object",
"description": "Stops all actions currently being taken by all connected devices.",
"anyOf": [
{
"$ref": "#/components/ClientIdMessage"
}
]
},
"VorzeA10CycloneCmd": {
"type": "object",
"description": "Sends a raw byte string to a Kiiroo Onyx/Pearl device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Speed": {
"description": "Rotation speed command for the Cyclone.",
"type": "integer",
"minimum": 0,
"maximum": 100
},
"Clockwise": {
"description": "True for clockwise rotation (in relation to device facing user), false for Counter-clockwise",
"type": "boolean"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Speed",
"Clockwise"
]
},
"KiirooCmd": {
"type": "object",
"description": "Sends a raw byte string to a Kiiroo Onyx/Pearl device.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Command": {
"description": "Command to send to Kiiroo device.",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Command"
]
},
"FleshlightLaunchFW12Cmd": {
"type": "object",
"description": "Sends speed and position command to the Fleshlight Launch Device denoted by the device index.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Speed": {
"description": "Speed at which to move to designated position.",
"type": "integer",
"minimum": 0,
"maximum": 99
},
"Position": {
"description": "Position to which to move Fleshlight.",
"type": "integer",
"minimum": 0,
"maximum": 99
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Speed",
"Position"
]
},
"LovenseCmd": {
"type": "object",
"description": "Sends a command string to a Lovense device. Command string will be verified by sender.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Command": {
"description": "Command to send to Lovense device.",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Command"
]
},
"SingleMotorVibrateCmd": {
"type": "object",
"description": "Sends a vibrate command to a device that supports vibration.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"DeviceIndex": {
"$ref": "#/components/DeviceIndex"
},
"Speed": {
"description": "Device vibration speed (floating point, 0 < x < 1), stepping will be device specific.",
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"additionalProperties": false,
"required": [
"Id",
"DeviceIndex",
"Speed"
]
},
"ServerInfo": {
"type": "object",
"description": "Server version information, in Major.Minor.Build format.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"ServerName": {
"description": "Name of the server. Can be 0-length.",
"type": "string"
},
"MessageVersion": {
"description": "Message template version of the server software.",
"type": "integer",
"minimum": 0
},
"MajorVersion": {
"description": "Major version of server.",
"type": "integer",
"minimum": 0
},
"MinorVersion": {
"description": "Minor version of server.",
"type": "integer",
"minimum": 0
},
"BuildVersion": {
"description": "Build version of server.",
"type": "integer",
"minimum": 0
},
"MaxPingTime": {
"description": "Maximum time (in milliseconds) the server will wait between ping messages from client before shutting down.",
"type": "integer",
"minimum": 0
}
},
"additionalProperties": false,
"required": [
"Id",
"MessageVersion",
"MaxPingTime",
"MajorVersion",
"MinorVersion",
"BuildVersion",
"ServerName"
]
},
"RequestServerInfo": {
"type": "object",
"description": "Request server version, and relay client name.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"ClientName": {
"description": "Name of the client software.",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"ClientName"
]
},
"RequestLog": {
"type": "object",
"description": "Request for server to stream log messages of a certain level to client.",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"LogLevel": {
"description": "Maximum level of log message to receive.",
"enum": [
"Off",
"Fatal",
"Error",
"Warn",
"Info",
"Debug",
"Trace"
]
}
},
"additionalProperties": false,
"required": [
"Id",
"LogLevel"
]
},
"Log": {
"type": "object",
"description": "Log message from the server.",
"properties": {
"Id": {
"$ref": "#/components/SystemId"
},
"LogLevel": {
"description": "Log level of message.",
"enum": [
"Off",
"Fatal",
"Error",
"Warn",
"Info",
"Debug",
"Trace"
]
},
"LogMessage": {
"description": "Log message from server.",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"LogLevel",
"LogMessage"
]
},
"DeviceRemoved": {
"type": "object",
"description": "Notifies client that a device of a certain type has been removed from the server.",
"anyOf": [
{
"$ref": "#/components/SystemIdDeviceIndexMessage"
}
]
},
"RequestDeviceList": {
"type": "object",
"description": "Request for the server to send a list of devices to the client.",
"anyOf": [
{
"$ref": "#/components/ClientIdMessage"
}
]
},
"StartScanning": {
"type": "object",
"description": "Request for the server to start scanning for new devices.",
"anyOf": [
{
"$ref": "#/components/ClientIdMessage"
}
]
},
"StopScanning": {
"type": "object",
"description": "Request for the server to stop scanning for new devices.",
"anyOf": [
{
"$ref": "#/components/ClientIdMessage"
}
]
},
"ScanningFinished": {
"type": "object",
"description": "Server notification to client that scanning has ended.",
"anyOf": [
{
"$ref": "#/components/SystemIdMessage"
}
]
},
"Ok": {
"type": "object",
"description": "Signifies successful processing of the message indicated by the id.",
"anyOf": [
{
"$ref": "#/components/ClientIdMessage"
}
]
},
"Ping": {
"type": "object",
"description": "Connection keep-alive message.",
"anyOf": [
{
"$ref": "#/components/ClientIdMessage"
}
]
},
"Error": {
"type": "object",
"description": "Signifies the server encountered an error while processing the message indicated by the id.",
"properties": {
"Id": {
"$ref": "#/components/ServerId"
},
"ErrorMessage": {
"type": "string"
},
"ErrorCode": {
"type": "number",
"minimum": 0,
"maximum": 4
}
},
"additionalProperties": false,
"required": [
"Id",
"ErrorMessage",
"ErrorCode"
]
},
"Test": {
"type": "object",
"description": "Used for connection/application testing. Causes server to echo back the string sent. Sending string of 'Error' will result in a server error. ",
"properties": {
"Id": {
"$ref": "#/components/ClientId"
},
"TestString": {
"description": "String to be echo'd back from server. Setting this to 'Error' will cause an error to be thrown.",
"type": "string"
}
},
"additionalProperties": false,
"required": [
"Id",
"TestString"
]
}
}
},
"specs": {
"MessageSpecV4": {
"type": "array",
"items": {
"type": "object",
"description": "All messages valid in Buttplug Spec v4",
"properties": {
"DeviceList": {
"$ref": "#/messages/SpecV4Messages/DeviceList"
},
"Error": {
"$ref": "#/messages/SpecV0Messages/Error"
},
"Ok": {
"$ref": "#/messages/SpecV0Messages/Ok"
},
"Ping": {
"$ref": "#/messages/SpecV0Messages/Ping"
},
"RequestDeviceList": {
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
},
"RequestServerInfo": {
"$ref": "#/messages/SpecV4Messages/RequestServerInfo"
},
"ScanningFinished": {
"$ref": "#/messages/SpecV0Messages/ScanningFinished"
},
"InputCmd": {
"$ref": "#/messages/SpecV4Messages/InputCmd"
},
"InputReading": {
"$ref": "#/messages/SpecV4Messages/InputReading"
},
"ServerInfo": {
"$ref": "#/messages/SpecV4Messages/ServerInfo"
},
"StartScanning": {
"$ref": "#/messages/SpecV0Messages/StartScanning"
},
"StopCmd": {
"$ref": "#/messages/SpecV4Messages/StopCmd"
},
"StopScanning": {
"$ref": "#/messages/SpecV0Messages/StopScanning"
},
"OutputCmd": {
"$ref": "#/messages/SpecV4Messages/OutputCmd"
}
},
"additionalProperties": false,
"minProperties": 1,
"maxProperties": 1
},
"minItems": 1
},
"MessageSpecV3": {
"type": "array",
"items": {
"type": "object",
"description": "All messages valid in Buttplug Spec v3",
"properties": {
"DeviceList": {
"$ref": "#/messages/SpecV3Messages/DeviceList"
},
"DeviceAdded": {
"$ref": "#/messages/SpecV3Messages/DeviceAdded"
},
"DeviceRemoved": {
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
},
"Error": {
"$ref": "#/messages/SpecV0Messages/Error"
},
"ScalarCmd": {
"$ref": "#/messages/SpecV3Messages/ScalarCmd"
},
"LinearCmd": {
"$ref": "#/messages/SpecV1Messages/LinearCmd"
},
"Ok": {
"$ref": "#/messages/SpecV0Messages/Ok"
},
"Ping": {
"$ref": "#/messages/SpecV0Messages/Ping"
},
"RawReadCmd": {
"$ref": "#/messages/SpecV2Messages/RawReadCmd"
},
"RawReading": {
"$ref": "#/messages/SpecV2Messages/RawReading"
},
"RawWriteCmd": {
"$ref": "#/messages/SpecV2Messages/RawWriteCmd"
},
"RawSubscribeCmd": {
"$ref": "#/messages/SpecV2Messages/RawSubscribeCmd"
},
"RawUnsubscribeCmd": {
"$ref": "#/messages/SpecV2Messages/RawUnsubscribeCmd"
},
"RequestDeviceList": {
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
},
"RequestServerInfo": {
"$ref": "#/messages/SpecV1Messages/RequestServerInfo"
},
"RotateCmd": {
"$ref": "#/messages/SpecV1Messages/RotateCmd"
},
"ScanningFinished": {
"$ref": "#/messages/SpecV0Messages/ScanningFinished"
},
"SensorReadCmd": {
"$ref": "#/messages/SpecV3Messages/SensorReadCmd"
},
"SensorReading": {
"$ref": "#/messages/SpecV3Messages/SensorReading"
},
"SensorSubscribeCmd": {
"$ref": "#/messages/SpecV3Messages/SensorSubscribeCmd"
},
"SensorUnsubscribeCmd": {
"$ref": "#/messages/SpecV3Messages/SensorUnsubscribeCmd"
},
"ServerInfo": {
"$ref": "#/messages/SpecV2Messages/ServerInfo"
},
"StartScanning": {
"$ref": "#/messages/SpecV0Messages/StartScanning"
},
"StopAllDevices": {
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
},
"StopDeviceCmd": {
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
},
"StopScanning": {
"$ref": "#/messages/SpecV0Messages/StopScanning"
}
},
"additionalProperties": false,
"minProperties": 1,
"maxProperties": 1
},
"minItems": 1
},
"MessageSpecV2": {
"type": "array",
"items": {
"type": "object",
"description": "All messages valid in Buttplug Spec v2.",
"properties": {
"BatteryLevelCmd": {
"$ref": "#/messages/SpecV2Messages/BatteryLevelCmd"
},
"BatteryLevelReading": {
"$ref": "#/messages/SpecV2Messages/BatteryLevelReading"
},
"DeviceList": {
"$ref": "#/messages/SpecV2Messages/DeviceList"
},
"DeviceAdded": {
"$ref": "#/messages/SpecV2Messages/DeviceAdded"
},
"DeviceRemoved": {
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
},
"Error": {
"$ref": "#/messages/SpecV0Messages/Error"
},
"LinearCmd": {
"$ref": "#/messages/SpecV1Messages/LinearCmd"
},
"Ok": {
"$ref": "#/messages/SpecV0Messages/Ok"
},
"Ping": {
"$ref": "#/messages/SpecV0Messages/Ping"
},
"RawReadCmd": {
"$ref": "#/messages/SpecV2Messages/RawReadCmd"
},
"RawReading": {
"$ref": "#/messages/SpecV2Messages/RawReading"
},
"RawWriteCmd": {
"$ref": "#/messages/SpecV2Messages/RawWriteCmd"
},
"RawSubscribeCmd": {
"$ref": "#/messages/SpecV2Messages/RawSubscribeCmd"
},
"RawUnsubscribeCmd": {
"$ref": "#/messages/SpecV2Messages/RawUnsubscribeCmd"
},
"RequestDeviceList": {
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
},
"RequestLog": {
"$ref": "#/messages/SpecV0Messages/RequestLog"
},
"RequestServerInfo": {
"$ref": "#/messages/SpecV1Messages/RequestServerInfo"
},
"RotateCmd": {
"$ref": "#/messages/SpecV1Messages/RotateCmd"
},
"RSSILevelCmd": {
"$ref": "#/messages/SpecV2Messages/RSSILevelCmd"
},
"RSSILevelReading": {
"$ref": "#/messages/SpecV2Messages/RSSILevelReading"
},
"ScanningFinished": {
"$ref": "#/messages/SpecV0Messages/ScanningFinished"
},
"ServerInfo": {
"$ref": "#/messages/SpecV2Messages/ServerInfo"
},
"StartScanning": {
"$ref": "#/messages/SpecV0Messages/StartScanning"
},
"StopAllDevices": {
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
},
"StopDeviceCmd": {
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
},
"StopScanning": {
"$ref": "#/messages/SpecV0Messages/StopScanning"
},
"VibrateCmd": {
"$ref": "#/messages/SpecV1Messages/VibrateCmd"
}
},
"additionalProperties": false,
"minProperties": 1,
"maxProperties": 1
},
"minItems": 1
},
"MessageSpecV1": {
"type": "array",
"items": {
"type": "object",
"description": "One or more messages validated by the Buttplug Message schema list.",
"properties": {
"DeviceList": {
"$ref": "#/messages/SpecV1Messages/DeviceList"
},
"DeviceAdded": {
"$ref": "#/messages/SpecV1Messages/DeviceAdded"
},
"DeviceRemoved": {
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
},
"Error": {
"$ref": "#/messages/SpecV0Messages/Error"
},
"FleshlightLaunchFW12Cmd": {
"$ref": "#/messages/SpecV0Messages/FleshlightLaunchFW12Cmd"
},
"KiirooCmd": {
"$ref": "#/messages/SpecV0Messages/KiirooCmd"
},
"LinearCmd": {
"$ref": "#/messages/SpecV1Messages/LinearCmd"
},
"Log": {
"$ref": "#/messages/SpecV0Messages/Log"
},
"Ok": {
"$ref": "#/messages/SpecV0Messages/Ok"
},
"Ping": {
"$ref": "#/messages/SpecV0Messages/Ping"
},
"RequestDeviceList": {
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
},
"RequestLog": {
"$ref": "#/messages/SpecV0Messages/RequestLog"
},
"RequestServerInfo": {
"$ref": "#/messages/SpecV1Messages/RequestServerInfo"
},
"RotateCmd": {
"$ref": "#/messages/SpecV1Messages/RotateCmd"
},
"ServerInfo": {
"$ref": "#/messages/SpecV1Messages/ServerInfo"
},
"StartScanning": {
"$ref": "#/messages/SpecV0Messages/StartScanning"
},
"StopAllDevices": {
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
},
"StopDeviceCmd": {
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
},
"StopScanning": {
"$ref": "#/messages/SpecV0Messages/StopScanning"
},
"Test": {
"$ref": "#/messages/SpecV0Messages/Test"
},
"VibrateCmd": {
"$ref": "#/messages/SpecV1Messages/VibrateCmd"
},
"VorzeA10CycloneCmd": {
"$ref": "#/messages/SpecV0Messages/VorzeA10CycloneCmd"
}
},
"additionalProperties": false,
"minProperties": 1,
"maxProperties": 1
},
"minItems": 1
},
"MessageSpecV0": {
"type": "array",
"items": {
"type": "object",
"description": "One or more messages validated by the Buttplug Message schema list.",
"properties": {
"DeviceList": {
"$ref": "#/messages/SpecV0Messages/DeviceList"
},
"DeviceAdded": {
"$ref": "#/messages/SpecV0Messages/DeviceAdded"
},
"DeviceRemoved": {
"$ref": "#/messages/SpecV0Messages/DeviceRemoved"
},
"Error": {
"$ref": "#/messages/SpecV0Messages/Error"
},
"Log": {
"$ref": "#/messages/SpecV0Messages/Log"
},
"Ok": {
"$ref": "#/messages/SpecV0Messages/Ok"
},
"Ping": {
"$ref": "#/messages/SpecV0Messages/Ping"
},
"RequestDeviceList": {
"$ref": "#/messages/SpecV0Messages/RequestDeviceList"
},
"RequestLog": {
"$ref": "#/messages/SpecV0Messages/RequestLog"
},
"RequestServerInfo": {
"$ref": "#/messages/SpecV0Messages/RequestServerInfo"
},
"ServerInfo": {
"$ref": "#/messages/SpecV0Messages/ServerInfo"
},
"StartScanning": {
"$ref": "#/messages/SpecV0Messages/StartScanning"
},
"StopAllDevices": {
"$ref": "#/messages/SpecV0Messages/StopAllDevices"
},
"StopDeviceCmd": {
"$ref": "#/messages/SpecV0Messages/StopDeviceCmd"
},
"StopScanning": {
"$ref": "#/messages/SpecV0Messages/StopScanning"
},
"Test": {
"$ref": "#/messages/SpecV0Messages/Test"
},
"FleshlightLaunchFW12Cmd": {
"$ref": "#/messages/SpecV0Messages/FleshlightLaunchFW12Cmd"
},
"KiirooCmd": {
"$ref": "#/messages/SpecV0Messages/KiirooCmd"
},
"SingleMotorVibrateCmd": {
"$ref": "#/messages/SpecV0Messages/SingleMotorVibrateCmd"
},
"VorzeA10CycloneCmd": {
"$ref": "#/messages/SpecV0Messages/VorzeA10CycloneCmd"
}
},
"additionalProperties": false,
"minProperties": 1,
"maxProperties": 1
},
"minItems": 1
}
},
"anyOf": [
{
"$ref": "#/specs/MessageSpecV4"
},
{
"$ref": "#/specs/MessageSpecV3"
},
{
"$ref": "#/specs/MessageSpecV2"
},
{
"$ref": "#/specs/MessageSpecV1"
},
{
"$ref": "#/specs/MessageSpecV0"
}
]
}