{ "$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", "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" } }, "messages": { "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": { "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/MessageSpecV3" }, { "$ref": "#/specs/MessageSpecV2" }, { "$ref": "#/specs/MessageSpecV1" }, { "$ref": "#/specs/MessageSpecV0" } ] }