

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.

# Tutorial: Monitorización de la humedad del suelo con una AWS IoT Raspberry Pi
<a name="iot-moisture-tutorial"></a>

En este tutorial se muestra cómo utilizar una [Raspberry Pi](https://www.raspberrypi.org/), un sensor de humedad, y cómo AWS IoT controlar el nivel de humedad del suelo de una planta de interior o de un jardín. La Raspberry Pi ejecuta un código que lee el nivel de humedad y la temperatura del sensor y, a continuación, envía los datos a AWS IoT. Creas una regla AWS IoT que envía un correo electrónico a una dirección suscrita a un tema de Amazon SNS cuando el nivel de humedad cae por debajo de un umbral.

**nota**  
Es posible que este tutorial no esté actualizado. Es posible que algunas referencias hayan sido reemplazadas desde que se publicó originalmente este tema.

**Contents**
+ [Requisitos previos](#iot-moisture-prereqs)
+ [Con AWS IoT figuración](iot-moisture-setup.md)
  + [Paso 1: Crear la AWS IoT política](iot-moisture-policy.md)
  + [Paso 2: Crea la AWS IoT cosa, el certificado y la clave privada](iot-moisture-create-thing.md)
  + [Paso 3: Crear un tema y una suscripción a Amazon SNS](iot-moisture-create-sns-topic.md)
  + [Paso 4: Crea una AWS IoT regla para enviar un correo electrónico](iot-moisture-create-rule.md)
+ [Configuración del dispositivo Raspberry Pi y el sensor de humedad](iot-moisture-raspi-setup.md)

## Requisitos previos
<a name="iot-moisture-prereqs"></a>

Para completar este tutorial, se necesita lo siguiente:
+ Y. Cuenta de AWS
+ Un usuario de IAM con permisos de administrador.
+ Un equipo de desarrollo con Windows, macOS, Linux o Unix para obtener acceso a la [consola de AWS IoT](https://console.aws.amazon.com/iot/home).
+ Una [Raspberry Pi 3B o 4B](https://www.raspberrypi.com/products/) ejecutando el último [Raspberry Pi OS](https://www.raspberrypi.com/software/operating-systems/). Para ver instrucciones de instalación, consulte [Instalación de un sistema operativo](https://www.raspberrypi.com/documentation/computers/getting-started.html#installing-the-operating-system) en el sitio web de Rasberry Pi. 
+ Un monitor, teclado, ratón y conexión de red wifi o Ethernet para su Raspberry Pi.
+ Un sensor de humedad compatible con Raspberry Pi. El sensor utilizado en este tutorial es un [sensor de humedad capacitivo Adafruit STEMMA I2C](https://www.adafruit.com/product/4026) con un [conector hembra de 4 clavijas JST](https://www.adafruit.com/product/3950). 

# Con AWS IoT figuración
<a name="iot-moisture-setup"></a>

Para completar este tutorial, debe crear los siguientes recursos. Para conectar un dispositivo AWS IoT, se crea una cosa de IoT, un certificado de dispositivo y una AWS IoT política. 
+ Cualquier AWS IoT cosa.

  Un objeto representa un dispositivo físico (en este caso, su Rasberry Pi) e incluye metadatos estáticos sobre el dispositivo. 
+ Un certificado de dispositivo.

  Todos los dispositivos deben tener un certificado de dispositivo para conectarse a AWS IoT y autenticarse con el mismo.
+ Una AWS IoT política.

  Cada certificado de dispositivo tiene una o más AWS IoT políticas asociadas. Estas políticas determinan a qué AWS IoT recursos puede acceder el dispositivo. 
+ Un certificado de CA AWS IoT raíz.

  Los dispositivos y otros clientes utilizan un certificado de CA AWS IoT raíz para autenticar el AWS IoT servidor con el que se comunican. Para obtener más información, consulte [Autenticación del servidor](server-authentication.md).
+ Una AWS IoT regla.

  Una regla incluye una consulta y una o varias acciones de regla. La consulta extrae datos de los mensajes del dispositivo para determinar si los datos de los mensajes deben procesarse. La acción de regla especifica qué hacer si los datos coinciden con la consulta.
+ Un tema de Amazon SNS y una suscripción a un tema.

  La regla escucha los datos de humedad del dispositivo Raspberry Pi. Si el valor está por debajo de un umbral, envía un mensaje al tema de Amazon SNS. Amazon SNS envía ese mensaje a todas las direcciones de correo electrónico suscritas al tema.

 



# Paso 1: Crear la AWS IoT política
<a name="iot-moisture-policy"></a>

Crea una AWS IoT política que permita a tu Raspberry Pi conectarse y enviar mensajes a AWS IoT.

1. En la [consola de AWS IoT](https://console.aws.amazon.com/iot), si aparece un botón **Empezar**, elíjalo. De lo contrario, en el panel de navegación, expanda **Seguridad** y, a continuación, elija **Políticas**.

1. Si aparece el cuadro de diálogo **Aún no tiene ninguna política**, elija **Crear una política**. De lo contrario, seleccione **Crear**.

1. Introduzca un nombre para la AWS IoT política (por ejemplo,**MoistureSensorPolicy**).

1. En la sección **Añadir instrucciones**, sustituya la política existente por el siguiente JSON. Sustituya *region* y *account* por su Cuenta de AWS número Región de AWS and.  
****  

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

1. Seleccione **Crear**.

# Paso 2: Crea la AWS IoT cosa, el certificado y la clave privada
<a name="iot-moisture-create-thing"></a>

Crea una cosa en el AWS IoT registro que represente tu Raspberry Pi.

1. En la [consola de AWS IoT](https://console.aws.amazon.com/iot/home), en el panel de navegación, elija **Administrar** y, a continuación, seleccione **Objetos**.

1. Si aparece el cuadro de diálogo **Aún no tiene ningún objeto**, elija **Registrar un objeto**. De lo contrario, seleccione **Crear**.

1. En la página **Crear AWS IoT cosas**, selecciona **Crear una sola cosa**.

1. En la página **Añadir su dispositivo al registro de dispositivos**, escriba un nombre para el objeto de IoT (por ejemplo, **RaspberryPi**) y, a continuación, elija **Siguiente**. No puede modificar el nombre de un objeto una vez creado. Para cambiar el nombre de una cosa, debe crear otra nueva, asignarle el nuevo nombre y eliminar después la anterior.

1. En la página **Agregar un certificado para el objeto**, elija **Crear certificado**.

1. Elija los enlaces **Descargar** para descargar el certificado, la clave privada y el certificado de CA raíz.
**importante**  
Esta es la única vez que puede descargar el certificado y la clave privada.

1. Para activar el certificado, seleccione **Activar**. El certificado debe estar activo para que un dispositivo pueda conectarse a AWS IoT.

1. Elija **Attach a policy (Asociar una política)**.

1. En **Añadir una política para tu cosa**, selecciona y **MoistureSensorPolicy**, a continuación, selecciona **Registrar cosa**.

# Paso 3: Crear un tema y una suscripción a Amazon SNS
<a name="iot-moisture-create-sns-topic"></a>

Cree un tema y una suscripción de Amazon SNS.

1. En la [consola SNS de AWS](https://console.aws.amazon.com/sns/home), en el panel de navegación, seleccione **Temas** y, a continuación, seleccione **Crear tema**.

1. Elija el tipo **Estándar** e introduzca un nombre para el tema (por ejemplo, **MoistureSensorTopic**).

1. Escriba un nombre de visualización para el tema (por ejemplo, **Moisture Sensor Topic**). Este es el nombre que se muestra para el tema en la consola de Amazon SNS.

1. Seleccione **Crear tema**.

1. En la página de detalles del tema de Amazon SNS, seleccione **Crear suscripción**.

1. En **Protocolo**, elija **Correo electrónico**.

1. Para **punto de conexión**, introduzca su dirección de correo electrónico.

1. Seleccione **Crear subscripción**.

1. Abra su cliente de correo electrónico y busque un mensaje con el asunto **MoistureSensorTopic**. Abra el correo electrónico y elija el enlace **Confirmar suscripción**.
**importante**  
No recibirá ninguna alerta por correo electrónico de este tema de Amazon SNS hasta que confirme la suscripción.

Debería recibir un mensaje de correo electrónico con el texto que escribió.

# Paso 4: Crea una AWS IoT regla para enviar un correo electrónico
<a name="iot-moisture-create-rule"></a>

Una AWS IoT regla define una consulta y una o más acciones que se deben realizar cuando se recibe un mensaje de un dispositivo. El motor de AWS IoT reglas escucha los mensajes enviados por los dispositivos y utiliza los datos de los mensajes para determinar si se debe realizar alguna acción. Para obtener más información, consulte [Reglas para AWS IoT](iot-rules.md). 

En este tutorial el dispositivo Raspberry Pi publica mensajes en `aws/things/RaspberryPi/shadow/update`. Se trata de un tema de MQTT interno utilizado por los dispositivos y el servicio Thing Shadow. El Raspberry Pi publica mensajes que tienen el siguiente formato:

```
{
    "reported": {
        "moisture" : moisture-reading,
        "temp" : temperature-reading
    }
}
```

Puede crear una consulta que extraiga los datos de humedad y temperatura del mensaje entrante. También creará una acción de Amazon SNS que tome los datos y los envíe a los suscriptores de temas de Amazon SNS si la lectura de humedad está por debajo de un valor umbral.

**Crear una regla de Amazon SNS**

1. En la [consola de AWS IoT](https://console.aws.amazon.com/iot/home), seleccione **Enrutamiento de mensajes** y, a continuación, selecciona **Reglas**. Si aparece el cuadro de diálogo **You don't have any rules yet (Aún no tiene ninguna regla)**, elija **Create a rule (Crear una regla)**. De lo contrario, seleccione **Crear regla**.

1. En la página de **propiedades de la regla**, introduzca un **nombre de regla**, por ejemplo**MoistureSensorRule**, y proporcione una breve **descripción de la regla**, por ejemplo **Sends an alert when soil moisture level readings are too low**.

1. Seleccione **Siguiente** y configure su sentencia SQL. Elija la **versión SQL** como **23 de marzo de 2016** e introduzca la siguiente AWS IoT sentencia de consulta SQL:

   ```
   SELECT * FROM '$aws/things/RaspberryPi/shadow/update/accepted' WHERE state.reported.moisture < 400
   ```

   Esta instrucción activa la acción de la regla cuando la lectura de `moisture` es menor que `400`.
**nota**  
Es posible que tenga que utilizar un valor diferente. Una vez que el código se ejecute en el dispositivo Raspberry Pi, si toca el sensor, lo coloca en agua o en una maceta, podrá ver los valores que se obtienen del sensor. 

1. Elija **Siguiente** y adjunte las acciones de las reglas. Para la **acción 1**, elija **Servicio de notificación simple**. La descripción de esta acción de regla es **Enviar un mensaje como una notificación push de SNS**.

1. **Para el **tema de SNS**, elija el tema en el que creó y deje el [Paso 3: Crear un tema y una suscripción a Amazon SNS](iot-moisture-create-sns-topic.md) formato **MoistureSensorTopic**del **mensaje** en RAW.** En **Rol de IAM**, elija **Crear un nuevo rol**. Especifique un nombre para el rol (por ejemplo, **LowMoistureTopicRole**) y elija **Crear rol**.

1. Seleccione **Siguiente** para revisarla y, a continuación, seleccione **Crear** para crear la regla.

# Configuración del dispositivo Raspberry Pi y el sensor de humedad
<a name="iot-moisture-raspi-setup"></a>



Inserte la tarjeta micro SD en el Raspberry Pi, conecte el monitor, el teclado, el ratón y, si no utiliza una conexión wifi, el cable Ethernet. No conecte aún el cable de alimentación.

Conecte el cable puente JST al sensor de humedad. El otro lado del puente tiene cuatro cables:
+ Verde: I2C SCL
+ Blanco: I2C SDA
+ Rojo: alimentación (3,5 V)
+ Negro: conexión a tierra

Sujete el dispositivo Raspberry Pi con el enchufe hembra Ethernet a la derecha. En esta orientación hay dos filas de clavijas GPIO en la parte superior. Conecte los cables del sensor de humedad a la fila inferior de clavijas en el orden que se indica a continuación. Comenzando por la clavija del extremo izquierdo, conecte el cable rojo (alimentación), el cable blanco (SDA) y el cable verde (SCL). Omita una clavija y, a continuación, conecte el cable negro (conexión a tierra). Para obtener más información, consulte [Cableado de equipos Python](https://learn.adafruit.com/adafruit-stemma-soil-sensor-i2c-capacitive-moisture-sensor/python-circuitpython-test).

Conecte el cable de alimentación al dispositivo Raspberry Pi y conecte el otro extremo a una toma de corriente para encenderlo.

**Configuración del dispositivo Raspberry Pi**

1. En **Welcome to Raspberry Pi (Bienvenido a Raspberry Pi)**, elija **Siguiente**.

1. Elija el país, el idioma, la zona horaria y la distribución del teclado. Elija **Siguiente**.

1. Escriba una contraseña para el dispositivo Raspberry Pi y, a continuación, elija **Siguiente**.

1. Elija una red wifi y, a continuación, elija **Siguiente**. Si no utiliza una red wifi, elija **Skip (Omitir)**.

1. Elija **Siguiente** para comprobar si hay actualizaciones de software. Cuando se completen las actualizaciones, elija **Restart (Reiniciar)** para reiniciar el dispositivo Raspberry Pi.

Una vez que se inicie el dispositivo Raspberry Pi, habilite la interfaz de I2C.

1. En la esquina superior izquierda del escritorio de Raspbian, elija el icono de Raspberry, elija **Preferencias** y, a continuación, elija **Configuración de Raspberry Pi**.

1. En la pestaña **Interfaces**, en **I2C**, elija **Habilitar**.

1. Seleccione **Aceptar**.

Las bibliotecas del sensor de humedad STEMMA de Adafruit están diseñadas para ello. CircuitPython Para ejecutarlas en un dispositivo Raspberry Pi, debe instalar la última versión de Python 3.

1. Ejecute los siguientes comandos desde un símbolo del sistema para actualizar el software del dispositivo Raspberry Pi:

   `sudo apt-get update`

   `sudo apt-get upgrade`

1. Ejecute el siguiente comando para actualizar la instalación de Python 3:

   `sudo pip3 install --upgrade setuptools`

1. Ejecute el siguiente comando para instalar las bibliotecas de GPIO de Raspberry Pi:

   `pip3 install RPI.GPIO`

1. Ejecute el siguiente comando para instalar las bibliotecas de Adafruit Blinka:

   `pip3 install adafruit-blinka`

   Para obtener más información, consulte [Instalación de CircuitPython bibliotecas en](https://learn.adafruit.com/circuitpython-on-raspberrypi-linux/installing-circuitpython-on-raspberry-pi) Raspberry Pi.

1. Ejecute el siguiente comando para instalar las bibliotecas de Adafruit Seesaw:

   `sudo pip3 install adafruit-circuitpython-seesaw`

1. Ejecute el siguiente comando para instalar el SDK de AWS IoT dispositivos para Python:

   `pip3 install AWSIoTPythonSDK`

El dispositivo Raspberry Pi ahora tiene todas las bibliotecas necesarias. Cree un archivo denominado **moistureSensor.py** y copie el siguiente código Python en el archivo:

```
from adafruit_seesaw.seesaw import Seesaw
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient
from board import SCL, SDA

import logging
import time
import json
import argparse
import busio

# Shadow JSON schema:
#
# {
#   "state": {
#       "desired":{
#           "moisture":<INT VALUE>,
#           "temp":<INT VALUE>            
#       }
#   }
# }

# Function called when a shadow is updated
def customShadowCallback_Update(payload, responseStatus, token):

    # Display status and data from update request
    if responseStatus == "timeout":
        print("Update request " + token + " time out!")

    if responseStatus == "accepted":
        payloadDict = json.loads(payload)
        print("~~~~~~~~~~~~~~~~~~~~~~~")
        print("Update request with token: " + token + " accepted!")
        print("moisture: " + str(payloadDict["state"]["reported"]["moisture"]))
        print("temperature: " + str(payloadDict["state"]["reported"]["temp"]))
        print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")

    if responseStatus == "rejected":
        print("Update request " + token + " rejected!")

# Function called when a shadow is deleted
def customShadowCallback_Delete(payload, responseStatus, token):

     # Display status and data from delete request
    if responseStatus == "timeout":
        print("Delete request " + token + " time out!")

    if responseStatus == "accepted":
        print("~~~~~~~~~~~~~~~~~~~~~~~")
        print("Delete request with token: " + token + " accepted!")
        print("~~~~~~~~~~~~~~~~~~~~~~~\n\n")

    if responseStatus == "rejected":
        print("Delete request " + token + " rejected!")


# Read in command-line parameters
def parseArgs():

    parser = argparse.ArgumentParser()
    parser.add_argument("-e", "--endpoint", action="store", required=True, dest="host", help="Your device data endpoint")
    parser.add_argument("-r", "--rootCA", action="store", required=True, dest="rootCAPath", help="Root CA file path")
    parser.add_argument("-c", "--cert", action="store", dest="certificatePath", help="Certificate file path")
    parser.add_argument("-k", "--key", action="store", dest="privateKeyPath", help="Private key file path")
    parser.add_argument("-p", "--port", action="store", dest="port", type=int, help="Port number override")
    parser.add_argument("-n", "--thingName", action="store", dest="thingName", default="Bot", help="Targeted thing name")
    parser.add_argument("-id", "--clientId", action="store", dest="clientId", default="basicShadowUpdater", help="Targeted client id")

    args = parser.parse_args()
    return args


# Configure logging
# AWSIoTMQTTShadowClient writes data to the log
def configureLogging():

    logger = logging.getLogger("AWSIoTPythonSDK.core")
    logger.setLevel(logging.DEBUG)
    streamHandler = logging.StreamHandler()
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
    streamHandler.setFormatter(formatter)
    logger.addHandler(streamHandler)


# Parse command line arguments
args = parseArgs()

if not args.certificatePath or not args.privateKeyPath:
    parser.error("Missing credentials for authentication.")
    exit(2)

# If no --port argument is passed, default to 8883
if not args.port: 
    args.port = 8883


# Init AWSIoTMQTTShadowClient
myAWSIoTMQTTShadowClient = None
myAWSIoTMQTTShadowClient = AWSIoTMQTTShadowClient(args.clientId)
myAWSIoTMQTTShadowClient.configureEndpoint(args.host, args.port)
myAWSIoTMQTTShadowClient.configureCredentials(args.rootCAPath, args.privateKeyPath, args.certificatePath)

# AWSIoTMQTTShadowClient connection configuration
myAWSIoTMQTTShadowClient.configureAutoReconnectBackoffTime(1, 32, 20)
myAWSIoTMQTTShadowClient.configureConnectDisconnectTimeout(10) # 10 sec
myAWSIoTMQTTShadowClient.configureMQTTOperationTimeout(5) # 5 sec

# Initialize Raspberry Pi's I2C interface
i2c_bus = busio.I2C(SCL, SDA)

# Intialize SeeSaw, Adafruit's Circuit Python library
ss = Seesaw(i2c_bus, addr=0x36)

# Connect to AWS IoT
myAWSIoTMQTTShadowClient.connect()

# Create a device shadow handler, use this to update and delete shadow document
deviceShadowHandler = myAWSIoTMQTTShadowClient.createShadowHandlerWithName(args.thingName, True)

# Delete current shadow JSON doc
deviceShadowHandler.shadowDelete(customShadowCallback_Delete, 5)

# Read data from moisture sensor and update shadow
while True:

    # read moisture level through capacitive touch pad
    moistureLevel = ss.moisture_read()

    # read temperature from the temperature sensor
    temp = ss.get_temp()

    # Display moisture and temp readings
    print("Moisture Level: {}".format(moistureLevel))
    print("Temperature: {}".format(temp))
    
    # Create message payload
    payload = {"state":{"reported":{"moisture":str(moistureLevel),"temp":str(temp)}}}

    # Update shadow
    deviceShadowHandler.shadowUpdate(json.dumps(payload), customShadowCallback_Update, 5)
    time.sleep(1)
```

Guarde el archivo en un lugar donde pueda encontrarlo. Ejecute `moistureSensor.py` desde la línea de comandos con los siguientes parámetros:

punto de conexión  
Tu AWS IoT punto final personalizado. Para obtener más información, consulte [API REST de sombra de dispositivo](device-shadow-rest-api.md).

rootCA  
La ruta completa a su certificado de CA AWS IoT raíz.

cert  
La ruta completa al certificado de su AWS IoT dispositivo.

clave  
La ruta completa a la clave privada AWS IoT del certificado de su dispositivo.

thingName  
El nombre de la cosa (en este caso, `RaspberryPi`).

clientId  
El ID de cliente de MQTT. Utilice `RaspberryPi`.

La línea de comandos debería tener este aspecto:

`python3 moistureSensor.py --endpoint your-endpoint --rootCA ~/certs/AmazonRootCA1.pem --cert ~/certs/raspberrypi-certificate.pem.crt --key ~/certs/raspberrypi-private.pem.key --thingName RaspberryPi --clientId RaspberryPi`

Pruebe a tocar el sensor, colocarlo en una maceta o ponerlo en un vaso de agua para ver cómo responde a distintos niveles de humedad. Si es necesario, puede cambiar el valor del umbral en la opción `MoistureSensorRule`. Cuando la lectura del sensor de humedad es inferior al valor especificado en la declaración de consulta SQL de la regla, AWS IoT publica un mensaje en el tema Amazon SNS. Debería recibir un mensaje de correo electrónico que incluya los datos de humedad y temperatura.

Una vez que haya verificado la recepción de los mensajes de correo electrónico de Amazon SNS, pulse **CTRL\$1C** para detener el programa Python. Es poco probable que el programa Python envíe suficientes mensajes para incurrir en gastos, pero se recomienda detener el programa cuando haya terminado.