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.
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.
- Ouvrez la console de gestion de votre compte AWS,
- Naviguez vers le service AWS IoT Core, puis ouvrez la section Sécurité > Politiques,
- Sélectionnez Créer.
- 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": "*" } ] }
- Sélectionnez Créer.
Création de l’objet connecté
- Dans la console de gestion AWS, ouvrez AWS IoT Core.
- Dans la section Gérer > Objets, sélectionnez Créer,
- Sélectionnez Créer un objet unique
- Créez un type d’objet avec les informations suivantes :
- Nom: M5Stick,
- Description : An M5StickC with NCIR hat
- Sélectionnez Créer un type d’objet,
- Sur la page suivante, remplissez le formulaire de création d’objet avec les informations suivantes :
- Nom: TempChecker
- Type d’objet : sélectionnez M5Stick
- Sélectionnez Suivant.
Ajouter un certificat pour votre objet et joindre une politique
- Dans le panneau « Création de certificat en un clic (recommandé) », sélectionnez Créer un certificat.
Le certificat est immédiatement créé. - Téléchargez le certificat, ainsi que les clés publiques et privées.
- Sélectionnez Attacher une politique.
- Sélectionnez la politique TempCheckerPolicy, puis sélectionnez Enregistrer l’objet.
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.
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
- Ouvrez Timestream dans la console de gestion AWS.
- Sélectionnez Créer une base de données.
- Saisissez les informations suivantes :
- Configuration : Standard database
- Nom : TempCheckerDatabase
- Chiffrement : aws/timestream
- Confirmez en sélectionnant Créer la base de données.
Créer une table
À la page suivante, nous créons notre table.
- Sélectionnez votre base de données nouvellement créée, ouvrez l’onglet Tables, puis sélectionnez Créer une table.
- 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
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.
- Ouvrez AWS IoT Core dans la console de gestion AWS.
- 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'
- 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.
- 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
- 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
- Nom : TempCheckerDatabaseRole
- Vérifiez vos sélections, puis confirmez l’action en sélectionnant Ajouter une action.
- 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.
- Sélectionnez Créer une nouvelle ressource à rediriger vers Cloudwatch.
- Créez un groupe de journaux nommé TempCheckerRuleErrors.
- Dans l’assistant de configuration de l’action, rafraîchissez la liste des ressources et sélectionnez le groupe de journaux nouvellement créé.
- 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
- Nom : TempCheckerCloudwatchRole
- Confirmez l’action en sélectionnant Ajouter l’action.
- Confirmez la création de la règle en sélectionnant Créer une 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.
- Ouvrez la console AMG, puis choisissez Créer un espace de travail et entrez ce qui suit :
- Nom de l’espace de travail : TempCheckerWorkspace
- Choisissez Suivant.
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.
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. - Sélectionnez Créer un utilisateur.
- Saisissez votre adresse e-mail, ainsi que votre prénom et votre nom, puis confirmez en sélectionnant Créer l’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. - 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.
- 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.
- Pour autoriser notre espace de travail à accéder à la source de données Timestream, sélectionnez Amazon TimeStream, puis sélectionnez Suivant.
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 : - Sélectionnez Assigner un utilisateur.
- Sélectionnez l’utilisateur que vous venez de créer et confirmez en sélectionnant Assigner l’utilisateur.
Une fois l’espace de travail Grafana créé, le lien sera fourni sur cette page.
Configurer un tableau de bord Grafana
- Connectez-vous avec AWS SSO.
- Sur la page d’accueil, naviguez jusqu’à Créer > Tableau de bord.
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
- Ajoutez un nouveau panneau et sélectionnez Amazon Timestream comme source de données.
- 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
- À 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.
- 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.
- Sélectionnez Enregistrer, et vous verrez votre jauge.
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.
- Ajoutez un panneau et sélectionnez Amazon Timestream comme source de données.
- 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)
- À droite, dans la configuration du panneau, définissez le titre du panneau sur Tendance et sélectionnez la visualisation de type Graphique.
- Sélectionnez Appliquer pour finaliser le deuxième panneau.
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)
- AWS IoT Core coûte 3,42 $/mois pour la connectivité, la messagerie et le moteur de règles.
- Amazon Timestream, après 1 an de données stockées, coûtera 1,64 $/mois pour le stockage et les requêtes.
- Amazon Managed Service pour Grafana est facturé 9,00 $/mois pour chaque licence Editeur.
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.