UAV — UAV-related messages

UAVs are subtypes of objects and thus exist in the same namespace as all other objects in the server. The messages listed in this section are specific to UAVs and do not apply to other object types.

UAV-CALIB - Calibrate a component of one or more UAVs

A client sends this request to the server to ask one or more UAVs to calibrate one of its components accelerometer, pressure sensor, ESCs and so on).

The message specifies the name of the component to calibrate and an additional parameter object. The interpretation of the parameter object depends on the component itself. Right now the protocol supports baro, compass, esc, gyro and rc, although not all UAV types may implement all of these calibration types. As the component names are merely strings, the protocol can easily be extended in the future with additional component types. UAVs that do not know or do not support calibrating a specific component will return failures for the unsupported components.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

component

yes

string

The name of the UAV component to calibrate

parameters

no

object

Additional parameters of the calibration

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the calibration was performed successfully on the UAV. The semantics of a successful response may vary from component to component; for instance, the calibration of a compass is a long process that requires a human operator to rotate the drone, so in this case the response may indicate success if the calibration has started. However, a pressure sensor is easily calibrated to a specific altitude without human intervention, so in this case the result indicates whether the calibration was successful.

Example request

{
    "type": "UAV-CALIB",
    "ids": ["1", "17", "31", "spam"],
    "component": "baro",
    "parameters": {}
}

Example response

