Le Blog Amazon Web Services

Construisez votre solution de surveillance de la température de l’eau de votre piscine avec AWS

J’habite à Toulouse, dans le sud de la France, où le climat est classé comme subtropical humide (Cfa dans la classification climatique de Köppen). C’est pourquoi les piscines sont si courantes ici ! Mon foyer ne fait pas exception. Mais en tant que geek, je voulais aussi surveiller la température de ma piscine, consulter les indicateurs en temps réel et voir leur historique.

Plongeons ensemble dans cette aventure. Dans cet article, j’illustre comment assembler les services AWS pour construire de manière efficace une solution de surveillance de la température de l’eau. En suivant cette démonstration, vous apprendrez des outils utiles non seulement pour construire votre propre solution de monitoring, mais aussi d’autres solutions de surveillance créatives.

Une version audio de ce contenu existe aussi, vous pouvez écouter cet épisode du podcast AWS en français où j’explique ce projet à Sébastien Stormacq.

Prérequis

J’avais un M5StickC avec un HAT NCIR, et un compte AWS avec AWS IoT Core, Amazon Timestream et Amazon Managed Service for Grafana : tout ce dont j’avais besoin pour commencer !

Aperçu des composants

M5StickC est une mini M5Stack, fonctionnant sur ESP32. Il s’agit d’une plateforme de développement IoT portable, facile à utiliser et Open Source. Le M5Stick C est l’un des principaux dispositifs de la série de produits M5Stack. Il est construit dans un écosystème matériel et logiciel en croissance continue. Il dispose de nombreux modules et unités compatibles, ainsi que du code source ouvert et des communautés d’ingénieurs qui vous aideront à progresser plus vite à chaque étape du processus de développement.

Le HAT NCIR est un capteur infrarouge compatible M5StickC. Ce module HAT intègre le composant MLX90614 qui peut être utilisé pour mesurer la température à la surface d’un corps humain ou d’un autre objet. Ce capteur mesure la lumière infrarouge qui rebondit sur des objets distants, il peut donc détecter la température sans avoir à les toucher physiquement.

AWS IoT Core vous permet de connecter des périphériques IoT au Cloud AWS sans avoir à allouer ou gérer de serveurs. AWS IoT Core peut prendre en charge des milliards d’appareils et des trillions de messages. Il peut les traiter et les acheminer de manière fiable et sécurisée vers des points de terminaison AWS et d’autres appareils. Avec AWS IoT Core, vos applications peuvent communiquer avec tous vos appareils et assurer leur suivi à tout moment, même lorsqu’ils ne sont pas connectés.

Amazon Timestream est un service de base de données de séries chronologiques rapide, évolutive et sans serveur pour l’IoT et les applications opérationnelles. Il facilite le stockage et l’analyse de milliers de milliards d’événements par jour, jusqu’à 1 000 fois plus vite que les bases de données relationnelles et pour un dixième du coût.

Amazon Managed Service for Grafana (AMG) est un service entièrement géré qui est développé conjointement avec Grafana Labs et basé sur la plateforme Open Source Grafana. Amélioré par des fonctionnalités d’entreprise, AMG vous permet de visualiser et d’analyser facilement vos données opérationnelles à l’échelle. Grafana est une plateforme d’analyse Open Source populaire qui vous permet d’interroger, de visualiser, d’alerter et de comprendre vos mesures, quel que soit l’endroit où elles sont stockées.

Architecture de la solution

Le schéma suivant montre le flux d’informations, partant du M5stickC, passant par AWS IoT Core puis Timestream, jusqu’aux utilisateurs finaux qui consultent le tableau de bord dans AMG.

Schéma d'architecture montrant le flux de données provenant de M5StickC, IoT Core, Timestream, et AMG jusqu'aux utilisateurs finaux.

Configuration d’AWS IoT Core

Nous allons commencer par les étapes suivantes :

  • Création de la politique de sécurité AWS IoT Core
  • Création des objets connectés, y compris :
    • Création du certificat,
    • Attachement de la politique de sécurité.

Création de la policy

