

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Retener el estado del dispositivo mientras el dispositivo está fuera de línea con Device Shadows
<a name="iot-shadows-tutorial"></a>

Estos tutoriales muestran cómo utilizar el servicio AWS IoT Device Shadow para almacenar y actualizar la información de estado de un dispositivo. El documento Shadow, que es un documento JSON, muestra el cambio en el estado del dispositivo en función de los mensajes publicados por un dispositivo, una aplicación local o un servicio. En este tutorial, el documento de sombra muestra el cambio en el color de una bombilla. Estos tutoriales también muestran cómo la sombra almacena esta información incluso cuando el dispositivo está desconectado de Internet y le devuelve la información de estado más reciente cuando vuelve a conectarse y solicita esta información.

Le recomendamos que pruebe estos tutoriales en el orden en que se muestran aquí, empezando por los recursos AWS IoT que necesita para crearlos y la configuración de hardware necesaria, lo que también le ayudará a aprender los conceptos de forma gradual. Estos tutoriales muestran cómo configurar y conectar un dispositivo Raspberry Pi para usarlo con él AWS IoT. Si no dispone del hardware necesario, puede seguir estos tutoriales adaptándolos al dispositivo que prefiera o [creando un dispositivo virtual con Amazon EC2](creating-a-virtual-thing.md).

**Información general del escenario del tutorial**  
El escenario de estos tutoriales es una aplicación o un servicio local que cambia el color de una bombilla y publica sus datos en temas ocultos reservados. Estos tutoriales son similares a la funcionalidad Device Shadow descrita en el [tutorial interactivo de introducción](interactive-demo.md) y se implementan en un dispositivo Raspberry Pi. Los tutoriales de esta sección se centran en una única sombra clásica y, al mismo tiempo, muestran cómo se pueden acomodar sombras con nombres o varios dispositivos.

Los siguientes tutoriales le ayudarán a aprender a utilizar el servicio AWS IoT Device Shadow.
+ 

**[Tutorial: Cómo preparar la Raspberry Pi para ejecutar la aplicación shadow](create-resources-shadow.md)**  
Este tutorial muestra cómo configurar un dispositivo Raspberry Pi para conectarlo AWS IoT. También creará un documento de AWS IoT política y un recurso específico, descargará los certificados y, a continuación, adjuntará la política a ese recurso. Para completar este tutorial se necesitan aproximadamente 30 minutos.
+ 

**[Tutorial: Instalación del SDK del dispositivo y ejecución de la aplicación de ejemplo para Device Shadows](lightbulb-shadow-application.md)**  
En este tutorial se muestra cómo instalar las herramientas, el software y el SDK de AWS IoT dispositivos necesarios para Python y, a continuación, ejecutar la aplicación oculta de ejemplo. Este tutorial se basa en los conceptos presentados en [Conexión de una Raspberry Pi u otro dispositivo](connecting-to-existing-device.md) y tarda 20 minutos en completarse.
+ 

**[Tutorial: Interactuar con Device Shadow mediante la aplicación de ejemplo y el cliente de pruebas MQTT](interact-lights-device-shadows.md)**  
En este tutorial se muestra cómo utilizar la aplicación y la **AWS IoT consola** de `shadow.py` ejemplo para observar la interacción entre AWS IoT Device Shadows y los cambios de estado de la bombilla. El tutorial también muestra cómo enviar mensajes MQTT a los temas reservados de Device Shadow. Para completar este tutorial se necesitan aproximadamente 45 minutos.

**AWS IoT Descripción general de Device Shadow**  
Un Device Shadow es una representación virtual y persistente de un dispositivo que se administra [mediante un recurso](iot-thing-management.md) creado en el AWS IoT registro. El documento Shadow es un JSON o un documento de JavaScript notación que se utiliza para almacenar y recuperar la información del estado actual de un dispositivo. Puede usar la sombra para obtener y establecer el estado de un dispositivo mediante temas de MQTT o HTTP REST APIs, independientemente de si el dispositivo está conectado a Internet.

Un documento Shadow contiene una propiedad `state` que describe estos aspectos del estado del dispositivo.
+ `desired`: Las aplicaciones especifican los estados deseados de las propiedades del dispositivo actualizando el objeto `desired`.
+ `reported`: Los dispositivos notifican su estado actual en el objeto `reported`.
+ `delta`: AWS IoT informa de las diferencias entre el estado deseado y el estado reportado en el `delta` objeto.

He aquí un ejemplo de documento de estado en Shadow.

```
{
  "state": {
    "desired": {
      "color": "green"
      },
    "reported": {
      "color": "blue"
      },
    "delta": {
      "color": "green"
      }
   }
}
```