{
    "type": "UAV-CALIB",
    "result": {
        "1": true,
    },
    "error": {
        "31": "Component not supported.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-FLY — Fly to a specific GPS coordinate

A client sends this request to the server to ask a UAV to fly to a specific GPS coordinate and altitude. Note that it is possible to target multiple UAVs with the same command, in which case they will be asked to fly to the same coordinate. It is the responsibility of the software running on the UAVs to avoid collisions in such cases, so make sure that the UAVs can handle this.

The server responds with two lists: the first list contains the IDs of the UAVs where the command was accepted (which does not mean that the UAVs have reached the destination, only that the UAVs have started processing the command and act accordingly), and the second list contains the IDs where such an attempt was not started. (Possible reasons for failure could be: invalid UAV ID, UAV does not support flying to a specific waypoint, waypoint is outside the designated flying zone and so on). The server MAY decide to include more detailed information about failed attempts in the response.

The target is specified as a GPSCoordinate object. This object MUST contain a latitude and a longitude, but MAY omit both altitudes; in this case, the UAV SHOULD attempt flying to the target at the same altitude where it currently is.

Clients interested in whether the UAVs have reached their positions should keep an eye on UAV-INF messages.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

target

yes

GPSCoordinate

The GPS coordinate to fly to

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-FLY",
    "ids": ["1", "17", "31", "spam"],
    "target": {
      "lat": 51.9976597,
      "lon": -0.7406863,
      "amsl": 93.765
    }
}

Example response

{
    "type": "UAV-FLY",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV does not support flying to waypoints.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-HALT — Initiate immediate shutdown

A client sends this request to the server to initiate an immediate shutdown of an UAV in case of an emergency. Note that the UAV will not attempt to land - typically it will stop the rotors even in mid-air. Use this message only in emergencies.

The server responds with two lists: the first list contains the IDs of the UAVs where a shutdown attempt was started (in the sense that the UAV has been notified that they should shut down now), and the second list contains the IDs where such an attempt was not started. (Possible reasons for failure could be: invalid UAV ID, UAV does not support forced shutdown and so on). The server MAY decide to include more detailed information about failed attempts in the response.

Clients interested in whether the shutdown attempts have succeeded should keep an eye on UAV-INF messages.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-HALT",
    "ids": ["1", "17", "31", "spam"]
}

Example response

{
    "type": "UAV-HALT",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV does not support forced shutdown.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-HOVER - Request position hold immediately

A client sends this request to the server to request one or more UAVs to stop and hover in place in the air as soon as possible. Not applicable to fixed-wing UAVs that are not capable of hovering in place.

The server responds with two lists: the first list contains the IDs of the UAVs where the command to hover in place was sent, and the second list contains the IDs where such a command was not delivered successfully. (Possible reasons for failure could be: invalid UAV ID, UAV is a fixed-wing aircraft and so on). The server MAY decide to include more detailed information about failed attempts in the response.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-HOVER",
    "ids": ["1", "17", "31", "spam"]
}

Example response

{
    "type": "UAV-HOVER",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV does not support forced shutdown.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-INF — Basic status information of one or more UAVs

A client sends this request to the server to obtain basic status information about one or more UAVs currently known to the server.

This message may also be broadcast as a notification by the server on its own volition to all connected Flockwave clients to notify them about a status change of one of the UAVs.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs that the client is interested in

Response and notification fields

Name Required? Type Description

status

no

object of UAVStatusInfo

Object mapping UAV IDs to the corresponding status information.

error

no

object

Object mapping UAV IDs to reasons why the corresponding status information could not have been retrieved.

All the UAV IDs that were specified in the request MUST appear either in the status list or in the error list. When this message is sent as a notification, only the status field SHOULD be present.

Example request

{
    "type": "UAV-INF",
    "ids": ["1", "spam"]
}

Example response

{
    "type": "UAV-INF",
    "status": {
        "1": {
            "id": "1",
            "mode": "pos",
            "position": [519976597, -7406863, 93765],
            "heading": 90,
            "attitude": [0, 0, 900],
            "velocity": [2000, 2000, -1000],
            "timestamp": "2015-12-08T08:17:41.000Z",
            "debug": "MEJBRENBRkU=",
            "error": [42]
        }
    },
    "error": {
        "spam": "No such UAV."
    }
}

UAV-LAND — Initiate unsupervised landing

A client send this request to the server to initiate unsupervised landing on one or more UAVs. The server responds with two lists: the first list contains the IDs of the UAVs where an unsupervised landing attempt was started (in the sense that the UAV has been notified that they should land now), and the second list contains the IDs where such an attempt was not started. (Possible reasons for failure could be: invalid UAV ID, UAV does not support unsupervised landing and so on). The server MAY decide to include more detailed information about failed attempts in the response.

Clients interested in whether the landing attempts have succeeded should keep an eye on UAV-INF messages.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-LAND",
    "ids": ["1", "17", "31", "spam"]
}

Example response

{
    "type": "UAV-LAND",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV is a beacon.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-LIST — List of all the UAVs known by the server

A client sends this request to the server to request the list of all UAVs currently known by the server. The semantics of ``knowing'' a UAV is left up to the server implementation and configuration; typically, the server will return an UAV ID in the response if it has received a status message from the given UAV recently, typically in the last few minutes.

This message is equivalent to sending an OBJ-LIST message with its filter set to uav; it exists solely for compatibility with legacy clients and will be deprecated in Flockwave 2.0.

Request fields

This request has no fields.

Response fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs that the server knows

Example request

{
    "type": "UAV-LIST"
}

Example response

{
    "type": "UAV-LIST",
    "ids": ["1", "17", "31"]
}

UAV-MOTOR — Send request to turn motors on (without taking off) or off

A client sends this request to the server to request one or more of the UAVs to turn their motors on or off. Not all UAVs support this operation; UAVs that do not support turning on their motors without taking off should do nothing.

Typically, it is dangerous to turn off the motors while the UAV is airborne, and the default behaviour in such cases is to deny the operation. When the operator wants to stop the motors of the UAV even if it is airborne (in other words, to initiate an emergency stop without shutting down the software of the UAV), the command must be sent in "forced" mode.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

start

yes

boolean

Whether to start (true) or stop (false) the motor.

force

no

boolean

Whether the command is forced, i.e. the UAV should execute it even if it is not safe to do so. Defaults to false if omitted.

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-MOTOR",
    "ids": ["1", "17", "31", "spam"],
    "start": false,
    "force": true
}

Example response

{
    "type": "UAV-MOTOR",
    "result": {
        "1": true
    },
    "error": {
        "31": "UAV does not support forced motor shutdown.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-PREFLT — Preflight checklist information of one or more UAVs

A client sends this request to the server to obtain detailed information about the state of the onboard preflight checks on one or more UAVs currently known to the server.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs that the client is interested in

Response and notification fields

Name Required? Type Description

status

no

object of PreflightCheckInfo

Object mapping UAV IDs to the corresponding preflight check information.

error

no

object

Object mapping UAV IDs to reasons why the corresponding preflight checklist could not have been retrieved.

All the UAV IDs that were specified in the request MUST appear either in the status list or in the error list. When this message is sent as a notification, only the status field SHOULD be present.

Example request

{
    "type": "UAV-PREFLT",
    "ids": ["1", "spam"]
}

Example response

{
    "type": "UAV-PREFLT",
    "status": {
        "1": {
            "message": "Compass inconsistency",
            "result": "failure",
            "items": [{
                "id": "compass",
                "label": "Compass",
                "result": "failure",
                "message": "Compass inconsistency detected"
            }, {
                "id": "imu",
                "label": "IMU",
                "result": "pass",
                "message": "IMU subsystem healthy"
            }, {
                "id": "gps",
                "label": "GPS",
                "result": "pass",
                "message": "3D GPS fix"
            }, {
                "id": "Home",
                "label": "Home position",
                "result": "warning",
                "message": "Home position not set yet"
            }]
        }
    },
    "error": {
        "spam": "No such UAV."
    }
}

UAV-RST — Send reboot request

A client sends this request to the server to initiate the reboot of the entire UAV or some subsystem of it. Note that this is a potentially dangerous operation; this message only if the UAV is on the ground or if you are sure that the rebooted subsystem does not affect the normal operation of the UAV during flight.

The server responds with two lists: the first list contains the IDs of the UAVs where a reboot attempt was started (in the sense that the UAV has been notified that they should reboot), and the second list contains the IDs where such an attempt was not started. (Possible reasons for failure could be: invalid UAV ID, UAV does not support rebooting and so on). The server MAY decide to include more detailed information about failed attempts in the response.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

component

no

string

The name of the UAV component to reboot. The list of allowed names depends on the type of the UAV. When omitted or empty, the entire UAV will be rebooted as if it was turned off and then on again.

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-RST",
    "ids": ["1", "17", "31", "spam"],
    "component": "autopilot"
}

Example response

{
    "type": "UAV-RST",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV does not support rebooting.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-RTH — Initiate return to home position

A client send this request to the server to request some of the UAVs to return to their home positions.

The server responds with two lists: the first list contains the IDs of the UAVs where an unsupervised landing attempt was started (in the sense that the UAV has been notified that they should return to their home positions now), and the second list contains the IDs where such an attempt was not started. (Possible reasons for failure could be: invalid UAV ID, UAV does not know the concept of a home position and so on). The server MAY decide to include more detailed information about failed attempts in the response.

Clients interested in whether the targeted UAVs have returned to their home positions should keep an eye on UAV-INF messages and watch the GPS coordinates of the UAVs.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-RTH",
    "ids": ["1", "17", "31", "spam"],
    "transport": {
        "channel": 1,
        "broadcast": true
    }
}

Example response

{
    "type": "UAV-RTH",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV is a beacon.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-SIGNAL - Emit light or audio signals

A client sends this request to the server to ask one or more UAVs to emit a light or audio signal in order to attract attention. This is useful if you are trying to find a lost drone in the field or if you want to identify a drone needing battery replacement in a drone swarm, given its ID.

The message specifies what sort of signal should be emitted; right now the protocol supports light and sound signals, but more signal types may be added in the future. As the signal types are merely strings, the protocol can easily be extended in the future with additional signal types, and UAVs that do not know or do not support a specific signal type should simply ignore the unknown ones.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

signals

yes

list of strings

The list of signal types that the targeted UAVs should emit

duration

yes

integer

The duration of the signal, in milliseconds. UAVs that do not support prescribed signal durations may ignore it and fall back to a default duration.

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-SIGNAL",
    "ids": ["1", "17", "31", "spam"],
    "signals": ["sound", "light"],
    "duration": 5000
}

Example response

{
    "type": "UAV-SIGNAL",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV is a beacon.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-SLEEP — Send the UAV to a low-power state.

A client sends this request to the server to request one or more UAVs to switch to a low-power state where most of the components are powered down, except the ones responsible for maintaining a connection with the GCS. This allows the operator to suspend a UAV remotely and wake it up later. UAVs that do not support low-power states MUST NOT treat this command as a poweroff command as it becomes impossible to recover from the powered-down state without physically restarting the UAV.

The server responds with two lists: the first list contains the IDs of the UAVs where the command was acknowledged, and the second list contains the IDs where such an acknowledgment was not received. (Note that the UAV may have still entered a low-power state even if the acknowledgment was not received; this may happen if the UAV is constructed in a way that it does not have time to send the acknowledgment before it powers down).

Clients interested in whether the low-power state switch attempts have succeeded should keep an eye on UAV-INF messages.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, and the server knows that no acknowledgment should be expected, the result may indicate whether the request has been sent to the UAV instead.

Example request

{
    "type": "UAV-SLEEP",
    "ids": ["1", "17", "31", "spam"]
}

Example response

{
    "type": "UAV-SLEEP",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV does not support sleep mode.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-TAKEOFF — Initiate unsupervised take-off

A client sends this request to the server to initiate unsupervised take-off on one or more UAVs. The server responds with two lists: the first list contains the IDs of the UAVs where an unsupervised take-off was started (in the sense that the UAV has been notified that they should take off now), and the second list contains the IDs where such an attempt was not started. (Possible reasons for failure could be: invalid UAV ID, UAV does not support unsupervised take-off and so on). The server MAY decide to include more detailed information about failed attempts in the response.

Clients interested in whether the take-off attempts have succeeded should keep an eye on UAV-INF messages and watch the status flags of the UAVs.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, the result will indicate whether the request has been sent to the UAV.

Example request

{
    "type": "UAV-TAKEOFF",
    "ids": ["1", "17", "31", "spam"]
}

Example response

{
    "type": "UAV-TAKEOFF",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV is a beacon.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-TEST - Test a component of one or more UAVs

A client sends this request to the server to ask one or more UAVs to perform a self-test on one of its components.

The message specifies the name of the component to test and an additional parameter object. The interpretation of the parameter object depends on the component itself. Right now the protocol supports motor and led as the component names, but more component types may be added in the future. As the component names are merely strings, the protocol can easily be extended in the future with additional component types. UAVs that do not know or do not support testing a specific component will return failures for the unsupported components.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

component

yes

string

The name of the UAV component to test

parameters

no

object

Additional parameters of the test

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the self-test was performed successfully on the UAV. The semantics of a successful response may vary from component to component; for instance, the self-test of a LED light requires a human operator to observe whether the LED light works correctly, so in this case the response will indicate success if the test has started. Similarly, a motor test might be handled by a particular UAV in a way that a human operator has to observe the motors to check whether they are spinning in the right direction.

Example request

{
    "type": "UAV-TEST",
    "ids": ["1", "17", "31", "spam"],
    "component": "motor",
    "parameters": {}
}

Example response

{
    "type": "UAV-TEST",
    "result": {
        "1": true,
    },
    "error": {
        "31": "Component not supported.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-VER — Query version number of components

A client sends this request to the server to retrieve the version numbers of the essential components of one or more UAVs.

It is up to the UAVs to decide which components can report version numbers and how these version numbers should be presented to the user. A simple non-autonomous UAV may report only the version number of the hardware and the firmware, while a more complex autonomous UAV may report several version numbers for various software components.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

Response fields

The response is a multi-object async response; each UAV is mapped to another object mapping component names to version numbers.

Example request

{
    "type": "UAV-VER",
    "ids": ["1", "17", "spam"]
}

Example response

{
    "type": "UAV-VER",
    "result": {
        "1": {
            "firmware": "2.4.17",
            "hardware": "1.3"
        }
    },
    "error": {
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}

UAV-WAKEUP — Recall the UAV from a low-power state to normal operational state.

A client sends this request to the server to request one or more UAVs to switch back to normal operational state from a low-power state. This allows the operator to wake up a UAV that was suspended earlier with UAV-SLEEP.

The server responds with two lists: the first list contains the IDs of the UAVs where the command was acknowledged, and the second list contains the IDs where such an acknowledgment was not received. (Note that the UAV may have still started recovering to a normal operational state even if the acknowledgment was not received; this may happen if the UAV is constructed in a way that it does not respond to wakeup calls because the power management subsystem is too low-level to engage in communication).

Clients interested in whether the wakeup calls have succeeded should keep an eye on UAV-INF messages.

Request fields

Name Required? Type Description

ids

yes

list of strings

The list of UAV IDs to target with this message

transport

no

TransportOptions

Object describing any additional preferences about how the messages should be delivered

Response fields

The response is a multi-object async response; each UAV is mapped to a boolean denoting whether the operation was sent successfully to the UAV. If the UAV supports acknowledgments for this operation, the result will indicate whether the UAV has acknowledged the operation. If the UAV does not support acknowledgments for this type of operation, and the server knows that no acknowledgment should be expected, the result may indicate whether the request has been sent to the UAV instead.

Example request

{
    "type": "UAV-WAKEUP",
    "ids": ["1", "17", "31", "spam"]
}

Example response

{
    "type": "UAV-WAKEUP",
    "result": {
        "1": true,
    },
    "error": {
        "31": "UAV does not support sleep mode.",
        "spam": "No such UAV."
    },
    "receipt": {
        "17": "0badcafedeadbeef"
    }
}