Une politique de sécurité AWS IoT Core vous permet de contrôler l’accès aux opérations AWS IoT Core qui vous permettent de vous connecter au bus de messages AWS IoT Core ainsi qu’envoyer et recevoir des messages MQTT.

  1. Ouvrez la console de gestion de votre compte AWS,
  2. Naviguez vers le service AWS IoT Core, puis ouvrez la section Sécurité > Politiques,
  3. Sélectionnez Créer.
  4. Saisissez les valeurs suivantes:
    • Nom : TempCheckerPolicy
    • Déclarations > Avancé
      {
        "Version": "2012-10-17",
        "Statement": [
          {
            "Effect": "Allow",
            "Action": "iot:Publish",
            "Resource": "arn:aws:iot:<region>:<account-id>:topic/TempCheckerTopic"
          },
          {
            "Effect": "Allow",
            "Action": "iot:Subscribe",
            "Resource": "arn:aws:iot:<region>:<account-id>:topicfilter/TempCheckerTopic"
          },
          {
            "Effect": "Allow",
            "Action": "iot:Connect",
            "Resource": "*"
          }
        ]
      }
      

      Capture d'écran de la sélection de l'action.

  5. Sélectionnez Créer.

Création de l’objet connecté

  1. Dans la console de gestion AWS, ouvrez AWS IoT Core.
  2. Dans la section Gérer > Objets, sélectionnez Créer,
  3. Sélectionnez Créer un objet unique
    Capture d'écran du démarrage de la création d'un objet AWS IoT.
  4. Créez un type d’objet avec les informations suivantes :
    • Nom: M5Stick,
    • Description : An M5StickC with NCIR hat
      Capture d'écran du formulaire de création de type d'objet.
  5. Sélectionnez Créer un type d’objet,
  6. Sur la page suivante, remplissez le formulaire de création d’objet avec les informations suivantes :
    • Nom: TempChecker
    • Type d’objet : sélectionnez M5Stick
  7. Sélectionnez Suivant.
    Capture d'écran du formulaire permettant d'ajouter votre appareil au registre d'objets.

Ajouter un certificat pour votre objet et joindre une politique

  1. Dans le panneau “Création de certificat en un clic (recommandé)”, sélectionnez Créer un certificat.
    Capture d'écran du début de la création de la certificat.
    Le certificat est immédiatement créé.
  2. Téléchargez le certificat, ainsi que les clés publiques et privées.
  3. Sélectionnez Attacher une politique.
    Screenshot of the certificate created.
  4. Sélectionnez la politique TempCheckerPolicy, puis sélectionnez Enregistrer l’objet.
    Screenshot of the thing registration completion.

Configuration du M5Stick

Maintenant que AWS IoT Core est prêt à recevoir des messages IoT (MQTT), occupons-nous de l’objet lui-même.

Le M5Stick prend en charge plusieurs plateformes de développement : UIFlow, Arduino, et FreeRTOS. Dans ce cas d’utilisation, j’ai utilisé les capacités de programmation visuelle d’UIFlow (utilisant Blockly+Python) ainsi que sa bibliothèque intégrée AWS IoT pour construire et déployer facilement ma logique métier.

Remarque : vous pouvez trouver plus d’informations ici sur la façon d’installer l’IDE UIFlow et de déployer le micrologiciel UIFlow sur le M5StickC.

Nous devons construire et déployer un programme sur le M5Stick qui fonctionnera en continu. Il contient toutes les instructions nécessaires pour récupérer les données du capteur de température et les envoyer à AWS IoT Core. L’algorithme est simple :

  • Initialiser la communication avec AWS IoT Core,
  • Initialiser l’horloge interne du M5StickC avec NTP,
  • Démarrer une boucle qui se répète toutes les secondes avec ce qui suit :
    • Obtenir la température du chapeau NCIR,
    • Publier un message au format JSON contenant la température et l’horodatage actuel.

J’ai ajouté une indication visuelle de la température sur l’écran LCD, ainsi que des signaux LED avec la publication de messages MQTT.

