{"id":1192,"date":"2021-01-06T11:30:42","date_gmt":"2021-01-06T10:30:42","guid":{"rendered":"http:\/\/miniprojets.net\/?p=1192"},"modified":"2022-12-17T17:23:52","modified_gmt":"2022-12-17T16:23:52","slug":"monitorer-la-temperature-et-le-ph-dun-bassin-avec-une-connexion-lora","status":"publish","type":"post","link":"https:\/\/miniprojets.net\/index.php\/2021\/01\/06\/monitorer-la-temperature-et-le-ph-dun-bassin-avec-une-connexion-lora\/","title":{"rendered":"Monitorer la temp\u00e9rature et le PH d&#8217;un bassin avec une connexion Lora et remonter l&#8217;information dans Jeedom"},"content":{"rendered":"\n<p>Bonjour \u00e0 tous, <\/p>\n\n\n\n<p>Aujourd&#8217;hui, on va apprendre comment monitorer l&#8217;\u00e9tat d&#8217;un bassin pour monitorer la temp\u00e9rature de l&#8217;eau ainsi que son PH afin de savoir si tout va bien pour ses habitants. Ce tutoriel change un peu de l&#8217;ordinaire car le mat\u00e9riel utilis\u00e9 est plus cher que ce que j&#8217;utilise d&#8217;habitude.<\/p>\n\n\n\n<p class=\"has-large-font-size\">Partie 0: Le mat\u00e9riel choisi<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Une Raspberry pi + son alimentation + une carte SD<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/asset.conrad.com\/media10\/isa\/160267\/c1\/-\/fr\/002138864PI00\/image.jpg\" alt=\"Raspberry Pi\u00ae 4 B 4 Go 4 x 1.5 GHz Raspberry Pi\u00ae | Conrad.fr\" width=\"318\" height=\"205\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Un shield Dragino <\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"289\" height=\"206\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-6.png\" alt=\"\" class=\"wp-image-1201\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Une sonde de temp\u00e9rature Atlas scientific PT-1000<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-1.png\" alt=\"\" class=\"wp-image-1196\" width=\"287\" height=\"279\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-1.png 444w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-1-300x292.png 300w\" sizes=\"auto, (max-width: 287px) 100vw, 287px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Un circuit de mesure de temp\u00e9rature EZO RTD<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"383\" height=\"380\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-2.png\" alt=\"\" class=\"wp-image-1197\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-2.png 383w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-2-300x298.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-2-150x150.png 150w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Une sonde de PH Atlas scientific<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"451\" height=\"432\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-3.png\" alt=\"\" class=\"wp-image-1198\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-3.png 451w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-3-300x287.png 300w\" sizes=\"auto, (max-width: 451px) 100vw, 451px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Un circuit de mesure de EZO PH<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"396\" height=\"350\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-4.png\" alt=\"\" class=\"wp-image-1199\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-4.png 396w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-4-300x265.png 300w\" sizes=\"auto, (max-width: 396px) 100vw, 396px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>2 Cartes de support EZO vers USB <\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"420\" height=\"285\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image.png\" alt=\"\" class=\"wp-image-1195\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image.png 420w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-300x204.png 300w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>2 c\u00e2bles mini USB -&gt; USB<\/li><\/ul>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"282\" height=\"242\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-5.png\" alt=\"\" class=\"wp-image-1200\"\/><\/figure>\n\n\n\n<ul class=\"wp-block-list\"><li>Optionnellement, une imprimante 3D<\/li><\/ul>\n\n\n\n<p class=\"has-large-font-size\">Partie 1: Pr\u00e9paration du mat\u00e9riel<\/p>\n\n\n\n<p>Comme pour chaque projet que je fais avec un raspberry pi, vous devez commencer par cr\u00e9er une carte SD (<a href=\"https:\/\/miniprojets.net\/index.php\/2019\/05\/13\/jeedom-ou-comment-domotiser-sa-maison-en-quelques-clics\/\">voir les parties de 1 \u00e0 4 de mon ancine poste https:\/\/miniprojets.net\/index.php\/2019\/05\/13\/jeedom-ou-comment-domotiser-sa-maison-en-quelques-clics<\/a>\/)<\/p>\n\n\n\n<p>Maintenant nous pouvons pr\u00e9parer le mat\u00e9riel physique.<\/p>\n\n\n\n<p>Dans un premier temps, nous devons faire une l\u00e9g\u00e8re modification sur le shield Dragino car certaines versions ont un d\u00e9faut et il faut souder en elles les pins 22 et 24. (Pour plus d&#8217;information, je vous invite \u00e0 aller vous le wiki <a href=\"https:\/\/wiki.dragino.com\/index.php?title=Lora_Shield\">https:\/\/wiki.dragino.com\/index.php?title=Lora_Shield<\/a>)<\/p>\n\n\n\n<figure class=\"wp-block-image is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/wiki.dragino.com\/images\/a\/a4\/Hat_for_LCRG.png\" alt=\"\" width=\"463\" height=\"432\"\/><\/figure>\n\n\n\n<p>Maintenant je vous propose d&#8217;imprimer en 3D le boitier pour la raspberry et le shield Dragino mais cela n&#8217;est pas n\u00e9cessaire pour la suite du projet, c&#8217;est juste que je vais l&#8217;installer dans mon garage et j&#8217;aimerai une installation propre.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.thingiverse.com\/thing:3352448\">https:\/\/www.thingiverse.com\/thing:3352448<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"338\" height=\"324\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-8.png\" alt=\"\" class=\"wp-image-1204\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-8.png 338w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-8-300x288.png 300w\" sizes=\"auto, (max-width: 338px) 100vw, 338px\" \/><\/figure>\n\n\n\n<p>Ainsi que le support pour maintenir en place les cartes de support EZO vers USB.<\/p>\n\n\n\n<p><a href=\"https:\/\/www.thingiverse.com\/thing:1561906\">https:\/\/www.thingiverse.com\/thing:1561906<\/a><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-7.png\" alt=\"\" class=\"wp-image-1203\" width=\"343\" height=\"247\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-7.png 609w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/image-7-300x216.png 300w\" sizes=\"auto, (max-width: 343px) 100vw, 343px\" \/><\/figure>\n\n\n\n<p>Une fois cela fait, nous pouvons les monter de la fa\u00e7on suivante: <\/p>\n\n\n\n<p>On commence par mettre la raspberry dans le support bas du boitier<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170301-1024x768.jpg\" alt=\"\" class=\"wp-image-1207\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170301-1024x768.jpg 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170301-300x225.jpg 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170301-768x576.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170301-1536x1152.jpg 1536w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170301-2048x1536.jpg 2048w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170301-160x120.jpg 160w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Puis on monte la pi\u00e8ce interm\u00e9diaire et le chapeau.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170603-768x1024.jpg\" alt=\"\" class=\"wp-image-1208\" width=\"374\" height=\"499\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170603-768x1024.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170603-225x300.jpg 225w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170603-1152x1536.jpg 1152w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170603-1536x2048.jpg 1536w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170603-scaled.jpg 1920w\" sizes=\"auto, (max-width: 374px) 100vw, 374px\" \/><\/figure>\n\n\n\n<p>Ensuite on fixe les 2 cartes supports<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170402-768x1024.jpg\" alt=\"\" class=\"wp-image-1210\" width=\"266\" height=\"354\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170402-768x1024.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170402-225x300.jpg 225w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170402-1152x1536.jpg 1152w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170402-1536x2048.jpg 1536w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170402-scaled.jpg 1920w\" sizes=\"auto, (max-width: 266px) 100vw, 266px\" \/><\/figure>\n\n\n\n<p>On assemble le tout sur le boitier et on branche les 2 c\u00e2bles USB<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170659-768x1024.jpg\" alt=\"\" class=\"wp-image-1211\" width=\"377\" height=\"502\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170659-768x1024.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170659-225x300.jpg 225w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170659-1152x1536.jpg 1152w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170659-1536x2048.jpg 1536w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170659-scaled.jpg 1920w\" sizes=\"auto, (max-width: 377px) 100vw, 377px\" \/><\/figure>\n\n\n\n<p>On peux enfin mettre en place le syst\u00e8me.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170842-1024x768.jpg\" alt=\"\" class=\"wp-image-1212\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170842-1024x768.jpg 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170842-300x225.jpg 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170842-768x576.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170842-1536x1152.jpg 1536w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170842-2048x1536.jpg 2048w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170842-160x120.jpg 160w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"768\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170908-1024x768.jpg\" alt=\"\" class=\"wp-image-1214\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170908-1024x768.jpg 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170908-300x225.jpg 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170908-768x576.jpg 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170908-1536x1152.jpg 1536w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170908-2048x1536.jpg 2048w, https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/20200607_170908-160x120.jpg 160w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Avant de plonger la sonde de PH, il faudra faire sa calibration. Pour cela, je modifierai mon article un peu plus tard car je n&#8217;ai pas le mat\u00e9riel sous la main \u00e0 cause de la situation actuelle&#8230;.<\/p>\n\n\n\n<p class=\"has-large-font-size\">Partie 2: Identification des sondes<\/p>\n\n\n\n<p>Pour cette partie, je me base sur la documentation fournie par AtlasScientific (comme d&#8217;habitude je vous mets la copie ci-dessous).<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/pi_sample_code-1.pdf\">Documentation pi_sample_code<\/a><a href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/pi_sample_code-1.pdf\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<p>Dans un premier temps, il faut rentrer en SSH sur la raspberry pi puis t\u00e9l\u00e9charger depuis le git le code n\u00e9cessaire avec la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/AtlasScientific\/Raspberry-Pi-sample-code.git<\/code><\/pre>\n\n\n\n<p>Il faut maintenant installer et param\u00e9trer les modules n\u00e9cessaire avec les commandes suivantes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo apt-get install libftdi-dev\nsudo pip3 install pylibftdi\nsudo nano \/etc\/udev\/rules.d\/99-libftdi.rules<\/code><\/pre>\n\n\n\n<p>Copier en rempla\u00e7ant le contenu du fichier  99-libftdi.rules par la ligne suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SUBSYSTEMS==\u201dusb\u201d, ATTRS{idVendor}==\u201d0403\u201d, ATTRS{idProduct}==\u201d6015\u201d,GROUP=\u201ddialout\u201d, MODE=\u201d0660\u201d, SYMLINK+=\u201dFTDISerial_Converter_$attr{serial}\u201d<\/code><\/pre>\n\n\n\n<p>Faites un Ctrl+X, puis y pour sauvegarder.<\/p>\n\n\n\n<p>Redemarrez le service udev avec la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo service udev restart<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez que dans le fichier \/usr\/local\/lib\/python3.7\/dist-packages\/pylibftdi\/driver.py pour la ligne qui contient USB_PID_LIST vous avez exactement cela USB_PID_LIST = [0x6001, 0x6010, 0x6011, 0x6014, 0x6015] gr\u00e2ce \u00e0 la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/usr\/local\/lib\/python3.7\/dist-packages\/pylibftdi\/driver.py<\/code><\/pre>\n\n\n\n<p>puis faite un Ctrl+W et tapez USB_PID_LIST, puis entr\u00e9e.<\/p>\n\n\n\n<p>Si jamais il manque 0x6015, rajoutez le en faite un Ctrl+X, puis Y.<\/p>\n\n\n\n<p>Maintenant tapez la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo python3 -m pylibftdi.examples.list_devices<\/code><\/pre>\n\n\n\n<p>Normalement vous devriez avec une r\u00e9ponse de ce genre:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FTDI:FT230X Basic UART:DO009J4O\nFTDI:FT230X Basic UART:DO009MWF<\/code><\/pre>\n\n\n\n<p>Ce qui correspond \u00e0 nos 2 capteurs.<\/p>\n\n\n\n<p>Maintenant tapez les commandes suivantes: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/Raspberry-Pi-sample-code<\/code><\/pre>\n\n\n\n<p>Nous allons modifier le fichier ftdi car avec python3 la fonction decode n&#8217;est plus n\u00e9cessaire. Pour cela on tape la commande: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano ftdi.py<\/code><\/pre>\n\n\n\n<p>Puis on recherche decode avec le Ctrl+w<\/p>\n\n\n\n<p>On tombe sur la ligne suivante: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> dev_info = map(lambda x: x.decode('latin1'), device)<\/code><\/pre>\n\n\n\n<p>il suffit de supprimer le &#8220;.decode(&#8216;latin1&#8217;)&#8221; ce qui donne<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> dev_info = map(lambda x: x, device)<\/code><\/pre>\n\n\n\n<p>Faites un Ctrl+x, puis Y<\/p>\n\n\n\n<p>Maintenant, tapez la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code> sudo python3 ftdi.py<\/code><\/pre>\n\n\n\n<p>Vous aurez le choix suivant:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nWelcome to the Atlas Scientific Raspberry Pi FTDI Serial example.\n\n    Any commands entered are passed to the board via UART except:\n    Poll,xx.x command continuously polls the board every xx.x seconds\n    Pressing ctrl-c will stop the polling\n\n    Press enter to receive all data in buffer (for continuous mode)\n\nDiscovered FTDI serial numbers:\n\nIndex:  0  Serial:  DO009J4O\n\nIndex:  1  Serial:  DO009MWF\n===================================\nPlease select a device index:\n<\/code><\/pre>\n\n\n\n<p>Tapez par exemple 0 ou 1 au choix (ici je tape 1), vous vous retrouvez avec l&#8217;annonce suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Please select a device index: 1\n\n&gt;&gt; Opened device  DO009MWF\n&gt;&gt; Any commands entered are passed to the board via FTDI:\nEnter command:<\/code><\/pre>\n\n\n\n<p>Tapez la commande R (Read (lecture)) puis  taper sur Entr\u00e9e. Apr\u00e8s quelques secondes, vous aurez le r\u00e9sultat suivant:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&gt;&gt; Opened device  DO009MWF\n&gt;&gt; Any commands entered are passed to the board via FTDI:\nEnter command: R\n8.294<\/code><\/pre>\n\n\n\n<p>Comme je sais que l&#8217;eau est \u00e0 environ 23\u00b0C (mesure fait via un thermom\u00e8tre simple) cela me renseigne que le capteur DO009MWF (ayant pour index 1) est mon capteur de PH et donc que le capteur DO009J4O (ayant pour index 0) est mon capteur de temp\u00e9rature.<\/p>\n\n\n\n<p>Je mets ici les 2 pdfs correspondant aux 2 capteurs afin de permettre de s&#8217;amuser avec les diff\u00e9rentes commandes possibles (\u00e9talonnage, mesure continue,&#8230;.)<\/p>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/EZO_RTD_Datasheet.pdf\">EZO_RTD_Datasheet<\/a><a href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/EZO_RTD_Datasheet.pdf\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<div class=\"wp-block-file\"><a href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/pH_EZO_Datasheet.pdf\">pH_EZO_Datasheet<\/a><a href=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2020\/06\/pH_EZO_Datasheet.pdf\" class=\"wp-block-file__button\" download>Download<\/a><\/div>\n\n\n\n<p>Voila nous avons identifi\u00e9 les 2 capteurs et nous pouvons passer \u00e0 la suite afin de permettre la lecture des 2 capteurs toutes les 15 minutes, la sauvegarde de la valeur puis leur envoie via Lora.<\/p>\n\n\n\n<p class=\"has-large-font-size\">Partie 3: Lecture et enregistrement des valeurs des sondes<\/p>\n\n\n\n<p>Maintenant, nous allons cr\u00e9er un script qui va permettre de lire les valeurs des capteurs puis de sauvegarder leur valeur dans 3 fichiers distincts (1 pour l&#8217;historisation, 1 pour la valeur actuelle de la temp\u00e9rature mais retravaill\u00e9 pour la transmission et 1 pour la valeur actuelle du PH).<\/p>\n\n\n\n<p>Pour cela, il faut cr\u00e9er un fichier avec la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano read_sensor_temp_ph.py<\/code><\/pre>\n\n\n\n<p>Puis collez le code suivant:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import string\n\nimport pylibftdi\nfrom pylibftdi.device import Device\nfrom pylibftdi.driver import FtdiError\nfrom pylibftdi import Driver\nimport os\nimport time\nfrom datetime import datetime\n\nclass AtlasDevice(Device):\n\n        def __init__(self, sn):\n                Device.__init__(self, mode='t', device_id=sn)\n\n\n        def read_line(self, size=0):\n                \"\"\"\n                taken from the ftdi library and modified to\n                use the ezo line separator \"\\r\"\n                \"\"\"\n                lsl = len('\\r')\n                line_buffer = &#91;]\n                while True:\n                        next_char = self.read(1)\n                        if next_char == '' or (size &gt; 0 and len(line_buffer) &gt; size):\n                                break\n                        line_buffer.append(next_char)\n                        if (len(line_buffer) &gt;= lsl and\n                                        line_buffer&#91;-lsl:] == list('\\r')):\n                                break\n                return ''.join(line_buffer)\n\n        def read_lines(self):\n                \"\"\"\n                also taken from ftdi lib to work with modified readline function\n                \"\"\"\n                lines = &#91;]\n                try:\n                        while True:\n                                line = self.read_line()\n                                if not line:\n                                        break\n                                        self.flush_input()\n                                lines.append(line)\n                        return lines\n\n                except FtdiError:\n                        print(\"Failed to read from the sensor.\")\n                        return ''\n\n        def send_cmd(self, cmd):\n                \"\"\"\n                Send command to the Atlas Sensor.\n                Before sending, add Carriage Return at the end of the command.\n                :param cmd:\n                :return:\n                \"\"\"\n                buf = cmd + \"\\r\"        # add carriage return\n                try:\n                        self.write(buf)\n                        return True\n                except FtdiError:\n                        print(\"Failed to send command to the sensor.\")\n                        return False\n\n\n\ndef get_ftdi_device_list():\n        \"\"\"\n        return a list of lines, each a colon-separated\n        vendor:product:serial summary of detected devices\n        \"\"\"\n        dev_list = &#91;]\n\n        for device in Driver().list_devices():\n                # list_devices returns bytes rather than strings\n#               dev_info = map(lambda x: x.decode('latin1'), device)\n                dev_info = map(lambda x: x, device)\n                # device must always be this triple\n                vendor, product, serial = dev_info\n                dev_list.append(serial)\n        return dev_list\n\n##########################################################################\nif __name__ == '__main__':\n\n        real_raw_input = vars(__builtins__).get('raw_input', input) # used to find the correct function for python2\/3\n\n        print(\"\\nWelcome to the Atlas Scientific Raspberry Pi FTDI Serial.\\n\")\n        print(\"Discovered FTDI serial numbers:\")\n\n        devices = get_ftdi_device_list()\n        cnt_all = len(devices)\n\n        #print \"\\nIndex:\\tSerial: \"\n        for i in range(cnt_all):\n                print(  \"\\nIndex: \", i, \" Serial: \", devices&#91;i])\n        print( \"===================================\")\n\n############### Capteurs ###################\n\n        index_temp = 0\n        index_ph = 1\n        while True:\n                dev_temp = AtlasDevice(devices&#91;int(index_temp)])\n                dev_ph = AtlasDevice(devices&#91;int(index_ph)])\n                time.sleep(1)\n                dev_temp.flush()\n                dev_ph.flush()\n                input_val = \"R\"\n\n                # pass commands straight to board\n                if len(input_val) == 0:\n                        lines = dev.read_lines()\n                        for i in range(len(lines)):\n                                print(\"temperature\" + lines&#91;i])\n                else:\n                        fichier = open(\"\/home\/pi\/Raspberry-Pi-sample-code\/datalog_Sensors_Temp_Ph.csv\", \"a\")\n                        fichier_lastest_temp = open(\"\/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_temp.csv\", \"w\")\n                        fichier_lastest_ph = open(\"\/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_ph.csv\", \"w\")\n                        dev_temp.send_cmd(input_val)\n                        time.sleep(1.3)\n                        lines = dev_temp.read_lines()\n                        now = datetime.now()\n                        timestamp = datetime.timestamp(now)\n\n                        for i in range(len(lines)):\n                                print(\"Temperature: \" + lines&#91;i])\n                                fichier.write(str(timestamp) + \",\")\n                                temperature = lines&#91;i]\n                                temperature = temperature.replace(temperature&#91;len(temperature)-1],',')\n                                fichier.write(temperature)\n                                temperature = temperature.replace(temperature&#91;len(temperature)-1],'')\n                                temperature = str(float(temperature)+40)\n                                fichier_lastest_temp.write(temperature)\n                                fichier_lastest_temp.close()\n                        dev_ph.send_cmd(input_val)\n                        time.sleep(1.3)\n                        lines = dev_ph.read_lines()\n                        for i in range(len(lines)):\n                                print(\"PH: \" + lines&#91;i])\n                                ph = lines&#91;i]\n                                ph = ph.replace(ph&#91;len(ph)-1],'')\n                                fichier.write(ph + \"\\n\")\n                                fichier_lastest_ph.write(ph)\n                                fichier_lastest_ph.close()\n                        fichier.close()\n                        time.sleep(60)<\/code><\/pre>\n\n\n\n<p>V\u00e9rifiez que les index sont corrects pour vos capteurs (ici)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>    index_temp = 0\n    index_ph = 1<\/code><\/pre>\n\n\n\n<p>et modifiez en cas o\u00f9 <\/p>\n\n\n\n<p>Ce code  un fois lanc\u00e9 va lire la valeur du capteur de temp\u00e9rature ainsi que celui du capteur de PH puis les enregistrer dans les fichiers et attendre 60 secondes avant de recommencer.<\/p>\n\n\n\n<p>Faites un Ctrl+X, puis Y.<\/p>\n\n\n\n<p>Maintenant, on va cr\u00e9er un service qui se lancera ce script au d\u00e9marrage de la raspberry pi. <\/p>\n\n\n\n<p>Pour cela, il faut faire les commandes suivantes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd \/lib\/systemd\/system\/\nsudo nano atlassensors.service<\/code><\/pre>\n\n\n\n<p>Maintenant, il faut coller le code suivant:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[Unit]\nDescription=Read Atlas sensors\nAfter=multi-user.target\n\n[Service]\nType=simple\nExecStart=\/usr\/bin\/python3 \/home\/pi\/Raspberry-Pi-sample-code\/read_sensor_temp_ph.py\nRestart=on-abort\n\n[Install]\nWantedBy=multi-user.target<\/pre>\n\n\n\n<p>Faites un Ctrl+X, puis Y.<\/p>\n\n\n\n<p>Maintenant on met en route le service via les commandes suivantes:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo chmod 644 \/lib\/systemd\/system\/atlassensors.service\nsudo chmod +x \/home\/pi\/Raspberry-Pi-sample-code\/read_sensor_temp_ph.py\nsudo systemctl daemon-reload\nsudo systemctl enable atlassensors.service\nsudo systemctl start atlassensors.service<\/code><\/pre>\n\n\n\n<p>Maintenant, nous allons v\u00e9rifier  que l&#8217;enregistrement fonctionne bien avec la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/home\/pi\/Raspberry-Pi-sample-code\/datalog_Sensors_Temp_Ph.csv<\/code><\/pre>\n\n\n\n<p>On se retrouve avec l&#8217;affichage suivant: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1591267278.838152,21.467,8.039\n1591267342.582241,21.467,8.048\n1591267406.338943,21.465,8.043\n1591267470.095639,21.463,8.031\n1591267533.852958,21.464,8.035\n1591267597.594173,21.462,8.035\n1591267661.351104,21.463,8.041\n1591267725.10559,21.462,8.042\n1591267788.860872,21.463,8.048<\/code><\/pre>\n\n\n\n<p>Ce qui correspond pour la premi\u00e8re colonne au timestamp, la seconde \u00e0 la temp\u00e9rature et la troisi\u00e8me au PH.<\/p>\n\n\n\n<p>on v\u00e9rifie aussi pour les valeurs actuelles avec les commandes: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_temp.csv<\/code><\/pre>\n\n\n\n<p>Qui nous donne 61.463 (car on a rajout\u00e9 40\u00b0 afin de n&#8217;avoir que des chiffres positifs pour l&#8217;envoi)<\/p>\n\n\n\n<p>et la commande <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>sudo nano \/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_ph.csv<\/code><\/pre>\n\n\n\n<p>qui nous donne 8.048<\/p>\n\n\n\n<p>Voila maintenant que les donn\u00e9es sont format\u00e9es et enregistr\u00e9es, nous pouvons passer \u00e0 leur envoi via le r\u00e9seau Lora<\/p>\n\n\n\n<p class=\"has-large-font-size\">Partie 4: Pr\u00e9paration de l&#8217;environnement LORA sur thethingsnetwork  <\/p>\n\n\n\n<p>Dans un premier temps, il faut vous inscrire sur TTN<\/p>\n\n\n\n<p><a href=\"https:\/\/www.thethingsnetwork.org\/\">https:\/\/www.thethingsnetwork.org\/<\/a><\/p>\n\n\n\n<p>Quand vous \u00eates inscrit et logg\u00e9, cliquez sur Console puis Application<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"290\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-17-1024x290.png\" alt=\"\" class=\"wp-image-235\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-17-1024x290.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-17-300x85.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-17-768x217.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-17.png 1176w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Cliquez maintenant sur add application<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"136\" height=\"42\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-18.png\" alt=\"\" class=\"wp-image-236\"\/><\/figure>\n\n\n\n<p>Remplissez les cases vides comme ci-dessous (c\u2019est un exemple que j\u2019ai fait avec ma raspberry qui se situe dans le garage ^^)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"625\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-1024x625.png\" alt=\"\" class=\"wp-image-1511\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-1024x625.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-300x183.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-768x469.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image.png 1137w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>La prochaine \u00e9tape consiste a ajouter un appareil (device) donc cliquez sur register device<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"120\" height=\"38\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-20.png\" alt=\"\" class=\"wp-image-238\"\/><\/figure>\n\n\n\n<p>Remplissez le Device ID avec un nom du genre sensors_from_dragino. (car c&#8217;est un shield dragino que j&#8217;utilise ^^)<\/p>\n\n\n\n<p>Cliquez sur les deux fl\u00e8ches sous le champ Device EUI ce qui le g\u00e9n\u00e9ra de fa\u00e7on automatique<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"111\" height=\"95\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2019\/05\/image-21.png\" alt=\"\" class=\"wp-image-239\"\/><\/figure>\n\n\n\n<p>Et finalement cliquez sur Register (Surtout pas sur Cancel car si vous cliquez dessus, vous perdez votre configuration en cours et cela est peu stupide\u2026. Non non je n\u2019ai jamais fait cela\u2026 Bon Ok peut-\u00eatre une fois quand j\u2019\u00e9tais jeune\u2026)<\/p>\n\n\n\n<p>Normalement vous devriez avoir une nouvelle page avec les identifiants pour connecter votre Lopy sur le r\u00e9seau Lora<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"884\" height=\"574\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-2.png\" alt=\"\" class=\"wp-image-1513\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-2.png 884w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-2-300x195.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-2-768x499.png 768w\" sizes=\"auto, (max-width: 884px) 100vw, 884px\" \/><\/figure>\n\n\n\n<p>Maintenant que nous avons les bonnes informations, nous pouvons retourner sur la raspberry pi pour coder la partie Lora<\/p>\n\n\n\n<p class=\"has-large-font-size\">Partie 5: Code LORA avec un dragino<\/p>\n\n\n\n<p>Dans un premier temps, il faut t\u00e9l\u00e9charger le programme avec la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>git clone https:\/\/github.com\/wklenk\/lmic-rpi-lora-gps-hat<\/code><\/pre>\n\n\n\n<p>Une fois cela fait, allez dans le dossier lmic-rpi-lora-gps-hat\/examples\/periodic\/<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cd lmic-rpi-lora-gps-hat\/examples\/periodic\/<\/pre>\n\n\n\n<p>Maintenant, il faut modifier le fichier sensor.c<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo nano lmic-rpi-lora-gps-hat\/examples\/periodic\/sensor.c<\/pre>\n\n\n\n<p>On modifie la partie Read data de la fa\u00e7on suivante:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> \/\/ Read data\n u2_t readsensor (char* file_name) {\n     debug_str(file_name);\n <code>FILE* file = NULL; int tempo[2]={0}; file = fopen(file_name, \"r\");<\/code>\n if (file != NULL)\n     {\n         fscanf(file, \"%d.%d\", &amp;tempo[0], &amp;tempo[1] );\n         printf(\"Les meilleurs scores sont : %d,%d\", tempo[0], tempo[1]);\n         fclose(file);\n     }\n <code>int t = 21; <\/code>\n<code>return tempo[0]*1000+tempo[1];<\/code>\n }<\/pre>\n\n\n\n<p>On sauvegarde avec ctrl+x <\/p>\n\n\n\n<p>Puis, nous allons modifier le fichier main.c<\/p>\n\n\n\n<pre id=\"block-63f61b06-615e-444a-bc64-96a5e2b89aab\" class=\"wp-block-preformatted\">sudo nano lmic-rpi-lora-gps-hat\/examples\/periodic\/main.c<\/pre>\n\n\n\n<p>Ajoutez  les lignes suivantes en dessous de #include &#8220;lmic.h&#8221; #include &#8220;debug.h&#8221;<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/ sensor functions<br>extern void initsensor(void);<br>extern u2_t readsensor(char*);<\/pre>\n\n\n\n<p>Dans la partie CONFIGURATION renseignez les clefs APPEUI, DEVEUI et DEV KEY avec les informations TTN respectives Application EUI, Device EUI et App Key<\/p>\n\n\n\n<p>ATTENTION!!!! Pour les APPEUI et DEVEUI, il faut inverser l&#8217;ordre des hexas, c&#8217;est \u00e0 dire que par exemple sur TTN, vous avez la clef Device EUI: 0127356F2894472B, il faudra \u00e9crire pour DEVEUI: 0x2B, 0x47, 0x94, 0x28, 0x6F, 0x35, 0x27, 0x01.<\/p>\n\n\n\n<p>Seul App Key garde le m\u00eame sens de lecture!<\/p>\n\n\n\n<p>Voila ce que cela donne par exemple:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\/\/ CONFIGURATION (FOR APPLICATION CALLBACKS BELOW)\n\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n\n\/\/ application router ID (LSBF)\n static const u1_t APPEUI[8] = { 0xXX, 0xXX, 0xXX, 0xXX, 0x7E, 0xD5, 0xB3, 0x70 };\n\n\/\/ unique device ID (LSBF)\n static const u1_t DEVEUI[8] = { 0xXX, 0x37, 0x94, 0x28, 0xXX, 0xXX, 0xXX, 0x00 };\n\n\/\/ device-specific AES key (derived from device EUI)\n static const u1_t DEVKEY[16] = { 0xXX, 0x95, 0xEA, 0x92, 0xXX, 0xXX, 0xDD, 0x9C, 0xXX, 0x27, 0xXX, 0xXX, 0xF7, 0xXX, 0xFB, 0xF4 };\n<\/pre>\n\n\n\n<p>Maintenant, il faut aussi modifier la partie UTILIY JOB de la fa\u00e7on suivante:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n \/\/ UTILITY JOB\n \/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\n static osjob_t reportjob;\n \/\/ report sensor value every minute\n static void reportfunc (osjob_t* j) {\n   char sensors[2][100] = { \"\/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_temp.csv\",\n                            \"\/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_ph.csv\"};\n   int i;\n   for(i=0; i&lt;2; i++){\n    u2_t val = readsensor(sensors[i]);\n    debug_val(\"val = \", val);\n    \/\/ prepare and schedule data for transmission\n    LMIC.frame[2<em>i] = val &gt;&gt; 8;    LMIC.frame[2<\/em>i+1] = val;\n   }\n   LMIC_setTxData2(1, LMIC.frame, i*2, 0); \/\/ (port 1, 2 bytes, unconfirmed)\n   \/\/ reschedule job in 900 seconds\n   os_setTimedCallback(j, os_getTime()+sec2osticks(900), reportfunc);\n }<\/pre>\n\n\n\n<p>On fait une sauvegarde avec ctrl+x<\/p>\n\n\n\n<p>Maintenant, on compile le code<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo make clean &amp;&amp; sudo make &amp;&amp; sudo .\/build\/periodic.out<\/pre>\n\n\n\n<p>on test le programme avec la commande suivante:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo .\/examples\/periodic\/build\/periodic.out<\/pre>\n\n\n\n<p>on devrait avoir le retour suivant:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">000000000 HAL: Initializing \u2026\n 000000002 HAL: Detected SX1276 radio module.\n 000000002 HAL: Set radio RST pin to 0x00\n 000000002 HAL: Wait until 000000003 ms\n 000000003 HAL: Set radio RST pin to 0x02\n 000000003 HAL: Wait until 000000008 ms\n 000000011 HAL: Receiving \u2026\n 000000029 Debug: Initializing\n 000000029 Debug: JOINING\n 000004213 Debug: EV_TXSTART\n 000004214 HAL: Sending \u2026\n 000009279 HAL: Receiving \u2026\n 000009279 HAL: Wait until 000009278 ms\n 000009349 Debug: JOINED\n 000009350 Debug: \/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_temp.csv\n Les meilleurs scores sont : 23,589000009350 Debug: Label 'val = ' value 0x5c25\n 000009350 Debug: \/home\/pi\/Raspberry-Pi-sample-code\/datalog_sensors_lastest_ph.csv\n Les meilleurs scores sont : 5,190000009350 Debug: Label 'val = ' value 0x1446\n 000009350 Debug: EV_TXSTART\n 000009351 HAL: Sending \u2026\n 000010406 HAL: Receiving \u2026\n 000010406 HAL: Wait until 000010405 ms\n 000011451 HAL: Receiving \u2026\n 000011451 HAL: Wait until 000011452 ms\n 000015017 Debug: TXCOMPLETE<\/pre>\n\n\n\n<p>On v\u00e9rifie sur TTN que tout est ok en allant sur l&#8217;onglet DATA<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"276\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-4-1024x276.png\" alt=\"\" class=\"wp-image-1533\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-4-1024x276.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-4-300x81.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-4-768x207.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-4.png 1072w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Si tout est bon, rep\u00e9rez bien le num\u00e9ro de Port. Cela servira pour la suite.<\/p>\n\n\n\n<p>on peux cr\u00e9er le service lora-node pour rendre automatique celui-ci<\/p>\n\n\n\n<p>Pour cela on fait les commande suivantes:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">cd \/lib\/systemd\/system\/\nsudo nano lora-node.service<\/pre>\n\n\n\n<p>On remplile fichier de la fa\u00e7on suivante:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">[Unit]\n Description=LoRaWAN node\n After=user.target\n [Service]\n Type=idle\n ExecStart=\/home\/pi\/lmic-rpi-lora-gps-hat\/examples\/periodic\/build\/periodic.out\n StandardOutput=journal\n StandardError=journal\n Restart=on-failure\n [Install]\n WantedBy=multi-user.target<\/pre>\n\n\n\n<p>On sauvegarde avec ctrl+x et on execute les commandes suivantes:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sudo chmod 644 \/lib\/systemd\/system\/lora-node.service\nsudo systemctl daemon-reload\nsudo systemctl enable lora-node.service\nsudo systemctl start lora-node.service\nsudo systemctl status lora-node.service<\/pre>\n\n\n\n<p>Nous devons avoir le retour suivant: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">\u25cf lora-node.service - LoRaWAN node\n    Loaded: loaded (\/lib\/systemd\/system\/lora-node.service; enabled; vendor preset: enabled)\n    Active: active (running) since Wed 2021-01-06 10:35:23 CET; 7min ago\n  Main PID: 26155 (periodic.out)\n     Tasks: 1 (limit: 2063)\n    CGroup: \/system.slice\/lora-node.service\n            \u2514\u250026155 \/home\/pi\/lmic-rpi-lora-gps-hat\/examples\/periodic\/build\/periodic.out\n janv. 06 10:35:23 raspberrypi systemd[1]: Started LoRaWAN node.<\/pre>\n\n\n\n<p>C&#8217;est ok? Parfait! maintenant on va passer \u00e0 la partie d\u00e9codage <\/p>\n\n\n\n<p class=\"has-large-font-size\">Partie 6: D\u00e9codage de la Trame Lora<\/p>\n\n\n\n<p>Il faut aller dans l&#8217;onglet Applications &gt; capteurs_garage &gt; Payload Formats<\/p>\n\n\n\n<p>On renseigne le code suivant dans la partie decoder<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">function Decoder(bytes, port) {\n var decoded = {};\n var counter = 1;\n decoded.temperature_eau = 0;\n for(i=0; i&lt;2; i++){\n decoded.temperature_eau += Math.pow(256,i)*parseInt(bytes[2*counter-1-i]);\n }\n decoded.temperature_eau = decoded.temperature_eau\/1000-20;\n counter +=1;\n decoded.ph_eau = 0;\n for(i=0; i&lt;2; i++){\n decoded.ph_eau += Math.pow(256,i)*parseInt(bytes[2*counter-1-i]);\n }\n decoded.ph_eau = decoded.ph_eau\/1000;\n return decoded;\n }<\/pre>\n\n\n\n<p>On va tester pour voir si cela fonctionne pour cela dans Payload, mettez 5C 24 14 46 et cliquez sur Test<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"260\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-5-1024x260.png\" alt=\"\" class=\"wp-image-1535\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-5-1024x260.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-5-300x76.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-5-768x195.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-5.png 1076w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Si tout est ok, on sauvegarde avec le bouton situ\u00e9 en bas. Voil\u00e0 nous avons r\u00e9ussi \u00e0 d\u00e9coder la trame et elle sera ainsi tout le temps d\u00e9cod\u00e9e.<\/p>\n\n\n\n<p class=\"has-large-font-size\">Partie 7: R\u00e9cup\u00e9rer les donn\u00e9es sur Jeedom<\/p>\n\n\n\n<p>Pour cette partie, on va utiliser le plugin LoRa Node for TTN (Attention le plugin est payant, j&#8217;\u00e9crirai un article sur une solution gratuite utilisant MQTT un peu plus tard)<\/p>\n\n\n\n<p>Pour cela dans le market de Jeedom t\u00e9l\u00e9charg\u00e9 le plugin et activ\u00e9 le, il n&#8217;y a pas de configuration sp\u00e9cifique. <\/p>\n\n\n\n<p>Maintenant allez dans le plugin en cliquant sur Plugins &gt; Protocole domotique &gt; Lora Node for TTN<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"542\" height=\"743\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-7.png\" alt=\"\" class=\"wp-image-1539\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-7.png 542w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-7-219x300.png 219w\" sizes=\"auto, (max-width: 542px) 100vw, 542px\" \/><\/figure>\n\n\n\n<p>Cliquez sur Ajouter un \u00e9quipement et donnez lui un nom<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"383\" height=\"231\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-8.png\" alt=\"\" class=\"wp-image-1542\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-8.png 383w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-8-300x181.png 300w\" sizes=\"auto, (max-width: 383px) 100vw, 383px\" \/><\/figure>\n\n\n\n<p>Remplissez les informations suivantes: Application ID, Device ID et Port<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"546\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-11-1024x546.png\" alt=\"\" class=\"wp-image-1547\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-11-1024x546.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-11-300x160.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-11-768x410.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-11-1536x820.png 1536w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-11.png 1578w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Pensez \u00e0 mettre Visible et sauvegardez<\/p>\n\n\n\n<p>Copiez l&#8217;adresse avec l&#8217;apikey en bas de la page et renseignez Europe pour le S\u00e9lection du serveur TTN (R\u00e9gion)<\/p>\n\n\n\n<p>Maintenant allez sur TTN et cliquez sur l&#8217;onglet Applications &gt;capteurs_garage &gt; Integrations<\/p>\n\n\n\n<p>Cliquez sur + add integration<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"58\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-12-1024x58.png\" alt=\"\" class=\"wp-image-1551\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-12-1024x58.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-12-300x17.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-12-768x43.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-12.png 1077w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Choisissez HTPP Integration<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"341\" height=\"431\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-13.png\" alt=\"\" class=\"wp-image-1553\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-13.png 341w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-13-237x300.png 237w\" sizes=\"auto, (max-width: 341px) 100vw, 341px\" \/><\/figure>\n\n\n\n<p>Maintenant, remplissez les donn\u00e9es suivantes Process ID, choisissez default key et collez l&#8217;URL prise dans Jeedom (ATTENTION, Il faut avoir ouvert et redirig\u00e9 les ports correctement de sa box afin d&#8217;avoir acc\u00e8s \u00e0 Jeedom depuis l&#8217;ext\u00e9rieur, je ferai un article prochainement dessus)<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"641\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-14-1024x641.png\" alt=\"\" class=\"wp-image-1555\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-14-1024x641.png 1024w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-14-300x188.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-14-768x481.png 768w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-14.png 1065w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p>Sauvegardez et maintenatnt retournez sur Jeedom.<\/p>\n\n\n\n<p>Si tout est param\u00e9tr\u00e9 correctement, on devrait voir apparaitre \u00e0 la prochaine remont\u00e9e les donn\u00e9es issues de TTN. Notre script Lora remontant les donn\u00e9es toutes les 15 minutes, nous avons le temps de boire un caf\u00e9 ^^<\/p>\n\n\n\n<p>Apr\u00e8s cette pause caf\u00e9, on v\u00e9rifie&#8230;.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"248\" height=\"122\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-15.png\" alt=\"\" class=\"wp-image-1556\"\/><\/figure>\n\n\n\n<p>Nous pouvons m\u00eame historiser&#8230;<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"778\" height=\"498\" src=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-17.png\" alt=\"\" class=\"wp-image-1558\" srcset=\"https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-17.png 778w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-17-300x192.png 300w, https:\/\/miniprojets.net\/wp-content\/uploads\/2021\/01\/image-17-768x492.png 768w\" sizes=\"auto, (max-width: 778px) 100vw, 778px\" \/><\/figure>\n\n\n\n<p>Voil\u00e0, maintenant vous \u00eates capable de faire le monitoring d&#8217;un bassin via une connexion Lora et remonter les donn\u00e9es dans Jeedom. <\/p>\n\n\n\n<p>J&#8217;esp\u00e8re que cela vous aidera, n&#8217;h\u00e9sitez pas \u00e0 poser des questions ou des updates. <\/p>\n\n\n\n<p>J\u00e9r\u00f4me Ferrari<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Bonjour \u00e0 tous, Aujourd&#8217;hui, on va apprendre comment monitorer l&#8217;\u00e9tat d&#8217;un bassin pour monitorer la temp\u00e9rature de l&#8217;eau ainsi que&hellip;<\/p>\n","protected":false},"author":1,"featured_media":1207,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[54],"tags":[82],"class_list":["post-1192","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\/1192","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\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/comments?post=1192"}],"version-history":[{"count":0,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/posts\/1192\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media\/1207"}],"wp:attachment":[{"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/media?parent=1192"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/categories?post=1192"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/miniprojets.net\/index.php\/wp-json\/wp\/v2\/tags?post=1192"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}