{"id":439,"date":"2019-07-23T11:39:57","date_gmt":"2019-07-23T09:39:57","guid":{"rendered":"http:\/\/miniprojets.net\/?p=439"},"modified":"2022-12-17T17:25:59","modified_gmt":"2022-12-17T16:25:59","slug":"monitoring-dune-serre-du-capteur-jusquau-serveur","status":"publish","type":"post","link":"https:\/\/miniprojets.net\/index.php\/2019\/07\/23\/monitoring-dune-serre-du-capteur-jusquau-serveur\/","title":{"rendered":"Monitoring d&#8217;une serre, du capteur jusqu&#8217;au serveur via le trio Lora, InfluxDB, Grafana"},"content":{"rendered":"\n<p>Bonjour \u00e0 tous, <\/p>\n\n\n\n<p>Je m&#8217;appelle Sylvain et Aujourd&#8217;hui je vous pr\u00e9sente le r\u00e9sultat mon sujet de stage.<\/p>\n\n\n\n<p>Vous avez toujours souhait\u00e9 installer un capteur chez vous ?<\/p>\n\n\n\n<p>Par exemple un capteur de temp\u00e9rature ET d&#8217;humidit\u00e9 chez vous, dans votre jardin, au-dessus de votre aquarium ou m\u00eame dans votre serre, voir une serre aquaponique ?<\/p>\n\n\n\n<p>Pour ma part, il s\u2019agit de la derni\u00e8re proposition :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/JNdGd8iMD6YOSIzPqxVYkgCiBUKUIEgMEEVRjreAMf2j4Wyi58ovwGn2z0h4JQeA406DQpabx66xuHOZ1lMt0m1twavO_BN7S6SZ-ix7RI_sE0wS-5eprvpiV9YvW0yOhBQoQlGs\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 0: CHOIX DU MAT\u00c9RIEL<\/p>\n\n\n\n<p class=\"has-medium-font-size\">I. LE CAPTEUR<\/p>\n\n\n\n<p>Pour commencer, on doit choisir un capteur qui permet de r\u00e9aliser ces fonctions. C&#8217;est pour cela que j&#8217;ai d\u00e9cid\u00e9 de choisir le DHT22&nbsp;<\/p>\n\n\n\n<p>Qu\u2019est ce qu\u2019un DHT22 ? <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/DHT22_3b-1024x1024.jpg\" alt=\"\" class=\"wp-image-441\" width=\"367\" height=\"367\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/DHT22_3b-1024x1024.jpg 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/DHT22_3b-150x150.jpg 150w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/DHT22_3b-300x300.jpg 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/DHT22_3b-768x768.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/DHT22_3b.jpg 1300w\" sizes=\"auto, (max-width: 367px) 100vw, 367px\" \/><\/figure><\/div>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/Jn4ODnTRyTd8ES649dStBrQnDOEntY26-5licCmGKDx_JEfCkyAwHybOuIpMRH_0lD2Xcqfc7GyB6bh7vUWURDCu03U18PWnikppZdgjnVk5b0UANQdneor0Df4HEkMZhpElJ6QA\" alt=\"\" width=\"244\" height=\"194\"\/><\/figure>\n\n\n\n<p>C\u2019est un capteur d&#8217;humidit\u00e9 et de temp\u00e9rature, il permet de recueillir les deux donn\u00e9es simultan\u00e9ment (temp\u00e9rature\/humidit\u00e9), il poss\u00e8de \u00e9galement quelques caract\u00e9ristiques int\u00e9ressantes :&nbsp;<\/p>\n\n\n\n<p> Il permet la mesure de temp\u00e9ratures pouvant varier de -40 \u00e0 125 degr\u00e9s Celsius avec une pr\u00e9cision de +\/- 0.5 degr\u00e9s Celsius&nbsp;<\/p>\n\n\n\n<p> Il permet la mesure de l&#8217;humidit\u00e9 pouvant varier de 0% \u00e0 100% avec une pr\u00e9cision variant de +\/- 2% \u00e0 5%&nbsp;<\/p>\n\n\n\n<p>Ce qui largement sup\u00e9rieur \u00e0 sa pr\u00e9c\u00e9dente version, le capteur DHT11 ne pouvant varier que de 0 \u00e0 50 degr\u00e9s Celsius avec une pr\u00e9cision de 2 degr\u00e9s Celsius et une tranche de mesure d&#8217;humidit\u00e9 variant de 20% \u00e0 80% avec une pr\u00e9cision de +\/- 5%<\/p>\n\n\n\n<p>Mais le DHT22 \u00e0 une fr\u00e9quence d&#8217;\u00e9chantillonnage de 0.5Hz, ce qui correspond \u00e0 une mesure toutes les 2 secondes \u00e0 la diff\u00e9rence de son pr\u00e9d\u00e9cesseur qui lui avait 1 Hz de fr\u00e9quence d\u2019\u00e9chantillonnage ce qui permet d&#8217;avoir une mesure toutes les secondes<\/p>\n\n\n\n<p>Le DHT22 est \u00e9galement un peu plus grand que son petit fr\u00e8re en affichant des dimensions de 15.1mm x 25mm x 7.7mm alors que ce dernier ne faisait que 15.5mm x 12mm x 5.5mm.<\/p>\n\n\n\n<p>\u00c9tant donn\u00e9 que nous n&#8217;avons pas besoin d&#8217;une tel rapidit\u00e9 et que l&#8217;\u00e9cart de dimension est minime et permet tout de m\u00eame de se faire discret dans son utilisation de tous les jours, le DHT11 ne poss\u00e9dait aucun argument permettant de le choisir en comparaison du DHT22.<\/p>\n\n\n\n<p>D&#8217;autant plus que les 2 capteurs ont les m\u00eames besoins en courant\/tension.<\/p>\n\n\n\n<p>II. LE MICROCONTROLEUR <\/p>\n\n\n\n<p>Quel Nano Ordinateur choisir alors ?<\/p>\n\n\n\n<p>Pour ma part, je vais opter pour un Pycom Lopy4<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/74yekACtuwgZ4_tdKa3Z55lUUiPkLppZhKmuVTeMC5RmzaGdj8KVa84iYXDON_onBG6VuH7IHAVME8nH08Xk2KP4Gkkq6pxHUHbTlq-nLLOg8K-q7d7vTGTOdUueob6rx9CrEXOr\" alt=\"\"\/><\/figure>\n\n\n\n<p>qui vient se greffer sur une extension board, un Pycom makr pour la programmation<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/eqvuckRPaVWAVUj4YWPXyoanwbLAKs3Mdgmvn6SY2uddyh8r1ZgdV55r0AwQHl0_QwBkvKA1M_3wYmbM_U6pK8gxD47WbAQRtiX8P4vCChRCYDuLUQ5YyvFX0aFr2xn3zgZLCyaU\" alt=\"\" width=\"358\" height=\"358\"\/><\/figure>\n\n\n\n<p>Ce qui nous donne une fois mis ensemble&nbsp;(attention au sens je vous conseille de bien regarder les signes distinctifs des deux parties pour pouvoir l&#8217;assembler dans le bon sens sinon toute la suite ne pourra pas fonctionner)<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/2SalOjOZ4N4RxXP_lqyfoMi-XHH6xbOq7nGiqX8BD3pRgSfcLmQSVasoLh0XIoa_Ko_ZSeikmiqw0TGqAZ2Hzq5VayFIi4jkTWOpiO33wuf-4RNIBSt6Em2p2sPZfFkCmCi5gyQI\" alt=\"\"\/><\/figure>\n\n\n\n<p>Une Pycom Lopy, c\u2019est un Nano Ordinateur tr\u00e8s peu gourmand en \u00e9nergie, pour maintenir LoRa actif (nous reviendrons par la suite sur ce qu&#8217;est LoRa) il nous faudra uniquement 3 mA, sous une alimentation variant de 3,3 \u00e0 5,5 Vcc . Cela permet d&#8217;obtenir une consommation \u00e9nerg\u00e9tique tr\u00e8s faible.<\/p>\n\n\n\n<p>Le Pycom Lopy est \u00e9galement tr\u00e8s facile de prise en main. En effet de nombreux documents techniques sont facilement disponibles sans devoir chercher des heures et des heures pour en obtenir un qui nous permettra d\u2019avoir l\u2019information voulu !<\/p>\n\n\n\n<p>Il est en plus, dot\u00e9 de 8 MB de m\u00e9moire flash ainsi que de 4 MB de m\u00e9moire RAM, de dimensions r\u00e9duites qui mettront tout le monde d\u2019accord : 55mm x 20mm x 3,5mm, un poids de 7 grammes, un module Bluetooth standard ainsi qu&#8217;un module wifi 802.11 permettant une connexion SSH par exemple et \u00e9videmment le plus important pour nous permettre de r\u00e9cup\u00e9rer les donn\u00e9es dans notre situation, un module LoRa compatible LoRaWan bas\u00e9 sur un SX1272.<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 1 : PROTOCOLE LORA<\/p>\n\n\n\n<p>LoRa nous sera fortement utile car en effet LoRaWAN est un protocole de t\u00e9l\u00e9communication permettant une communication \u00e0 bas d\u00e9bit pour des objets \u00e0 faible consommation \u00e9lectrique communiquant selon la technologie LoRa et connect\u00e9s \u00e0 Internet gr\u00e2ce \u00e0 de multiples passerelles, dans notre situation.<\/p>\n\n\n\n<p>Il permettra de faire le lien entre le capteur\/Microcontr\u00f4leur et un serveur tampon que nous reparlerons un peu plus tard.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/PxnF_fSuQHSGqVbdHhP4jSEwZV0G-RicCPSKve883Mmkf8uugfAU1zp73PPra4oo2JSo6q2RWa78qAKxoKo-B1V3BfH7tDxO3OWrQWVxT4HBkoIv9Bd_uEiiwLHr_l1wQmLxYg3k\" alt=\"\"\/><\/figure>\n\n\n\n<p>Un SX1272 est un \u00e9metteur-r\u00e9cepteur qui est dot\u00e9 du modem LoRa \u00e0 longue port\u00e9e qui permet d&#8217;offrir des communications \u00e0 spectre \u00e9tal\u00e9 ultra-longue port\u00e9e ainsi qu&#8217;une tr\u00e8s bonne immunit\u00e9 aux interf\u00e9rences tout en r\u00e9duisant la consommation d&#8217;\u00e9nergie, que demander de plus !<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 2: CABLAGE<\/p>\n\n\n\n<p>Pour permettre l&#8217;exploitation des donn\u00e9es du capteur DHT22, il est n\u00e9cessaire de brancher le capteur sur notre Pycom Lopy ce qui nous permettra de lire les donn\u00e9es sortant de celui ci.<\/p>\n\n\n\n<p>Pour le branchement rien de plus facile. Reproduisez le sch\u00e9ma suivant :<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/ItTwDmLVfdzaReuK7_pgDfqVebFzqfCHHvhk_0Gwc3VPnZMdhRAqQVRg54BnrUjliwwuMvRl79yKVSjBrdNdbpCw3iVtS8Ty4taDFkrGnSZiR2qGnV84kka6LJN6ZHRNjpPrhDp7\" alt=\"\" width=\"468\" height=\"253\"\/><\/figure>\n\n\n\n<p>Pour vous connectez \u00e0 votre Pycom Lopy, branchez les composants comme indiqu\u00e9 sur la photo suivante (petite astuce pour l\u2019antenne LoRa et la brancher au bonne endroit, elle se situe entre l\u2019alimentation et le Gnd). Mettez sous tension en branchant l&#8217;alimentation.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/cM-HyW3W3aW-tDYWCt3CiK4k4siPk6OPuX71IE7y0gtE6tkvB6yP6PnleoqGwV5EDfM4a9Us_w2OZ4SCQ2QDEBOaEYUmsSNCt3Dw-GPKoxKk9RSFF2err12QptN8XzZPusLrwSpp\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 3: PREPARATION POUR LE CODAGE<\/p>\n\n\n\n<p>Pour information,  Les sources sont <strong> CC-BY-NC-SA<\/strong> <a href=\"https:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/fr\/\">https:\/\/creativecommons.org\/licenses\/by-nc-sa\/3.0\/fr\/<\/a> <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter\"><img loading=\"lazy\" decoding=\"async\" width=\"403\" height=\"141\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/09\/licence.png\" alt=\"\" class=\"wp-image-796\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/09\/licence.png 403w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/09\/licence-300x105.png 300w\" sizes=\"auto, (max-width: 403px) 100vw, 403px\" \/><\/figure><\/div>\n\n\n\n<p>Maintenant vous pouvez aller sur votre Ordinateur et connecter vous au wifi de votre Pycom (exemple : lopy-wlan-xxxx), le mot de passe par d\u00e9faut est : <a href=\"http:\/\/www.pycom.io\">www.pycom.io<\/a><\/p>\n\n\n\n<p>Si vous avez r\u00e9ussi \u00e0 vous connecter \u00e0 la Lopy, on va pouvoir commencer \u00e0 la programmer.<\/p>\n\n\n\n<p>Pour cela, il vous faudra cr\u00e9er un fichier qui portera le nom : main.py<\/p>\n\n\n\n<p>On le placera dans un dossier du nom de votre choix.<\/p>\n\n\n\n<p>Vous pouvez r\u00e9cup\u00e9rer les codes python dont nous allons parler dans le fichier zip suivant :<\/p>\n\n\n\n<p style=\"font-size:40px\" class=\"has-text-color has-background has-very-light-gray-color has-vivid-red-background-color\">zip python<\/p>\n\n\n\n<p>Le fichier main.py&nbsp; c\u2019est le script qui s&#8217;ex\u00e9cute directement apr\u00e8s le fichier boot.py et doit contenir le code principal que vous souhaitez ex\u00e9cuter sur votre appareil.<\/p>\n\n\n\n<p>Le main.py lui contiendra ce code :&nbsp;<\/p>\n\n\n\n<pre class=\"lang:python decode:true\">from network import LoRa\nimport socket\nimport binascii\nimport struct\nimport pycom\nimport time\nfrom machine import Pin\nfrom machine import enable_irq, disable_irq\n\n#################### Define LoraWan ########################\n# for EU868\nLORA_FREQUENCY = 868100000\nLORA_GW_DR = \"SF7BW125\" #DR_5\nLORA_NODE_DR = 5\n\n# initialize LoRa in LORAWAN mode.\n# Please pick the region that matches where you are using the device:\n# Asia = LoRa.AS923\n# Australia = LoRa.AU915\n# Europe = LoRa.EU868\n# United States = LoRa.US915\nlora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868)\n# create an OTA authentication params\ndev_eui = binascii.unhexlify(your_dev_eui)\napp_eui = binascii.unhexlify(your_app_eui)\napp_key = binascii.unhexlify(your_app_key)\n# set the 3 default channels to the same frequency (must be before sending the OTAA join request)\nlora.add_channel(0, frequency=LORA_FREQUENCY, dr_min=0, dr_max=5)\nlora.add_channel(1, frequency=LORA_FREQUENCY, dr_min=0, dr_max=5)\nlora.add_channel(2, frequency=LORA_FREQUENCY, dr_min=0, dr_max=5)\n# join a network using OTAA\nlora.join(activation=LoRa.OTAA, auth=(dev_eui, app_eui, app_key), timeout=0,\ndr=LORA_NODE_DR)\n# wait until the module has joined the network\nwhile not lora.has_joined():\n    time.sleep(5)\n    print('Not joined yet...')\nprint(\"Joined\")\n# remove all the non-default channels\nfor i in range(3, 16):\n    lora.remove_channel(i)\n# create a LoRa socket\ns = socket.socket(socket.AF_LORA, socket.SOCK_RAW)\n# set the LoRaWAN data rate\ns.setsockopt(socket.SOL_LORA, socket.SO_DR, LORA_NODE_DR)\n# make the socket blocking\ns.setblocking(True)\ntime.sleep(5.0)\n\n#################### End of define LoraWan ###########\n\ndef getval(pin):\n    ms = [1]*700        # needs long sample size to grab all the bits from the DHT\n    time.sleep(1)\n    pin(0)\n    time.sleep_us(10000)\n    pin(1)\n    irqf = disable_irq()\n    for i in range(len(ms)):\n        ms[i] = pin()      ## sample input and store value\n    enable_irq(irqf)\n    # for i in range(len(ms)):\t\t#print debug for checking raw data\n\t#     print (ms[i])\n    return ms\n\ndef decode(inp):\n    res= [0]*5\n    bits=[]\n    ix = 0\n    try:\n        #if inp[0] == 1 : ix = inp.index(0, ix) ## skip to first 0\t# ignore first '1' as probably sample of start signal.  *But* code seems to be missing the start signal, so jump this line to ensure response signal is identified in next two lines.\n        ix = inp.index(1,ix) ## skip first 0's to next 1\t#  ignore first '10' bits as probably the response signal.\n        ix = inp.index(0,ix) ## skip first 1's to next 0\n        while len(bits) < len(res)*8 : ##need 5 * 8 bits :\n            ix = inp.index(1,ix) ## index of next 1\n            ie = inp.index(0,ix) ## nr of 1's = ie-ix\n            # print ('ie-ix:',ie-ix)\n            bits.append(ie-ix)\n            ix = ie\n    except:\n        print('6: decode error')\n        print('length:')\n        print(len(inp), len(bits))\n        return([0xff,0xff,0xff,0xff])\n\n    # print('bits:', bits)\n    for i in range(len(res)):\n        for v in bits[i*8:(i+1)*8]:   #process next 8 bit\n            res[i] = res[i]<<1  ##shift byte one place to left\n            if v > 5:                   #  less than 5 '1's is a zero, more than 5 1's in the sequence is a one\n                res[i] = res[i]+1  ##and add 1 if lsb is 1\n            # print ('res',  i,  res[i])\n\n    if (res[0]+res[1]+res[2]+res[3])&0xff != res[4] :   ##parity error!\n        print(\"Checksum Error\")\n        print (res[0:4])\n        # res= [0xff,0xff,0xff,0xff]\n\n    #print ('res:', res[0:4])\n    return(res[0:4])\n\ndef DHT22(pin):\n    res = decode(getval(pin))\n    hum = res[0]*256+res[1]\n    temp = res[2]*256 + res[3]\n    if (temp > 0x7fff):\n        temp = 0x8000 - temp\n    return (temp, hum)\n\n#################### End of define DHT22 ###########\n\n#################### Main program #################\ndef go_DHT():\n    dht_pin=Pin('P9', Pin.OPEN_DRAIN)\t# connect DHT22 sensor data line to pin P9\/G16 on the expansion board\n    dht_pin(1)\t\t\t\t\t\t\t# drive pin high to initiate data conversion on DHT sensor\n\n    while True:\n        temp, hum = DHT22(dht_pin)\n        temp = temp\/\/10\n        hum = hum\/\/10\n        pkt = str(temp).encode() # Encode the data\n        pkh = str(hum).encode() # Encode the data\n        testpkall = pkt+pkh # Concatenate the 2 data encoded\n        s.send(testpkall)              # Send the data\n        time.sleep(300) # Break of 300sec before the next run of your program\npycom.heartbeat(False)\n\ngo_DHT()\n#################### End of Main program ################# <\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code><\/code><\/pre>\n\n\n\n<p>Il existe \u00e9galement un deuxi\u00e8me fichier qui peut se r\u00e9v\u00e9ler \u00eatre n\u00e9cessaire, mais pas dans notre cas, mais nous allons tout de m\u00eame le cr\u00e9er et le laisser vide,il s\u2019agit du fichier \u201cboot.py\u201d<\/p>\n\n\n\n<p>Le fichier boot.py c&#8217;est le premier script qui s&#8217;ex\u00e9cute sur votre module lorsqu&#8217;il s&#8217;allume. Il est souvent utilis\u00e9 pour connecter un module \u00e0 un r\u00e9seau WiFi afin que Telnet et FTP puissent \u00eatre utilis\u00e9s sans se connecter au point d&#8217;acc\u00e8s WiFi cr\u00e9\u00e9 par le module et ne pas encombrer le main.py file. Dans notre cas, vous n&#8217;avez pas besoin d&#8217;utiliser un boot.py pour ces raisons, on va le laisser vide et l&#8217;ajouter \u00e0 notre dossier cr\u00e9\u00e9 juste avant.<\/p>\n\n\n\n<p>Avant de continuer sur ce code et le mettre en marche, on va cr\u00e9er un serveur tampon sur TheThingsNetwork de 7 jours qui nous permettra d&#8217;utiliser tous ces composants de mani\u00e8re efficace et permettre une bonne analyse.<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 4: LA R\u00c9CUP\u00c9RATION DE DONN\u00c9ES VIA TTN<\/p>\n\n\n\n<p>The Things Network nous permettra de sauvegarder les donn\u00e9es re\u00e7ues assez rapidement et comme vous l&#8217;aurez donc compris, The Things Networks nous servira de serveur tampon o\u00f9 les donn\u00e9es seront stock\u00e9es pendant une dur\u00e9e de 7 jours ainsi que de site web pour visualiser les donn\u00e9es rentrantes en temps r\u00e9els.<\/p>\n\n\n\n<p>Pour ce faire, nous allons cr\u00e9er un compte \u00e0 l&#8217;adresse suivante : <\/p>\n\n\n\n<p><a href=\"https:\/\/account.thethingsnetwork.org\/register\">https:\/\/account.thethingsnetwork.org\/register<\/a><\/p>\n\n\n\n<p>Une fois votre compte cr\u00e9\u00e9, connectez vous, sur la page d&#8217;accueil, cliquez sur votre profil en haut \u00e0 droite puis cliquez sur console puis enfin choisissez application :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/ux2Sxu516gDfFLybpc7WjRDHuswrgPEwZRBOAPw_5COM_VG3HeLf29kpguCULIsuzuDIsOhqqsWzXAssJ-w4pkXAjymi1jTwJvw3buHiKBo5kAJrsPfgqDSUVSPIk4TUqYhM7e-8\" alt=\"\"\/><\/figure>\n\n\n\n<p>Maintenant vous pouvez cr\u00e9er votre application avec un serveur tampon de 7 jours. Pour cela, cliquez sur &#8220;add application&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/1SQXq2h0FgGkNj7D2lAJ3fMb9Vvt6CJGp3xulxUo52a8EEU-nZJ7-LILlM6I_6sWhvbrlb90Mlp6FmLoRZ01tVYnlNQGG48JOvAWn_xo0YrGEsoIJ3g2ccUNVumnmSbbcrFxX8Fm\" alt=\"\"\/><\/figure>\n\n\n\n<p>Choisissez un nom dans &#8220;Application ID&#8221;, ajoutez un descriptif une fois ces champs rempli, vous pouvez cliquez sur &#8220;Add application&#8221; une nouvelle fois.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/v1kkPPTPTVVh_bSFtVYnp9b1GouC3yC7Ty_kv78NVFUBFLlhVqHMMqFG0jY6uXM-Akm8V3OA5ERJ3yfhxuYFWTwyH_QnMAa1gaqmCZZFvEaOyfPfojzoh4rytOBBoUcYAPK5xul7\" alt=\"\"\/><\/figure>\n\n\n\n<p>Cliquez sur l&#8217;application&#8221; que vous venez de cr\u00e9er d\u00e9sormais, plusieurs informations seront affich\u00e9es.<\/p>\n\n\n\n<p>Nous allons avoir besoin de certains d&#8217;entre elles pour compl\u00e9ter le code pr\u00e9c\u00e9dent.<\/p>\n\n\n\n<p>Pour ce faire nous devons aller dans l&#8217;onglet &#8220;Devices&#8221; et cliquer sur &#8220;Get started by registering one!&#8221; ou &#8220;register device&#8221;<br>Une fois cela fait, il ne vous restera plus qu&#8217;\u00e0 entrer un nom dans &#8220;Device ID&#8221; ainsi que de cliquez sur les doubles fl\u00e8ches \u00e0 gauche des champs pr\u00e9vus pour ins\u00e9rer le texte :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/rHOsT035a9xHpNfbX3r1_6zZSoGzSpWnGlJN8sSFEOnykfd-rFCKRHBR-zy3ua8UVjXXN9qIyi71ZT_8OFV6V31HrGXEn8dPnA4X8Vp-JdFPeNYx6--MB6vrCoNklA5Y8HVeoLmg\" alt=\"\"\/><\/figure>\n\n\n\n<p>Une fois cela fait, cliquez sur register en bas \u00e0 droite de la page. Ce qui vous renverra sur une page contenant plein de chiffres et de lettres. C&#8217;est sur cette page l\u00e0 que nous allons trouver les informations n\u00e9cessaires pour compl\u00e9ter notre code.<\/p>\n\n\n\n<p>Dans le code copi\u00e9 pr\u00e9c\u00e9demment vous avez remarqu\u00e9 qu&#8217;\u00e0 la ligne 24,25 et 26 des informations sont manquantes.<\/p>\n\n\n\n<p>Pour la ligne 24 entre les simples quotes (&#8216;), il vous faudra mettre la suite de chiffre et de lettre contenu dans la case \u00e0 c\u00f4t\u00e9 de &#8220;Device EUI&#8221; pour \u00e9viter que cela soit monotone et \u00e9liminer le risque d&#8217;erreur je vous conseille d&#8217;utiliser le bouton situ\u00e9 \u00e0 droite de la case permettant de copier le contenu dans la case en 1 clic! Cela fonctionnera \u00e9galement pour les 2 prochains contenus \u00e0 copier.<\/p>\n\n\n\n<p>Pour la ligne 25, entre les simples quotes (&#8216;), il vous faudra mettre le contenu de la case \u00e0 c\u00f4t\u00e9 de &#8220;Application EUI&#8221;.<\/p>\n\n\n\n<p>Pour la ligne 26 entre les simples quotes (&#8216;), il vous faudra mettre le  contenu dans la case \u00e0 c\u00f4t\u00e9 de &#8220;App Key&#8221; (Pensez \u00e0 appuyer sur l&#8217;oeil \u00e0 gauche de cette case pour voir les chiffres et les lettres contenu dans celle ci mais avec la technique cit\u00e9e pr\u00e9c\u00e9demment, il n&#8217;est pas n\u00e9cessaire de voir le texte pour le copier).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/Uu3klFCXiTTVQTlguX-bo2cjIrpVg5EQ_cwYVjd4sKL-p7A0DVlXEB5pG8JO-vsvITkvuBT-qSGSxLQdPc_glOdPEvnHE908q0uPHB6ZPG-ctkAGVRdconFVrvRtdHbZdxuLCZBJ\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 5: PROGRAMMATION DE LA LOPY<\/p>\n\n\n\n<p>D\u00e9sormais, vous pouvez mettre votre code dans la Pycom Lopy pour se faire nous allons utiliser Atom qui un \u00e9diteur de texte OpenSource avec son paquet Pymakr, ce paquet suppl\u00e9mentaire nous permettra de communiquer avec notre Lopy et t\u00e9l\u00e9charger votre projet, vos fichiers contenant le code python pr\u00e9c\u00e9dent sur votre Nano Ordinateur.<br><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/r1R9tzskEDiYuZVVa-jIdvr49WbSZXZbUXo7cqlU3U1_Lt0-pUR9HZjIEV3McYH3Z2YeJRLg4O0YAnpoMCQvzaKnBFgBRFFE9IkKYoKKNJcFxQkKfKYYuF_usbm1mc4shdcOuAFs\" alt=\"\"\/><\/figure>\n\n\n\n<p>Vous pouvez t\u00e9l\u00e9charger Atom en cliquant sur \u201cDownload\u201d sur cette page :&nbsp;<\/p>\n\n\n\n<p><a href=\"https:\/\/atom.io\/\">https:\/\/atom.io\/<\/a><\/p>\n\n\n\n<p>ou alors directement en cliquant sur ce lien si vous vous trouvez sous windows 64bits :<\/p>\n\n\n\n<p><a href=\"https:\/\/atom.io\/download\/windows_x64\">https:\/\/atom.io\/download\/windows_x64<\/a><\/p>\n\n\n\n<p>Vous pouvez t\u00e9l\u00e9charger Atom directement en cliquant sur ce lien si vous vous trouvez sous Linux :&nbsp;<\/p>\n\n\n\n<p><a href=\"https:\/\/atom.io\/download\/deb\">https:\/\/atom.io\/download\/deb<\/a><\/p>\n\n\n\n<p>Pour installer Pymakr, vous devez premi\u00e8rement lancer Atom puis cliquer sur &#8220;Install a Package&#8221; \u00e0 droite de votre application parmi la colonne de choix propos\u00e9s. Enfin cliquez sur &#8220;Open Installer&#8221; puis cherchez &#8220;pymakr&#8221;, il s&#8217;agira du premier de la liste normalement, t\u00e9l\u00e9chargez le module en appuyant sur le bouton pr\u00e9vu \u00e0 cet effet.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/VCjRXr2em2UKzCYl48_28JGsdxLzInBeFkOY55Kwye0CHoXxeUZ6wGY7SLaSJOB-K9w8D6Gmp8zrmofg5T5C3Y7SaXJII6dKSib4NrbCOS5NiveiGFp2GF0azyWHS4wzMAYrMsXm\" alt=\"\"\/><\/figure>\n\n\n\n<p>Une fois l&#8217;installation termin\u00e9e, vous avez une fen\u00eatre &#8220;terminal&#8221; qui s&#8217;ouvre au sein de votre Atom, pas d&#8217;inqui\u00e9tude cela veut tout simplement dire que vous avez r\u00e9ussi \u00e0 installer Pymakr.<\/p>\n\n\n\n<p>D\u00e9sormais nous allons connecter notre Pycom en wifi au PC si cela n\u2019\u00e9tait pas d\u00e9j\u00e0 fait auparavant alors vous devez avoir une ligne indiquant &#8220;Connecting on AdresseIpDeVotrePycom&#8221;.<\/p>\n\n\n\n<p>Si c&#8217;est le cas alors tout va bien jusque l\u00e0 et on est presque au bout de notre p\u00e9riple pour installer notre capteur DHT22 et r\u00e9cup\u00e9rer toutes ses pr\u00e9cieuses donn\u00e9es.<\/p>\n\n\n\n<p>D\u00e9sormais, il ne vous restera plus qu&#8217;\u00e0 ouvrir votre dossier contenant les code python main.py, et boot.py.<\/p>\n\n\n\n<p>Pour ce faire, appuyez simultan\u00e9ment sur les touches Ctrl + Shift + A puis s\u00e9lectionnez donc notre dossier, validez puis enfin vous cliquerez sur &#8220;Package&#8221; puis s\u00e9lectionnez dans la liste propos\u00e9e &#8220;Pymakr&#8221; et enfin cliquez sur &#8220;synchronize project&#8221;.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"662\" height=\"566\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/atom-synchro-project.png\" alt=\"\" class=\"wp-image-451\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/atom-synchro-project.png 662w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/atom-synchro-project-300x256.png 300w\" sizes=\"auto, (max-width: 662px) 100vw, 662px\" \/><\/figure>\n\n\n\n<p>Il est \u00e9galement possible en fonction de votre version d\u2019Atom de cliquez sur &#8220;Upload&#8221; qui se situe au dessus \u00e0 droite de votre fen\u00eatre &#8220;terminal&#8221; qui c&#8217;est ouverte dans Atom.<br>Gr\u00e2ce \u00e0 cette action votre Lopy recevra le code et l&#8217;ex\u00e9cutera. Le code \u00e9tant pr\u00e9vu dans une boucle while infinie, notre code tournera en boucle d\u00e9sormais jusqu&#8217;\u00e0 la fin des temps.<\/p>\n\n\n\n<p>Vous pouvez \u00e9galement utiliser l&#8217;option &#8220;Run&#8221; mais celle ci permet d&#8217;ex\u00e9cuter le programme jusqu&#8217;\u00e0 que votre Pycom s&#8217;\u00e9teigne (ou qu&#8217;elle n&#8217;est plus d&#8217;alimentation), tandis que &#8220;Upload&#8221; permet de dire \u00e0 la carte de continuer \u00e0 ex\u00e9cuter le code tant que l&#8217;on n&#8217;a pas remplac\u00e9 celui-ci dans la carte ou de la r\u00e9initialiser.<\/p>\n\n\n\n<p>Pour information, si vous regardez votre code de plus pr\u00e8s, on se rend compte qu\u2019il met en &#8220;veille&#8221; la transmission des donn\u00e9es r\u00e9colt\u00e9es par le capteur pendant 304 secondes soit 5 minutes et 04 secondes, pourquoi 04 secondes ? Tout simplement car je n&#8217;aime pas les chiffres rond et si vous voulez modifiez cette valeurs, il vous suffira de modifier la valeurs comprise entre les parenth\u00e8ses \/\/ () qui suivent notre &#8220;time.sleep&#8221; \u00e0 la ligne 125, qui est exprim\u00e9 en seconde, il faudra \u00e9galement ajouter 4 secondes \u00e0 ce temps l\u00e0, qui est un peu \u00e9parpill\u00e9 ailleurs dans le code mais je doute fort que vous ayez envie de voir la temp\u00e9rature et l&#8217;humidit\u00e9 vari\u00e9es avec moins de 4 secondes d&#8217;intervalles entre chaque valeurs ce qui n&#8217;aurait pas grand int\u00e9r\u00eat dans le domaine abord\u00e9 actuellement.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/HpuUO8a3uDU6NNXpyBQMHQv7MaVfcOq-tiSPAswSlJ-RjZMwzlonIwi8Lc4rg6XZE8GXvfRNUXxDlbg51iX_RzxtglOsFsV6ehJRxWkGHW-YtzI5Hc9FVYNuThqwRe3DOwvc6ixl\" alt=\"\"\/><\/figure>\n\n\n\n<p>D\u00e9sormais notre Lopy permet de transmettre les donn\u00e9es du capteur DHT22 \u00e0 TheThingsNetwork.<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 6: D\u00c9TRAMAGE DES DONN\u00c9ES SUR TTN<\/p>\n\n\n\n<p>Si on retourne sur le site web : <a href=\"https:\/\/console.thethingsnetwork.org\/applications\">https:\/\/console.thethingsnetwork.org\/applications<\/a> en choisissant votre application et en allant dans l&#8217;onglet &#8220;Data&#8221; rien n&#8217;appara\u00eet, vous n&#8217;avez qu&#8217;un tableau rempli d&#8217;une couleur bleu clair et transparent et sans colonne.<\/p>\n\n\n\n<p>Pourtant, je vous assure que les donn\u00e9es sont transmises et TheThingsNetwork les re\u00e7oit bien !<\/p>\n\n\n\n<p>Mais pourtant tout reste vide&#8230;<\/p>\n\n\n\n<p>Si vous cliquez sur l&#8217;onglet &#8220;Payload Formats&#8221; vous verrez encore du code mais cette fois ci, il est comment\u00e9 et forc\u00e9ment si un code est en commentaire, il ne sera pas lu et ne pourra pas faire la t\u00e2che qui lui est attribu\u00e9&#8230;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/0uQT9VaalcYkrSstdMEhPNJJADTSBhMna2XU9z7F72JSpZcNN38ruxH3FVGIuQMllFdLskvWHHTz7fH4D8lXpZCWBlU_LmuFfXbdXLJxYq980VIsyZOgrE5WqFctoebMgkNdvssh\" alt=\"\"\/><\/figure>\n\n\n\n<p>Cette fois-ci, vous allez devoir copier ce code :<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>function Decoder(bytes, port) {\n  \/\/ Decode an uplink message from a buffer\n  \/\/ (array) of bytes to an object of fields.\n  var decoded = {};\n  decoded.temperature = \"\";\n  decoded.humidity = \"\";\n  decoded.temperature = decoded.temperature + String.fromCharCode(bytes[0]);\n  decoded.temperature = decoded.temperature + String.fromCharCode(bytes[1]);\n  decoded.humidity = decoded.humidity + String.fromCharCode(bytes[2]);\n  decoded.humidity = decoded.humidity + String.fromCharCode(bytes[3]);\n  return decoded;\n}<\/code><\/pre>\n\n\n\n<p>et le coller \u00e0 la place de tout ce qui se trouve dans la fen\u00eatre qui contient du code en commentaire.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/SUqIGz1POkpi2L20IB0VwCj_seLkt4HXRdmza88clANCQaDrW2_Wlvz7yICFoc_hOp9StrOio5Q3Jp-0pyBenRatKcd_vpslTdUdt9n6WGCTQjSZ4cthGSoV_a5LA885g4e3J6fS\" alt=\"\"\/><\/figure>\n\n\n\n<p>Maintenant, si on regarde dans l&#8217;onglet &#8220;Data&#8221; on verra les donn\u00e9es arriver toutes les 5 minutes et 04 secondes.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/jaRKsQ6s_9iAHVOydQbqQz-1Lyb7xUgWlc1CjW4XvJdatVS8uyBruWJpy7fxSJSzcTQjAG29CPfDW9Tva4Rw7hY41QTW5-H1GQHtyJ7jfm9tdJYRNS-UQmxD_PzRUy0gh2pcfFIZ\" alt=\"\"\/><\/figure>\n\n\n\n<p>Il ne reste plus qu&#8217;\u00e0 cr\u00e9er un &#8220;Data Storage&#8221; dans TheThingsNetwork.<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 7 : SERVEUR TAMPON SUR TTN<\/p>\n\n\n\n<p>Pour ce faire, on va aller dans l&#8217;onglet &#8220;Integration&#8221;, une fois dans cette onglet, on va cliquer sur &#8220;Get started by creating one!&#8221; ou &#8220;add integration&#8221;, cela nous conduit sur une nouvelle page. Sur celle-ci, on va s\u00e9lectionner &#8220;Data Storage&#8221;, une fois cela fait, on valide en cliquant sur &#8220;add integration&#8221; en bas \u00e0 droite puis enfin on va cliquez sur &#8220;go to platform&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/JMZ_92gF86B0GgBayFnmjOyQybo2eMhCbxgVs4Fv5mA-nr_40b4_rs-tPsfqHzyl2dpwRFzac_c2BTv2F2jw8EvWUcex7nGV5uJ2BGgWsiqKsH42V--Vux0Pw2BXMjhndp0p5Csl\" alt=\"\"\/><\/figure>\n\n\n\n<p>Le Data Storage existe, et en ayant cliquez sur &#8220;go to platform&#8221; une nouvelle fen\u00eatre dans le navigateur c&#8217;est ouverte.<\/p>\n\n\n\n<p>Retournons sur notre autre fen\u00eatre et allons dans l&#8217;onglet &#8220;Overview&#8221; et descendez tout en bas de cette page, copier le contenu de &#8220;ACCESS KEYS&#8221; :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/Zxu_3MziN1jPNVnuC-GvnLrFHumJBpZsHrVFQL5G2HT9CJbY7vUTrd79VMhwwTFm3_q4gVS1bQ56w3eFC3fu824t5DQU1Ak18H1BZKUYHJu-GhCs2QdABsqDynflz-yIVRqPF2NR\" alt=\"\"\/><\/figure>\n\n\n\n<p>Une fois le contenu copi\u00e9, on retourne sur notre fen\u00eatre qui s&#8217;est ouverte pr\u00e9c\u00e9demment, et tout en haut \u00e0 droite dans la barre verte se trouve &#8220;Authorize&#8221;, cliquez dessus, collez ce que vous venez de copier dans le cadre puis cliquez sur \u201cAuthorize\u201d :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/t6ak7rWHyo606X_ORDLca0Qlf234zES0i71Esm94HZPtFK0b6hb0nlFCLenJlc8l13jGlPRZFPGj9YM92_3eD9ls-_oHVPFmL1nFYRoIVYofsdyRHBT2n97iYpjX54G_ywc0UwSH\" alt=\"\"\/><\/figure>\n\n\n\n<p>Cliquez sur &#8220;\/api\/v2\/query&#8221; et dans le cadre demandant les param\u00e8tres \u00e9crivez &#8220;304s&#8221;, validez.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/8qpRZuTaaGgh167Lz2ZXLpf0MR5ffROVWct0zIgB8hcPHLwvwp2zKmpCo2H3tZhihD6-Iv3QUcFCOn7jMiYiPPEUQzlhy92NJuoZeDy-GWO2xW5DUAkRXlQaXu9IOZGNS5e14d_m\" alt=\"\"\/><\/figure>\n\n\n\n<p>On va d\u00e9sormais, faire un moyen de stockage qui durera plus de 7 jours et qui soit permanent.<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 8: STOCKAGE DANS UNE BASE DE DONN\u00c9ES PERMANENTE INFLUXDB<br><\/p>\n\n\n\n<p>Pour cette partie, on va installer InfluxDB.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/UC7FEL4XvJlbrxIZ09aMY-BbaFoOGqFbFlo0r9H79JlEkI7IyG_MVrm8Pn5Extp7RYPk7gFYQBiRJQY2LHL1qwFSvt-HygHWFbIWXe6K8QbRIIs2FbZnSLB8ppvGc5xA6srz9tLV\" alt=\"\" width=\"432\" height=\"159\"\/><\/figure>\n\n\n\n<p>InfluxDB c&#8217;est quoi ?<\/p>\n\n\n\n<p>Il s&#8217;agit d&#8217;un outil de gestion de Base De Donn\u00e9es qui rentre dans la famille des Base De Donn\u00e9es (BDD) tel que MariaDB ou encore MySQL mais les commandes et les noms ne seront pas tout \u00e0 fait les m\u00eames, tout comme la structure au final.<\/p>\n\n\n\n<p>Pour l&#8217;installer, il suffit d&#8217;utiliser cette commande dans votre terminal:<\/p>\n\n\n\n<p> sudo apt-get update; sudo apt-get upgrade; sudo apt-get install influxdb; sudo service influxdb start<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/l5PBXFa3enzHZkgGebymFBZuyp0sPang8T9A8ZXse9ggOAL08dGlz9r7rKHtMA-vYC_wG9VJFI9n_hbgi2yy2iqDE7ERZpRWSTsbPbDa9bJAKGSAAVspUvN14RcthBPsGu723HXp\" alt=\"\"\/><\/figure>\n\n\n\n<p>Si vous faite r\u00e9guli\u00e8rement vos mises \u00e0 jours, cela ne durera pas longtemps.<\/p>\n\n\n\n<p>Cette commande nous permet de mettre \u00e0 jour notre OS, d&#8217;installer InfluxDB puis enfin de le lancer sans intervention de notre part, sauf si les fichiers \u00e0 t\u00e9l\u00e9charger sont volumineux et \u00e0 ce moment l\u00e0 ils nous demandent une petite confirmation de votre part par un &#8216;O&#8217; ou &#8216;Y&#8217;.<\/p>\n\n\n\n<p>Maintenant que InfluxDB est install\u00e9, on va quand m\u00eame v\u00e9rifier que tout marche bien.<\/p>\n\n\n\n<p>Pour \u00e7a, on va utiliser la commande &#8220;influx&#8221; qui va nous permettre de nous connecter \u00e0 InfluxDB.<\/p>\n\n\n\n<p>Si tout est ok, votre terminal change l\u00e9g\u00e8rement et ressemble \u00e0 cela :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/UcjNBv51ezxLiVOnDYgx5Srly2gPpY9hswin9pKE96xmqhDk0laIpr40qa9PbsmA0mJqDcHzQdK_oeCmqmdsWQRNz55_swsusaZtS4SjzfWaC80IgDFlfYzc6sWJ5PsLRsWztylB\" alt=\"\"\/><\/figure>\n\n\n\n<p>Maintenant qu&#8217;on a v\u00e9rifi\u00e9 que tout marche, on va quitter InfluxDB pour se lancer dans un script en langage C et Shell pour automatiser la r\u00e9ception de nos donn\u00e9es.<\/p>\n\n\n\n<p>Pour quitter InfluxDB, on va utiliser la commande &#8220;quit&#8221;. Une fois InfluxDB quitt\u00e9, nous revoil\u00e0 sur le Terminal d&#8217;origine.<\/p>\n\n\n\n<p>Vous pouvez r\u00e9cup\u00e9rer les codes que l&#8217;on va aborder dans ce fichier zip suivant:<\/p>\n\n\n\n<p style=\"font-size:40px\" class=\"has-text-color has-background has-very-light-gray-color has-vivid-red-background-color\">zip C<\/p>\n\n\n\n<p> Avant de commencer, on va cr\u00e9er un dossier qui aura pour nom : GestionDHT22 dans le dossier Documents <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/U1ZheFcqa4JbsL4NZ0ChWAchxPdwmhsm1zODDcSUgcluBTxwNLn29Uif7FTt3IExh1IMPdm43pKRZYAS46S5ffM2x-12imN8LMmoDCbRZQajMK_C7goD9t-a7LLvp43r_9CwgrVI\" alt=\"\"\/><\/figure>\n\n\n\n<p>On va d\u00e9sormais cr\u00e9er 3 nouveaux scripts, le premier qui s\u2019appellera : script_shell_BDD.sh qui lui contiendra ce script l\u00e0 :<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\ncd ~\/Documents\/GestionDHT22\ncurl -i -XPOST 'http:\/\/localhost:8086\/write?db=nom_de_votre_BDD' --data-binary @testtend.txt\nrm *.txt<\/code><\/pre>\n\n\n\n<p>Il nous permettra d\u2019envoyer le contenu de \u201ctesttend.txt\u201d \u00e0 notre BDD InfluxDB ainsi que de supprimer tous les fichiers .txt cr\u00e9\u00e9s durant l\u2019ex\u00e9cution du programme C afin de permettre le traitement des donn\u00e9es.<\/p>\n\n\n\n<p>Un deuxi\u00e8me : script_shell_curl.sh qui lui aura pour code : <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#!\/bin\/bash\ncd ~\/Documents\/GestionDHT22<\/code><\/pre>\n\n\n\n<p>Nous devons retourner sur notre fameuse page internet et r\u00e9cup\u00e9rer la commande &#8220;Curl&#8221; pour l&#8217;ins\u00e9rer ici (exemple ci dessous) :<\/p>\n\n\n\n<p>#curl -X GET &#8211;header &#8216;Accept: application\/json&#8217; &#8211;header &#8216;Authorization: key ttn-account-v2.suite_de_caractere&#8217; &#8216;https:\/\/nom_de_votre_application.data.thethingsnetwork.org\/api\/v2\/query?last=304s&#8217; &gt; testtr.txt<\/p>\n\n\n\n<p>Ajoutez \u00e9galement \u00e0 la fin de cette commande Curl &#8220;&gt; testtr.txt&#8221; comme montrez dans l&#8217;exemple ci dessus, cela nous permettra de rediriger la sortie de ce que notre commande \u00e9crit dans le terminal dans le fichier testtr.txt<br>Celui ci nous permettra de r\u00e9cup\u00e9rer les valeurs en format Json de la page venant du Data Storage de TheThingsNetwork<\/p>\n\n\n\n<p>Enfin le dernier et aussi le plus long : unJolieNom.c qui lui contiendra ce code l\u00e0 :<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;stdio.h>\n#include &lt;stdlib.h>\n#include &lt;string.h>\n#include &lt;unistd.h>\n#define LECTURE_MAX 1000000\n \nint\tmain()\n{\n\tFILE* ficr;\n\tFILE* ficw;\n\tFILE* ficp;\n\tFILE* ficx;\n\tFILE* ficfull;\n\tFILE* fice;\n\tFILE* ficl;\n\tchar jsonOneLigne[LECTURE_MAX] = \"\";\n\tint a;\n\tint compt;\n\tint savecompt;\n\tchar jsonPretty[LECTURE_MAX] = \"\";\n\tint i;\n\tint try;\n\tchar traiter[LECTURE_MAX] = \"\";\n\tint n;\n\twhile (1)\n\t{\n\t\tsystem(\"sh script_shell_curl.sh\");\n\t\tstrcpy(jsonOneLigne,\"\");\n\t\tficr = NULL;\n\t\tficr = fopen(\"testtr.txt\", \"r\"); \n\t\tif (ficr == NULL) \n\t\t{\n\t\t\tprintf(\"Une erreur c\\'est produit durant l'ouverture du fichier de lecture\"); \n\t\t\texit(1); \n\t\t}\n\t\telse \n\t\t{\n\t\t\tfgets(jsonOneLigne, LECTURE_MAX, ficr); \n\t\t\tfclose(ficr); \n\t\t\tficw = NULL;\n\t\t\tficw = fopen(\"testtw.txt\", \"w\"); \n\t\t\tif (ficw == NULL) \n\t\t\t{\n\t\t\t\tprintf(\"Une erreur c\\'est produit durant l'ouverture du fichier d\\'ecriture\"); \n\t\t\t\texit(1); \n\t\t\t}\n\t\t\telse \n\t\t\t{\n\t\t\t\ta = 0;\n\t\t\t\tcompt = 0;\n\t\t\t\tsavecompt = compt;\n\t\t\t\twhile (jsonOneLigne[a] != '\\0') \n\t\t\t\t{\n\t\t\t\t\tif (jsonOneLigne[a] == '[')\n\t\t\t\t\t{\n\t\t\t\t\t\tif (a != 0) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf(ficw, \"\\n\"); \n\t\t\t\t\t\t}\n\t\t\t\t\t\tfprintf(ficw, \"%c\", jsonOneLigne[a]);\n\t\t\t\t\t\tcompt++;\n\t\t\t\t\t}\n\t\t\t\t\telse if (jsonOneLigne[a] == '\"' &amp;&amp; jsonOneLigne[a-1] == '[') \n\t\t\t\t\t{\n\t\t\t\t\t\tsavecompt = compt; \n\t\t\t\t\t\tfprintf(ficw, \"\\n\");\n\t\t\t\t\t\twhile (compt != 0) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf(ficw, \"\\t\"); \n\t\t\t\t\t\t\tcompt--; \n\t\t\t\t\t\t}\n\t\t\t\t\t\tfprintf(ficw, \"%c\", jsonOneLigne[a]);\n\t\t\t\t\t\tcompt = savecompt; \n\t\t\t\t\t\tcompt++; \n\t\t\t\t\t\tsavecompt = compt; \n\t\t\t\t\t}\n\t\t\t\t\telse if (jsonOneLigne[a] == ']') \n\t\t\t\t\t{\n\t\t\t\t\t\tfprintf(ficw, \"\\n%c\", jsonOneLigne[a]); \n\t\t\t\t\t\tcompt--; \n\t\t\t\t\t}\n\t\t\t\t\telse if (jsonOneLigne[a] == '{') \n\t\t\t\t\t{\n\t\t\t\t\t\tsavecompt = compt;\n\t\t\t\t\t\tfprintf(ficw, \"\\n\"); \n\t\t\t\t\t\twhile (compt != 0) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf(ficw, \"\\t\");\n\t\t\t\t\t\t\tcompt--; \n\t\t\t\t\t\t}\n\t\t\t\t\t\tfprintf(ficw, \"%c\", jsonOneLigne[a]); \n\t\t\t\t\t\tcompt = savecompt; \n\t\t\t\t\t\tcompt++;\n\t\t\t\t\t\tsavecompt = compt;\n\t\t\t\t\t\tfprintf(ficw, \"\\n\");\n\t\t\t\t\t\twhile (compt != 0) \n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf(ficw, \"\\t\");\n\t\t\t\t\t\t\tcompt--; \n\t\t\t\t\t\t}\n\t\t\t\t\t\tcompt = savecompt;\n\t\t\t\t\t}\n\t\t\t\t\telse if (jsonOneLigne[a] == '}')\n\t\t\t\t\t{\n\t\t\t\t\t\tcompt--;\n\t\t\t\t\t\tsavecompt = compt;\n\t\t\t\t\t\tfprintf(ficw, \"\\n\");\n\t\t\t\t\t\twhile (compt != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf(ficw, \"\\t\");\n\t\t\t\t\t\t\tcompt--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcompt = savecompt;\n\t\t\t\t\t\tfprintf(ficw, \"%c\", jsonOneLigne[a]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (jsonOneLigne[a] == ':')\n\t\t\t\t\t{\n\t\t\t\t\t\tfprintf(ficw, \"%c\", jsonOneLigne[a]);\n\t\t\t\t\t\tif (jsonOneLigne[a] == ':' &amp;&amp; jsonOneLigne[a+1] == '\"')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf(ficw, \" \");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse if (jsonOneLigne[a] == ',' &amp;&amp; jsonOneLigne[a+1] == '{')\n\t\t\t\t\t{\n\t\t\t\t\t\tfprintf(ficw, \"%c\", jsonOneLigne[a]);\n\t\t\t\t\t}\n\t\t\t\t\telse if (jsonOneLigne[a] == ',')\n\t\t\t\t\t{\n\t\t\t\t\t\tsavecompt = compt;\n\t\t\t\t\t\tfprintf(ficw, \"%c\\n\", jsonOneLigne[a]);\n\t\t\t\t\t\twhile (compt != 0)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tfprintf(ficw, \"\\t\");\n\t\t\t\t\t\t\tcompt--;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcompt = savecompt;\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tfprintf(ficw, \"%c\", jsonOneLigne[a]);\n\t\t\t\t\t}\n\t\t\t\t\ta++;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfclose(ficw);\n\t\t\tficp = NULL;\n\t\t\tficp = fopen(\"testtw.txt\", \"r\");\n\t\t\tif (ficp == NULL)\n\t\t\t{\n\t\t\t\tprintf(\"Une erreur c\\'est produit durant l'ouverture du fichier de lecture\");\n\t\t\t\texit(1);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tficx = NULL;\n\t\t\t\tficx = fopen(\"testt.txt\", \"w\");\n\t\t\t\tficfull = NULL;\n\t\t\t\tficfull = fopen(\"testtfull.txt\", \"a\");\n\t\t\t\tif (ficx == NULL || ficfull == NULL)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"Une erreur c\\'est produit durant l'ouverture du fichier d\\'ecriture\");\n\t\t\t\t\texit(1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tstrcpy(jsonPretty,\"\");\n\t\t\t\t\twhile (fgets(jsonPretty,LECTURE_MAX, ficp) != '\\0')\n\t\t\t\t\t{\n\t\t\t\t\t\tprintf(\"%s\", jsonPretty);\t\t\t\n\t\t\t\t\t\ti = 0;\n\t\t\t\t\t\ttry = 0;\n\t\t\t\t\t\twhile (jsonPretty[i] != '\\0')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif (jsonPretty[i] >= 'a' &amp;&amp; jsonPretty[i] &lt;= 'z')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf(ficx, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\tfprintf(ficfull, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (jsonPretty[i] >= 'A' &amp;&amp; jsonPretty[i] &lt;= 'Z')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf(ficx, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\tfprintf(ficfull, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (jsonPretty[i] == ':' || jsonPretty[i] == '.')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (jsonPretty[i] == ':' &amp;&amp; jsonPretty[i+1] == ' ')\t\t\t\t\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(ficx, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\t\tfprintf(ficfull, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\t\tfprintf(ficx, \"%c\", jsonPretty[i+1]);\n\t\t\t\t\t\t\t\t\tfprintf(ficfull, \"%c\", jsonPretty[i+1]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(ficx, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\t\tfprintf(ficfull, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (jsonPretty[i] == '\\n' || jsonPretty[i] == '=' || jsonPretty[i] == '_' || jsonPretty[i] == '-')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf(ficx, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\tfprintf(ficfull, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (jsonPretty[i] &lt;= '9' &amp;&amp; jsonPretty[i] >= '0')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf(ficx, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t\tfprintf(ficfull, \"%c\", jsonPretty[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ti++;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfclose(ficp);\n\t\t\t\t}\n\t\t\t\tfclose(ficx);\n\t\t\t\tfclose(ficfull);\n\t\t\t\tfice = NULL;\n\t\t\t\tfice = fopen(\"testtend.txt\", \"w\");\n\t\t\t\tif (ficp == NULL)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"Une erreur c\\'est produit durant l'ouverture du fichier d'ecriture\");\n\t\t\t\t\texit(1);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tficl = NULL;\n\t\t\t\t\tficl = fopen(\"testt.txt\", \"r\");\n\t\t\t\t\tif (ficl == NULL)\n\t\t\t\t\t{\n\t\t\t\t\t\tprintf(\"Une erreur c\\'est produit durant l'ouverture du fichier de lecture\");\n\t\t\t\t\t\texit(1);\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tstrcpy(traiter,\"\");\n\t\t\t\t\t\tfprintf(fice, \"captor_tester,capteur_numero=1 \");\n\t\t\t\t\t\twhile (fgets(traiter,LECTURE_MAX, ficl) != '\\0')\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tn = 0;\n\t\t\t\t\t\t\tif (traiter[0] == 't' &amp;&amp; traiter[1] == 'e' &amp;&amp; traiter[2] == 'm' &amp;&amp; traiter[3] == 'p' &amp;&amp; traiter[4] == 'e' &amp;&amp; traiter[5] == 'r' &amp;&amp; traiter[6] == 'a' &amp;&amp; traiter[7] == 't' &amp;&amp; traiter[8] == 'u' &amp;&amp; traiter[9] == 'r' &amp;&amp; traiter[10] == 'e')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tfprintf(fice, \",\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twhile (traiter[n] != '\\0')\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tif (traiter[0] == 't' &amp;&amp; traiter[1] == 'i' &amp;&amp; traiter[2] == 'm' &amp;&amp; traiter[3] == 'e')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twhile (traiter[n] != '\\0')\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tn++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (traiter[0] == 'd' &amp;&amp; traiter[1] == 'e' &amp;&amp; traiter[2] &lt;= 'v' &amp;&amp; traiter[3] >= 'i' &amp;&amp; traiter[4] &lt;= 'c' &amp;&amp; traiter[5] >= 'e')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twhile (traiter[n] != '\\0')\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tn++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (traiter[0] == 'r' &amp;&amp; traiter[1] == 'a' &amp;&amp; traiter[2] == 'w')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\twhile (traiter[n] != '\\0')\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\tn++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif (traiter[n] &lt;= 'Z' &amp;&amp; traiter[n] >= 'A')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(fice, \"%c\", traiter[n]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (traiter[n] &lt;= 'z' &amp;&amp; traiter[n] >= 'a')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(fice, \"%c\", traiter[n]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (traiter[n] == ':' &amp;&amp;  traiter[n+1] == ' ')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(fice, \"=\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (traiter[n] == '_' || traiter[n] == '-' || traiter[n] == '.' || traiter[n] == ':' || traiter[n] == '\\'')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(fice, \"%c\", traiter[n]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (traiter[n] &lt;= '9' &amp;&amp; traiter[n] >= '0')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(fice, \"%c\", traiter[n]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\telse if (traiter[n] == '=')\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tfprintf(fice, \"%c\", traiter[n]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tn++;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfclose(ficl);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfclose(fice);\n\t\t\t}\n\t\t}\n\t\tsystem(\"sh script_shell_BDD.sh\");\n\t\tsleep(300);\n\t}\n\treturn (0);\n}\n<\/code><\/pre>\n\n\n\n<p>Enfin vous utiliserez la commande suivante:<\/p>\n\n\n\n<p>gcc .\/unJolieNom.c<\/p>\n\n\n\n<p>Celle-ci, nous permet de rendre notre code C compr\u00e9hensible par la machine, elle a convertie votre code C en ex\u00e9cutable.<\/p>\n\n\n\n<p>Une fois cela fait, pour l\u2019ex\u00e9cuter, il ne vous reste plus qu\u2019\u00e0 faire lancer cette derni\u00e8re  commande:<\/p>\n\n\n\n<p>.\/a.out<\/p>\n\n\n\n<p>cela lancera le programme compil\u00e9 sans aucune extension qui se nomme : a.out par d\u00e9faut.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/ViY6mRVz2rZ7E5Osg-QOACMHDXdDCt_UFDDZdoyfNDIJloYzIwGlDGfEWkZ0q2OTNyhaIis24J4jvJxfT11gGhLEDe8DE-i8uG_0vFnOHrs_5Mh_mvszw_xSy-r5Cx38dpdKMfWD\" alt=\"\"\/><\/figure>\n\n\n\n<p>Voil\u00e0, notre script nous permet de r\u00e9cup\u00e9rer toutes les 5 minutes et 04 secondes les valeurs transmises par le capteur, cela nous permet d&#8217;avoir la m\u00eame fr\u00e9quence que l&#8217;envoi des donn\u00e9es de notre capteur DHT22.<\/p>\n\n\n\n<p>Il ne vous reste plus qu&#8217;\u00e0 lancer ce script sur votre machine ou m\u00eame sur une Raspberry si vous ne voulez pas laisser votre Ordinateur allum\u00e9 en permanence.<\/p>\n\n\n\n<p>Mais si vous avez un souci,( que votre Ordinateur s&#8217;\u00e9teint ou que le script cesse de fonctionner) et que vous perdez 1,2,3,4,5,6 voir 7 jours (car vous \u00eates partis en vacances par exemple), il vous suffira d&#8217;effectuer une petite modification afin de nous permettre de r\u00e9cup\u00e9rer tout cela d&#8217;un seul coup.<\/p>\n\n\n\n<p>Je vous conseille m\u00eame de faire des fichier &#8220;Origine&#8221; permettant de garder les codes d&#8217;origines pour \u00eatre s\u00fbr de ne pas vous tromper lors de la remise par d\u00e9faut de votre code. Vous n&#8217;aurez qu&#8217;\u00e0 faire un copier\/coller de ces derniers pour reprendre comme avant vos activit\u00e9s de stockage.<\/p>\n\n\n\n<p>Donc la modification \u00e0 faire est sur la commande Curl du script_shell_curl, \u00e0 la fin de celle ci se trouve &#8220;=304s&#8221; si vous avez mis \u00e9galement un temps de 304 secondes entre chaque mesure. Vous devrez mettre si vous avez perdu 10 heures 25 minutes 2 secondes par exemple &#8220;=37502s&#8221; mais si vous avez besoin de r\u00e9cup\u00e9rer pr\u00e9cis\u00e9ment 1 jours vous pouvez \u00e9galement mettre &#8220;=1d&#8221; ou qu&#8217;une seul heure &#8220;=1h&#8221; mais en g\u00e9n\u00e9rale, on ne perd pas 1 journ\u00e9e pr\u00e9cise de travail alors je vous conseille de faire une conversion en secondes pour r\u00e9cup\u00e9rer absolument toutes les valeurs perdues.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/5d3h42m24s.png\" alt=\"\" class=\"wp-image-445\" width=\"623\" height=\"28\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/5d3h42m24s.png 489w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/5d3h42m24s-300x13.png 300w\" sizes=\"auto, (max-width: 623px) 100vw, 623px\" \/><\/figure>\n\n\n\n<p>Une fois la modification faite, lancez le programme normalement et une fois ex\u00e9cut\u00e9 une fois, vous pouvez le remettre avec votre temps pr\u00e9c\u00e9demment dans notre cas &#8220;=304s&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/304s.png\" alt=\"\" class=\"wp-image-446\" width=\"469\" height=\"13\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/304s.png 469w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/07\/304s-300x8.png 300w\" sizes=\"auto, (max-width: 469px) 100vw, 469px\" \/><\/figure>\n\n\n\n<p>Et voil\u00e0, d\u00e9sormais InfluxDB nous permet le stockage \u00e0 long termes de nos valeurs re\u00e7ues et m\u00eame de r\u00e9cup\u00e9rer les donn\u00e9es perdues jusqu&#8217;\u00e0 1 semaine si votre serveur a d\u00e9cid\u00e9 de vous laisser tomber en m\u00eame temps que vos vacances.<\/p>\n\n\n\n<p>Mais je pense que nous sommes tous d\u2019accord pour dire qu\u2019un affichage graphique permettant un aper\u00e7u plus simpliste et plus lisible serait \u00e9galement sympathique pour visualiser nos donn\u00e9es stock\u00e9es sans difficult\u00e9 afin de voir plus rapidement certaines anomalies pour les analyser par exemple ou encore permettre de voir entre quelle valeurs oscille notre temp\u00e9rature et notre humidit\u00e9 dans notre cas.<\/p>\n\n\n\n<p>Pour ce faire on va utiliser Grafana.<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 9: VISUALISATION DES DONN\u00c9ES VIA GRAFANA<\/p>\n\n\n\n<p>Grafana c&#8217;est quoi ?<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/gi5hCla3jLgH94Yrwwo6HX69sNkDF5Ud1-tHm8J4wKrVLW0Crd72Kzp1omBxSFVWkaIlbjpFNt3sLpl7XqWJPykSmdnLUJ8Vl3O5MKZmBTyvN2H_-Htu-dcCvOmjESKFU8cgNhPe\" alt=\"\"\/><\/figure>\n\n\n\n<p>Grafana c&#8217;est un logiciel libre, il est OpenSource, il est disponible sous license Apache 2.0.<\/p>\n\n\n\n<p>Il permet la visualisation et la mise en forme de diverses donn\u00e9es au sein de divers tableaux de bord graphiques. Il supporte plusieurs sources dont des Bases De Donn\u00e9es comme OpenTSDB, graphite ou encore InfluxDB, parfait c\u2019est exactement ce que vous utilisez !<\/p>\n\n\n\n<p class=\"has-medium-font-size\">Comment l&#8217;installer ?<\/p>\n\n\n\n<p>\tSi vous \u00eates sous Linux :<\/p>\n\n\n\n<p>Soit vous pouvez l&#8217;installer de mani\u00e8re classique avec non pas 1 mais 2 lignes de commande et le tour sera jou\u00e9.<\/p>\n\n\n\n<p>sudo wget <a href=\"https:\/\/dl.grafana.com\/oss\/release\/grafana_6.2.5_amd64.deb\">https:\/\/dl.grafana.com\/oss\/release\/grafana_6.2.5_amd64.deb<\/a><\/p>\n\n\n\n<p>sudo dpkg -i grafana_6.2.5_amd64.deb <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/GqE35ITnFX1jxG1cP50SVAFByN0m2wCD9OM9X-zbj28MHV1nHnFKs4HdL8X7TWhZA2dcV5MV3Mc4cVCneigKhbYK0iWQp5rkPw0Uwt0dw0VQ3mqKj-9x2DhTHhcdA-XvQUrx_V_C\" alt=\"\"\/><\/figure>\n\n\n\n<p>Une fois cela fait, il vous suffit de lancer cette commande qui permettra de mettre en route le serveur grafana :<\/p>\n\n\n\n<p>\t\t\tsudo \/bin\/systemctl start grafana-server<\/p>\n\n\n\n<p>\tSi vous \u00eates sous windows :<\/p>\n\n\n\n<p>\t\tCliquez sur le lien suivant pour installer l&#8217;installation de grafana.<\/p>\n\n\n\n<p><a href=\"https:\/\/dl.grafana.com\/oss_release\/grafana-6.2.5.windows-amd64-msi\">https:\/\/dl.grafana.com\/oss_release\/grafana-6.2.5.windows-amd64-msi<\/a><\/p>\n\n\n\n<p>\t\tUne fois install\u00e9, lancer le.<\/p>\n\n\n\n<p>Laissez tout par d\u00e9faut en suivant ce qui vous est demand\u00e9 lors de l&#8217;installation.<\/p>\n\n\n\n<p>\tSi vous \u00eates sous mac :<\/p>\n\n\n\n<p>\t\tUne seule ligne de commande suffira :<\/p>\n\n\n\n<p>\t\t\tbrew install grafana<\/p>\n\n\n\n<p>Une fois cela fait il vous suffit de lancer cette commande qui permettra de lancer le serveur grafana :<\/p>\n\n\n\n<p>\t\t\tbrew services start grafana.<\/p>\n\n\n\n<p>Une fois l&#8217;installation termin\u00e9e, ouvrez un navigateur web et allez sur le lien suivant :<\/p>\n\n\n\n<p> <a href=\"3000\">localhost:3000<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/sJF5-rsmEZS1n65dzlgu38-CU8RxGdJUzYs8KGL6eAXAY_BnEdvEgAgLskU-8dLta5F0ZaDOeuLwzkE3Tt_2aWaZYepsSsE5_ra5lFSluyqet2Ysa0lBjFbqPQZsEOC5hLYfov8V\" alt=\"\"\/><\/figure>\n\n\n\n<p>Une fois sur cette page, il vous sera demand\u00e9 un nom d&#8217;utilisateur et un mot de passe, les 2 seront par d\u00e9faut &#8220;admin&#8221;<\/p>\n\n\n\n<p>Une fois connect\u00e9, on vous demandera si vous souhaitez changer de mot de passe, ce qui est fortement recommand\u00e9&#8230;<\/p>\n\n\n\n<p>Maintenant qu&#8217;il est install\u00e9 et fonctionnel, il ne reste plus qu&#8217;\u00e0 le configurer.<\/p>\n\n\n\n<p>Pour ce faire, une fois connect\u00e9, en haut \u00e0 gauche dans une liste vertical se trouver un &#8220;+&#8221;&nbsp; cliquez dessus puis s\u00e9lectionner sur &#8220;Dashboard&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/FrY45MhB3zdvPTvVEQHc0LPOPkh2Tqq6RRT56kWljlBlSsjAvlHNJn5cogMAAVknaugSkkmg08oUZT7r6AGC-z0qIQ28MA92wxiqSnphw0f2bj16RHyGLajzq-HOcNYXHh0rBm9Z\" alt=\"\"\/><\/figure>\n\n\n\n<p> Je vous conseille d&#8217;utiliser &#8220;Choose Visualization&#8221; dans un premier temps utilisez l&#8217;option &#8220;Graph&#8221; pour permettre l&#8217;affichage de votre temp\u00e9rature et de votre humidit\u00e9 sur le m\u00eame graphique. Une fois &#8220;Graph&#8221; s\u00e9lectionn\u00e9, plusieurs options vous sont propos\u00e9es. Pour plus de clart\u00e9, je vous sugg\u00e8re d&#8217;utiliser &#8220;Lines&#8221; qui vous permettra comme son nom l&#8217;indique de former une lignes constante gr\u00e2ce aux diff\u00e9rentes valeurs r\u00e9colt\u00e9es.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/FGbjv6XKlUTi05CgFDcRjeiUTSTmDrjTp52x6OhSvGtpE4xqJm0UvoMBcYr7MUPT7yZdY_MVK9phMbf7IOfXx9gFz_QRFou9_MBVJy9_UezfVl767iMsocuY7hCtUQqe2WG9yR_e\" alt=\"\"\/><\/figure>\n\n\n\n<p>Utiliser &#8220;Bars&#8221; permet de cr\u00e9er une barre verticale pour chaque valeur r\u00e9colt\u00e9e, ce qui permet de voir la valeur re\u00e7ue ainsi que sa temporalit\u00e9.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/G5G2TMu49NXMubUHdqQ49MjDw8b3MlyskEuEkOvVaob_bL9V6KcWg6Ufii4oIvdTubhAaMkCZojwQc1--ZPHPQQQBC6bP90akRxQ3KMKuIITMutMHJN1Fret-2QBsTj6si-a7VEj\" alt=\"\"\/><\/figure>\n\n\n\n<p>Enfin utilisez &#8220;Points&#8221; vous permet de cr\u00e9er 1 point par valeur ce qui \u00e0 mon sens n&#8217;a pas forc\u00e9ment d&#8217;int\u00e9r\u00eat dans notre situation, je vous conseille donc d&#8217;utiliser &#8220;Lines&#8221; ou bien &#8220;Bars&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/ph_QhlcfJ_IahOz0YkW9hNUxtcStdJ2G9J8o7R-Rphk8wy3PayzRaGujJiVLZPGW2T2G1cnloZFFY9pZ3TPKZKjK6Eb7v16R8JWbZkLszbWP4W0UeeEgs0tuYw59mipD0TzD_S4t\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ensuite dans la colonne &#8220;Mode Options&#8221;, si vous avez s\u00e9lectionn\u00e9 l&#8217;option &#8220;Bars&#8221;, aucune option dans cette colonne ne vous sera propos\u00e9e. Si vous avez s\u00e9lectionn\u00e9 l&#8217;option &#8220;Lines&#8221;, l&#8217;option &#8220;Fill&#8221; permet de choisir l&#8217;opacit\u00e9 de ce qui se trouve en dessous de votre ligne, elle est par d\u00e9faut r\u00e9gl\u00e9 \u00e0 1 et je vous conseille de garder cette valeur. L&#8217;option &#8220;Line Width&#8221; permet de r\u00e9gler l&#8217;\u00e9paisseur de la ligne, elle est \u00e9galement fix\u00e9 \u00e0 1 par d\u00e9faut. L&#8217;option &#8220;Staircase&#8221; permet de mettre un mode escalier, cela permettra un m\u00e9lange entre l&#8217;option &#8220;Lines&#8221; et l&#8217;option &#8220;Bars&#8221;. Si vous avez s\u00e9lectionn\u00e9 l&#8217;option &#8220;Points&#8221;, Seule l&#8217;option &#8220;Point Radius&#8221; vous sera propos\u00e9e, vous permettant de choisir la taille du rayon de votre point.<br>Ensuite dans la colonne &#8220;Hover tooltip&#8221;, Il ne faudra rien toucher.<br>Dans la colonne &#8220;Stacking &amp; Null value&#8221;, il faudra mettre &#8220;Null value&#8221; avec pour valeur &#8220;null&#8221; ce qui permettra en cas d&#8217;erreur de ne pas renvoyer une valeur aberrante tel que 0 qui est propos\u00e9e dans la liste des valeurs assignable \u00e0 &#8220;Null value&#8221;.<br>Une fois la partie visuelle termin\u00e9e, on va descendre l\u00e9g\u00e8rement et donner des titres \u00e0 nos Axes. D&#8217;autant plus que nous allons avoir besoin des 2 axes Y pour mettre l&#8217;humidit\u00e9 et la temp\u00e9rature sur le m\u00eame graphique.<\/p>\n\n\n\n<p>Nous allons mettre la temp\u00e9rature \u00e0 gauche et l&#8217;humidit\u00e9 \u00e0 droite en assignant les extremums possible par le capteurs.<\/p>\n\n\n\n<p>Ensuite vient la l\u00e9gende, cela ne d\u00e9pend que de vous. Pour ma part, je continuerai en activant &#8220;Show&#8221;, &#8220;As Table&#8221; ainsi que &#8220;To the right&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/fY2nLgA7Iqd2xz3V1xfPRitrLxusiP6rPPtQrlopMQWzZWM2KcJVrkBnCTnW5r3uDdS0CMeP0rCZMe9NV-ZkWC7Xo6P7SGY8UPrkMDQpMq5b8To6f5bZwi5YCDu7dqmj5BHim8nr\" alt=\"\"\/><\/figure>\n\n\n\n<p>D\u00e9sormais, on va cliquer sur le boulon avec la cl\u00e9 \u00e0 molette dans la colonne de gauche qui s&#8217;appelle &#8220;General\u201d<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/BhzQzeJEb519dm-EKyu0BAXIHXKFDHca2wqNsxEViCwK7BYkmZ-XCEmO4jB3sygEqkdUYZ-gt02zsOy4y2KGYt-7wOsXrUFff6s1DsfWzqrGzYMkQdVmPCyGYhTIiLxSEiYvIPUG\" alt=\"\"\/><\/figure>\n\n\n\n<p>On va activer le mode &#8220;Transparent&#8221; pour plus de confort lors de la lecture des futures valeurs.<br>Une fois tout cela fait, on sauvegarde en appuyant le boulon tout en haut de l&#8217;\u00e9cran qui s&#8217;appelle &#8220;Dashboard settings&#8221;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/gnQdhXSGY5pKWpt7GNa077RnwK2sIYKJsOVTh40fhDt2kUEXLoq9IrQxtBlaYrPpddq35mTkOwobi-uvTOpHlBg-7G0lThaKTY7SAgrHaaLVK5ZKoFekeuWJeTXwbQChvo6uSwRZ\" alt=\"\"\/><\/figure>\n\n\n\n<p>Puis cliquez sur &#8220;save&#8221;, \u00e0 ce moment l\u00e0, on donne le nom du tableau de bord que l&#8217;on souhaite. On va ensuite aller dans Dashboard (le carr\u00e9 d\u00e9coup\u00e9 en 4 petit carr\u00e9 (\u00e0 gauche de votre \u00e9cran).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/D8rb1s1GYpiWHdFUsPjn0H5CFkFVEWsYHDHPg5CH7GdHqgh1av0yrwQmjRkVG88GyRxjK9tfpt72OFRsPMjUJUH5Mq2DlwsJ1Y1cYza_nUCraXn-aFCwKDxZQbPDTNAs3WOlmTx6\" alt=\"\"\/><\/figure>\n\n\n\n<p>Puis cliquez sur &#8220;Add data source&#8221;, on s\u00e9lectionne notre outil de gestion de Base De Donn\u00e9es soit, InfluxDB.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/zMYq6ciiw7_J1F0SmstPzjtMFIrJfdg1PsHYkvbYFBxVevuxVXRObSZiT0lCY2LuDh6ocktM3lUDa7JGDLRGKrSOfxQf8Uu0qINuTCEG_q-Pg4T_WYusaLUwn2MeBlXTnixlSoCz\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ensuite on cliquera sur la case &#8220;URL&#8221; et on prendra le lien propos\u00e9 comme ci-dessous ou si il n&#8217;est pas propos\u00e9 copier le :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/FMd68GF0-0grfzeMApYPlMHWzQKujSBlaadw5joe-lKKKhSDPbt-cK5O6_E87iPbyVHdyfyAaqLihj4Gon954yjtxSZODmwGIuk8ws00MP2l4vypDJphGp2TynZZd8exDFJX01sw\" alt=\"\"\/><\/figure>\n\n\n\n<p>Il ne vous reste plus qu&#8217;\u00e0 renseigner le nom de votre Base De Donn\u00e9es cr\u00e9\u00e9 pr\u00e9c\u00e9demment dans la case &#8220;Database&#8221;.<\/p>\n\n\n\n<p>Et voil\u00e0, il ne vous reste plus qu&#8217;\u00e0 cliquer sur &#8220;Save &amp; Test&#8221; tout en bas de la page pour valider votre Base De Donn\u00e9es au sein de Grafana. D\u00e9sormais vous pourrez utiliser les valeurs pr\u00e9sentes dans cette Base De Donn\u00e9es sur Grafana sur tous vos dashboard.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/M9AF4PijiONaXpRlntagb31yQsbvDJ9maeSB2RjvMS7XwI--hIkE-v2THcX1ER7sFknERUzK_3hcGAj6wKMMMgs5R_SJEa5LxPLx5_BKyDscJoamnfCkjkIv0H6usOluOpdT7FwA\" alt=\"\"\/><\/figure>\n\n\n\n<p>Retournons sur notre page d&#8217;accueil &#8220;Dashboard&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/dQgIkky35xJtxKr0nwNDG9U5V_W7IBEbR7_9dHXyAfOGLlmvbmx5-PhRQGLLekYg-j8Ja7e_R9FntnQiEPrE5gcx4YaYCu-_B3aBqhWzUkrrbhFEYeapoPwy-YnFcKyBKfTx3Mb2\" alt=\"\"\/><\/figure>\n\n\n\n<p>Vous aurez une ligne ayant le nom du dashboard que vous venez de sauvegarder.<\/p>\n\n\n\n<p>Cliquez dessus&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/6_qS_AvKKYftYe3aLZOJOeTbQFqKoChwUQQjaBu-4Tlh6jXoERrI2C8rZTFgRDlX035S-lTQlsi6gqiV5B55M6PfxFzxb40Eo7usYjrwWaFaPa46OD47ZK9JL0Nm3P58iPWrkoYx\" alt=\"\"\/><\/figure>\n\n\n\n<p>Une fois de retour sur la page, mettez votre souris sur votre graphique et appuyez sur la touche &#8220;e&#8221;, cela ouvrira le panneau d&#8217;\u00e9dition du graphique.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/da7glqr23D8uO8ij6k-DFoPpgwTaa8ZaQkNhLbfhBkGK1mwGd_kU7Vj7pB8vxWmhHjD_Z7OOh-S1a7LQl_MMgaKcGh0A9FCE-xzsJputnILnNqkHRnEONewMEXYMnAzaEb6nDy7q\" alt=\"\"\/><\/figure>\n\n\n\n<p>Maintenant, il ne nous reste plus qu&#8217;\u00e0 s\u00e9lectionner la Base De Donn\u00e9es que l&#8217;on vient d&#8217;ajouter pour cela, on va cliquez sur la case associ\u00e9e \u00e0 &#8220;Queries&#8221; :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/Cmrn5xXSLfDm1fy3JTKKINjrggC0Oq31L2EazOX3QlXm5uQiARofCshk5ySYDFFXi1XMmxJlZH3C4Me8SXJ_WE0woiUMPG44W7NeYROrNC6bQMKIrHODO-xhXbTmm6-6EOaGwZTp\" alt=\"\"\/><\/figure>\n\n\n\n<p>On s\u00e9lectionne &#8220;InfluxDB&#8221; puis on choisi dans &#8220;select measurement&#8221; le nom de la &#8220;measurement&#8221; soit l&#8217;\u00e9quivalent d&#8217;une table en SQL.Sur la ligne &#8220;SELECT&#8221;, cliquez sur le contenu des parenth\u00e8ses de &#8220;field(value)&#8221;, choisissez la temp\u00e9rature pour afficher les valeurs de temp\u00e9rature.<\/p>\n\n\n\n<p>Sur la ligne &#8220;GROUP BY&#8221; ainsi que les suivantes, je vous conseille de ne pas toucher les valeurs qui s&#8217;y trouvent par d\u00e9faut (\u00e0 part &#8220;time()&#8221; dans les parenth\u00e8se de time o\u00f9 je vous conseille de s\u00e9lectionner une valeur proche du temps de r\u00e9cup\u00e9ration de nos donn\u00e9es, pour ma part j&#8217;ai s\u00e9lectionn\u00e9 5 minutes).<\/p>\n\n\n\n<p>Maintenant que nous avons la temp\u00e9rature, appuyez sur le &#8220;+&#8221; de la ligne &#8220;SELECT&#8221; et choisissez dans &#8220;Fields&#8221;, &#8220;field&#8221;.<\/p>\n\n\n\n<p>Choisissez l&#8217;humidit\u00e9 et non pas la temp\u00e9rature car nous affichons d\u00e9j\u00e0.<\/p>\n\n\n\n<p>Maintenant, on shouhaite mettre l&#8217;humidit\u00e9 sur l&#8217;axe Y de droite. Pour cela, on va cliquer sur la couleur correspondante \u00e0 l&#8217;humidit\u00e9 dans notre l\u00e9gende.<\/p>\n\n\n\n<p>S\u00e9lectionnez &#8220;Y-Axis&#8221; puis activez &#8220;use right y-axis&#8221; et voil\u00e0 notre humidit\u00e9 et attribu\u00e9 \u00e0 l&#8217;axe des Y de droite.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/o8l_fhck4g7-tLRC5Yi439jBgDXyc0ukbsuWN0WtPaEwVsk8-bCmKS5ZGEvmF83Qx3quWDNfKeRguoDXAXLhxzXq9HJ_j65SlPp346rHdfV-ktV_ispZQVk2QZZEXg05P5iwCtxa\" alt=\"\"\/><\/figure>\n\n\n\n<p>Nous avons notre graphique qui contient nos 2 valeurs afin de voir l&#8217;\u00e9volution des 2 simultan\u00e9ment q(ui permettra par exemple de soup\u00e7onner un orage qui se pr\u00e9pare).<\/p>\n\n\n\n<p>Nous allons faire un graphique pour chacune des 2 valeurs, pour ce faire, on s\u00e9lectionne le logo du graphique en b\u00e2ton avec un + tout en haut de votre page qui s&#8217;appelle &#8220;Add panel&#8221;&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/NQNXXWs6y3QPkwEdHQnc98B6Wv9rCdzrjfJ-kep2z4b-WhYvzR7rRXix2rNk-AfSlxLRa6ZW7voDkBfHpweWTuJVAnWD82sfa-C7MynBZ5rhaOrn1scmgK8Y5vrdtqmFCQWXkZav\" alt=\"\"\/><\/figure>\n\n\n\n<p>On choisit comme pr\u00e9c\u00e9demment &#8220;Choose Visualization&#8221;, puis &#8220;Graph&#8221;.<\/p>\n\n\n\n<p>On s\u00e9lectionne les attributs qui nous convienne le mieux. Ici, je vais choisir en b\u00e2ton.<\/p>\n\n\n\n<p>On peut d\u00e9sactiver la colonne de droite car on aura qu&#8217;une seule variable cette fois ci dont un seul axe Y n\u00e9cessaire donc on peut d\u00e9cocher &#8220;show&#8221; qui est dans la colonne &#8220;Right Y&#8221;.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/B_2dLD-3rM3BhgI9UeBY41q7LdiGXL6BaP121FaLs1M7l9gR_XMomFbpiEg41s_tki-amE5XcUIJodgLQrHCtTj47FjL-xRDhjw7wTkHoNSZKVCDlqmapb-CtJtT3GsNbdFdoBGc\" alt=\"\"\/><\/figure>\n\n\n\n<p>On redonne un titre \u00e0 notre axe Y de gauche.<\/p>\n\n\n\n<p>Dans general, on peut donner un titre \u00e0 notre graphique (par exemple mettre &#8220;Temp\u00e9rature&#8221; et pour le prochain graphique contenant que l&#8217;humidit\u00e9 ne mettre que &#8220;Humidit\u00e9&#8221; et pour notre 1er graphique on peut mettre &#8220;Temp\u00e9rature &amp; Humidit\u00e9&#8221;).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/SP623ukwtvhOW-NR1zluXq7mcfHtqDNdibsrXDg-xKjP4W7hA50L5FU6ZFZEnAQ16gptW-UEZqulgU0omzfTAVxSL3oNkonBjAGVljTuRr3F9TNf6fCQ0EsbKQwlhozRitFFnnPe\" alt=\"\"\/><\/figure>\n\n\n\n<p>Allons dans la partie &#8220;Query&#8221; et s\u00e9lectionnons encore une fois les valeurs qui nous int\u00e9ressent.<\/p>\n\n\n\n<p>Maintenant que cela est fait, appuyez sur la fl\u00e8che en haut \u00e0 gauche pour revenir \u00e0 votre dashboard. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/mYo4OuCAOnVv13ruPwzYItOKnSKIN6PyZHGUtLR_SGRFXfnbJGCpv7TE8c3f9ZEamUql-YeBaL4vKsFHIfAh61fGSMIcKPX-lHFhjUoaGVRr5ZZvSuXLmYss0Raa5Nvsjz1E5Vrz\" alt=\"\"\/><\/figure>\n\n\n\n<p>R\u00e9p\u00e9tez les m\u00eames op\u00e9rations pour r\u00e9cup\u00e9rer les donn\u00e9es de l&#8217;humidit\u00e9.<\/p>\n\n\n\n<p>D\u00e9sormais vous avez 3 graphique, un en &#8220;Line&#8221; pour r\u00e9cup\u00e9rer les valeurs de l&#8217;humidit\u00e9 et de la temp\u00e9rature simultan\u00e9ment et 2 en &#8220;Bars&#8221;.<\/p>\n\n\n\n<p>Maintenant, je vous propose de construire 2 &#8220;Gauges&#8221; qui nous permettront de voir les valeurs re\u00e7ues en temps r\u00e9els tout en impl\u00e9mentant un code couleurs en fonction de la temp\u00e9rature par exemple.<\/p>\n\n\n\n<p>Il faudra pour cela cliquer sur &#8220;Add panel&#8221; puis de choisir encore une fois &#8220;Choose Visualization&#8221;, cette fois-ci on va choisir &#8220;Gauge&#8221;, plusieurs nouvelles variables font leur apparition mais ne vous inqui\u00e9tez pas, cela sera rapide \u00e0 r\u00e9gler.<\/p>\n\n\n\n<p>Pour r\u00e9gler ce nouveau type de graphique, on va changer la valeur contenue dans &#8220;Calc&#8221; pour choisir &#8220;Last&#8221; ce qui nous permettra d&#8217;obtenir la derni\u00e8re valeur obtenue.<\/p>\n\n\n\n<p>Ensuite je vous conseille d&#8217;activer l&#8217;option &#8220;Labels&#8221; pour avoir les valeurs flottantes autour des zones que vous allez ajouter par la suite.<\/p>\n\n\n\n<p>Pour la temp\u00e9rature, il faudra choisir l&#8217;unit\u00e9 &#8220;temperature&#8221; en degr\u00e9s Celsius (\u00b0C) et pour l&#8217;Humidit\u00e9, il faudra aller dans Misc et choisir &#8220;Humidity (%H)&#8221;, pour la temp\u00e9rature, on peut changer les extremums pour mettre -40 et 120 et pour l&#8217;humidit\u00e9 on peut les laisser par d\u00e9faut entre&nbsp; 0 et 100.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh4.googleusercontent.com\/xJVlz1iWVRWJKazZN8vbyBJAx2PDaeCTrwBrQVpmfyLE_MaFhhDzLQQsEXq_MEhqv_4gsrZXpqGghkd_DBfPrn5uQIYdr5FKyVXW1dUHd5tG54sOBMYEX7-s5K98SCucT0CDl3BH\" alt=\"\"\/><\/figure>\n\n\n\n<p>Ensuite, dans la colonne &#8220;Thresholds&#8221;, vous pouvez ajouter des diff\u00e9rentes couleurs et diff\u00e9rentes valeurs permettant de faire varier la couleur comme on peut le voir ci-dessous par exemple :<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/PcOSv8mvfeTPvMVqI99DxZs0QEWDNmY-ak0-8BYKK57eglrNm6QJQqkmkUpQQvfN83crGBfP5OoScULtb78sakWNoXfOrSIYeKS-UUK-P8f6D2Mb5JSRpcr6cjxUP5i2f3oPtFhR\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/-DO-OsaWnLReokdP6BnsC-h3NXKEab-aAtFA97WdmM32pWR3ynNxP-3EDK4OXr-kHI4ScArOoxOOf3yDu8EHSXwxxnfA4PfJyV7hmLienNwn6W6N1rXoH359TVh4zQs8F-3OV20D\" alt=\"\"\/><\/figure>\n\n\n\n<p>Maintenant faite de m\u00eame pour l&#8217;humidit\u00e9 ou la temp\u00e9rature en fonction de votre premier &#8220;Gauge&#8221;.<\/p>\n\n\n\n<p>Une fois cela fait, il ne nous reste plus qu&#8217;une seule chose \u00e0 faire.<\/p>\n\n\n\n<p>Cliquez sur &#8220;Dashboard settings&#8221; (le petit engrenage tout en haut de votre page web).<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/tkAq13GHKAo9eO5hF1Ntecv6WhQOvZSN5vfW6N_eOJQdvGLLNVK5Rbqfb8_DMV8RuVloDVSrlvBgFJFgMtPDPwmoHTZCd-DnANWYYbx_qyIS8aPv3Te_9HL-TAmAMdGFSFa6jKDR\" alt=\"\"\/><\/figure>\n\n\n\n<p>La ligne &#8220;auto-refresh&#8221; poss\u00e8de plusieurs valeurs, vous pouvez toutes les supprimer et mettre 5min pour notre exemple.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh6.googleusercontent.com\/QVSgwZiHHs7itmyFwzU1q6O9BT9k4P6bq9rwmkwMsU7vNyOPVwGbIBhz2-p71FCbDT-63dAQXSxQk49LfeiwusIRXTRBX443tuHXvmBp11HiDVJY-YheviOBeXvnYLpR4_A_PkgR\" alt=\"\"\/><\/figure>\n\n\n\n<p>Vous pouvez \u00e9videmment adapter cette valeur \u00e0 votre guise( plus le temps sera court, plus cela consomme de la puissance, plus ce dernier aura les valeurs \u00e0 jours et les plus r\u00e9centes). Il ne vous reste plus qu&#8217;\u00e0 sauvegarder. <\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/ec00BjNNCgdL1ScmQeHJ9hjk7B2ufpwv97BGvNIMPhp7aizIJi-tlFyiZulWOQRlNAsVBN7LD67x4C4sxAHIJfi0HNxqD_-lw5dSwS4r194DIP1r4wma85RA9sP2f5TmukXYU7Gn\" alt=\"\"\/><\/figure>\n\n\n\n<p>Vous voil\u00e0 pr\u00eat \u00e0 visualiser et exploiter toutes vos donn\u00e9es !<\/p>\n\n\n\n<p class=\"has-large-font-size\">PARTIE 10: INSTALLATION DANS LA SERRE<\/p>\n\n\n\n<p>Pour ma part, j\u2019ai rang\u00e9 la Lopy dans une bo\u00eete en plastique adapt\u00e9e \u00e0 ce genre d\u2019usage ce qui permet de la prot\u00e9ger des intemp\u00e9ries et de l\u2019humidit\u00e9 tout en laissant le capteur \u00e0 l\u2019ext\u00e9rieur comme son r\u00f4le le demande.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh3.googleusercontent.com\/Rx9z4UeiGy6TDLjKAFwR6whzAsLMg56E6tzQtIcLomhdNdmwCxaDMAW_40dKJZBDwN-0jO5jJgbKMYKjwEp7nS2imGqfpE7Qub2juctbk0lAr1jwNh-sgPjOYx44mbSxQZhXqLdO\" alt=\"\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/lh5.googleusercontent.com\/5zUnWl-OalpQxELCKhkrf3qEPR7u83RDo2iX6ZNUeR047VmAOROgjVNVNbXjyKgMzu9wdXbSk2tXnqW57z1cUYu1FxLAdUVIDArldZ8ItZ7WJ3-nTachSTpx9AJvo7qumSMtbUIl\" alt=\"\"\/><\/figure>\n\n\n\n<p>J&#8217;esp\u00e8re que ce tutoriel vous sera utile et il peut \u00eatre adapt\u00e9 \u00e0 tous les capteurs pour une serre, (pH, temp\u00e9rature eau,&#8230;)<\/p>\n\n\n\n<p>Bonne continuation, <\/p>\n\n\n\n<p>Sylvain Mazzoleni<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bonjour \u00e0 tous, Je m&#8217;appelle Sylvain et Aujourd&#8217;hui je vous pr\u00e9sente le r\u00e9sultat mon sujet de stage. Vous avez toujours&hellip;<\/p>\n","protected":false},"author":3,"featured_media":508,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[54],"tags":[82],"class_list":["post-439","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-capteurs","tag-capteurs"],"_links":{"self":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/439","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/comments?post=439"}],"version-history":[{"count":0,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/439\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media\/508"}],"wp:attachment":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media?parent=439"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/categories?post=439"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/tags?post=439"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}