Comme le dit Werner Vogels, CTO d’AWS, “everything fails all the time” (tout peut échouer à tout moment), donc pour réduire les erreurs, j’ai ajouté des composants try-catch pour déboguer et reprendre en cas d’erreur.

Dans le bloc AWS IoT, utilisez les fichiers de clé privée et de certificat que vous venez de télécharger pour définir les valeurs keyFile et certFile.

Capture d'écran de l'algorithme UIFlow.

UIFlow traduit les blocs en micropython.

from m5stack import *
from m5ui import *
from uiflow import *
from IoTcloud.AWS import AWS
import ntptime
import hat
import json
import time
import hat

setScreenColor(0x111111)
hat_ncir5 = hat.get(hat.NCIR)
iterator = None
temperature = None
label0 = M5TextBox(5, 72, "1", lcd.FONT_Default, 0xFFFFFF, rotate=0)

from numbers import Number

try :
  aws = AWS(things_name='TempChecker', host='<endpoint>.iot.eu-west-1.amazonaws.com', port=8883, keepalive=300, cert_file_path="/flash/res/c47c10a25d-certificate.pem", private_key_path='')
  aws.start()
  try :
    ntp = ntptime.client(host='pool.ntp.org', timezone=2)
    iterator = 1
    while True:
      temperature = hat_ncir5.temperature
      M5Led.on()
      try :
        aws.publish(str('TempCheckerTopic'),str((json.dumps(({'Temperature':temperature,'Iterator':iterator,'Timestamp':(ntp.getTimestamp())})))))
        iterator = (iterator if isinstance(iterator, Number) else 0) + 1
        label0.setText(str(temperature))
        pass
      except:
        label0.setColor(0xff0000)
        label0.setText('IoT error')
      M5Led.off()
      wait(1)
    pass
  except:
    label0.setColor(0xff0000)
    label0.setText('NTP error')
  pass
except:
  label0.setColor(0xff0000)
  label0.setText('AWS error')

Configuration d’Amazon Timestream

Nous allons maintenant configurer le stockage de nos données de température. Amazon offre le plus grand choix de bases de données spécialisées pour répondre à différents cas d’utilisation. Dans ce cas, le bon outil est Amazon Timestream.

Notre cas d’utilisation est clairement lié aux données de séries chronologiques. Timestream est le service dédié à la manipulation de ce type de données à l’aide de SQL, avec des fonctions intégrées de séries chronologiques pour le lissage, l’approximation et l’interpolation. Amazon Timestream prend également en charge les agrégats avancés, les fonctions de fenêtre et les types de données complexes tels que les tableaux et les rangées. Et Amazon Timestream fonctionne sans serveur – il n’y a pas de serveurs à gérer ni de capacité à fournir. Plus d’informations dans la documentation.

Créer une base de données dans Timestream

  1. Ouvrez Timestream dans la console de gestion AWS.
  2. Sélectionnez Créer une base de données.
  3. Saisissez les informations suivantes :
    • Configuration : Standard database
    • Nom : TempCheckerDatabase
    • Chiffrement : aws/timestream
  4. Confirmez en sélectionnant Créer la base de données.
    Capture d'écran du formulaire de création de la base de données.

Créer une table

À la page suivante, nous créons notre table.

  1. Sélectionnez votre base de données nouvellement créée, ouvrez l’onglet Tables, puis sélectionnez Créer une table.
  2. Définissez les valeurs suivantes :
    • Nom de la table : Temperature
    • Conservation des données :
      • En mémoire : 1 jour
      • Sur support magnétique : 1 an
        Capture d'écran du formulaire de création de table.

Configuration de la destination AWS IoT Core

Notre stockage est prêt à recevoir des données depuis AWS IoT Core.

