Objectifs pédagogiques

L'objectif principal de ce sujet de travaux pratiques est découvrir les bases de l'IoT (Internet of things – cf. cours, chap. R3‑V ).

On expérimente un objet connecté démonstrateur constitué d'une simple led commandée par une carte à microcontrôleur à module Wi‑Fi. Avec ce système, on doit pouvoir :

  • connaître l'état de la led en temps‑réel (accès au système en « lecture ») ;
  • la piloter en tout‑ou‑rien (accès au système en « écriture ») ;

et ce à distance sur une page web – autrement dit via n'importe quel client HTTP connecté au réseau (poste de travail, smartphone, etc.).

Dans la continuité des choix technologiques de ce module de formation, on opte pour une implémentation du micrologiciel de commande codée en C++ dans l'environnement Arduino. Quant aux pages web de pilotage des objets, on se propose de les implémenter de diverses façons :

  • par des fichiers embarqués HTML et CSS interfacées avec le micrologiciel via des fonctions de callback codées en JavaScript ;
  • par des solutions « low code » comme Jeedom  ou Node‑RED (cf. cours ).

Ce thème et la progression proposée s'inspirent en grande partie d'une série de vidéos didactiques Y publiées par Éric Peronnin, professeur au département GEII de l'IUT de Nantes.

Un objectif secondaire est d'exploiter un routeur Wi‑Fi dont la phase de configuration s'appuie sur les connaissances acquises avec le logiciel Cisco Packet Tracer dans le sujet de TP R3‑1 .

Pour traiter ces exercices, il est recommandé d'avoir étudié les chapitres R3‑IV et R3‑V du cours. Des renvois aux principaux éléments de cours ou à des pages web d'information générale sont donnés au fur et à mesure des questions.

Mise en situation

Environnement

Les manipulations demandées sont à accomplir sur un réseau local (LAN) utilisant la pile de protocoles TCP/IP, raccordé à l'Internet

Attention ! Le traitement des exercices nº 8 & 9 requiert un accès à l'Internet avec un serveur proxy académique transparent. Si tel n'est pas le cas, on peut rencontrer des problèmes d'accès à divers composants logiciels des applications Jeedom et Node‑RED.

En conséquence, par souci d'uniformité, les figures topologiques des exercices nº 4 à 7 ci‑dessous sont représentées avec un accès à l'Internet via une box FAI. Néanmoins, ces exercices peuvent en principe être traités via un réseau pédagogique avec un serveur proxy transparent.

Équipement

  • Un routeur Wi‑Fi – par exemple, le Cisco RV215W  en photo ci‑contre – créera un WLAN avec un point d'accès sans‑fil pour l'objet connecté et pour tout smartphone permettant de contrôler l'objet à distance.
  • Cet équipement n'est pas indispensable si le LAN possède lui‑même un point d'accès sans‑fil dont les identifiants de connexion (SSID et mot de passe) sont connus.
  • Une carte à microcontrôleur à module Wi‑Fi – par exemple, la SBC‑NodeMCU (cf. chap. C1‑III ) en photo ci‑contre – constituera la carte électronique de l'objet connecté. Son micrologiciel (programme utilisateur) pourra embarquer un serveur web.
  • Tout autre modèle à module ESP8266 (par exemple, Wemos D1R1, etc.) programmable avec le logiciel Arduino IDE peut convenir.

    Pour programmer la carte à microcontrôleur, d'autres environnements de développement comme Visual Studio Code ou Community peuvent convenir. Il suffit alors d'adapter les consignes de TP.

  • Une platine d'essai (breadboard) équipée d'une led rouge, d'une résistance de limitation de courant (typiquement 220 Ω), et de deux fils de raccordement à la carte (jumpers), câblés conformément à la figure ci‑contre, prototypera la partie opérative du système.
  • Un nano‑ordinateur Raspberry Pi jouera le rôle de box domotique (exercice 8) puis de broker MQTT (exercice 9). Dans les deux cas, il est préférable qu'un système d'exploitation Raspberry Pi OS lite (sans bureau) soit déjà installé avec l'accès ssh activé pour permettre le contrôle par un terminal de commandes en ligne sur le poste de travail (cf. sujet de TP R2‑2 ).
  • Un poste de travail (typiquement, un PC) servira de terminal de programmation et d'interface de commande de l'objet.
  • Éventuellement, un smartphone sera utile pour montrer la possibilité de contrôle de l'objet connecté par un autre client HTTP raccordé au réseau local.

