Regen all docs. (#700)

* Stop recursing if discovery == {}

* Generate docs with 'make docs'.
diff --git a/docs/dyn/cloudiot_v1.projects.locations.registries.devices.html b/docs/dyn/cloudiot_v1.projects.locations.registries.devices.html
new file mode 100644
index 0000000..7218ff9
--- /dev/null
+++ b/docs/dyn/cloudiot_v1.projects.locations.registries.devices.html
@@ -0,0 +1,1176 @@
+<html><body>
+<style>
+
+body, h1, h2, h3, div, span, p, pre, a {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  font-weight: inherit;
+  font-style: inherit;
+  font-size: 100%;
+  font-family: inherit;
+  vertical-align: baseline;
+}
+
+body {
+  font-size: 13px;
+  padding: 1em;
+}
+
+h1 {
+  font-size: 26px;
+  margin-bottom: 1em;
+}
+
+h2 {
+  font-size: 24px;
+  margin-bottom: 1em;
+}
+
+h3 {
+  font-size: 20px;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+pre, code {
+  line-height: 1.5;
+  font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', 'Lucida Console', monospace;
+}
+
+pre {
+  margin-top: 0.5em;
+}
+
+h1, h2, h3, p {
+  font-family: Arial, sans serif;
+}
+
+h1, h2, h3 {
+  border-bottom: solid #CCC 1px;
+}
+
+.toc_element {
+  margin-top: 0.5em;
+}
+
+.firstline {
+  margin-left: 2 em;
+}
+
+.method  {
+  margin-top: 1em;
+  border: solid 1px #CCC;
+  padding: 1em;
+  background: #EEE;
+}
+
+.details {
+  font-weight: bold;
+  font-size: 14px;
+}
+
+</style>
+
+<h1><a href="cloudiot_v1.html">Cloud IoT API</a> . <a href="cloudiot_v1.projects.html">projects</a> . <a href="cloudiot_v1.projects.locations.html">locations</a> . <a href="cloudiot_v1.projects.locations.registries.html">registries</a> . <a href="cloudiot_v1.projects.locations.registries.devices.html">devices</a></h1>
+<h2>Instance Methods</h2>
+<p class="toc_element">
+  <code><a href="cloudiot_v1.projects.locations.registries.devices.configVersions.html">configVersions()</a></code>
+</p>
+<p class="firstline">Returns the configVersions Resource.</p>
+
+<p class="toc_element">
+  <code><a href="cloudiot_v1.projects.locations.registries.devices.states.html">states()</a></code>
+</p>
+<p class="firstline">Returns the states Resource.</p>
+
+<p class="toc_element">
+  <code><a href="#create">create(parent, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Creates a device in a device registry.</p>
+<p class="toc_element">
+  <code><a href="#delete">delete(name, x__xgafv=None)</a></code></p>
+<p class="firstline">Deletes a device.</p>
+<p class="toc_element">
+  <code><a href="#get">get(name, fieldMask=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Gets details about a device.</p>
+<p class="toc_element">
+  <code><a href="#list">list(parent, pageSize=None, fieldMask=None, deviceNumIds=None, x__xgafv=None, deviceIds=None, pageToken=None, gatewayListOptions_associationsGatewayId=None, gatewayListOptions_associationsDeviceId=None, gatewayListOptions_gatewayType=None)</a></code></p>
+<p class="firstline">List devices in a device registry.</p>
+<p class="toc_element">
+  <code><a href="#list_next">list_next(previous_request, previous_response)</a></code></p>
+<p class="firstline">Retrieves the next page of results.</p>
+<p class="toc_element">
+  <code><a href="#modifyCloudToDeviceConfig">modifyCloudToDeviceConfig(name, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Modifies the configuration for the device, which is eventually sent from</p>
+<p class="toc_element">
+  <code><a href="#patch">patch(name, body, updateMask=None, x__xgafv=None)</a></code></p>
+<p class="firstline">Updates a device.</p>
+<p class="toc_element">
+  <code><a href="#sendCommandToDevice">sendCommandToDevice(name, body, x__xgafv=None)</a></code></p>
+<p class="firstline">Sends a command to the specified device. In order for a device to be able</p>
+<h3>Method Details</h3>
+<div class="method">
+    <code class="details" id="create">create(parent, body, x__xgafv=None)</code>
+  <pre>Creates a device in a device registry.
+
+Args:
+  parent: string, The name of the device registry where this device should be created.
+For example,
+`projects/example-project/locations/us-central1/registries/my-registry`. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # The device resource.
+  "lastStateTime": "A String", # [Output only] The last time a state event was received. Timestamps are
+      # periodically collected and written to storage; they may be stale by a few
+      # minutes.
+  "gatewayConfig": { # Gateway-related configuration and state. # Gateway-related configuration and state.
+    "lastAccessedGatewayTime": "A String", # [Output only] The most recent time at which the device accessed the gateway
+        # specified in `last_accessed_gateway`.
+    "lastAccessedGatewayId": "A String", # [Output only] The ID of the gateway the device accessed most recently.
+    "gatewayAuthMethod": "A String", # Indicates how to authorize and/or authenticate devices to access the
+        # gateway.
+    "gatewayType": "A String", # Indicates whether the device is a gateway.
+  },
+  "lastConfigSendTime": "A String", # [Output only] The last time a cloud-to-device config version was sent to
+      # the device.
+  "lastEventTime": "A String", # [Output only] The last time a telemetry event was received. Timestamps are
+      # periodically collected and written to storage; they may be stale by a few
+      # minutes.
+  "lastErrorTime": "A String", # [Output only] The time the most recent error occurred, such as a failure to
+      # publish to Cloud Pub/Sub. This field is the timestamp of
+      # 'last_error_status'.
+  "numId": "A String", # [Output only] A server-defined unique numeric ID for the device. This is a
+      # more compact way to identify devices, and it is globally unique.
+  "lastHeartbeatTime": "A String", # [Output only] The last time an MQTT `PINGREQ` was received. This field
+      # applies only to devices connecting through MQTT. MQTT clients usually only
+      # send `PINGREQ` messages if the connection is idle, and no other messages
+      # have been sent. Timestamps are periodically collected and written to
+      # storage; they may be stale by a few minutes.
+  "lastConfigAckTime": "A String", # [Output only] The last time a cloud-to-device config version acknowledgment
+      # was received from the device. This field is only for configurations
+      # sent through MQTT.
+  "logLevel": "A String", # **Beta Feature**
+      # 
+      # The logging verbosity for device activity. If unspecified,
+      # DeviceRegistry.log_level will be used.
+  "state": { # The device state, as reported by the device. # [Output only] The state most recently received from the device. If no state
+      # has been reported, this field is not present.
+    "updateTime": "A String", # [Output only] The time at which this state version was updated in Cloud
+        # IoT Core.
+    "binaryData": "A String", # The device state data.
+  },
+  "lastErrorStatus": { # The `Status` type defines a logical error model that is suitable for # [Output only] The error message of the most recent error, such as a failure
+      # to publish to Cloud Pub/Sub. 'last_error_time' is the timestamp of this
+      # field. If no errors have occurred, this field has an empty message
+      # and the status code 0 == OK. Otherwise, this field is expected to have a
+      # status code other than OK.
+      # different programming environments, including REST APIs and RPC APIs. It is
+      # used by [gRPC](https://github.com/grpc). Each `Status` message contains
+      # three pieces of data: error code, error message, and error details.
+      #
+      # You can find out more about this error model and how to work with it in the
+      # [API Design Guide](https://cloud.google.com/apis/design/errors).
+    "message": "A String", # A developer-facing error message, which should be in English. Any
+        # user-facing error message should be localized and sent in the
+        # google.rpc.Status.details field, or localized by the client.
+    "code": 42, # The status code, which should be an enum value of google.rpc.Code.
+    "details": [ # A list of messages that carry the error details.  There is a common set of
+        # message types for APIs to use.
+      {
+        "a_key": "", # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+  },
+  "blocked": True or False, # If a device is blocked, connections or requests from this device will fail.
+      # Can be used to temporarily prevent the device from connecting if, for
+      # example, the sensor is generating bad data and needs maintenance.
+  "credentials": [ # The credentials used to authenticate this device. To allow credential
+      # rotation without interruption, multiple device credentials can be bound to
+      # this device. No more than 3 credentials can be bound to a single device at
+      # a time. When new credentials are added to a device, they are verified
+      # against the registry credentials. For details, see the description of the
+      # `DeviceRegistry.credentials` field.
+    { # A server-stored device credential used for authentication.
+      "publicKey": { # A public key format and data. # A public key used to verify the signature of JSON Web Tokens (JWTs).
+          # When adding a new device credential, either via device creation or via
+          # modifications, this public key credential may be required to be signed by
+          # one of the registry level certificates. More specifically, if the
+          # registry contains at least one certificate, any new device credential
+          # must be signed by one of the registry certificates. As a result,
+          # when the registry contains certificates, only X.509 certificates are
+          # accepted as device credentials. However, if the registry does
+          # not contain a certificate, self-signed certificates and public keys will
+          # be accepted. New device credentials must be different from every
+          # registry-level certificate.
+        "key": "A String", # The key data.
+        "format": "A String", # The format of the key.
+      },
+      "expirationTime": "A String", # [Optional] The time at which this credential becomes invalid. This
+          # credential will be ignored for new client authentication requests after
+          # this timestamp; however, it will not be automatically deleted.
+    },
+  ],
+  "metadata": { # The metadata key-value pairs assigned to the device. This metadata is not
+      # interpreted or indexed by Cloud IoT Core. It can be used to add contextual
+      # information for the device.
+      # 
+      # Keys must conform to the regular expression a-zA-Z+ and
+      # be less than 128 bytes in length.
+      # 
+      # Values are free-form strings. Each value must be less than or equal to 32
+      # KB in size.
+      # 
+      # The total size of all keys and values must be less than 256 KB, and the
+      # maximum number of key-value pairs is 500.
+    "a_key": "A String",
+  },
+  "config": { # The device configuration. Eventually delivered to devices. # The most recent device configuration, which is eventually sent from
+      # Cloud IoT Core to the device. If not present on creation, the
+      # configuration will be initialized with an empty payload and version value
+      # of `1`. To update this field after creation, use the
+      # `DeviceManager.ModifyCloudToDeviceConfig` method.
+    "version": "A String", # [Output only] The version of this update. The version number is assigned by
+        # the server, and is always greater than 0 after device creation. The
+        # version must be 0 on the `CreateDevice` request if a `config` is
+        # specified; the response of `CreateDevice` will always have a value of 1.
+    "cloudUpdateTime": "A String", # [Output only] The time at which this configuration version was updated in
+        # Cloud IoT Core. This timestamp is set by the server.
+    "binaryData": "A String", # The device configuration data.
+    "deviceAckTime": "A String", # [Output only] The time at which Cloud IoT Core received the
+        # acknowledgment from the device, indicating that the device has received
+        # this configuration version. If this field is not present, the device has
+        # not yet acknowledged that it received this version. Note that when
+        # the config was sent to the device, many config versions may have been
+        # available in Cloud IoT Core while the device was disconnected, and on
+        # connection, only the latest version is sent to the device. Some
+        # versions may never be sent to the device, and therefore are never
+        # acknowledged. This timestamp is set by Cloud IoT Core.
+  },
+  "id": "A String", # The user-defined device identifier. The device ID must be unique
+      # within a device registry.
+  "name": "A String", # The resource path name. For example,
+      # `projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+      # `projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+      # When `name` is populated as a response from the service, it always ends
+      # in the device numeric ID.
+}
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The device resource.
+    "lastStateTime": "A String", # [Output only] The last time a state event was received. Timestamps are
+        # periodically collected and written to storage; they may be stale by a few
+        # minutes.
+    "gatewayConfig": { # Gateway-related configuration and state. # Gateway-related configuration and state.
+      "lastAccessedGatewayTime": "A String", # [Output only] The most recent time at which the device accessed the gateway
+          # specified in `last_accessed_gateway`.
+      "lastAccessedGatewayId": "A String", # [Output only] The ID of the gateway the device accessed most recently.
+      "gatewayAuthMethod": "A String", # Indicates how to authorize and/or authenticate devices to access the
+          # gateway.
+      "gatewayType": "A String", # Indicates whether the device is a gateway.
+    },
+    "lastConfigSendTime": "A String", # [Output only] The last time a cloud-to-device config version was sent to
+        # the device.
+    "lastEventTime": "A String", # [Output only] The last time a telemetry event was received. Timestamps are
+        # periodically collected and written to storage; they may be stale by a few
+        # minutes.
+    "lastErrorTime": "A String", # [Output only] The time the most recent error occurred, such as a failure to
+        # publish to Cloud Pub/Sub. This field is the timestamp of
+        # 'last_error_status'.
+    "numId": "A String", # [Output only] A server-defined unique numeric ID for the device. This is a
+        # more compact way to identify devices, and it is globally unique.
+    "lastHeartbeatTime": "A String", # [Output only] The last time an MQTT `PINGREQ` was received. This field
+        # applies only to devices connecting through MQTT. MQTT clients usually only
+        # send `PINGREQ` messages if the connection is idle, and no other messages
+        # have been sent. Timestamps are periodically collected and written to
+        # storage; they may be stale by a few minutes.
+    "lastConfigAckTime": "A String", # [Output only] The last time a cloud-to-device config version acknowledgment
+        # was received from the device. This field is only for configurations
+        # sent through MQTT.
+    "logLevel": "A String", # **Beta Feature**
+        #
+        # The logging verbosity for device activity. If unspecified,
+        # DeviceRegistry.log_level will be used.
+    "state": { # The device state, as reported by the device. # [Output only] The state most recently received from the device. If no state
+        # has been reported, this field is not present.
+      "updateTime": "A String", # [Output only] The time at which this state version was updated in Cloud
+          # IoT Core.
+      "binaryData": "A String", # The device state data.
+    },
+    "lastErrorStatus": { # The `Status` type defines a logical error model that is suitable for # [Output only] The error message of the most recent error, such as a failure
+        # to publish to Cloud Pub/Sub. 'last_error_time' is the timestamp of this
+        # field. If no errors have occurred, this field has an empty message
+        # and the status code 0 == OK. Otherwise, this field is expected to have a
+        # status code other than OK.
+        # different programming environments, including REST APIs and RPC APIs. It is
+        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
+        # three pieces of data: error code, error message, and error details.
+        #
+        # You can find out more about this error model and how to work with it in the
+        # [API Design Guide](https://cloud.google.com/apis/design/errors).
+      "message": "A String", # A developer-facing error message, which should be in English. Any
+          # user-facing error message should be localized and sent in the
+          # google.rpc.Status.details field, or localized by the client.
+      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
+      "details": [ # A list of messages that carry the error details.  There is a common set of
+          # message types for APIs to use.
+        {
+          "a_key": "", # Properties of the object. Contains field @type with type URL.
+        },
+      ],
+    },
+    "blocked": True or False, # If a device is blocked, connections or requests from this device will fail.
+        # Can be used to temporarily prevent the device from connecting if, for
+        # example, the sensor is generating bad data and needs maintenance.
+    "credentials": [ # The credentials used to authenticate this device. To allow credential
+        # rotation without interruption, multiple device credentials can be bound to
+        # this device. No more than 3 credentials can be bound to a single device at
+        # a time. When new credentials are added to a device, they are verified
+        # against the registry credentials. For details, see the description of the
+        # `DeviceRegistry.credentials` field.
+      { # A server-stored device credential used for authentication.
+        "publicKey": { # A public key format and data. # A public key used to verify the signature of JSON Web Tokens (JWTs).
+            # When adding a new device credential, either via device creation or via
+            # modifications, this public key credential may be required to be signed by
+            # one of the registry level certificates. More specifically, if the
+            # registry contains at least one certificate, any new device credential
+            # must be signed by one of the registry certificates. As a result,
+            # when the registry contains certificates, only X.509 certificates are
+            # accepted as device credentials. However, if the registry does
+            # not contain a certificate, self-signed certificates and public keys will
+            # be accepted. New device credentials must be different from every
+            # registry-level certificate.
+          "key": "A String", # The key data.
+          "format": "A String", # The format of the key.
+        },
+        "expirationTime": "A String", # [Optional] The time at which this credential becomes invalid. This
+            # credential will be ignored for new client authentication requests after
+            # this timestamp; however, it will not be automatically deleted.
+      },
+    ],
+    "metadata": { # The metadata key-value pairs assigned to the device. This metadata is not
+        # interpreted or indexed by Cloud IoT Core. It can be used to add contextual
+        # information for the device.
+        #
+        # Keys must conform to the regular expression a-zA-Z+ and
+        # be less than 128 bytes in length.
+        #
+        # Values are free-form strings. Each value must be less than or equal to 32
+        # KB in size.
+        #
+        # The total size of all keys and values must be less than 256 KB, and the
+        # maximum number of key-value pairs is 500.
+      "a_key": "A String",
+    },
+    "config": { # The device configuration. Eventually delivered to devices. # The most recent device configuration, which is eventually sent from
+        # Cloud IoT Core to the device. If not present on creation, the
+        # configuration will be initialized with an empty payload and version value
+        # of `1`. To update this field after creation, use the
+        # `DeviceManager.ModifyCloudToDeviceConfig` method.
+      "version": "A String", # [Output only] The version of this update. The version number is assigned by
+          # the server, and is always greater than 0 after device creation. The
+          # version must be 0 on the `CreateDevice` request if a `config` is
+          # specified; the response of `CreateDevice` will always have a value of 1.
+      "cloudUpdateTime": "A String", # [Output only] The time at which this configuration version was updated in
+          # Cloud IoT Core. This timestamp is set by the server.
+      "binaryData": "A String", # The device configuration data.
+      "deviceAckTime": "A String", # [Output only] The time at which Cloud IoT Core received the
+          # acknowledgment from the device, indicating that the device has received
+          # this configuration version. If this field is not present, the device has
+          # not yet acknowledged that it received this version. Note that when
+          # the config was sent to the device, many config versions may have been
+          # available in Cloud IoT Core while the device was disconnected, and on
+          # connection, only the latest version is sent to the device. Some
+          # versions may never be sent to the device, and therefore are never
+          # acknowledged. This timestamp is set by Cloud IoT Core.
+    },
+    "id": "A String", # The user-defined device identifier. The device ID must be unique
+        # within a device registry.
+    "name": "A String", # The resource path name. For example,
+        # `projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+        # `projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+        # When `name` is populated as a response from the service, it always ends
+        # in the device numeric ID.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="delete">delete(name, x__xgafv=None)</code>
+  <pre>Deletes a device.
+
+Args:
+  name: string, The name of the device. For example,
+`projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+`projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`. (required)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # A generic empty message that you can re-use to avoid defining duplicated
+      # empty messages in your APIs. A typical example is to use it as the request
+      # or the response type of an API method. For instance:
+      #
+      #     service Foo {
+      #       rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty);
+      #     }
+      #
+      # The JSON representation for `Empty` is empty JSON object `{}`.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="get">get(name, fieldMask=None, x__xgafv=None)</code>
+  <pre>Gets details about a device.
+
+Args:
+  name: string, The name of the device. For example,
+`projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+`projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`. (required)
+  fieldMask: string, The fields of the `Device` resource to be returned in the response. If the
+field mask is unset or empty, all fields are returned.
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The device resource.
+    "lastStateTime": "A String", # [Output only] The last time a state event was received. Timestamps are
+        # periodically collected and written to storage; they may be stale by a few
+        # minutes.
+    "gatewayConfig": { # Gateway-related configuration and state. # Gateway-related configuration and state.
+      "lastAccessedGatewayTime": "A String", # [Output only] The most recent time at which the device accessed the gateway
+          # specified in `last_accessed_gateway`.
+      "lastAccessedGatewayId": "A String", # [Output only] The ID of the gateway the device accessed most recently.
+      "gatewayAuthMethod": "A String", # Indicates how to authorize and/or authenticate devices to access the
+          # gateway.
+      "gatewayType": "A String", # Indicates whether the device is a gateway.
+    },
+    "lastConfigSendTime": "A String", # [Output only] The last time a cloud-to-device config version was sent to
+        # the device.
+    "lastEventTime": "A String", # [Output only] The last time a telemetry event was received. Timestamps are
+        # periodically collected and written to storage; they may be stale by a few
+        # minutes.
+    "lastErrorTime": "A String", # [Output only] The time the most recent error occurred, such as a failure to
+        # publish to Cloud Pub/Sub. This field is the timestamp of
+        # 'last_error_status'.
+    "numId": "A String", # [Output only] A server-defined unique numeric ID for the device. This is a
+        # more compact way to identify devices, and it is globally unique.
+    "lastHeartbeatTime": "A String", # [Output only] The last time an MQTT `PINGREQ` was received. This field
+        # applies only to devices connecting through MQTT. MQTT clients usually only
+        # send `PINGREQ` messages if the connection is idle, and no other messages
+        # have been sent. Timestamps are periodically collected and written to
+        # storage; they may be stale by a few minutes.
+    "lastConfigAckTime": "A String", # [Output only] The last time a cloud-to-device config version acknowledgment
+        # was received from the device. This field is only for configurations
+        # sent through MQTT.
+    "logLevel": "A String", # **Beta Feature**
+        #
+        # The logging verbosity for device activity. If unspecified,
+        # DeviceRegistry.log_level will be used.
+    "state": { # The device state, as reported by the device. # [Output only] The state most recently received from the device. If no state
+        # has been reported, this field is not present.
+      "updateTime": "A String", # [Output only] The time at which this state version was updated in Cloud
+          # IoT Core.
+      "binaryData": "A String", # The device state data.
+    },
+    "lastErrorStatus": { # The `Status` type defines a logical error model that is suitable for # [Output only] The error message of the most recent error, such as a failure
+        # to publish to Cloud Pub/Sub. 'last_error_time' is the timestamp of this
+        # field. If no errors have occurred, this field has an empty message
+        # and the status code 0 == OK. Otherwise, this field is expected to have a
+        # status code other than OK.
+        # different programming environments, including REST APIs and RPC APIs. It is
+        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
+        # three pieces of data: error code, error message, and error details.
+        #
+        # You can find out more about this error model and how to work with it in the
+        # [API Design Guide](https://cloud.google.com/apis/design/errors).
+      "message": "A String", # A developer-facing error message, which should be in English. Any
+          # user-facing error message should be localized and sent in the
+          # google.rpc.Status.details field, or localized by the client.
+      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
+      "details": [ # A list of messages that carry the error details.  There is a common set of
+          # message types for APIs to use.
+        {
+          "a_key": "", # Properties of the object. Contains field @type with type URL.
+        },
+      ],
+    },
+    "blocked": True or False, # If a device is blocked, connections or requests from this device will fail.
+        # Can be used to temporarily prevent the device from connecting if, for
+        # example, the sensor is generating bad data and needs maintenance.
+    "credentials": [ # The credentials used to authenticate this device. To allow credential
+        # rotation without interruption, multiple device credentials can be bound to
+        # this device. No more than 3 credentials can be bound to a single device at
+        # a time. When new credentials are added to a device, they are verified
+        # against the registry credentials. For details, see the description of the
+        # `DeviceRegistry.credentials` field.
+      { # A server-stored device credential used for authentication.
+        "publicKey": { # A public key format and data. # A public key used to verify the signature of JSON Web Tokens (JWTs).
+            # When adding a new device credential, either via device creation or via
+            # modifications, this public key credential may be required to be signed by
+            # one of the registry level certificates. More specifically, if the
+            # registry contains at least one certificate, any new device credential
+            # must be signed by one of the registry certificates. As a result,
+            # when the registry contains certificates, only X.509 certificates are
+            # accepted as device credentials. However, if the registry does
+            # not contain a certificate, self-signed certificates and public keys will
+            # be accepted. New device credentials must be different from every
+            # registry-level certificate.
+          "key": "A String", # The key data.
+          "format": "A String", # The format of the key.
+        },
+        "expirationTime": "A String", # [Optional] The time at which this credential becomes invalid. This
+            # credential will be ignored for new client authentication requests after
+            # this timestamp; however, it will not be automatically deleted.
+      },
+    ],
+    "metadata": { # The metadata key-value pairs assigned to the device. This metadata is not
+        # interpreted or indexed by Cloud IoT Core. It can be used to add contextual
+        # information for the device.
+        #
+        # Keys must conform to the regular expression a-zA-Z+ and
+        # be less than 128 bytes in length.
+        #
+        # Values are free-form strings. Each value must be less than or equal to 32
+        # KB in size.
+        #
+        # The total size of all keys and values must be less than 256 KB, and the
+        # maximum number of key-value pairs is 500.
+      "a_key": "A String",
+    },
+    "config": { # The device configuration. Eventually delivered to devices. # The most recent device configuration, which is eventually sent from
+        # Cloud IoT Core to the device. If not present on creation, the
+        # configuration will be initialized with an empty payload and version value
+        # of `1`. To update this field after creation, use the
+        # `DeviceManager.ModifyCloudToDeviceConfig` method.
+      "version": "A String", # [Output only] The version of this update. The version number is assigned by
+          # the server, and is always greater than 0 after device creation. The
+          # version must be 0 on the `CreateDevice` request if a `config` is
+          # specified; the response of `CreateDevice` will always have a value of 1.
+      "cloudUpdateTime": "A String", # [Output only] The time at which this configuration version was updated in
+          # Cloud IoT Core. This timestamp is set by the server.
+      "binaryData": "A String", # The device configuration data.
+      "deviceAckTime": "A String", # [Output only] The time at which Cloud IoT Core received the
+          # acknowledgment from the device, indicating that the device has received
+          # this configuration version. If this field is not present, the device has
+          # not yet acknowledged that it received this version. Note that when
+          # the config was sent to the device, many config versions may have been
+          # available in Cloud IoT Core while the device was disconnected, and on
+          # connection, only the latest version is sent to the device. Some
+          # versions may never be sent to the device, and therefore are never
+          # acknowledged. This timestamp is set by Cloud IoT Core.
+    },
+    "id": "A String", # The user-defined device identifier. The device ID must be unique
+        # within a device registry.
+    "name": "A String", # The resource path name. For example,
+        # `projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+        # `projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+        # When `name` is populated as a response from the service, it always ends
+        # in the device numeric ID.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list">list(parent, pageSize=None, fieldMask=None, deviceNumIds=None, x__xgafv=None, deviceIds=None, pageToken=None, gatewayListOptions_associationsGatewayId=None, gatewayListOptions_associationsDeviceId=None, gatewayListOptions_gatewayType=None)</code>
+  <pre>List devices in a device registry.
+
+Args:
+  parent: string, The device registry path. Required. For example,
+`projects/my-project/locations/us-central1/registries/my-registry`. (required)
+  pageSize: integer, The maximum number of devices to return in the response. If this value
+is zero, the service will select a default size. A call may return fewer
+objects than requested. A non-empty `next_page_token` in the response
+indicates that more data is available.
+  fieldMask: string, The fields of the `Device` resource to be returned in the response. The
+fields `id` and `num_id` are always returned, along with any
+other fields specified.
+  deviceNumIds: string, A list of device numeric IDs. If empty, this field is ignored. Maximum
+IDs: 10,000. (repeated)
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+  deviceIds: string, A list of device string IDs. For example, `['device0', 'device12']`.
+If empty, this field is ignored. Maximum IDs: 10,000 (repeated)
+  pageToken: string, The value returned by the last `ListDevicesResponse`; indicates
+that this is a continuation of a prior `ListDevices` call and
+the system should return the next page of data.
+  gatewayListOptions_associationsGatewayId: string, If set, only devices associated with the specified gateway are returned.
+The gateway ID can be numeric (`num_id`) or the user-defined string
+(`id`). For example, if `123` is specified, only devices bound to the
+gateway with `num_id` 123 are returned.
+  gatewayListOptions_associationsDeviceId: string, If set, returns only the gateways with which the specified device is
+associated. The device ID can be numeric (`num_id`) or the user-defined
+string (`id`). For example, if `456` is specified, returns only the
+gateways to which the device with `num_id` 456 is bound.
+  gatewayListOptions_gatewayType: string, If `GATEWAY` is specified, only gateways are returned. If `NON_GATEWAY`
+is specified, only non-gateway devices are returned. If
+`GATEWAY_TYPE_UNSPECIFIED` is specified, all devices are returned.
+
+Returns:
+  An object of the form:
+
+    { # Response for `ListDevices`.
+    "nextPageToken": "A String", # If not empty, indicates that there may be more devices that match the
+        # request; this value should be passed in a new `ListDevicesRequest`.
+    "devices": [ # The devices that match the request.
+      { # The device resource.
+        "lastStateTime": "A String", # [Output only] The last time a state event was received. Timestamps are
+            # periodically collected and written to storage; they may be stale by a few
+            # minutes.
+        "gatewayConfig": { # Gateway-related configuration and state. # Gateway-related configuration and state.
+          "lastAccessedGatewayTime": "A String", # [Output only] The most recent time at which the device accessed the gateway
+              # specified in `last_accessed_gateway`.
+          "lastAccessedGatewayId": "A String", # [Output only] The ID of the gateway the device accessed most recently.
+          "gatewayAuthMethod": "A String", # Indicates how to authorize and/or authenticate devices to access the
+              # gateway.
+          "gatewayType": "A String", # Indicates whether the device is a gateway.
+        },
+        "lastConfigSendTime": "A String", # [Output only] The last time a cloud-to-device config version was sent to
+            # the device.
+        "lastEventTime": "A String", # [Output only] The last time a telemetry event was received. Timestamps are
+            # periodically collected and written to storage; they may be stale by a few
+            # minutes.
+        "lastErrorTime": "A String", # [Output only] The time the most recent error occurred, such as a failure to
+            # publish to Cloud Pub/Sub. This field is the timestamp of
+            # 'last_error_status'.
+        "numId": "A String", # [Output only] A server-defined unique numeric ID for the device. This is a
+            # more compact way to identify devices, and it is globally unique.
+        "lastHeartbeatTime": "A String", # [Output only] The last time an MQTT `PINGREQ` was received. This field
+            # applies only to devices connecting through MQTT. MQTT clients usually only
+            # send `PINGREQ` messages if the connection is idle, and no other messages
+            # have been sent. Timestamps are periodically collected and written to
+            # storage; they may be stale by a few minutes.
+        "lastConfigAckTime": "A String", # [Output only] The last time a cloud-to-device config version acknowledgment
+            # was received from the device. This field is only for configurations
+            # sent through MQTT.
+        "logLevel": "A String", # **Beta Feature**
+            #
+            # The logging verbosity for device activity. If unspecified,
+            # DeviceRegistry.log_level will be used.
+        "state": { # The device state, as reported by the device. # [Output only] The state most recently received from the device. If no state
+            # has been reported, this field is not present.
+          "updateTime": "A String", # [Output only] The time at which this state version was updated in Cloud
+              # IoT Core.
+          "binaryData": "A String", # The device state data.
+        },
+        "lastErrorStatus": { # The `Status` type defines a logical error model that is suitable for # [Output only] The error message of the most recent error, such as a failure
+            # to publish to Cloud Pub/Sub. 'last_error_time' is the timestamp of this
+            # field. If no errors have occurred, this field has an empty message
+            # and the status code 0 == OK. Otherwise, this field is expected to have a
+            # status code other than OK.
+            # different programming environments, including REST APIs and RPC APIs. It is
+            # used by [gRPC](https://github.com/grpc). Each `Status` message contains
+            # three pieces of data: error code, error message, and error details.
+            #
+            # You can find out more about this error model and how to work with it in the
+            # [API Design Guide](https://cloud.google.com/apis/design/errors).
+          "message": "A String", # A developer-facing error message, which should be in English. Any
+              # user-facing error message should be localized and sent in the
+              # google.rpc.Status.details field, or localized by the client.
+          "code": 42, # The status code, which should be an enum value of google.rpc.Code.
+          "details": [ # A list of messages that carry the error details.  There is a common set of
+              # message types for APIs to use.
+            {
+              "a_key": "", # Properties of the object. Contains field @type with type URL.
+            },
+          ],
+        },
+        "blocked": True or False, # If a device is blocked, connections or requests from this device will fail.
+            # Can be used to temporarily prevent the device from connecting if, for
+            # example, the sensor is generating bad data and needs maintenance.
+        "credentials": [ # The credentials used to authenticate this device. To allow credential
+            # rotation without interruption, multiple device credentials can be bound to
+            # this device. No more than 3 credentials can be bound to a single device at
+            # a time. When new credentials are added to a device, they are verified
+            # against the registry credentials. For details, see the description of the
+            # `DeviceRegistry.credentials` field.
+          { # A server-stored device credential used for authentication.
+            "publicKey": { # A public key format and data. # A public key used to verify the signature of JSON Web Tokens (JWTs).
+                # When adding a new device credential, either via device creation or via
+                # modifications, this public key credential may be required to be signed by
+                # one of the registry level certificates. More specifically, if the
+                # registry contains at least one certificate, any new device credential
+                # must be signed by one of the registry certificates. As a result,
+                # when the registry contains certificates, only X.509 certificates are
+                # accepted as device credentials. However, if the registry does
+                # not contain a certificate, self-signed certificates and public keys will
+                # be accepted. New device credentials must be different from every
+                # registry-level certificate.
+              "key": "A String", # The key data.
+              "format": "A String", # The format of the key.
+            },
+            "expirationTime": "A String", # [Optional] The time at which this credential becomes invalid. This
+                # credential will be ignored for new client authentication requests after
+                # this timestamp; however, it will not be automatically deleted.
+          },
+        ],
+        "metadata": { # The metadata key-value pairs assigned to the device. This metadata is not
+            # interpreted or indexed by Cloud IoT Core. It can be used to add contextual
+            # information for the device.
+            #
+            # Keys must conform to the regular expression a-zA-Z+ and
+            # be less than 128 bytes in length.
+            #
+            # Values are free-form strings. Each value must be less than or equal to 32
+            # KB in size.
+            #
+            # The total size of all keys and values must be less than 256 KB, and the
+            # maximum number of key-value pairs is 500.
+          "a_key": "A String",
+        },
+        "config": { # The device configuration. Eventually delivered to devices. # The most recent device configuration, which is eventually sent from
+            # Cloud IoT Core to the device. If not present on creation, the
+            # configuration will be initialized with an empty payload and version value
+            # of `1`. To update this field after creation, use the
+            # `DeviceManager.ModifyCloudToDeviceConfig` method.
+          "version": "A String", # [Output only] The version of this update. The version number is assigned by
+              # the server, and is always greater than 0 after device creation. The
+              # version must be 0 on the `CreateDevice` request if a `config` is
+              # specified; the response of `CreateDevice` will always have a value of 1.
+          "cloudUpdateTime": "A String", # [Output only] The time at which this configuration version was updated in
+              # Cloud IoT Core. This timestamp is set by the server.
+          "binaryData": "A String", # The device configuration data.
+          "deviceAckTime": "A String", # [Output only] The time at which Cloud IoT Core received the
+              # acknowledgment from the device, indicating that the device has received
+              # this configuration version. If this field is not present, the device has
+              # not yet acknowledged that it received this version. Note that when
+              # the config was sent to the device, many config versions may have been
+              # available in Cloud IoT Core while the device was disconnected, and on
+              # connection, only the latest version is sent to the device. Some
+              # versions may never be sent to the device, and therefore are never
+              # acknowledged. This timestamp is set by Cloud IoT Core.
+        },
+        "id": "A String", # The user-defined device identifier. The device ID must be unique
+            # within a device registry.
+        "name": "A String", # The resource path name. For example,
+            # `projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+            # `projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+            # When `name` is populated as a response from the service, it always ends
+            # in the device numeric ID.
+      },
+    ],
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="list_next">list_next(previous_request, previous_response)</code>
+  <pre>Retrieves the next page of results.
+
+Args:
+  previous_request: The request for the previous page. (required)
+  previous_response: The response from the request for the previous page. (required)
+
+Returns:
+  A request object that you can call 'execute()' on to request the next
+  page. Returns None if there are no more items in the collection.
+    </pre>
+</div>
+
+<div class="method">
+    <code class="details" id="modifyCloudToDeviceConfig">modifyCloudToDeviceConfig(name, body, x__xgafv=None)</code>
+  <pre>Modifies the configuration for the device, which is eventually sent from
+the Cloud IoT Core servers. Returns the modified configuration version and
+its metadata.
+
+Args:
+  name: string, The name of the device. For example,
+`projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+`projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # Request for `ModifyCloudToDeviceConfig`.
+    "versionToUpdate": "A String", # The version number to update. If this value is zero, it will not check the
+        # version number of the server and will always update the current version;
+        # otherwise, this update will fail if the version number found on the server
+        # does not match this version number. This is used to support multiple
+        # simultaneous updates without losing data.
+    "binaryData": "A String", # The configuration data for the device.
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The device configuration. Eventually delivered to devices.
+    "version": "A String", # [Output only] The version of this update. The version number is assigned by
+        # the server, and is always greater than 0 after device creation. The
+        # version must be 0 on the `CreateDevice` request if a `config` is
+        # specified; the response of `CreateDevice` will always have a value of 1.
+    "cloudUpdateTime": "A String", # [Output only] The time at which this configuration version was updated in
+        # Cloud IoT Core. This timestamp is set by the server.
+    "binaryData": "A String", # The device configuration data.
+    "deviceAckTime": "A String", # [Output only] The time at which Cloud IoT Core received the
+        # acknowledgment from the device, indicating that the device has received
+        # this configuration version. If this field is not present, the device has
+        # not yet acknowledged that it received this version. Note that when
+        # the config was sent to the device, many config versions may have been
+        # available in Cloud IoT Core while the device was disconnected, and on
+        # connection, only the latest version is sent to the device. Some
+        # versions may never be sent to the device, and therefore are never
+        # acknowledged. This timestamp is set by Cloud IoT Core.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="patch">patch(name, body, updateMask=None, x__xgafv=None)</code>
+  <pre>Updates a device.
+
+Args:
+  name: string, The resource path name. For example,
+`projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+`projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+When `name` is populated as a response from the service, it always ends
+in the device numeric ID. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # The device resource.
+  "lastStateTime": "A String", # [Output only] The last time a state event was received. Timestamps are
+      # periodically collected and written to storage; they may be stale by a few
+      # minutes.
+  "gatewayConfig": { # Gateway-related configuration and state. # Gateway-related configuration and state.
+    "lastAccessedGatewayTime": "A String", # [Output only] The most recent time at which the device accessed the gateway
+        # specified in `last_accessed_gateway`.
+    "lastAccessedGatewayId": "A String", # [Output only] The ID of the gateway the device accessed most recently.
+    "gatewayAuthMethod": "A String", # Indicates how to authorize and/or authenticate devices to access the
+        # gateway.
+    "gatewayType": "A String", # Indicates whether the device is a gateway.
+  },
+  "lastConfigSendTime": "A String", # [Output only] The last time a cloud-to-device config version was sent to
+      # the device.
+  "lastEventTime": "A String", # [Output only] The last time a telemetry event was received. Timestamps are
+      # periodically collected and written to storage; they may be stale by a few
+      # minutes.
+  "lastErrorTime": "A String", # [Output only] The time the most recent error occurred, such as a failure to
+      # publish to Cloud Pub/Sub. This field is the timestamp of
+      # 'last_error_status'.
+  "numId": "A String", # [Output only] A server-defined unique numeric ID for the device. This is a
+      # more compact way to identify devices, and it is globally unique.
+  "lastHeartbeatTime": "A String", # [Output only] The last time an MQTT `PINGREQ` was received. This field
+      # applies only to devices connecting through MQTT. MQTT clients usually only
+      # send `PINGREQ` messages if the connection is idle, and no other messages
+      # have been sent. Timestamps are periodically collected and written to
+      # storage; they may be stale by a few minutes.
+  "lastConfigAckTime": "A String", # [Output only] The last time a cloud-to-device config version acknowledgment
+      # was received from the device. This field is only for configurations
+      # sent through MQTT.
+  "logLevel": "A String", # **Beta Feature**
+      # 
+      # The logging verbosity for device activity. If unspecified,
+      # DeviceRegistry.log_level will be used.
+  "state": { # The device state, as reported by the device. # [Output only] The state most recently received from the device. If no state
+      # has been reported, this field is not present.
+    "updateTime": "A String", # [Output only] The time at which this state version was updated in Cloud
+        # IoT Core.
+    "binaryData": "A String", # The device state data.
+  },
+  "lastErrorStatus": { # The `Status` type defines a logical error model that is suitable for # [Output only] The error message of the most recent error, such as a failure
+      # to publish to Cloud Pub/Sub. 'last_error_time' is the timestamp of this
+      # field. If no errors have occurred, this field has an empty message
+      # and the status code 0 == OK. Otherwise, this field is expected to have a
+      # status code other than OK.
+      # different programming environments, including REST APIs and RPC APIs. It is
+      # used by [gRPC](https://github.com/grpc). Each `Status` message contains
+      # three pieces of data: error code, error message, and error details.
+      #
+      # You can find out more about this error model and how to work with it in the
+      # [API Design Guide](https://cloud.google.com/apis/design/errors).
+    "message": "A String", # A developer-facing error message, which should be in English. Any
+        # user-facing error message should be localized and sent in the
+        # google.rpc.Status.details field, or localized by the client.
+    "code": 42, # The status code, which should be an enum value of google.rpc.Code.
+    "details": [ # A list of messages that carry the error details.  There is a common set of
+        # message types for APIs to use.
+      {
+        "a_key": "", # Properties of the object. Contains field @type with type URL.
+      },
+    ],
+  },
+  "blocked": True or False, # If a device is blocked, connections or requests from this device will fail.
+      # Can be used to temporarily prevent the device from connecting if, for
+      # example, the sensor is generating bad data and needs maintenance.
+  "credentials": [ # The credentials used to authenticate this device. To allow credential
+      # rotation without interruption, multiple device credentials can be bound to
+      # this device. No more than 3 credentials can be bound to a single device at
+      # a time. When new credentials are added to a device, they are verified
+      # against the registry credentials. For details, see the description of the
+      # `DeviceRegistry.credentials` field.
+    { # A server-stored device credential used for authentication.
+      "publicKey": { # A public key format and data. # A public key used to verify the signature of JSON Web Tokens (JWTs).
+          # When adding a new device credential, either via device creation or via
+          # modifications, this public key credential may be required to be signed by
+          # one of the registry level certificates. More specifically, if the
+          # registry contains at least one certificate, any new device credential
+          # must be signed by one of the registry certificates. As a result,
+          # when the registry contains certificates, only X.509 certificates are
+          # accepted as device credentials. However, if the registry does
+          # not contain a certificate, self-signed certificates and public keys will
+          # be accepted. New device credentials must be different from every
+          # registry-level certificate.
+        "key": "A String", # The key data.
+        "format": "A String", # The format of the key.
+      },
+      "expirationTime": "A String", # [Optional] The time at which this credential becomes invalid. This
+          # credential will be ignored for new client authentication requests after
+          # this timestamp; however, it will not be automatically deleted.
+    },
+  ],
+  "metadata": { # The metadata key-value pairs assigned to the device. This metadata is not
+      # interpreted or indexed by Cloud IoT Core. It can be used to add contextual
+      # information for the device.
+      # 
+      # Keys must conform to the regular expression a-zA-Z+ and
+      # be less than 128 bytes in length.
+      # 
+      # Values are free-form strings. Each value must be less than or equal to 32
+      # KB in size.
+      # 
+      # The total size of all keys and values must be less than 256 KB, and the
+      # maximum number of key-value pairs is 500.
+    "a_key": "A String",
+  },
+  "config": { # The device configuration. Eventually delivered to devices. # The most recent device configuration, which is eventually sent from
+      # Cloud IoT Core to the device. If not present on creation, the
+      # configuration will be initialized with an empty payload and version value
+      # of `1`. To update this field after creation, use the
+      # `DeviceManager.ModifyCloudToDeviceConfig` method.
+    "version": "A String", # [Output only] The version of this update. The version number is assigned by
+        # the server, and is always greater than 0 after device creation. The
+        # version must be 0 on the `CreateDevice` request if a `config` is
+        # specified; the response of `CreateDevice` will always have a value of 1.
+    "cloudUpdateTime": "A String", # [Output only] The time at which this configuration version was updated in
+        # Cloud IoT Core. This timestamp is set by the server.
+    "binaryData": "A String", # The device configuration data.
+    "deviceAckTime": "A String", # [Output only] The time at which Cloud IoT Core received the
+        # acknowledgment from the device, indicating that the device has received
+        # this configuration version. If this field is not present, the device has
+        # not yet acknowledged that it received this version. Note that when
+        # the config was sent to the device, many config versions may have been
+        # available in Cloud IoT Core while the device was disconnected, and on
+        # connection, only the latest version is sent to the device. Some
+        # versions may never be sent to the device, and therefore are never
+        # acknowledged. This timestamp is set by Cloud IoT Core.
+  },
+  "id": "A String", # The user-defined device identifier. The device ID must be unique
+      # within a device registry.
+  "name": "A String", # The resource path name. For example,
+      # `projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+      # `projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+      # When `name` is populated as a response from the service, it always ends
+      # in the device numeric ID.
+}
+
+  updateMask: string, Only updates the `device` fields indicated by this mask.
+The field mask must not be empty, and it must not contain fields that
+are immutable or only set by the server.
+Mutable top-level fields: `credentials`, `blocked`, and `metadata`
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # The device resource.
+    "lastStateTime": "A String", # [Output only] The last time a state event was received. Timestamps are
+        # periodically collected and written to storage; they may be stale by a few
+        # minutes.
+    "gatewayConfig": { # Gateway-related configuration and state. # Gateway-related configuration and state.
+      "lastAccessedGatewayTime": "A String", # [Output only] The most recent time at which the device accessed the gateway
+          # specified in `last_accessed_gateway`.
+      "lastAccessedGatewayId": "A String", # [Output only] The ID of the gateway the device accessed most recently.
+      "gatewayAuthMethod": "A String", # Indicates how to authorize and/or authenticate devices to access the
+          # gateway.
+      "gatewayType": "A String", # Indicates whether the device is a gateway.
+    },
+    "lastConfigSendTime": "A String", # [Output only] The last time a cloud-to-device config version was sent to
+        # the device.
+    "lastEventTime": "A String", # [Output only] The last time a telemetry event was received. Timestamps are
+        # periodically collected and written to storage; they may be stale by a few
+        # minutes.
+    "lastErrorTime": "A String", # [Output only] The time the most recent error occurred, such as a failure to
+        # publish to Cloud Pub/Sub. This field is the timestamp of
+        # 'last_error_status'.
+    "numId": "A String", # [Output only] A server-defined unique numeric ID for the device. This is a
+        # more compact way to identify devices, and it is globally unique.
+    "lastHeartbeatTime": "A String", # [Output only] The last time an MQTT `PINGREQ` was received. This field
+        # applies only to devices connecting through MQTT. MQTT clients usually only
+        # send `PINGREQ` messages if the connection is idle, and no other messages
+        # have been sent. Timestamps are periodically collected and written to
+        # storage; they may be stale by a few minutes.
+    "lastConfigAckTime": "A String", # [Output only] The last time a cloud-to-device config version acknowledgment
+        # was received from the device. This field is only for configurations
+        # sent through MQTT.
+    "logLevel": "A String", # **Beta Feature**
+        #
+        # The logging verbosity for device activity. If unspecified,
+        # DeviceRegistry.log_level will be used.
+    "state": { # The device state, as reported by the device. # [Output only] The state most recently received from the device. If no state
+        # has been reported, this field is not present.
+      "updateTime": "A String", # [Output only] The time at which this state version was updated in Cloud
+          # IoT Core.
+      "binaryData": "A String", # The device state data.
+    },
+    "lastErrorStatus": { # The `Status` type defines a logical error model that is suitable for # [Output only] The error message of the most recent error, such as a failure
+        # to publish to Cloud Pub/Sub. 'last_error_time' is the timestamp of this
+        # field. If no errors have occurred, this field has an empty message
+        # and the status code 0 == OK. Otherwise, this field is expected to have a
+        # status code other than OK.
+        # different programming environments, including REST APIs and RPC APIs. It is
+        # used by [gRPC](https://github.com/grpc). Each `Status` message contains
+        # three pieces of data: error code, error message, and error details.
+        #
+        # You can find out more about this error model and how to work with it in the
+        # [API Design Guide](https://cloud.google.com/apis/design/errors).
+      "message": "A String", # A developer-facing error message, which should be in English. Any
+          # user-facing error message should be localized and sent in the
+          # google.rpc.Status.details field, or localized by the client.
+      "code": 42, # The status code, which should be an enum value of google.rpc.Code.
+      "details": [ # A list of messages that carry the error details.  There is a common set of
+          # message types for APIs to use.
+        {
+          "a_key": "", # Properties of the object. Contains field @type with type URL.
+        },
+      ],
+    },
+    "blocked": True or False, # If a device is blocked, connections or requests from this device will fail.
+        # Can be used to temporarily prevent the device from connecting if, for
+        # example, the sensor is generating bad data and needs maintenance.
+    "credentials": [ # The credentials used to authenticate this device. To allow credential
+        # rotation without interruption, multiple device credentials can be bound to
+        # this device. No more than 3 credentials can be bound to a single device at
+        # a time. When new credentials are added to a device, they are verified
+        # against the registry credentials. For details, see the description of the
+        # `DeviceRegistry.credentials` field.
+      { # A server-stored device credential used for authentication.
+        "publicKey": { # A public key format and data. # A public key used to verify the signature of JSON Web Tokens (JWTs).
+            # When adding a new device credential, either via device creation or via
+            # modifications, this public key credential may be required to be signed by
+            # one of the registry level certificates. More specifically, if the
+            # registry contains at least one certificate, any new device credential
+            # must be signed by one of the registry certificates. As a result,
+            # when the registry contains certificates, only X.509 certificates are
+            # accepted as device credentials. However, if the registry does
+            # not contain a certificate, self-signed certificates and public keys will
+            # be accepted. New device credentials must be different from every
+            # registry-level certificate.
+          "key": "A String", # The key data.
+          "format": "A String", # The format of the key.
+        },
+        "expirationTime": "A String", # [Optional] The time at which this credential becomes invalid. This
+            # credential will be ignored for new client authentication requests after
+            # this timestamp; however, it will not be automatically deleted.
+      },
+    ],
+    "metadata": { # The metadata key-value pairs assigned to the device. This metadata is not
+        # interpreted or indexed by Cloud IoT Core. It can be used to add contextual
+        # information for the device.
+        #
+        # Keys must conform to the regular expression a-zA-Z+ and
+        # be less than 128 bytes in length.
+        #
+        # Values are free-form strings. Each value must be less than or equal to 32
+        # KB in size.
+        #
+        # The total size of all keys and values must be less than 256 KB, and the
+        # maximum number of key-value pairs is 500.
+      "a_key": "A String",
+    },
+    "config": { # The device configuration. Eventually delivered to devices. # The most recent device configuration, which is eventually sent from
+        # Cloud IoT Core to the device. If not present on creation, the
+        # configuration will be initialized with an empty payload and version value
+        # of `1`. To update this field after creation, use the
+        # `DeviceManager.ModifyCloudToDeviceConfig` method.
+      "version": "A String", # [Output only] The version of this update. The version number is assigned by
+          # the server, and is always greater than 0 after device creation. The
+          # version must be 0 on the `CreateDevice` request if a `config` is
+          # specified; the response of `CreateDevice` will always have a value of 1.
+      "cloudUpdateTime": "A String", # [Output only] The time at which this configuration version was updated in
+          # Cloud IoT Core. This timestamp is set by the server.
+      "binaryData": "A String", # The device configuration data.
+      "deviceAckTime": "A String", # [Output only] The time at which Cloud IoT Core received the
+          # acknowledgment from the device, indicating that the device has received
+          # this configuration version. If this field is not present, the device has
+          # not yet acknowledged that it received this version. Note that when
+          # the config was sent to the device, many config versions may have been
+          # available in Cloud IoT Core while the device was disconnected, and on
+          # connection, only the latest version is sent to the device. Some
+          # versions may never be sent to the device, and therefore are never
+          # acknowledged. This timestamp is set by Cloud IoT Core.
+    },
+    "id": "A String", # The user-defined device identifier. The device ID must be unique
+        # within a device registry.
+    "name": "A String", # The resource path name. For example,
+        # `projects/p1/locations/us-central1/registries/registry0/devices/dev0` or
+        # `projects/p1/locations/us-central1/registries/registry0/devices/{num_id}`.
+        # When `name` is populated as a response from the service, it always ends
+        # in the device numeric ID.
+  }</pre>
+</div>
+
+<div class="method">
+    <code class="details" id="sendCommandToDevice">sendCommandToDevice(name, body, x__xgafv=None)</code>
+  <pre>Sends a command to the specified device. In order for a device to be able
+to receive commands, it must:
+1) be connected to Cloud IoT Core using the MQTT protocol, and
+2) be subscribed to the group of MQTT topics specified by
+   /devices/{device-id}/commands/#. This subscription will receive commands
+   at the top-level topic /devices/{device-id}/commands as well as commands
+   for subfolders, like /devices/{device-id}/commands/subfolder.
+   Note that subscribing to specific subfolders is not supported.
+If the command could not be delivered to the device, this method will
+return an error; in particular, if the device is not subscribed, this
+method will return FAILED_PRECONDITION. Otherwise, this method will
+return OK. If the subscription is QoS 1, at least once delivery will be
+guaranteed; for QoS 0, no acknowledgment will be expected from the device.
+
+Args:
+  name: string, The name of the device. For example,
+`projects/p0/locations/us-central1/registries/registry0/devices/device0` or
+`projects/p0/locations/us-central1/registries/registry0/devices/{num_id}`. (required)
+  body: object, The request body. (required)
+    The object takes the form of:
+
+{ # Request for `SendCommandToDevice`.
+    "binaryData": "A String", # The command data to send to the device.
+    "subfolder": "A String", # Optional subfolder for the command. If empty, the command will be delivered
+        # to the /devices/{device-id}/commands topic, otherwise it will be delivered
+        # to the /devices/{device-id}/commands/{subfolder} topic. Multi-level
+        # subfolders are allowed. This field must not have more than 256 characters,
+        # and must not contain any MQTT wildcards ("+" or "#") or null characters.
+  }
+
+  x__xgafv: string, V1 error format.
+    Allowed values
+      1 - v1 error format
+      2 - v2 error format
+
+Returns:
+  An object of the form:
+
+    { # Response for `SendCommandToDevice`.
+  }</pre>
+</div>
+
+</body></html>
\ No newline at end of file