Configurons la règle IoT qui se déclenche lorsque notre M5StickC envoie des données. Cela permettra d’exécuter l’action d’insertion des données dans Timestream.

  1. Ouvrez AWS IoT Core dans la console de gestion AWS.
  2. Dans la section Action > Règles, sélectionnez Créer, puis saisissez les éléments suivants :
    • Nom : TempCheckerRule
    • Description : Règle permettant de traiter les messages de température
    • Requête : SELECT Temperature FROM 'TempCheckerTopic'
      Capture d'écran du formulaire de création de règles.
  3. Dans le panneau “Configurer une ou plusieurs actions”, sélectionnez Ajouter une action. Sélectionnez Ecrire un message dans une table Timestream, puis Configurer l’action.
    Screenshot of the action selection.
  4. Sélectionnez la base de données et la table Timestream que nous venons de créer. Ajoutez la dimension suivante :
    • Nom de la dimension : Device
    • Valeur de la dimension : M5stick
  5. Ensuite, nous devons créer un rôle AWS IAM pour permettre au service d’accéder à la base de données. Sélectionnez Créer un rôle, puis saisissez les éléments suivants :
    • Nom : TempCheckerDatabaseRole
      Capture d'écran du formulaire de création de rôle de base de données.
  6. Vérifiez vos sélections, puis confirmez l’action en sélectionnant Ajouter une action.Capture d'écran du formulaire de création d'action.
  7. Dans le panneau ” Action d’erreur”, sélectionnez Ajouter une action. Sélectionnez Envoyer les données du message aux journaux de CloudWatch, puis sélectionnez Configurer l’action.
    Capture d'écran de la sélection de l'action en cas d'erreur.
  8. Sélectionnez Créer une nouvelle ressource à rediriger vers Cloudwatch.
  9. Créez un groupe de journaux nommé TempCheckerRuleErrors.
  10. Dans l’assistant de configuration de l’action, rafraîchissez la liste des ressources et sélectionnez le groupe de journaux nouvellement créé.
  11. Nous devons créer un rôle AWS IAM pour permettre au service d’accéder à Cloudwatch. Sélectionnez Créer un rôle, puis saisissez le nom suivant :
    • Nom : TempCheckerCloudwatchRole
      Capture d'écran du formulaire de création de rôle Cloudwatch.
  12. Confirmez l’action en sélectionnant Ajouter l’action.
    Capture d'écran de l'achèvement de la création de l'action.
  13. Confirmez la création de la règle en sélectionnant Créer une règle.
    Capture d'écran de l'achèvement de la création de la règle.

Nous avons maintenant une règle valide qui alimente la base de données Timestream avec les données de température envoyées par le M5StickC.

Configuration d’Amazon Managed Service pour Grafana

Ensuite, visualisons ces données.

  1. Ouvrez la console AMG, puis choisissez Créer un espace de travail et entrez ce qui suit :
    • Nom de l’espace de travail : TempCheckerWorkspace
  2. Choisissez Suivant.
    Capture d'écran du formulaire de création d'un espace de travail.
    Vous êtes invité à activer AWS Single Sign-On (SSO) avant de pouvoir commencer à le gérer. Si vous avez déjà effectué ces actions dans votre compte AWS, vous pouvez sauter cette étape.
    Capture d'écran du formulaire d'activation d'AWS SSO.
    AMG s’intègre à AWS SSO afin que vous puissiez facilement attribuer des utilisateurs et des groupes à partir de votre répertoire d’utilisateurs existant, tel qu’Active Directory, LDAP ou Okta, au sein de l’espace de travail Grafana et procéder à une authentification unique à l’aide de votre ID utilisateur et de votre mot de passe existants. Vous pouvez trouver plus d’informations dans cet article en anglais.
  3. Sélectionnez Créer un utilisateur.
  4. Saisissez votre adresse e-mail, ainsi que votre prénom et votre nom, puis confirmez en sélectionnant Créer l’utilisateur.
    Capture d'écran du formulaire de création d'un utilisateur.
    AWS Organization et AWS SSO devraient être activés en quelques secondes. Vous recevrez plusieurs emails en parallèle : un pour la validation de la configuration de AWS Organization, et un pour la validation de la configuration de AWS SSO. N’oubliez pas de les consulter et de suivre les étapes de validation.
  5. Pour le type de permission, utilisez les permissions gérées par service par défaut, permettant à AWS de gérer les rôles IAM. Cela garantit que les évolutions dans AMG qui nécessitent des mises à jour dans IAM seront automatiquement propagées et que le service ne sera pas interrompu. Sélectionnez Suivant.Capture d'écran du formulaire de configuration de l'authentification.
  6. Comme mon projet est personnel, je peux utiliser “Compte actuel” pour gérer les autorisations de ce compte AWS. Les organisations complexes préféreront utiliser leurs unités d’organisation AWS.
  7. Pour autoriser notre espace de travail à accéder à la source de données Timestream, sélectionnez Amazon TimeStream, puis sélectionnez Suivant.
    Capture d'écran du formulaire de configuration des autorisations gérées et des sources de données.
    Un panneau d’avertissement devrait apparaître, indiquant “vous devez assigner un ou plusieurs utilisateurs ou groupes d’utilisateurs avant qu’ils puissent accéder à la console Grafana”. Pour affecter des utilisateurs, procédez comme suit :
  8. Sélectionnez Assigner un utilisateur.
  9. Sélectionnez l’utilisateur que vous venez de créer et confirmez en sélectionnant Assigner l’utilisateur.
    Capture d'écran du formulaire de configuration des utilisateurs.

