Dans ce mini-projet, il s’agit de transmettre les informations de température et hygrométrie d’une pièce à un serveur du réseau The Things Networks à l’aide à l’aide du protocole LoRaWAN.
Sommaire
Etape 1 Accéder au réseau The Things Network (TTN)
Etape 2 Récupérer les données de température et humidité du DHT11
Etape 3 Envoi des données de température et humidité sur le serveur TTN
Matériel/logiciel :
- LoPy4 + Expansion Board 3.1 de Pycom
- Antenne LoRa
- Capteur de température DHT11
- Des fils
- Gateway LoRaWAN en fonctionnement et à proximité qui permet la couverture réseau, existante ou à fabriquer soi-même (tuto à venir …)
- VSCode pour la programmation en python
Etape 1 Accéder au réseau The Things Network (TTN)
a) Découverte du réseau TTN et de la plateforme web
La figure 1 présente l’architecture classique d’un réseau LoRaWAN, dite en étoile. Chaque noeud (ou end device) peut être connecté à plusieurs passerelles (gateways), qui sont elles-mêmes connectées à un serveur d’application qui va collecter, choisir voire, traiter les données. Les gateways ne font que relayer les paquets de données. Si le serveur d’application reçoit plusieurs fois le même paquet en provenance de plusieurs passerelles, il est capable de choisir celui avec la meilleure qualité de signal.
Il existe plusieurs réseaux publics d’opérateurs LoRaWAN. Dans ce mini-projet, nous choisissons le réseau The Things Network (TTN), qui est un réseau public open-source, qui peut être utilisé sans contrainte commerciale ou privée.
L’équipe pédagogique a préalablement déclaré les noeuds LoPy4 sur l’interface de TTN appelée, The Things Stack Community Edition.
Exemple de tutorial pour déclarer un device de type LoPy4 (lien vers tuto spécifique).
Demandez login et mdp à l’enseignant.e présent.e pour accéder à la plateforme [4].
Les devices sont nommés selon leur adresse MAC (voir Bien démarrer avec la LoPy4 pour lire l’adresse MAC [19]). Avant toute chose identifiez votre device en lisant son adresse MAC.
Dans l’application tp-lora-cooc de la plateforme The Things Stack Community Edition [4], repérez votre device et cliquez pour obtenir des informations supplémentaires :
Notez la valeur de AppEUI, DevEUI et AppKey. Les 3 éléments permettent de mettre en place une connexion LoRaWAN sécurisée avec le serveur TTN.
Dans l’onglet Live data, vous observerez plus tard les données qui sont remontées de votre noeud (uplink) ou qui sont envoyées à votre noeud (downlink). Dans l’onglet Messaging, vous pouvez simuler l’envoi de données uplink au serveur, vous pouvez également programmer des envois de données downlink. Vous pouvez également appliquer un code aux données reçues et envoyées permettant de les formatter pour les rendre lisibles par un humain (Payload formatters).
Toutes ces actions seront expérimentées un peu plus loin.
b) Se connecter au réseau TTN à partir de votre LoPy4 et envoyer vos 1ers paquets
Vous allez connecter votre Lopy4 au réseau TTN et envoyez vos 1ers paquets en uplink sur le réseau TTN.
- Récupérez le code main_template.py sur gitlab [5]
- Modifiez DevEUI et AppKey selon les paramètres indiqués sur la plateforme TTN
- Modifiez le nom en main.py et chargez sur le device
- Observez les print dans la console pymakr ainsi que la couleur de la LED qui vous indique l’évolution de la connexion
- Une fois la connexion effectuée (CONNECTED!!), observez les messages remontés (payload) sur la plateforme dans l’onglet Live data du device.
Questions
- Quelle est la forme des paquets remontés (payload) dans live data ? Quel est le lien avec les données envoyées de la lopy qui sont sous la forme PKT + entier ? La table de correspondance Decimal <>Hexadecimal<>Caractère ASCII [10] va vous aider. On remarque par exemple que le code hexadécimal du caractère P est 50.
- Utilisez lora.stats() et comparez avec la variable consumed_airtime sur la plateforme en cliquant sur l’évènement (event details)
- Quel est le SNR de la transmission ? lisez la variable SNR dans l’onglet Live data. Observez les variations (min/max).
- Calculez la marge de transmission pour le min et le max à partir du SNR récupéré dans la console et du SNR limit donné ci-dessous pour le SF utilisé (Cf. [7] video 17 slide 16 et vidéo 16 slide 4, supports disponibles en pdf sur Moodle)
Figure. Mobilefish.com – LoRa/LoRaWAN tutorial – SNR limit and Receiver sensibility [7]
5. Quel est le spreading factor ? Varie-t-il pendant la transmission ?
6. À l’initialisation de la transmission, modifiez le spreading factor dans main.py en choisissant SF égal à 10. soit DR=2 [17]
s.setsockopt(socket.SOL_LORA, socket.SO_DR, 2)
Observez l’effet dans la console du device sur la plateforme TTN.
7. Ajoutez la fonctionnalité d’adaptive data rate (adr=True
), observez la variation du SF au cours de la transmission. Expliquez.
lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868, device_class=LoRa.CLASS_C, adr=True)
c) Décrypter les messages envoyés sur la gateway
Dans la console gateway, observez les paquets remontés sur le serveur TTN. En cliquant sur l’event, vous pouvez accéder à différentes informations comme les informations sur la transmission, par exemple :
settings": {
"data_rate": {
"lora": {
"bandwidth": 125000,
"spreading_factor": 12,
"coding_rate": "4/5"
On trouve également des informations sur le paquet transmis
"message": {
"raw_payload": "QDQjCyYAqAAC5OFiPQ/CfAA=",
"payload": {
"m_hdr": {
"m_type": "UNCONFIRMED_UP"
},
"mic": "D8J8AA==",
"mac_payload": {
"f_hdr": {
"dev_addr": "260B2334",
"f_ctrl": {},
"f_cnt": 168
},
"f_port": 2,
"frm_payload": "5OFiPQ=="
}
},
Le MIC ainsi que le DevAddr sont en clair. Par contre, le message est crypté (« 5OFiPQ=="
).
Sur [18] (LoRaWAN 1.0.x packet decoder), vous pouvez décoder le raw_payload de votre message :
Questions
- Après décodage, identifiez le
Message Type
;DevAddr
;FRMPayload
Vérifiez que le
FRMPayload
ne correspond pas au message envoyé (Live data du device). En effet, le message est crypté ! Récupérez laNwkSKey
et laAppSKey
dans la console de votre device (Overview). Entrez-les dans votre décodeur et vérifiez que leFRMPayload
décrypté après décodage est identique au message envoyé.
d) Envoyer des paquets du serveur TTN vers votre Lopy4 (Downlink)
Pour cela, nous allons programmer des envois downlink à partir de la plateforme TTN, onglet Messaging du device.
- Décommentez les lignes de code correspondantes à la réception d’un message dans main.py sur la LoPy4
- Téléversez le code dans la LoPy4
- Après la connexion au réseau TTN, observez la réception du 1er paquet sur l’interface, puis la LoPy est en attente de réception d’un paquet
- Programmez un envoi downlink (exemple FF) dans la console Gateway sur la plateforme TTN
- Observez la réception du paquet sur la LoPy (via le print dans la console pymakr), puis l’envoi d’un nouveau paquet en uplink.
L’attente de réception d’un paquet bloque l’envoi de tout nouveau paquet.
- Programmez l’envoi de plusieurs paquets dans la console (Push to downlink queue)
Si la qualité de la transmission est suffisante, le protocole ADR devrait modifier le Data Rate (SF et puissance d’émission).
e) Décoder le paquet downlink envoyé du serveur vers la LoPy4 et reçu au niveau de la gateway
Comme pour le message Uplink reçu au niveau de la gateway, le message Downlink transmis du serveur vers la gateway est crypté.
On peut lire le DevAddr, le compteur de paquet, Le FRMPayload est encrypté, il est donc différent du message envoyé par la Lopy. En utilisant le NwkSKey (hex-encoded; optional) et le AppSKey, vous pouvez décrypter le paquet envoyé par la Lopy. Vérifiez que le FRMPayload décrypte correspond bien au message envoyé par la Lopy.
Etape 2 Récupérer les données de température et humidité du DHT11
Pour cette étape, nous allons utiliser la LoPy4 uniquement en tant que micro-contrôleur (pas de transmission sans fil) pour récupérer les données du capteur de température et humidité DHT11. La data sheet du capteur est donnée ici [2]. Il est monté sur une carte à 3 broches SE052, dont la data sheet est donnée ici [8].
- Récupérez le dossier DHT11 sur gitlab [9]
- Enregistrer le répertoire en local. L’arborescence et le nom des fichiers doivent être conservés (1 fichier main.py, 1 répertoire lib, 1 fichier dht.py dans le répertoire lib). Supprimez les fichiers cachés en .gitxxx.
- Dans le main.py, identifiez la broche de la LopY qui sera utilisée
- Branchez les fils entre le capteur DHT11 et la LoPy4. S pour signal sur la broche identifiée dans le main.py, – pour GND, VCC pour la broche du milieu sur 3V3. Attention si les fils sont mal branchés la petite led orange de l’expansion board va flasher.
- Téléversez le code (car il faut charger la librairie dht.py)
- Observez les données récupérées dans la console pymakr
- Dans le fichier dht.py, lisez le code correspondant à read(). Comparez avec le chronogramme de communication ci-dessous (extrait de la data sheet [2]). Qu’observe-t-on en sortie de la fonction pulses_get() ? Quels sont les intervalles de temps qui permettent de définir si le capteur envoie un ‘0’ ou un ‘1’ ?
- Repérez le format des données dans la data sheet ([2], p.5), comparez avec la fonction read(). Combien d’octets sont envoyés du capteur vers la Lopy (MCU)? Quels sont les octets qui contiennent les données ? À quoi sert le checksum ?
Etape 3 Envoi des données de température et humidité sur le serveur TTN
Nous allons maintenant intégrer les 2 codes précédents pour envoyer les données de température et humidité sur le serveur TTN.
a) Intégration des 2 codes précédents
À vous de jouer !
Attention au format des données transmises via LoRaWAN. Utilisez la fonction bytes() pour envoyer des octets.
La table de correspondance Decimal <>Hexadecimal<>Caractère ASCII [10] peut vous aider.
Vous devriez voir apparaître quelque chose comme ça dans la console TTN de votre device
Observez le format affiché des données reçues (MAC Payload : 1549).
Comparez avec le format affiché des données envoyées :
Temp : 21
RH : 73
b’\x15I’
Expliquez !
b) Mise en forme des données affichées dans la console : Payload Formatters
Dans l’onglet Payload Formatters de votre device, choisissez Formatter Type > Javascript. Appliquez directement la fonction telle qu’elle est proposée (Save changes) et observez le résultat dans la console. Vous pouvez aussi tester vos modifications dans la fenêtre Test en appliquant une valeur dans Byte payload.
Puis modifiez la fonction decodeUplink pour permettre l’affichage sous la forme suivante :
Conclusion
Bravo ! Vous êtes allés au bout de ces 3 activités autour de la prise en main des LoPy4 !
Il reste encore plein de choses à découvrir dans le monde de l’IoT. Voici quelques pages d’inspiration :
- un projet très complet qui envoie les données d’une station météo sur la plateforme cloud Ubidots (via WiFI) en utilisant le protocole MQTT (Message Queuing Telemetry Transport), puis envoi des données sur une application Android [11]
- un autre projet du même style mais qui utilise plutôt la plateforme cloud IFTTT, en utilisant l’application IFTTT (dans tous les stores) [12]
- un projet de capteurs pour les plantes qui utilise la plateforme de Pycom, appelée Pybytes, à l’aide d’une connexion WiFI [13]
Plus d’infos sur les plateformes Cloud Ubidots [14] ou Cayenne [15].
Références
[1] « Démarrer avec Lopy4 Pycom | Téléfab ». https://telefab.fr/2021/09/27/demarrer-avec-lopy4-pycom/ (consulté le oct. 19, 2021).
[2] « DHT11.pdf · main · LANGLAIS Charlotte / TP lora COOC », GitLab. https://gitlab.imt-atlantique.fr/clanglai/tp-lora-cooc/-/blob/main/DHT11.pdf (consulté le oct. 19, 2021).
[3] « TTN Mapper ». https://ttnmapper.org/colour-radar/ (consulté le oct. 19, 2021).
[4] « Management platform for The Things Network », The Things Network Console. https://eu1.cloud.thethings.network/console (consulté le oct. 19, 2021).
[5] « OTAA/main_template.py · main · LANGLAIS Charlotte / TP lora COOC », GitLab. https://gitlab.imt-atlantique.fr/clanglai/tp-lora-cooc/-/blob/main/OTAA/main_template.py (consulté le oct. 19, 2021).
[6] « LoRa ». https://docs.pycom.io/firmwareapi/pycom/network/lora/ (consulté le oct. 19, 2021).
[7] « Mobilefish.com – LoRa/LoRaWAN tutorial. » https://www.mobilefish.com/developer/lorawan/lorawan_quickguide_tutorial.html (consulté le oct. 19, 2021).
[8] GO TRONIC, « Capteur de t° et d’humidité DHT11 ST052 », GO TRONIC. Consulté le: 16 septembre 2024. [En ligne]. Disponible sur: https://www.gotronic.fr/art-capteur-de-t-et-d-humidite-dht11-st052-26117.htm
[9] « DHT11 · main · LANGLAIS Charlotte / TP lora COOC », GitLab. https://gitlab.imt-atlantique.fr/clanglai/tp-lora-cooc/-/tree/main/DHT11 (consulté le oct. 19, 2021).
[10] « Fichier:ASCII-Table-wide.svg — Wikipédia ». https://commons.wikimedia.org/wiki/File:ASCII-Table-wide.svg(consulté le oct. 19, 2021).
[11] « Tutorial on how to build a Pycom LoPy4 weather station », HackMD. https://hackmd.io/@ehTrKNe5RYyySf6QXbWMWA/ByVCoGFAU (consulté le oct. 19, 2021).
[12] « Automating a floor fan with DHT11 sensor », HackMD. https://hackmd.io/@abbeabbe/ByNXPfGyv (consulté le oct. 19, 2021).
[13] « Plant Sensor », Hackster.io. https://www.hackster.io/55480/plant-sensor-a9937f (consulté le oct. 19, 2021).
[14] « Ubidots ». https://www.thethingsindustries.com/docs/integrations/cloud-integrations/ubidots/ (consulté le oct. 19, 2021).
[15] « Cayenne ». https://www.thethingsindustries.com/docs/integrations/cloud-integrations/cayenne/ (consulté le oct. 19, 2021).
[16] « LoRa et LoRaWAN pour l’internet des objets ». Udemy. https://www.udemy.com/course/lora-et-lorawan-pour-linternet-des-objets/learn/lecture/20927430#overview (consulté le oct. 3, 2022).
[17] « Méthodes et constructeur de la classe LoRa ». https://docs.pycom.io/firmwareapi/pycom/network/lora/
[18] « Lora Packet Decoder ». Consulté le: 4 octobre 2024. [En ligne]. Disponible sur: https://lora-packet.vercel.app/