L'architecture de réseau à constituer doit donc être conforme à la figure ci‑dessous.

Mais dans un premier temps, le poste de travail doit être raccordé au LAN et disposer d'un accès à l'Internet pour pouvoir configurer le routeur.

Travail demandé

Effectuer les manipulations dans l'ordre indiqué et le codage des fonctions demandées en respectant les spécifications indiquées. Pour une bonne organisation, chaque programme est à placer dans un répertoire de projet distinct, et de réunir tous ces répertoires dans un répertoires de TP, typiquement nommé TP_R3-3, lui‑même placé dans le répertoire principal du module RESEAUX, lui‑même placé dans répertoire personnel d'étudiant.

En cas de doute sur un branchement ou une manipulation, ne pas hésiter à solliciter l'enseignant.

  1. Préparation du poste de travail et de l'objet connecté
    1. Réaliser le montage de la partie opérative de l'objet connecté conformément à la figure supra avec la led rouge connectée à la broche D7 de la carte.
    2. Sur le poste de travail, lancer l'application Arduino IDE. Procéder à l'installation des cartes à module ESP8266 si elles ne font pas encore partie de la liste de celles qui sont déjà reconnues par l'application, en suivant la procédure recommandée – cf. chap. C1‑III .
    3. Sur l'IDE, dans le menu Outils/Type de carte, sélectionner alors NodeMCU 1.0 (ESP-12E Module).
    4. Créer un nouveau croquis (sketch) nommé nodemcuTest.ino et l'enregistrer dans un répertoire de projet homonyme, lui‑même dans dans le répertoire de TP. Y coder un programme basique de clignotement la led du montage (cf. chap. C2‑IX ).
      • Déterminer le numéro de la broche du port numérique de la carte à coder dans le programme de clignotement (cf. chap. C2‑VIII ).
      • Téléverser le programme et vérifier sa bonne exécution sur la montage.
    5. Modifier le code source pour vérifier que le moniteur série est opérationnel, en réglant la vitesse de transmission à 115200 baud (cf. chap. C3‑X ). Faire afficher la version du compilateur C++ utilisée par l'IDE (cf. chap. C1‑III ).
  2. Prise en main et configuration du routeur
    1. Configurer le poste de travail en client DHCP (cf. chap. R2‑II ) et supprimer tout recours à un proxy server (serveur mandataire).
    2. En laissant le routeur hors tension, avec des câbles Ethernet, relier l'une des prises RJ45 de son port LAN au poste de travail pour que ce dernier joue dans un premier temps le rôle de terminal de configuration.
    3. Éventuellement, il est déjà possible de relier également le routeur au réseau local (et donc à l'Internet) via la prise RJ45 de son port WAN. Il faut juste que l'adresse de la passerelle par défaut du réseau ne soit pas conflictuelle avec celle qu'adopte par défaut le routeur lorsqu'il est réinitialisé (en effet, ce dernier s'auto‑attribue l'adresse 192.168.1.1 après sa ré‑initialisation).
      Remarque : la liaison à l'Internet rend la procédure de réinitialisation plus rapide, mais elle n'est pas indispensable.
    4. Mettre le routeur sous tension et :
      • attendre l'achèvement de son démarrage – c'est‑à‑dire jusqu'à ce que sa led  ne clignote plus ;
      • avec une pointe de jumper ou un trombone, appuyer au moins 10 secondes sur le bouton Reset ; sa led   clignote durant toute la procédure de réinitialisation.
    5. Sur le poste de travail, vérifier dans les paramètres réseaux que l'interface Ethernet est bien configurée avec l'adresse IP 192.168.1.100 attribuée par défaut par le serveur DHCP du routeur. Si tel n'est pas le cas, désactiver puis réactiver l'interface.
    6. Ensuite, avec un logiciel navigateur, se connecter à l'URL http://192.168.1.1 puis, en passant outre l'avertissement de sécurité, accéder à la page web de connexion au routeur avec les identifiants par défaut (login/mot de passe) cisco/cisco (tout en minuscules).
    7. Annuler la procédure de démarrage rapide et procéder au paramétrage du routeur. Pour plus de détails, on pourra se référer à la notice de l'équipement – cf. le lien suivant .
      • Donner au routeur le nouveau mot de passe proposé par votre enseignant. Avec identifiant associé, le noter dans un fichier pour le retrouver en cas d'oubli ultérieur.
      • Après la déconnexion automatique, se reconnecter au routeur avec le nouveau mot de passe.
      • Dans le menu NetWorking/LAN, donner à l'interface réseau du LAN du routeur une nouvelle configuration IP qui ne puisse être confondue avec celle du réseau pédagogique et qui soit différente de celle prise par défaut lors de la réinitialisation : typiquement, 192.168.x.1/24 avec x ≠ 1. Par exemple, on prendra x = 102030… (un nombre différent pour chaque routeur dans la salle de TP – demander à l'enseignant la valeur de x à choisir).
      • Garder les réglages par défaut du service DHCP du LAN – activé avec une plage de 50 adresses à partir de l'adresse 100.
      • Dans le menu Wireless, cocher la case du premier réseau de la table, cliquer sur le bouton Edit et lui donner l'identifiant (SSID name) ciscoWAPx avec x = 102030… (comme pour les adresses IP ci‑dessus) pour différentier chaque point d'accès mis en œuvre dans la salle de TP. Cliquer sur le bouton Save.
      • Cliquer sur le bouton Edit Security Mode puis :
        • laisser le mode de sécurité par défaut, c'est‑à‑dire WPA2 Personal - TKIP/AES (cf. chap. R3‑IV ) ;
        • saisir la clef de sécurité – c'est‑à‑dire le mot de passe pour l'accès au réseau sans‑fil – proposé par votre enseignant. Avec l'identifiant associé, le noter dans un fichier pour le retrouver en cas d'oubli ultérieur.
        Cliquer sur le bouton Save.
      • Dans le menu Administration/Time Settings, choisir le fuseau horaire de la France. Activer l'option DST (daylight saving time) et renseigner les dates de passage de l'heure d'été et de l'heure d'hiver (cf. chap. R2‑VI ). Cliquer sur le bouton Save.
    8. Une fois la configuration du routeur terminée, si cela n'est pas déjà fait, raccorder le routeur par sa prise WAN au réseau donnant accès à l'Internet (réseau pédagogique ou box de FAI pour s'affranchir de tout serveur proxy).
    9. En ligne de commande depuis le poste de travail, procéder aux vérifications que toutes les connexions du LAN sont opérationnelles :
      • accès à l'Internet depuis le poste de travail ;
      • détection et connexion au réseau sans‑fil par un smartphone.
  3. Programme de connexion sans‑fil de l'objet au réseau
  4. On commence par vérifier que l'objet connecté est capable de se connecter au WLAN mis en œuvre par le routeur Wi‑Fi. On opte pour une configuration IP statique dans la mesure où l'objet connecté est destiné par la suite à embarquer un serveur web.
    1. Télécharger le dossier d'archive du code source du programme au lien suivant . Déplacer l'archive dans le répertoire de TP puis l'extraire.
    2. Ouvrir le programme avec le logiciel Arduino IDE. Apporter au code source les adaptations suivantes :
      • Dans le fichier connectionID.h, modifier les identifiants de connexion au réseau Wi‑Fi – SSID et mot de passe – pour qu'ils soient conformes au paramétrage du point d'accès opéré précédemment sur le routeur.
      • Dans le fichier setupUtilities.h, modifier les adresses IP de la configuration statique conformément au paramétrage du WLAN mis en place.
      • Pour les adresses IP des résolveurs DNS, on pourra utiliser celles de résolveurs publics (cf. chap. R2‑I ) ou encore celles obtenues par le poste de travail via le protocole DHCP (cf. chap. R1‑III ).
    3. Procéder au téléversement du programme dans la carte. Une fois l'opération achevée, procéder au vérifications suivantes.
      • La led intégrée de la carte (pas celle du module ESP‑12 – cf. chap. C2‑VIII ) doit s'allumer et s'éteindre selon que la fonctionnalité Wi‑Fi est active ou non sur le routeur. Cette fonctionnalité est contrôlable par appuis longs sur le bouton lumineux On/Off sur la face avant du routeur.
      • L'affichage sur le moniteur série doit confirmer la connexion de l'objet au réseau local via le point d'accès fourni par le routeur et indiquer les adresses IP de sa configuration. La force du signal (cf. chap. R3‑IV ) est‑elle satisfaisante ?
      • Lors d'une déconnexion, décoder le code numérique de la cause indiquée sur le moniteur série .
      • L'objet connecté doit répondre à une commande ping émise par le poste de travail.
  5. Programme de serveur web rudimentaire
  6. On installe maintenant sur l'objet connecté un programme qui met en œuvre un serveur web pour contrôler la led, c'est‑à‑dire afficher et modifier son état allumé/éteint. Les pages web embarquées sont minimales (elles n'ont même pas d'en‑tête).
    1. Comme à l'exercice précédent, télécharger le dossier d'archive du code source au lien suivant , le déplacer puis l'extraire dans le répertoire de TP.
    2. Écraser les fichiers connectionID.h et setupUtilities.h avec ceux de l'exercice 3 pour utiliser les mêmes identifiants de connexion et la même configuration IP de la carte.
    3. Ouvrir le fichier principal .ino avec le logiciel Arduino IDE. Procéder au téléversement du programme dans la carte. Une fois l'opération achevée, vérifier le bon fonctionnement du serveur web de la manière suivante en utilisant un navigateur s'exécutant sur le poste de travail et sur un smartphone connecté au WLAN.
      • Dans la barre d'adresse du navigateur, saisir l'URL :
        http://adresse IP carte ESP8266
        et constater que s'affiche alors une page web presque vide, avec pour titre :
      • Web server main page
      • Dans la barre d'adresse, ajouter à l'URL le segment led_on. Vérifier alors que la led rouge s'allume et que la page web affichée confirme cet état avec le titre :
      • LED on
      • Procéder de même pour vérifier que la led rouge s'éteint en ajoutant le segment led_off à l'URL de la page principale, avec confirmation par affichage du titre :
      • LED off
    4. Dans le code source, quel appel de fonction permet d'afficher l'état de la led dans le navigateur ? Comment s'appelle l'action qu'effectue cette fonction et que signifie la valeur de son premier argument ? (cf. chap. R2‑III )
  7. Programme de page web interactive
  8. Le programme de l'exercice précédent permet de connaître l'état de la led et de la contrôler à distance, mais l'interface utilisateur – qui procède par commandes saisies dans la barre d'adresse du navigateur – n'est pas commode à utiliser. On va donc voir comment embarquer dans le programme une page web qui réunit deux boutons interactifs  ON et OFF et un champ d'affichage de l'état de la led.
    1. Comme à l'exercice précédent, télécharger le dossier d'archive du code source au lien suivant , le déplacer puis l'extraire dans le répertoire de TP.
    2. Écraser les fichiers connectionID.h et setupUtilities.h avec ceux de l'exercice 3 pour utiliser les mêmes identifiants de connexion et la même configuration IP de la carte.
    3. Avec Arduino IDE, procéder au téléversement du programme dans la carte. Une fois l'opération achevée, tester son exécution sur un navigateur via la page web de l'objet connecté, en cliquant sur les boutons ON et OFF.
    4. * Dans le code source :
      • Comment la page web est‑elle stockée ?
      • Quel appel de fonction permet d'afficher la page web ?
      • Comment un appui sur un bouton est‑il traité ?
      • Comment l'état de la led est‑il affiché dans la page ?
  9. Programme de page web dynamique
  10. L'inconvénient du programme de l'exercice précédent est qu'il recharge l'intégralité de la page web à chaque appui sur l'un des boutons. Non gênante ici, cette approche devient problématique avec une page ayant un contenu plus riche. On va donc voir comment embarquer implémenter une page web dynamique avec des fonctionnalités Ajax W (Asynchronous JavaScript and XML).
    1. Comme à l'exercice précédent, télécharger le dossier d'archive du code source au lien suivant , le déplacer puis l'extraire dans le répertoire de TP.
    2. Écraser les fichiers connectionID.h et setupUtilities.h avec ceux de l'exercice 3 pour utiliser les mêmes identifiants de connexion et la même configuration IP de la carte.
    3. Avec Arduino IDE, procéder au téléversement du programme dans la carte. Une fois l'opération achevée, tester son exécution dans la page web de l'objet connecté, en cliquant sur les boutons ON et OFF.
    4. Recharger la page web. Qu'observe‑t‑on ?
    5. * Dans le code source, par rapport au programme de l'exercice précédent, qu'est‑ce qui a changé pour les fonctions de callback du serveur web W pour allumer et éteindre la led ?
    6. Où les fonctionnalités Ajax sont‑elles codées ?
  11. Programme de page web responsive
  12. L'inconvénient principal du programme de l'exercice précédent est que la page web n'est pas responsive : elle ne s'adapte pas au terminal qui la consulte. Pour y remédier, on peut bien entendu coder des feuilles de style en CSS. On se propose de montrer plutôt comment embarquer et utiliser un framework W suffisamment léger : Milligram .
    1. Comme à l'exercice précédent, télécharger le dossier d'archive du code source au lien suivant , le déplacer puis l'extraire dans le répertoire de TP.
    2. Écraser les fichiers connectionID.h et setupUtilities.h avec ceux de l'exercice 3 pour utiliser les mêmes identifiants de connexion et la même configuration IP de la carte.
    3. Avec Arduino IDE, procéder au téléversement du programme dans la carte. Une fois l'opération achevée, tester son exécution dans la page web de l'objet connecté, en cliquant sur les boutons ON et OFF.
    4. Observer attentivement la page web de l'objet connecté, sur le smartphone et sur le poste de travail. L'affichage est adaptatif ?
    5. En analysant le code source, comment la mise en forme de la page web est‑elle implémentée ?
  13. Programme de page web avec API
  14. On souhaite pouvoir intégrer l'objet connecté à un réseau domotique. Pour cela, il est nécessaire de mettre en place une API W (application programming interface). Dans le cas d'un serveur Web, l'API peut prendre la forme d'une série de segments d'URL (cf. chap. R2‑I ).
    1. Comme à l'exercice précédent, télécharger le dossier d'archive du code source au lien suivant , le déplacer puis l'extraire dans le répertoire de TP.
    2. Écraser les fichiers connectionID.h et setupUtilities.h avec ceux de l'exercice 3 pour utiliser les mêmes identifiants de connexion et la même configuration IP de la carte.
    3. Avec Arduino IDE, procéder au téléversement du programme dans la carte. Une fois l'opération achevée, vérifier que la carte est bien connectée au réseau Wi‑Fi.
    4. Tester le bon fonctionnement du programme en accédant à la page web du serveur embarqué dans l'objet connecté. Saisir successivement dans la barre d'adresse les trois commandes API indiquées en commentaires dans le fichier source .ino du programme, sous la ligne // API commands.
    5. Raccorder une box Jeedom au port LAN du routeur.
    6. Pour installer une box Jeedom sur une carte Raspberry Pi, on pourra se reporter à la procédure décrite au sujet de TP nº R3‑2 .
    7. Une fois la box Jeedom mise en service, exécuter les étapes suivantes.
      • Installer et activer le plugin Script (gratuit).
      • Dans le menu Plugins/Programmation/Script, ajouter un nouveau script ; l'associer à un objet défini dans la box (par exemple, Maison). Dans l'onglet Équipement, cocher les cases Activer et Visible.
      • Dans l'onglet Commandes, ajouter :
        • deux commandes HTTP de type Action, nommées ON et OFF pour respectivement allumer et éteindre la led ;
        • une commande HTTP de type Info, nommée STATE pour afficher l'état de la led.
        Les requêtes HTTP de ces commandes sont les mêmes que les commandes API testées à la question c).
      • Vérifier le bon fonctionnement de ces commandes directement dans la page de script, puis dans le Dashboard de l'application Jeedom.
      Pour plus de détails sur toute cette procédure, on pourra consulter ce lien Y.
  15. Contrôle à distance de la led par protocole MQTT et interface Node‑RED
  16. On souhaite pouvoir contrôler à distance la led par l'intermédiaire d'un broker MQTT (cf. chap. R3‑V ) implémenté sur un nano‑ordinateur Raspberry Pi. Afin que l'interface de commande soit conviviale et localisée dans une page web, on recourt à l'outil de développement Node‑RED.
    1. Comme à l'exercice précédent, télécharger le dossier d'archive du code source au lien suivant , le déplacer puis l'extraire dans le répertoire de TP.
    2. Écraser les fichiers connectionID.h et setupUtilities.h avec ceux de l'exercice 3 pour utiliser les mêmes identifiants de connexion et la même configuration IP de la carte.
    3. Avec Arduino IDE, saisir l'adresse IP du broker MQTT dans le WLAN, conformément au plan d'adressage indiqué par la figure.
    4. De plus, saisir l'adresse IP du broker MQTT dans le WLAN, conformément au plan d'adressage indiqué par la figure ci‑dessus.
      Par ailleurs, dans le code source du programme, relever les noms des topics relatifs respectivement à l'état et à la commande de la led.
    5. Installer le module de bibliothèque Arduino nommée PubSubClient (cf. chap. C4‑VI C). Procéder alors au téléversement du programme dans la carte.
    6. Une fois l'opération achevée, tester son exécution en ouvrant le moniteur série d'Arduino IDE sur le poste de travail. Pour le moment, seule la connexion au réseau Wi‑Fi peut être confirmée. En effet, la connexion au broker MQTT n'est pas encore opérationnelle puisque ce dernier n'est pas encore installé.
    7. Mettre en service une carte Raspberry Pi avec un système sans bureau et une configuration IP statique (cf. chap. R1‑III ) conforme aux spécifications de la figure ci‑dessus. La raccorder au WLAN sur le routeur avec un câble Ethernet au switch du port LAN.
    8. En cas d'installation d'un nouveau système, on pourra se reporter à la procédure décrite dans le sujet de TP nº R2‑2 .
      Dans tous les cas, depuis un terminal de commande en ligne sur le poste de travail, ouvrir une session ssh sur la carte Raspberry Pi et penser à mettre à jour le système.
    9. Sur la carte Raspberry Pi, installer les paquets mosquitto et mosquitto clients (cf. chap. R3‑V ). Puis, comme indiqué dans le cours, paramétrer l'application broker et redémarrer le système.
    10. Lancer alors l'application en tant que service. Dans le moniteur série de l'IDE Arduino, vérifier que le client MQTT de la carte NodeMCU a pu se connecter au broker.
    11. Dans le terminal de commande en ligne de la carte Raspberry Pi, saisir la commande d'abonnement :
    12. 	  
      mosquitto_sub -t LED/state
      On doit normalement obtenir l'affichage 0 – c'est‑à‑dire led éteinte – toutes les secondes.
      Saisir alors la commande de publication :
      	  
      mosquitto_pub -t LED/command -m "#on"
      La led doit normalement s'allumer. Vérifier également que le résultat de la commande d'abonnement supra affiche alors la valeur 1.
      Recommencer la même commande mais avec le message "#off" ; la led doit normalement s'éteindre.
    13. Via la session ssh sur la carte Raspberry Pi, installer l'application de développement Node‑RED (cf. cours, chap. R3‑V ).
    14. Suivre la procédure indiquée de paramétrage général de l'application.
    15. Démarrer l'application (commande node-red-start) et dans un navigateur sur le poste de travail, se connecter à l'adresse IP du broker sur le port 1880 pour afficher la page web d'interface de développement.
    16. Via le menu principal, exécuter la commande Manage palette et ajouter à l'interface la palette de nœuds node-red-dashboard.
    17. Dans la fenêtre de développement de Node‑RED (onglet Flow 1 par défaut), créer les nœuds suivants et les liaisons entre eux pour afficher l'état de la led.
      • Créer un nœud mqtt in (palette network), un nœud text (palette dashboard) et les relier entre‑eux, conformément à la capture d'écran ci‑contre.
      • Paramétrer le nœud mqtt in en renseignant pour l'adresse IP du broker la valeur localhost (puisque Node‑RED est installé sur la même machine) et le nom du topic de l'état de la led (cf. question 9.d supra).
      • Paramétrer le nœud text en créant au passage un groupe (ui_group) nommée NodeMCU et dans cette zone, un block (tab) nommé LED.
      • Dans l'onglet Flow 1, le réseau des deux nœuds créés doit alors être conforme à la capture d'écran ci‑contre.
      • Cliquer sur le bouton Deploy et vérifier la page web d'interface utilisateur en ouvrant dans le navigateur un nouvel onglet avec l'URL :
        http://adresse IP broker:1880/ui
        On doit obtenir un résultat conforme à la capture d'écran ci‑contre.
    18. Dans la fenêtre de développement de Node‑RED, créer maintenant les nœuds suivants et les liaisons entre eux pour commander la led.
      • Créer un nœud switch (palette dashboard), un nœud mqtt out (palette network) et les relier entre‑eux, conformément à la capture d'écran ci‑contre.
      • Paramétrer le nœud switch en saisissant les chaînes de caractères (string) à envoyer comme On Payload et Off Payload respectivement pour allumer et éteindre la led – cf. le code source de la fonction mqttCallback dans le programme de la carte NodeMCU.
      • Paramétrer le nœud mqtt out en renseignant le broker (localhost) et le topic de commande de la led (cf. question 9.d supra).
      • La structure doit alors être conforme à la capture d'écran ci‑dessus.
      • Cliquer sur le bouton Deploy et vérifier le résultat en ouvrant la page web d'interface utilisateur. On doit normalement obtenir un résultat conforme à la capture d'écran ci‑contre.
    19. Tester maintenant le fonctionnement de l'interface : allumer et éteindre la led avec le switch.
    20. Ouvrir et tester le fonctionnement de cette page d'interface sur un smartphone. Le rendu est‑il satisfaisant sur un petit écran (en d'autres termes, la page web est‑elle responsive) ?
    21. On souhaite afficher un diagramme d'historique des valeurs d'état de la led dans l'heure en cours. Pour cela, sur la fenêtre de développement, ajouter un nœud chart et relier son entrée à la sortie du nœud mqtt_in, conformément à la conformément à la capture d'écran ci‑contre.
    22. Paramétrer ce nœud pour que l'axe des abscisses porte sur la journée en cours avec des repères de la forme HH:mm, et que l'axe des ordonnées soit graduées avec les repères 0 (min) et 1 (max).
      Cliquer sur le bouton Deploy et vérifier le résultat en ouvrant la page web d'interface utilisateur. À l'aide du switch, changer plusieurs fois l'état de la led. On doit normalement obtenir un résultat similaire à celui de la capture d'écran ci‑contre.
    23. On souhaite enregistrer un fichier d'historique des valeurs d'état de la led dans la journée en cours, enregistrées au format csv  W (comma‑separated values). Pour cela, sur la fenêtre de développement, effectuer les tâches suivantes.
      • Créer un nœud trigger (palette function) et un nœud debug (palette function) et les relier en chaîne à la sortie du nœud mqtt_in, conformément à la figure ci‑contre.
      • Paramétrer le nœud trigger pour qu'il émette un timestamp puis attende d'être réinitialisé (wait to be reset) lorsque la valeur du message qu'il reçoit (msg.payload) vaut 0. Nommer ce nœud « timestamp on 0 ».
        Cliquer sur le bouton Deploy puis, via l'interface utilisateur, allumer et éteindre la led. Dans le panneau latéral droit de la fenêtre de développement, ouvrir l'onglet Debug messages. Vérifier que la valeur affichée correspond à un timestamp récent, par exemple en consultant la page web au lien suivant .
        Entre les nœuds trigger et debug, insérer un nœud function (palette function), le nommer format et le définir avec le code Javascript ci‑dessous :
        msg.payload = (new Date(msg.payload)).toLocaleTimeString();
        return msg;
        
        Cliquer sur le bouton Deploy puis, via l'interface utilisateur, allumer et éteindre la led. Dans l'onglet Debug messages du panneau latéral droit, vérifier que la valeur affichée correspond à l'heure courante.
      • De la même manière, créer une séquence de nœuds trigger et debug pour récupérer la valeur du message issu du nœud mqtt_in (existing msg objet).
      • Cliquer sur le bouton Deploy et vérifier dans l'onglet Debug messages qu'à chaque allumage-extinction de la led, on obtient la valeur d'état 1 de la led puis l'heure courante lors de cet événement.
        Entre ces deux nœuds trigger et debug, insérer un nœud delay (palette function) et le paramétrer avec la valeur 10 ms. Vérifier alors que dans l'onglet Debug messages, l'heure puis la valeur d'état 1 de la led sont affichées dans cet ordre.
      • Copier‑coller la structure des 6 nœuds précédemment crées et apporter les modifications nécessaires pour récupérer la valeur d'état 0 de la led, précédée de l'heure courante lors de cet événement.
      • Déployer ces changements et vérifier le résultat.
      • Supprimer les nœuds debug puis ajouter un nœud join (palette function) ainsi qu'un nœud write file (palette storage). Les relier conformément à la capture d'écran ci‑contre.
      • Paramétrer le nœud join en mode manuel pour créer une chaîne de caractères en joignant ses parties avec le symbole , après réception de 2 parties.
        Paramétrer le nœud write file en renseignant le chemin d'accès au fichier :
        /home/pi/documents/LEDhistoric.csv
        et en choisissant l'encodage ascii.
        Par ailleurs, créer ce fichier dans l'arborescence de la carte Raspberry Pi via un terminal de commandes en lignes en ssh (commande touch).
        Cliquer sur le bouton Deploy et vérifier que les changements d'état de la led sont correctement enregistrés dans le fichier LEDhistoric.csv (commande touch).
      • Chercher une solution pour afficher sur la page d'interface non pas 0/1 mais le texte Off/On pour l'état de la led sur la page d'interface.