Une fois l’espace de travail Grafana créé, le lien sera fourni sur cette page.

Configurer un tableau de bord Grafana

  1. Connectez-vous avec AWS SSO.
  2. Sur la page d’accueil, naviguez jusqu’à Créer > Tableau de bord.
    Capture d'écran de la page d'accueil de Grafana avec le menu Créer déplié.

Dans Grafana, chaque tableau de bord contient un ou plusieurs panneaux. Le panneau est le bloc de construction de base. À l’exception de quelques panneaux à usage spécial, un panneau est une représentation visuelle de données dans le temps. Cela peut aller des fluctuations de température à l’état actuel d’un serveur en passant par une liste de journaux ou d’alertes. Il existe une grande variété d’options de style et de formatage pour chaque panneau. Les panneaux peuvent être déplacés, réorganisés et redimensionnés.

Nous commençons par ajouter un panneau pour l’affichage de la température en temps réel. Pour cela, une jauge nous donnera un aperçu rapide et coloré.

Configurer un panneau de jauge de température

  1. Ajoutez un nouveau panneau et sélectionnez Amazon Timestream comme source de données.
  2. Saisissez la requête suivante pour récupérer la dernière valeur de température insérée dans la base de données :
    SELECT measure_value::double AS temperature
    FROM "TempCheckerDatabase".Temperature
    ORDER BY time DESC
    LIMIT 1
    

    Capture d'écran de la configuration de la requête pour le panneau de la jauge de température.

  3. À droite, dans la configuration du panneau, définissez le nom du panneau comme “Surveillance en temps réel” et sélectionnez la visualisation de type Jauge.
    Capture d'écran de la sélection du type de visualisation.
  4. Dans la configuration du Champ, définissez les options Min et Max, ainsi que les seuils pertinents. J’ai choisi un arc-en-ciel progressif allant du bleu au rouge au fur et à mesure que la température augmente.
    Capture d'écran du formulaire de configuration des champs.
    Capture d'écran de la configuration des seuils.
  5. Sélectionnez Enregistrer, et vous verrez votre jauge.
    Capture d'écran du panneau de la jauge de température entièrement configuré.

Configurer un panneau d’historique de température

Le deuxième panneau est un panneau d’historique de température qui récupérera les données historiques, filtrées par la période sélectionnée par l’utilisateur dans Grafana.

  1. Ajoutez un panneau et sélectionnez Amazon Timestream comme source de données.
  2. Saisissez la requête suivante afin d’interroger la base de données avec les filtres pertinents :
    SELECT ROUND(AVG(measure_value::double), 2) AS avg_temperature, BIN(time, $__interval_ms) AS binned_timestamp
    FROM "TempCheckerDatabase".Temperature
    WHERE $__timeFilter
    AND measure_value::double < 100
    AND measure_value::double > 20
    GROUP BY BIN(time, $__interval_ms)
    ORDER BY BIN(time, $__interval_ms)
    

    Capture d'écran de la configuration de la requête pour le panneau de l'historique des températures.

  3. À droite, dans la configuration du panneau, définissez le titre du panneau sur Tendance et sélectionnez la visualisation de type Graphique.
    Capture d'écran de la sélection du type de visualisation.
  4. Sélectionnez Appliquer pour finaliser le deuxième panneau.
    Capture d'écran du panneau de l'historique des températures entièrement configuré.