Para actualizar el documento Shadow de un dispositivo, puede utilizar los [temas reservados de MQTT](reserved-topics.md#reserved-topics-shadow), el [Device Shadow REST APIs](device-shadow-rest-api.md) que admite las `GET` operaciones con HTTP y `DELETE` las operaciones con HTTP y la [AWS IoT CLI](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iot-data/index.html). `UPDATE`

En el ejemplo anterior, supongamos que desea cambiar el color `desired` a `yellow`. Para ello, envía una solicitud a la API [UpdateThingShadow](device-shadow-rest-api.md#API_UpdateThingShadow) o publica un mensaje en el tema [Actualizar](device-shadow-mqtt.md#update-pub-sub-topic), `$aws/things/THING_NAME/shadow/update`.

```
{
  "state": {
    "desired": {
      "color": yellow
    }
  }
}
```

Las actualizaciones afectan únicamente a los campos especificados en la solicitud. Tras actualizar correctamente Device Shadow, AWS IoT publica el nuevo `desired` estado del `delta` tema,`$aws/things/THING_NAME/shadow/delta`. El documento Shadow en este caso tiene este aspecto:

```
{
  "state": {
    "desired": {
      "color": yellow
    },
    "reported": {
      "color": green
    },
    "delta": {
      "color": yellow
      }
  }
}
```

A continuación, se informa del nuevo estado a AWS IoT Device Shadow mediante el `Update` tema `$aws/things/THING_NAME/shadow/update` con el siguiente mensaje JSON: 

```
{
  "state": {
    "reported": {
      "color": yellow
    }
  }
}
```

Si desea obtener la información sobre el estado actual, envíe una solicitud a la API [GetThingShadow](device-shadow-rest-api.md#API_GetThingShadow) o publique un mensaje MQTT en el tema [Obtener](device-shadow-mqtt.md#get-pub-sub-topic), `$aws/things/THING_NAME/shadow/get`.

Para obtener más información sobre el uso del servicio Device Shadow, consulte [AWS IoT Servicio Device Shadow](iot-device-shadows.md).

Para obtener más información sobre el uso de Device Shadows en dispositivos, aplicaciones y servicios, consulte [Uso de sombras en dispositivos](device-shadow-comms-device.md) y [Uso de sombras en aplicaciones y servicios](device-shadow-comms-app.md).

Para obtener información sobre cómo interactuar con AWS IoT las sombras, consulte[Interacción con sombras](device-shadow-data-flow.md).

Para obtener información sobre los temas reservados de MQTT y HTTP REST APIs, consulte [Temas MQTT de sombra de dispositivo](device-shadow-mqtt.md) y[API REST de sombra de dispositivo](device-shadow-rest-api.md).

# Tutorial: Cómo preparar la Raspberry Pi para ejecutar la aplicación shadow
<a name="create-resources-shadow"></a>

Este tutorial muestra cómo instalar y configurar un dispositivo Raspberry Pi y cómo crear los AWS IoT recursos que un dispositivo necesita para conectarse e intercambiar mensajes MQTT.

**nota**  
Si tiene previsto [Crear un dispositivo virtual con Amazon EC2](creating-a-virtual-thing.md), puede saltarse esta página y continuar en [Configuración del dispositivo](configure-device.md). Creará estos recursos cuando cree su objeto virtual. Si desea utilizar un dispositivo diferente en lugar de la Raspberry Pi, puede intentar seguir estos tutoriales adaptándolos a un dispositivo de su elección.

**En este tutorial, aprenderá a:**
+ Configura un dispositivo Raspberry Pi y configúralo para usarlo con AWS IoTél.
+ Cree un documento AWS IoT de política que autorice a su dispositivo a interactuar con AWS IoT los servicios.
+ Cree un recurso específico en AWS IoT los certificados de dispositivo X.509 y, a continuación, adjunte el documento de política.

  Se trata de la representación virtual de su dispositivo en el registro AWS IoT . El certificado autentica el dispositivo ante AWS IoT Core y el documento de política autoriza al dispositivo a interactuar con él. AWS IoT

**Cómo ejecutar este tutorial**  
Para ejecutar la aplicación de ejemplo `shadow.py` para Device Shadows, necesitará un dispositivo Raspberry Pi que se conecte a AWS IoT. Le recomendamos que siga este tutorial en el orden en que se presenta aquí, comenzando con la configuración de la Raspberry Pi y sus accesorios, y luego la creación de una política y la vinculación de la política a un recurso cosa que usted cree. A continuación, puede seguir este tutorial utilizando la interfaz gráfica de usuario (GUI) compatible con la Raspberry Pi para abrir la AWS IoT consola en el navegador web del dispositivo, lo que también facilita la descarga de los certificados directamente a su Raspberry Pi para conectarse a ella. AWS IoT

**Antes de empezar este tutorial, asegúrese de que tiene:**
+ Un Cuenta de AWS. Si no la tiene, complete los pasos que se describen en [Configurar Cuenta de AWS](setting-up.md) antes de continuar. Necesitarás una consola Cuenta de AWS y una AWS IoT consola para completar este tutorial. 
+ La Raspberry Pi y los accesorios necesarios. Necesitará lo siguiente:
  + Una [Raspberry Pi 3 Modelo B](https://www.raspberrypi.com/products/) o un modelo más reciente. Este tutorial puede funcionar en versiones anteriores de la Raspberry Pi, pero no lo hemos probado.
  + [Sistema operativo Raspberry Pi (32 bits)](https://www.raspberrypi.com/software/operating-systems/) o posterior. Recomendamos utilizar la última versión del sistema operativo Raspberry Pi. Este tutorial puede funcionar en versiones anteriores del sistema operativo, pero no lo hemos probado.
  + Una conexión Ethernet o wifi.
  + Teclado, ratón, monitor, cables y fuentes de alimentación.

Para completar este tutorial se necesitan aproximadamente 30 minutos.

## Paso 1: Instalar y configurar el dispositivo Raspberry Pi
<a name="setup-device-shadow"></a>

En esta sección, configuraremos un dispositivo Raspberry Pi para usarlo con AWS IoT.

**importante**  
Adaptar estas instrucciones a otros dispositivos y sistemas operativos puede resultar difícil. Deberás entender el dispositivo lo suficientemente bien como para poder interpretar estas instrucciones y aplicarlas al dispositivo. Si encuentra dificultades, puede probar una de las otras opciones de dispositivos como alternativa, por ejemplo [Crear un dispositivo virtual con Amazon EC2](creating-a-virtual-thing.md) o [Utilice su PC o Mac con Windows o Linux como dispositivo AWS IoT](using-laptop-as-device.md). 

Tendrá que configurar su Raspberry Pi de forma que pueda iniciar el sistema operativo (SO), conectarse a Internet y permitirle interactuar con ella en una interfaz de línea de comandos. También puedes usar la interfaz gráfica de usuario (GUI) compatible con la Raspberry Pi para abrir la AWS IoT consola y ejecutar el resto de este tutorial.

**Para configurar el dispositivo Raspberry Pi:**

1. Inserte la tarjeta SD en la ranura para tarjetas MicroSD de la Raspberry Pi. Algunas tarjetas SD vienen precargadas con un administrador de instalación que muestra un menú para instalar el sistema operativo después de arrancar la placa. También puede utilizar el generador de imágenes de la Raspberry Pi para instalar el sistema operativo en su tarjeta.

1. Conecte un televisor o monitor HDMI al cable HDMI que se conecta al puerto HDMI de la Raspberry Pi. 

1. Conecte el teclado y el ratón a los puertos USB de la Raspberry Pi y, a continuación, enchufe el adaptador de corriente para arrancar la placa.

Una vez que se inicie la Raspberry Pi, si la tarjeta SD viene precargada con el administrador de instalación, aparecerá un menú para instalar el sistema operativo. Si tiene problemas para instalar el sistema operativo, pruebe los siguientes pasos. Para más información sobre la configuración de la Raspberry Pi, consulte [Configuración de su Raspberry Pi](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/).

**Si tiene problemas para configurar la Raspberry Pi:**
+ Compruebe si ha insertado la tarjeta SD antes de arrancar la placa. Si conecta la tarjeta SD después de arrancar la placa, es posible que no aparezca el menú de instalación.
+ Asegúrese de que el televisor o el monitor estén encendidos y de que se haya seleccionado la entrada correcta.
+ Asegúrese de utilizar un software compatible con Raspberry Pi.

Una vez que haya instalado y configurado el sistema operativo Raspberry Pi, abra el navegador web de la Raspberry Pi y navegue hasta la AWS IoT Core consola para continuar con el resto de los pasos de este tutorial.

Si puedes abrir la AWS IoT Core consola, tu Raspberry Pi está lista y puedes continuar haciéndolo[Tutorial: Aprovisionar tu dispositivo en AWS IoT](shadow-provision-cloud.md).

Si tiene problemas o necesita ayuda adicional, consulte [Cómo obtener ayuda para su Raspberry Pi](https://projects.raspberrypi.org/en/projects/raspberry-pi-setting-up/5).

# Tutorial: Aprovisionar tu dispositivo en AWS IoT
<a name="shadow-provision-cloud"></a>

En esta sección, se crean los AWS IoT Core recursos que utilizará el tutorial.

**Topics**
+ [Paso 1: Crear una AWS IoT política para Device Shadow](#create-policy-shadow)
+ [Paso 2: Cree un recurso cosa y adjunte la política a la cosa](#create-thing-shadow)
+ [Paso 3: Revisar los resultados y los siguientes pasos](#resources-shadow-review)

## Paso 1: Crear una AWS IoT política para Device Shadow
<a name="create-policy-shadow"></a>

Los certificados X.509 autentican su dispositivo. AWS IoT Core AWS IoT se adjuntan políticas al certificado que permiten al dispositivo realizar AWS IoT operaciones, como suscribirse o publicar en temas reservados de MQTT utilizados por el servicio Device Shadow. El dispositivo presenta su certificado cuando se conecta y envía mensajes a. AWS IoT Core

En este procedimiento, creará una política que permita al dispositivo realizar las operaciones AWS IoT necesarias para ejecutar el programa de ejemplo. Le recomendamos que cree una política que conceda únicamente los permisos necesarios para realizar la tarea. Primero debe crear la AWS IoT política y, a continuación, adjuntarla al certificado del dispositivo que creará más adelante.

**Para crear una AWS IoT política**

1. En el panel de navegación de la izquierda, seleccione **Seguridad** y, a continuación, elija **Políticas**. Si su cuenta tiene pólizas existentes, elija **Crear**, de lo contrario, en la página **Aún no tiene una política**, elija **Crear una política**.

1. En la página **Crear una política**:

   1. Introduzca un nombre para la política en el campo **Nombre** (por ejemplo, **My\$1Device\$1Shadow\$1policy**). No utilice información personalmente identificable en sus nombres de política.

   1. En el documento de política, se describen las acciones de conexión, suscripción, recepción y publicación que dan permiso al dispositivo para publicar y suscribirse a los temas reservados de MQTT.

      Copie el siguiente ejemplo de política y péguelo en su documento de política. `thingname`Sustitúyala por el nombre de lo que vas a crear (por ejemplo,`My_light_bulb`), `region` por la AWS IoT región en la que utilizas los servicios y `account` por tu Cuenta de AWS número. Para obtener más información sobre AWS IoT las políticas, consulte[AWS IoT Core políticas](iot-policies.md).  
****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Publish"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/get",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Receive"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/get/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/get/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topic/$aws/things/thingname/shadow/update/delta"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": [
                      "iot:Subscribe"
                  ],
                  "Resource": [
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/get/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/get/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/update/accepted",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/update/rejected",
                      "arn:aws:iot:us-east-1:123456789012:topicfilter/$aws/things/thingname/shadow/update/delta"
                  ]
              },
              {
                  "Effect": "Allow",
                  "Action": "iot:Connect",
                  "Resource": "arn:aws:iot:us-east-1:123456789012:client/test-*"
              }
          ]
      }
      ```

## Paso 2: Cree un recurso cosa y adjunte la política a la cosa
<a name="create-thing-shadow"></a>

Los dispositivos conectados a AWS IoT pueden representarse mediante *recursos* de objetos en el AWS IoT registro. Un *recurso de cosa* representa un dispositivo específico o una entidad lógica, como la bombilla de este tutorial.

Para obtener información sobre cómo crear una cosa en AWS IoT, siga los pasos que se describen en[Crear un objeto](create-iot-resources.md#create-aws-thing). He aquí algunas cosas clave que debe tener en cuenta mientras sigue los pasos de ese tutorial:

1. Elija **Crear una sola cosa** y, en el campo **Nombre**, introduzca un nombre para la cosa que sea igual a la `thingname` (por ejemplo, `My_light_bulb`) que especificó al crear la política anteriormente.

   No se puede cambiar el nombre de una cosa después de haberla creado. Si le dio un nombre diferente a `thingname`, cree una cosa nueva con el nombre `thingname` y borre la cosa antigua.
**nota**  
No utilice información personal identificable en el nombre de la cosa. El nombre de la cosa puede aparecer en comunicaciones e informes no cifrados.

1. Le recomendamos que descargue cada uno de los archivos de certificado de la página **¡Certificado creado\$1** en un lugar donde pueda encontrarlos fácilmente. Necesitará instalar estos archivos para ejecutar la aplicación de ejemplo.

   Le recomendamos que descargue los archivos en un subdirectorio `certs` del directorio `home` de su Raspberry Pi y asigne un nombre más simple a cada uno de ellos, tal y como se sugiere en la siguiente tabla.  
**Nombres de archivo de certificado**    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/iot/latest/developerguide/shadow-provision-cloud.html)

1. Después de activar el certificado para habilitar las conexiones AWS IoT, elija **Adjuntar una política** y asegúrese de adjuntar la política que creó anteriormente (por ejemplo,**My\$1Device\$1Shadow\$1policy**) a la cosa.

   Una vez que hayas creado una cosa, podrás ver tu recurso en la lista de cosas de la AWS IoT consola.

## Paso 3: Revisar los resultados y los siguientes pasos
<a name="resources-shadow-review"></a>

**En este tutorial, ha aprendido a:**
+ Instalar y configurar el dispositivo Raspberry Pi.
+ Crea un documento AWS IoT de política que autorice a tu dispositivo a interactuar con AWS IoT los servicios.
+ Crear un recurso de cosas y un certificado de dispositivo X.509 asociado, y adjuntarle el documento de política.

**Siguientes pasos**  
Ahora puede instalar el SDK del AWS IoT dispositivo para Python, ejecutar la aplicación de `shadow.py` ejemplo y usar Device Shadows para controlar el estado. Para más información sobre cómo ejecutar este tutorial, consulte [Tutorial: Instalación del SDK del dispositivo y ejecución de la aplicación de ejemplo para Device Shadows](lightbulb-shadow-application.md).

# Tutorial: Instalación del SDK del dispositivo y ejecución de la aplicación de ejemplo para Device Shadows
<a name="lightbulb-shadow-application"></a>

En esta sección se muestra cómo instalar el software necesario y el SDK de AWS IoT dispositivos para Python y ejecutar la aplicación de `shadow.py` ejemplo para editar el documento Shadow y controlar el estado de la sombra. 

**En este tutorial, aprenderá a:**
+ Usa el software instalado y el SDK de AWS IoT dispositivo para Python para ejecutar la aplicación de muestra.
+ Descubre cómo al introducir un valor con la aplicación de ejemplo, se publica el valor deseado en la consola de AWS IoT .
+ Revise la aplicación de ejemplo `shadow.py` y descubra cómo utiliza el protocolo MQTT para actualizar el estado de la sombra.

**Antes de ejecutar este tutorial:**  
Debe haber configurado su Cuenta de AWS dispositivo Raspberry Pi y creado AWS IoT algo y una política que otorgue al dispositivo permisos para publicar y suscribirse a los temas reservados de MQTT del servicio Device Shadow. Para obtener más información, consulte [Tutorial: Cómo preparar la Raspberry Pi para ejecutar la aplicación shadow](create-resources-shadow.md).

También debes haber instalado Git, Python y el SDK de AWS IoT dispositivos para Python. Este tutorial se basa en los conceptos presentados en el tutorial [Conexión de una Raspberry Pi u otro dispositivo](connecting-to-existing-device.md). Si no ha probado ese tutorial, le recomendamos que siga los pasos descritos en él para instalar los archivos de certificado y el SDK del dispositivo y, a continuación, vuelva a este tutorial para ejecutar la aplicación de ejemplo `shadow.py`.

**Topics**
+ [Paso 1: ejecutar la aplicación de ejemplo shadow.py](#run-sample-application-shadows)
+ [Paso 2: Revisar la aplicación de ejemplo del SDK de dispositivos shadow.py](#review-shadow-sample-code)
+ [Paso 3: Solucionar problemas con la aplicación de ejemplo `shadow.py`](#shadow-sample-app-troubleshoot)
+ [Paso 4: Revisar los resultados y los siguientes pasos](#sample-app-shadow-review)

Para completar este tutorial se necesitan aproximadamente 20 minutos.

## Paso 1: ejecutar la aplicación de ejemplo shadow.py
<a name="run-sample-application-shadows"></a>

Antes de ejecutar la aplicación de ejemplo `shadow.py`, necesitará la siguiente información además de los nombres y la ubicación de los archivos de certificado que instaló.


**Valores de los parámetros de la aplicación**  

|  Parámetro  |  Dónde encontrar el valor  | 
| --- | --- | 
| your-iot-thing-name |  Nombre del elemento AWS IoT que creaste anteriormente en[Paso 2: Cree un recurso cosa y adjunte la política a la cosa](shadow-provision-cloud.md#create-thing-shadow). Para encontrar este valor, en la [consola de AWS IoT](https://console.aws.amazon.com/iot/home), seleccione **Administrar** y, a continuación, seleccione **Cosas**.  | 
| your-iot-endpoint |   El *your-iot-endpoint* valor tiene el formato:`endpoint_id-ats.iot.region.amazonaws.com`, por ejemplo,`a3qj468EXAMPLE-ats.iot.us-west-2.amazonaws.com`. Para encontrar este valor: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/iot/latest/developerguide/lightbulb-shadow-application.html)  | 

**Instalar y ejecutar la aplicación de ejemplo**

1. Navegue hasta el directorio de la aplicación de ejemplo.

   ```
   cd ~/aws-iot-device-sdk-python-v2/samples/service-clients
   ```

1. En la ventana de la línea de comandos, *your-iot-thing-name* sustituya *your-iot-endpoint* y, como se indica, y ejecute este comando.

   ```
   python3 shadow.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint --thing_name your-iot-thing-name
   ```

1. Observe que la aplicación de ejemplo:

   1. Se conecta al servicio de AWS IoT de tu cuenta.

   1. Se suscribe a eventos `Delta` y respuestas `Update` y `Get`.

   1. Le pide que introduzca el valor deseado en el terminal.

   1. Muestra una salida similar a la siguiente:

   ```
   Connecting to a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-0c8ae2ff-cc87-49d2-a82a-ae7ba1d0ca5a'...
   Connected!
   Subscribing to Delta events...
   Subscribing to Update responses...
   Subscribing to Get responses...
   Requesting current shadow state...
   Launching thread to read user input...
   Finished getting initial shadow state.
   Shadow contains reported value 'off'.
   Enter desired value:
   ```

**nota**  
Si tiene problemas para ejecutar la aplicación de ejemplo `shadow.py`, revise [Paso 3: Solucionar problemas con la aplicación de ejemplo `shadow.py`](#shadow-sample-app-troubleshoot). Para obtener información adicional que pueda ayudarle a corregir el problema, añada el parámetro `--verbosity debug` a la línea de órdenes para que la aplicación de ejemplo muestre mensajes detallados sobre lo que está haciendo.

**Introduzca los valores y observe las actualizaciones en el documento Shadow**  
Puede introducir valores en el terminal para especificar el valor `desired`, lo que también actualiza el valor `reported`. Supongamos que introduce el color `yellow` en el terminal. El valor `reported` también se actualiza al color `yellow`. A continuación se muestran los mensajes que se muestran en el terminal:

```
Enter desired value:
yellow
Changed local shadow value to 'yellow'.
Updating reported shadow value to 'yellow'...
Update request published.
Finished updating reported shadow value to 'yellow'.
```

Al publicar esta solicitud de actualización, AWS IoT crea una sombra clásica y predeterminada para el recurso. Puede observar la solicitud de actualización que publicó en `desired` los valores `reported` y de la AWS IoT consola consultando el documento Shadow del recurso de objetos que creó (por ejemplo,`My_light_bulb`). Para ver la actualización en el documento Shadow, siga estos pasos:

1. En la AWS IoT consola, selecciona **Administrar** y, a continuación, selecciona **Cosas**.

1. En la lista de cosas que se muestran, seleccione la cosa que ha creado, elija **Sombras** y, a continuación, **Sombra clásica**.

El documento Shadow debería tener un aspecto similar al siguiente y mostrar los valores `reported` y `desired` establecidos en el color `yellow`. Puede ver estos valores en la sección **Estado de sombra** del documento.

```
{
"desired": {
  "welcome": "aws-iot",
  "color": "yellow"
},
"reported": {
  "welcome": "aws-iot",
  "color": "yellow"
}
}
```

También verá una sección de **metadatos** que contiene la información de la marca de tiempo y el número de versión de la solicitud.

Puede utilizar la versión del documento de estado para asegurarse de que actualiza la versión más reciente del documento de sombra de un dispositivo. Si envía otra solicitud de actualización, el número de versión aumentará en 1. Cuando se suministra una versión con una solicitud de actualización, el servicio rechaza la solicitud con un código de respuesta de conflicto HTTP 409 si la versión actual del documento de estado no coincide con la versión suministrada. 

```
{
"metadata": {
  "desired": {
    "welcome": {
      "timestamp": 1620156892
    },
    "color": {
      "timestamp": 1620156893
    }
  },
  "reported": {
    "welcome": {
      "timestamp": 1620156892
    },
    "color": {
      "timestamp": 1620156893
    }
  }
},
"version": 10
}
```

Para obtener más información sobre el documento alternativo y observar los cambios en la información de estado, continúe con el siguiente tutorial [Tutorial: Interactuar con Device Shadow mediante la aplicación de ejemplo y el cliente de pruebas MQTT](interact-lights-device-shadows.md), tal como se describe en la sección [Paso 4: Revisar los resultados y los siguientes pasos](#sample-app-shadow-review) de este tutorial. Si lo desea, también puede obtener información sobre el código de ejemplo `shadow.py` y cómo utiliza el protocolo MQTT en la siguiente sección.

## Paso 2: Revisar la aplicación de ejemplo del SDK de dispositivos shadow.py
<a name="review-shadow-sample-code"></a>

En esta sección se revisa la aplicación de ejemplo `shadow.py` del **SDK de dispositivos AWS IoT v2 para Python** utilizada en este tutorial. Aquí veremos cómo se conecta AWS IoT Core mediante los protocolos MQTT y MQTT over WSS. La biblioteca [de tiempo de ejecución AWS común (AWS-CRT)](https://github.com/awslabs/aws-crt-python#aws-crt-python) proporciona compatibilidad con el protocolo de comunicación de bajo nivel y se incluye en el AWS IoT Device SDK v2 para Python.

Si bien este tutorial utiliza MQTT y MQTT sobre WSS, AWS IoT es compatible con los dispositivos que publican solicitudes HTTPS. Para ver un ejemplo de un programa de Python que envía un mensaje HTTP desde un dispositivo, consulta el [ejemplo de código HTTPS](http.md#codeexample) con la biblioteca `requests` de Python. 

Para obtener información sobre cómo tomar una decisión fundamentada sobre qué protocolo utilizar para las comunicaciones de su dispositivo, consulte la [Elección de un protocolo de aplicación para la comunicación entre dispositivos](protocols.md#protocol-selection).

**MQTT**  
Las llamadas de ejemplo `shadow.py` `mtls_from_path` (mostradas aquí) en el [https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py) para establecer una conexión con AWS IoT Core mediante el protocolo MQTT. `mtls_from_path` utiliza certificados X.509 y TLS v1.2 para autenticar el dispositivo. La biblioteca AWS-CRT gestiona los detalles de nivel inferior de esa conexión.

```
mqtt_connection = mqtt_connection_builder.mtls_from_path(
  endpoint=args.endpoint,
  cert_filepath=args.cert,
  pri_key_filepath=args.key,
  ca_filepath=args.ca_file,
  client_bootstrap=client_bootstrap,
  on_connection_interrupted=on_connection_interrupted,
  on_connection_resumed=on_connection_resumed,
  client_id=args.client_id,
  clean_session=False,
  keep_alive_secs=6
)
```
+ `endpoint`es el AWS IoT punto final que ha introducido desde la línea de comandos y `client_id` es el ID que identifica de forma exclusiva a este dispositivo en. Región de AWS
+ `cert_filepath`, `pri_key_filepath` y `ca_filepath` son las rutas a los archivos de certificados y claves privadas del dispositivo y al archivo CA raíz. 
+ `client_bootstrap` es el objeto común en tiempo de ejecución que gestiona las actividades de comunicación del socket, y se instancia antes de la llamada a `mqtt_connection_builder.mtls_from_path`.
+ `on_connection_interrupted` y `on_connection_resumed` son funciones de devolución de llamada para llamar cuando la conexión del dispositivo se interrumpe y se reanuda.
+ `clean_session` es si se debe iniciar una nueva sesión persistente o, si ya existe una, reconectarse a una existente. `keep_alive_secs` es el valor de mantenimiento de vida, en segundos, que se debe enviar en la solicitud `CONNECT`. Se enviará automáticamente un ping en este intervalo. El servidor asume que la conexión se pierde si no recibe un ping después de 1,5 veces este valor.

La muestra `shadow.py` también llama a `websockets_with_default_aws_signing` en el [https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py](https://github.com/awslabs/aws-crt-python/blob/89207bcf1387177034e02fe29e8e469ca45e39b7/awscrt/awsiot_mqtt_connection_builder.py) para establecer una conexión con AWS IoT Core usando el protocolo MQTT sobre WSS. MQTT sobre WSS también utiliza los mismos parámetros que MQTT y toma estos parámetros adicionales:
+ `region`es la región de AWS firma utilizada en la autenticación de Signature V4 y `credentials_provider` son las AWS credenciales que se proporcionan para utilizarlas en la autenticación. La Región se pasa desde la línea de comandos, y el objeto `credentials_provider` se instancia justo antes de la llamada a `mqtt_connection_builder.websockets_with_default_aws_signing`.
+ `websocket_proxy_options` son las opciones de proxy HTTP, si se utiliza un servidor proxy. En la aplicación de ejemplo `shadow.py`, este valor se crea justo antes de la llamada a `mqtt_connection_builder.websockets_with_default_aws_signing`.

**Suscribirse a los temas y eventos de Sombra**  
El ejemplo `shadow.py` intenta establecer una conexión y espera a que esté completamente conectado. Si no está conectado, los comandos se ponen en cola. Una vez conectado, el ejemplo se suscribe a los eventos delta y actualiza y recibe mensajes, y publica los mensajes con un nivel de calidad de servicio (QoS) de 1 (`mqtt.QoS.AT_LEAST_ONCE`). 

Cuando un dispositivo se suscribe a un mensaje con QoS de nivel 1, el agente de mensajes guarda los mensajes a los que está suscrito el dispositivo hasta que se puedan enviar al dispositivo. El agente de mensajes vuelve a enviar los mensajes hasta que recibe una respuesta `PUBACK` del dispositivo. 

Para más información sobre el protocolo MQTT, consulte [Revise el protocolo MQTT](sdk-tutorials.md#sdk-tutorials-mqtt-review) y [MQTT](mqtt.md).

Para obtener más información sobre cómo se utilizan MQTT, MQTT sobre WSS, las sesiones persistentes y los niveles de QoS que se utilizan en este tutorial, consulte [Consulte la aplicación de ejemplo del SDK de dispositivo pubsub.py](sdk-tutorials.md#sdk-tutorials-explore-sample).

## Paso 3: Solucionar problemas con la aplicación de ejemplo `shadow.py`
<a name="shadow-sample-app-troubleshoot"></a>

Cuando ejecute la aplicación de ejemplo `shadow.py`, debería ver algunos mensajes en el terminal y un aviso para introducir un valor `desired`. Si el programa arroja un error, para depurarlo puede empezar por comprobar si ha ejecutado el comando correcto para su sistema.

En algunos casos, el mensaje de error puede indicar problemas de conexión y tener un aspecto similar a: `Host name was invalid for dns resolution` o `Connection was closed unexpectedly`. En esos casos, puede comprobar lo siguiente:
+ 

**Compruebe la dirección del punto de conexión en el comando**  
Revise el argumento `endpoint` del comando que introdujo para ejecutar la aplicación de ejemplo, (por ejemplo, `a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com`) y compruebe este valor en la **consola de AWS IoT **.

  Para comprobar si ha utilizado el valor correcto:

  1. En la **consola de AWS IoT **, seleccione **Administrar** y después **Cosas**.

  1. Elija la cosa que creó para su aplicación de ejemplo (por ejemplo, **My\$1light\$1bulb**) y luego elija **Interactuar**.

  Su punto de conexión se muestra en la sección ** HTTPS**. También debería ver un mensaje que dice: `This thing already appears to be connected.`
+ 

**Compruebe la activación del certificado**  
Los certificados autentican el dispositivo con AWS IoT Core.

  Para comprobar si su certificado está activo:

  1. En la **consola de AWS IoT **, seleccione **Administrar** y después **Cosas**.

  1. Elija la cosa que creó para su aplicación de ejemplo (por ejemplo, **My\$1light\$1bulb**) y luego elija **Seguridad**.

  1. Seleccione el certificado y, a continuación, en la página de detalles del certificado, seleccione **Acciones**.

  Si en la lista desplegable **Activar** no está disponible y solo puede elegir **Desactivar**, su certificado está activo. Si no es así, seleccione **Activar** y vuelva a ejecutar el programa de muestra.

  Si el programa sigue sin ejecutarse, compruebe los nombres de los archivos de certificado en la carpeta `certs`.
+ 

**Compruebe la política adjunta al recurso de la cosa**  
Si bien los certificados autentican el dispositivo, AWS IoT las políticas permiten que el dispositivo realice AWS IoT operaciones, como suscribirse o publicar en temas reservados de MQTT.

  Para comprobar si se adjunta la política correcta:

  1. Busque el certificado tal y como se describió anteriormente y, a continuación, elija **Políticas**.

  1. Elija la política que se muestra y compruebe si describe las acciones `connect`, `subscribe`, `receive` y `publish` que permiten al dispositivo publicar y suscribirse a los temas reservados de MQTT.

     Para ver un ejemplo de política, consulte [Paso 1: Crear una AWS IoT política para Device Shadow](shadow-provision-cloud.md#create-policy-shadow).

  Si ves mensajes de error que indican que tienes problemas para conectarte AWS IoT, es posible que se deba a los permisos que utilizas para la política. Si ese es el caso, le recomendamos que comience con una política que proporcione acceso total a AWS IoT los recursos y, a continuación, vuelva a ejecutar el programa de muestra. Puede editar la política actual o elegir la política actual, seleccionar **Separar** y, a continuación, crear otra política que proporcione acceso completo y adjuntarla a su recurso principal. Más adelante, podrá restringir la política únicamente a las acciones y políticas que necesite para ejecutar el programa.  
****  

  ```
  {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iot:*"
            ],
            "Resource": "*"
        }
    ]
  }
  ```
+ 

**Compruebe la instalación de su SDK del dispositivo**  
Si el programa sigue sin ejecutarse, puede volver a instalar el SDK del dispositivo para asegurarse de que su instalación del SDK es completa y correcta.

## Paso 4: Revisar los resultados y los siguientes pasos
<a name="sample-app-shadow-review"></a>

**En este tutorial, ha aprendido a:**
+ Instale el software, las herramientas y el SDK de AWS IoT dispositivo necesarios para Python.
+ Entender cómo la aplicación de ejemplo, `shadow.py`, utiliza el protocolo MQTT para recuperar y actualizar el estado actual de la sombra.
+ Ejecute la aplicación de ejemplo para Device Shadows y observe la actualización del documento Shadow en la AWS IoT consola. También aprendió a solucionar cualquier problema y a corregir errores al ejecutar el programa.

**Siguientes pasos**  
Ahora puede ejecutar la aplicación de ejemplo `shadow.py` y usar Device Shadows para controlar el estado. Puede observar las actualizaciones del documento sombra en la consola de AWS IoT y observar los eventos delta a los que responde la aplicación de muestra. Con el cliente de pruebas MQTT, puede suscribirse a los temas paralelos reservados y observar los mensajes que reciben los temas al ejecutar el programa de ejemplo. Para más información sobre cómo ejecutar este tutorial, consulte [Tutorial: Interactuar con Device Shadow mediante la aplicación de ejemplo y el cliente de pruebas MQTT](interact-lights-device-shadows.md).

# Tutorial: Interactuar con Device Shadow mediante la aplicación de ejemplo y el cliente de pruebas MQTT
<a name="interact-lights-device-shadows"></a>

Para interactuar con la aplicación de ejemplo `shadow.py`, introduzca un valor para el valor en el terminal `desired`. Por ejemplo, puede especificar colores que se parezcan a los semáforos AWS IoT y responder a la solicitud y actualizar los valores informados.

**En este tutorial, aprenderá a:**
+ Usar la aplicación de ejemplo `shadow.py` para especificar los estados deseados y actualizar el estado actual de la sombra.
+ Editar el documento Shadow para observar los eventos delta y cómo responde a ellos la aplicación de muestra `shadow.py`.
+ Utilizar el cliente de prueba MQTT para suscribirse a temas sombra y observar las actualizaciones cuando ejecute el programa de ejemplo.

**Antes de ejecutar este tutorial, debe disponer de lo siguiente:**  
Configura tu Cuenta de AWS, configura tu dispositivo Raspberry Pi y crea una AWS IoT cosa y una política. También debe haber instalado el software necesario, el SDK del dispositivo y los archivos de certificado necesarios y haber ejecutado el programa de muestra en la terminal. Para obtener más información, consulte los tutoriales anteriores [Tutorial: Cómo preparar la Raspberry Pi para ejecutar la aplicación shadow](create-resources-shadow.md) y [Paso 1: ejecutar la aplicación de ejemplo shadow.py](lightbulb-shadow-application.md#run-sample-application-shadows). Si aún no lo ha hecho, debe completar estos tutoriales.

**Topics**
+ [Paso 1: Actualizar los valores deseados y notificados mediante la aplicación de ejemplo `shadow.py`](#update-desired-shadow-sample)
+ [Paso 2: Ver los mensajes de la aplicación de ejemplo `shadow.py` en el cliente de prueba MQTT](#shadow-sample-view-msg)
+ [Paso 3: solucionar los errores de las interacciones de Device Shadow](#shadow-observe-messages-troubleshoot)
+ [Paso 4: Revisar los resultados y los siguientes pasos](#sample-shadow-review)

Para completar este tutorial se necesitan aproximadamente 45 minutos.

## Paso 1: Actualizar los valores deseados y notificados mediante la aplicación de ejemplo `shadow.py`
<a name="update-desired-shadow-sample"></a>

En el tutorial anterior[Paso 1: ejecutar la aplicación de ejemplo shadow.py](lightbulb-shadow-application.md#run-sample-application-shadows), aprendió a observar un mensaje publicado en el documento Shadow de la AWS IoT consola al introducir el valor deseado, tal y como se describe en la sección[Tutorial: Instalación del SDK del dispositivo y ejecución de la aplicación de ejemplo para Device Shadows](lightbulb-shadow-application.md).

En el ejemplo anterior, configuramos el color deseado en `yellow`. Después de introducir cada valor, el terminal le pide que introduzca otro valor `desired`. Si vuelve a introducir el mismo valor (`yellow`), la aplicación lo reconoce y le pide que introduzca un nuevo valor `desired`.

```
Enter desired value:
yellow
Local value is already 'yellow'.
Enter desired value:
```

Ahora, supongamos que has introducido el color`green`. AWS IoT responde a la solicitud y actualiza el `reported` valor a`green`. Así es como se produce la actualización cuando el estado `desired` es diferente del estado `reported`, lo que provoca un delta.

**Cómo simula la aplicación de ejemplo `shadow.py` las interacciones de Device Shadow:**

1. Introduzca un valor `desired` (por ejemplo`yellow`) en el terminal para publicar el estado deseado.

1. Como el estado `desired` es diferente del estado `reported` (por ejemplo, el color `green`), se produce un delta y la aplicación que está suscrita al delta recibe este mensaje.

1. La aplicación responde al mensaje y actualiza su estado al valor `desired`, `yellow`.

1. A continuación, la aplicación publica un mensaje de actualización con el nuevo valor registrado del estado del dispositivo, `yellow`.

A continuación se muestran los mensajes que se muestran en el terminal y que muestran cómo se publica la solicitud de actualización.

```
Enter desired value:
green
Changed local shadow value to 'green'.
Updating reported shadow value to 'green'...
Update request published.
Finished updating reported shadow value to 'green'.
```

En la AWS IoT consola, el documento oculto refleja el valor actualizado `green` para los `desired` campos `reported` y, además, el número de versión se incrementa en 1. Por ejemplo, si el número de la versión anterior se mostraba como 10, el número de la versión actual aparecerá como 11.

**nota**  
Borrar una sombra no restablece el número de versión a 0. Verá que la versión sombra se incrementa en 1 cuando publique una solicitud de actualización o cree otra sombra con el mismo nombre.

**Editar el documento Shadow para observar los eventos delta**  
La aplicación de ejemplo `shadow.py` también está suscrita a los eventos `delta` y responde cuando se produce un cambio en el valor `desired`. Por ejemplo, puede cambiar el valor `desired` por el color `red`. Para ello, en la AWS IoT consola, edite el documento oculto haciendo clic en **Editar** y, a continuación, establezca el `desired` valor `red` en en el JSON, manteniendo el `reported` valor en. `green` Antes de guardar los cambios, mantén abierto el terminal de la Raspberry Pi, ya que verás mensajes en el terminal cuando se produzca el cambio.

```
{
"desired": {
  "welcome": "aws-iot",
  "color": "red"
},
"reported": {
  "welcome": "aws-iot",
  "color": "green"
}
}
```

Tras guardar el nuevo valor, la aplicación de ejemplo `shadow.py` responde a este cambio y muestra mensajes en el terminal que indican el delta. A continuación, verá los siguientes mensajes debajo de la solicitud para introducir el valor `desired`.

```
Enter desired value:
Received shadow delta event.
Delta reports that desired value is 'red'. Changing local value...
Changed local shadow value to 'red'.
Updating reported shadow value to 'red'...
Finished updating reported shadow value to 'red'.
Enter desired value:
Update request published.
Finished updating reported shadow value to 'red'.
```

## Paso 2: Ver los mensajes de la aplicación de ejemplo `shadow.py` en el cliente de prueba MQTT
<a name="shadow-sample-view-msg"></a>

Puede utilizar el **cliente de prueba de MQTT** de la **consola de AWS IoT ** para supervisar los mensajes de MQTT que se transmiten a su Cuenta de AWS. Al suscribirse a los temas MQTT reservados utilizados por el servicio Device Shadow, puede observar los mensajes recibidos por los temas al ejecutar la aplicación de ejemplo.

Si aún no ha utilizado el cliente de pruebas de MQTT, puede revisar [Vea los mensajes MQTT con el cliente AWS IoT MQTT](view-mqtt-messages.md) Esto le ayudará a aprender a utilizar el **cliente de prueba de MQTT** de la **consola de AWS IoT ** para ver los mensajes MQTT a medida que pasan por el agente de mensajes.

1. 

**Abra el cliente de prueba MQTT**

   Abra el [cliente de prueba de MQTT en la consola de AWS IoT](https://console.aws.amazon.com//iot/home#/test) en una ventana nueva para poder observar los mensajes recibidos por los temas MQTT sin perder la configuración de su cliente de prueba de MQTT. El cliente de prueba MQTT no conserva las suscripciones ni los registros de mensajes si lo abandona para ir a otra página de la consola. Para esta sección del tutorial, puedes hacer que el documento Shadow que AWS IoT prefieras y el cliente de pruebas de MQTT se abran en ventanas separadas para observar más fácilmente la interacción con Device Shadows.

1. 

**Suscribirse a los temas reservados de MQTT Shadow**

   Puede utilizar el cliente de pruebas de MQTT para introducir los nombres de los temas reservados de MQTT de Device Shadow y suscribirse a ellos para recibir actualizaciones cuando ejecute la aplicación de ejemplo `shadow.py`. Para suscribirse al tema:

   1. En el **cliente de prueba MQTT** de la **consola de AWS IoT **, seleccione **Suscribirse a un tema**.

   1.  En la sección de **filtros de temas**, introduzca: ***thingname*\$1aws/things/** /shadow/update/ \$1. Aquí `thingname` es el nombre del recurso que creó anteriormente (por ejemplo, `My_light_bulb`).

   1. Mantenga los valores predeterminados para los ajustes de configuración adicionales y, a continuación, seleccione **Suscribirse**.

   Si utiliza el comodín **\$1** en la suscripción al tema, podrá suscribirse a varios temas de MQTT al mismo tiempo y observar todos los mensajes que se intercambian entre el dispositivo y su Shadow en una sola ventana. Para obtener más información sobre los caracteres comodín y su uso, consulte [Temas de MQTT](topics.md).

1. 

**Ejecute un programa de ejemplo `shadow.py` y observe los mensajes**

   En la ventana de la línea de comandos de la Raspberry Pi, si ha desconectado el programa, vuelva a ejecutar la aplicación de ejemplo y mire los mensajes en el **cliente de pruebas MQTT** de la **consola de AWS IoT **.

   1. Ejecute la siguiente orden para reiniciar el programa de muestra. Sustituya *your-iot-thing-name* y por *your-iot-endpoint* los nombres de AWS IoT lo que creó anteriormente (por ejemplo,`My_light_bulb`) y del punto final para interactuar con el dispositivo. 

      ```
      cd ~/aws-iot-device-sdk-python-v2/samples/service-clients
      python3 shadow.py --ca_file ~/certs/Amazon-root-CA-1.pem --cert ~/certs/device.pem.crt --key ~/certs/private.pem.key --endpoint your-iot-endpoint --thing_name your-iot-thing-name
      ```

      A continuación, la aplicación de ejemplo `shadow.py` se ejecuta y recupera el estado de sombra actual. Si ha eliminado la sombra o borrado los estados actuales, el programa fija el valor actual a `off` y luego le pide que introduzca un valor `desired`.

      ```
      Connecting to a3qEXAMPLEffp-ats.iot.us-west-2.amazonaws.com with client ID 'test-0c8ae2ff-cc87-49d2-a82a-ae7ba1d0ca5a'...
      Connected!
      Subscribing to Delta events...
      Subscribing to Update responses...
      Subscribing to Get responses...
      Requesting current shadow state...
      Launching thread to read user input...
      Finished getting initial shadow state.
      Shadow document lacks 'color' property. Setting defaults...
      Changed local shadow value to 'off'.
      Updating reported shadow value to 'off'...
      Update request published.
      Finished updating reported shadow value to 'off'...
      Enter desired value:
      ```

      Por otro lado, si el programa se estaba ejecutando y lo reiniciaste, verás el último valor de color registrado en la terminal. **En el cliente de pruebas de MQTT, verá una actualización de los temas **\$1aws/things/ /shadow/get y *thingname* \$1aws/things/**/. *thingname* shadow/get/accepted**

      Supongamos que el último color registrado fue `green`. **A continuación se muestra el contenido del archivo \$1aws/things//JSON. *thingname* shadow/get/accepted**

      ```
      {
      "state": {
        "desired": {
          "welcome": "aws-iot",
          "color": "green"
        },
        "reported": {
          "welcome": "aws-iot",
          "color": "green"
        }
      },
      "metadata": {
        "desired": {
          "welcome": {
            "timestamp": 1620156892
          },
          "color": {
            "timestamp": 1620161643
          }
        },
        "reported": {
          "welcome": {
            "timestamp": 1620156892
          },
          "color": {
            "timestamp": 1620161643
          }
        }
      },
      "version": 10,
      "timestamp": 1620173908
      }
      ```

   1. Introduzca un valor `desired` en la terminal, por ejemplo `yellow`. La aplicación de ejemplo `shadow.py` responde y muestra los siguientes mensajes en el terminal que muestran el cambio en el valor `reported` a `yellow`.

      ```
      Enter desired value:
      yellow
      Changed local shadow value to 'yellow'.
      Updating reported shadow value to 'yellow'...
      Update request published.
      Finished updating reported shadow value to 'yellow'.
      ```

      En la opción **Cliente de prueba de MQTT** de la **consola de AWS IoT **, en **Suscripciones**, verá que los siguientes temas han recibido un mensaje:
      + **\$1aws/things/ *thingname* /shadow/update**: muestra que ambos valores cambian de color. `desired` `updated` `yellow`
      + **\$1aws/things/*thingname*/shadow/update/accepted: muestra los valores actuales de los estados y y sus** metadatos e información de versión. `desired` `reported`
      + **\$1aws/things/*thingname*/shadow/update/documents**: muestra los valores anteriores y actuales de los estados y sus metadatos e información de versión. `desired` `reported`

      Como el documento **\$1aws/things/*thingname*/shadow/update/documents**también contiene información incluida en los otros dos temas, podemos revisarla para ver la información sobre el estado. El estado anterior muestra el valor informado establecido en `green`, sus metadatos e información de versión, y el estado actual, que muestra el valor informado actualizado a `yellow`.

      ```
      {
      "previous": {
        "state": {
          "desired": {
            "welcome": "aws-iot",
            "color": "green"
          },
          "reported": {
            "welcome": "aws-iot",
            "color": "green"
          }
        },
        "metadata": {
          "desired": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297898
            }
          },
          "reported": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297898
            }
          }
        },
        "version": 10
      },
      "current": {
        "state": {
          "desired": {
            "welcome": "aws-iot",
            "color": "yellow"
          },
          "reported": {
            "welcome": "aws-iot",
            "color": "yellow"
          }
        },
        "metadata": {
          "desired": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297904
            }
          },
          "reported": {
            "welcome": {
              "timestamp": 1617297888
            },
            "color": {
              "timestamp": 1617297904
            }
          }
        },
        "version": 11
      },
      "timestamp": 1617297904
      }
      ```

   1. Ahora, si introduce otro valor `desired`, verá más cambios en los valores `reported` y en las actualizaciones de los mensajes que se reciben en estos temas. El número de versión también se incrementa en 1. Por ejemplo, si introduce el valor `green`, el estado anterior informa del valor `yellow` y el estado actual informa del valor `green`.

1. 

**Editar el documento Shadow para observar los eventos delta**

   Para observar los cambios en el tema delta, edite el documento paralelo en la consola de AWS IoT . Por ejemplo, puede cambiar el valor `desired` por el color `red`. Para ello, en la AWS IoT consola, selecciona **Editar** y, a continuación, establece el `desired` valor en rojo en el JSON, manteniendo el valor establecido en. `reported` `green` Antes de guardar el cambio, mantenga el terminal abierto ya que verá el mensaje delta informado en el terminal.

   ```
   {
   "desired": {
     "welcome": "aws-iot",
     "color": "red"
   },
   "reported": {
     "welcome": "aws-iot",
     "color": "green"
   }
   }
   ```

   La aplicación de ejemplo `shadow.py` responde a este cambio y muestra mensajes en el terminal que indican el delta. En el cliente de pruebas de MQTT, los temas `update` habrán recibido un mensaje que muestra los cambios en los valores `desired` y `reported`.

   También verás que el tema **\$1aws/things//*thingname***ha recibido un mensaje. shadow/update/delta Para ver el mensaje, seleccione este tema, que aparece en **Suscripciones**.

   ```
   {
   "version": 13,
   "timestamp": 1617318480,
   "state": {
     "color": "red"
   },
   "metadata": {
     "color": {
       "timestamp": 1617318480
     }
   }
   }
   ```

## Paso 3: solucionar los errores de las interacciones de Device Shadow
<a name="shadow-observe-messages-troubleshoot"></a>

Al ejecutar la aplicación de ejemplo Shadow, es posible que surjan problemas al observar las interacciones con el servicio Device Shadow. 

Si el programa se ejecuta correctamente y le pide que introduzca un valor `desired`, debería poder observar las interacciones de Device Shadow mediante el documento Shadow y el cliente de pruebas MQTT, tal y como se ha descrito anteriormente. Sin embargo, si no puede ver las interacciones, puede comprobar lo siguiente:
+ 

**Comprueba el nombre de la cosa y su sombra en la consola AWS IoT**  
Si no ve los mensajes en el documento Shadow, revise el comando y asegúrese de que coincide con el nombre de la cosa en la **consola de AWS IoT **. También puede comprobar si tiene una sombra clásica eligiendo su recurso cosa y luego eligiendo **Sombras**. Este tutorial se centra principalmente en las interacciones con la sombra clásica.

   También puede confirmar que el dispositivo que utilizó está conectado a Internet. En la **consola de AWS IoT **, elija lo que ha creado anteriormente y, a continuación, seleccione **Interactuar**. En la página de detalles de la cosa, debería ver un mensaje que dice: `This thing already appears to be connected.` 
+ 

**Compruebe los temas reservados de MQTT a los que se ha suscrito**  
Si los mensajes no aparecen en el cliente de prueba de MQTT, compruebe si los temas a los que se ha suscrito tienen el formato correcto. Los temas de Device Shadow de MQTT tienen el formato **\$1aws/things/ *thingname* /shadow/** y pueden tener `update``get`, o `delete` seguir este formato en función de las acciones que desee realizar en la sombra. **En este tutorial se utiliza el tema **\$1aws/things/ *thingname* /shadow/ \$1**, así que asegúrese de haberlo introducido correctamente al suscribirse al tema en la sección de filtro de temas del cliente de prueba.**

  Al introducir el nombre del tema, asegúrate de que *thingname* es el mismo que el nombre del tema que has creado anteriormente. AWS IoT También puede suscribirse a otros temas de MQTT para comprobar si la actualización se ha realizado correctamente. Por ejemplo, puedes suscribirte al tema **\$1aws/things/*thingname*/shadow/update/rejected**para recibir un mensaje cada vez que falle una solicitud de actualización y así poder depurar los problemas de conexión. Para más información sobre los temas reservados, consulte [Temas de sombra](reserved-topics.md#reserved-topics-shadow) y [Temas MQTT de sombra de dispositivo](device-shadow-mqtt.md).

## Paso 4: Revisar los resultados y los siguientes pasos
<a name="sample-shadow-review"></a>

**En este tutorial, ha aprendido a:**
+ Usar la aplicación de ejemplo `shadow.py` para especificar los estados deseados y actualizar el estado actual de la sombra.
+ Editar el documento Shadow para observar los eventos delta y cómo responde a ellos la aplicación de muestra `shadow.py`.
+ Utilizar el cliente de prueba MQTT para suscribirse a temas sombra y observar las actualizaciones cuando ejecute el programa de ejemplo.

**Siguientes pasos**  
Puede suscribirse a otros temas reservados de MQTT para ver las actualizaciones de la aplicación oculta. Por ejemplo, si solo te suscribes al tema **\$1aws/things/*thingname*/shadow/update/accepted**, solo verás la información sobre el estado actual cuando la actualización se realice correctamente.

También puede suscribirse a temas sombra adicionales para depurar problemas o aprender más sobre las interacciones de la Sombra de Dispositivos y también depurar cualquier problema con las interacciones de la Sombra de Dispositivos. Para obtener más información, consulte [Temas de sombra](reserved-topics.md#reserved-topics-shadow) y [Temas MQTT de sombra de dispositivo](device-shadow-mqtt.md).

También puedes optar por ampliar tu aplicación utilizando sombras con nombre o utilizando hardware adicional conectado a la Raspberry Pi para observar los cambios en su estado mediante los mensajes enviados desde el LEDs terminal.

Para obtener más información sobre el servicio Device Shadow y el uso del servicio en dispositivos, aplicaciones y servicios, consulte [AWS IoT Servicio Device Shadow](iot-device-shadows.md), [Uso de sombras en dispositivos](device-shadow-comms-device.md), y [Uso de sombras en aplicaciones y servicios](device-shadow-comms-app.md).