Nous avons maintenant créé deux panneaux dans notre tableau de bord Grafana : un qui affiche la température actuelle sur une jauge et un qui affiche l’historique de la température sur un graphique.

Tarification

Pour comprendre le coût de ce projet en utilisant les services de paiement à l’usage d’AWS, nous allons utiliser les hypothèses suivantes :

  • Le M5StickC est connecté en permanence pour envoyer 1 message par seconde.
  • Chaque message IoT est écrit dans la base de données des séries temporelles, pour environ 40 octets chacun.
  • 1 licence Grafana Editeur active, car je suis le seul utilisateur de mon tableau de bord personnel.

Répartition des coûts

(Remarque : veuillez consulter les pages de tarification suivantes pour vous assurer de la tarification actuelle)

Coût total

Le coût mensuel total de notre solution complète est de 3,42 $ + 1,64 $ + 9,00 $ = 14,06 $/mois.

Suppression des ressources

Si vous avez suivi cette procédure, effectuez les étapes suivantes pour éviter d’encourir des frais non désirés sur votre compte AWS.

AWS IoT Core

  • Dans la section Gérer, supprimez l’objet et le type d’objet.
  • Dans la section Sécurité, supprimez la politique et le certificat.
  • Dans la section Action, nettoyez la règle.

Amazon Timestream

  • Supprimez la base de données, cela supprimera également la table.

Amazon Managed Service for Grafana

  • Supprimez l’ensemble de l’espace de travail.

AWS IAM

  • Supprimez les rôles créés en cours de route.

Amazon CloudWatch

  • Supprimez les groupes de journaux pertinents.

Conclusion

Dans ce billet, j’ai fait la démonstration de comment mettre en place une solution simple de bout en bout pour surveiller la température de votre piscine. La solution a nécessité un codage minimal : seulement 2 requêtes SQL pour Grafana. Si vous voulez l’essayer, vous pouvez simuler le M5stickC en créant une fonction AWS Lambda dans votre compte AWS avec le code suivant. Donnez-lui un rôle IAM avec des droits d’accès à AWS IoT Core.

import boto3
import datetime
import time
import math
import json

iot_client=boto3.client('iot-data')
topic = "TempCheckerTopic"

def lambda_handler(event, context):

    i = 0
    while i < 800:
        i += 1 
      
        # Calculating seconds from midnight
        now = datetime.datetime.now()
        midnight = now.replace(hour=0, minute=0, second=0, microsecond=0)
        seconds = (now - midnight).seconds
        
        # Calculating fake temperature value
        temperature = round(math.sin(seconds/600) * 5 + 25, 2)
    
        # Preparing payload
        payload = json.dumps({"Iterator": i,
                              "Temperature": temperature,
                              "Timestamp": now.timestamp()})
                              
        # Publishing to IoT Core
        iot_client.publish(topic=topic, payload=payload)
        
        # Waiting for 1 second before next value
        time.sleep(1)

    return {
        'statusCode': 200
    }

Merci d’avoir lu cet article de blog où j’ai démontré comment utiliser AWS IoT Core, Timestream et AMG ensemble pour construire une solution intelligente de surveillance de la température de l’eau pour ma piscine. J’espère que la démonstration et les leçons apprises vous inspireront pour donner vie à vos idées innovantes ! Apprenez-en davantage sur les solutions AWS IoT pour la maison connectée.

À propos de l’auteur

Jérôme Gras est architecte de solutions chez AWS. Il est passionné par l’idée d’aider les clients industriels à créer des applications évolutives, sécurisées et rentables pour atteindre leurs objectifs métier. En dehors du travail, Jérôme aime bricoler, les jeux vidéo et les jeux de société en famille.