Articles sur Lora écrits par un autre Montpellierrain Cédric Goby 🙂
Si vous avez la chance d’être dans une zone couverte avec une communauté, vous n’êtes pas obligé de mettre en œuvre une passerelle vous pouvez simplement rejoindre une communauté.
Explications détaillées par Cédric Goby.
- Je dispose pour ma part d’une passerelle premier prix, a savoir le modèle « TBMH100 » de « The Things Industries »
- Nous utiliserons une carte de développement de chez Microchip à base de RN2483, qui intègre par défaut un capteur de lumière et de température.
- Relevés effectués sur The Things Network
- Mise en forme des données réceptionnées en json converties au format highcharts par un script en bash.
- Graphiques construits à l’aide de highcharts
Dans un premier temps il nous faut ouvrir un compte sur The Things Network a fin de pouvoir y connecter notre passerelle (GATEWAYS), rien de compliqué a cette manœuvre suivez ce guide sur The Things Network.
Une fois la passerelle connectée à ttn il va falloir programmer notre objet a base de RN2483, nous utiliseront le protocole sécurisé OTAA (Over The Air) pour communiquer entre notre objet et la passerelle.
Il va maintenant falloir paramétrer notre carte Microchip à base de RN248 qui intègre par défaut un capteur de lumière et de température.
Je vous conseille de changer au moins les trois paramètres suivants deveui (8 bits) appeui (8 bits) appkey (16 bits) qui nous seront nécessaire pour ajouter notre objet dans ttn.
Connectez le RN2483 en USB a votre PC démarrez l’IDE Arduino, réglez le port com, puis ouvrez le moniteur série et réglez-le en 57600 et double retour de chariot \r\n.
Sachez que Microchip met a notre disposition ou outil dédié qui peux aussi vous servir à dialoguer et a mettre à jour le firmware facilement.
Sur la page du produit ou vous trouverez les mise à jour du firmware, le software « LoRa Development Suite » est disponible pour Windows/Mac OS/Linux, ainsi que toute les documentations nécessaires.
Microchip: https://www.microchip.com/Developmenttools/ProductDetails/dv164140-1
Vous pouvez par exemple utiliser ce générateur pour générer les codes en hexadécimal si comme moi vous n’écrivez pas en hexadécimal aussi facilement que en français.
Commandes pour otaa:
1 2 3 4 5 |
sys get ver mac set deveui xxxxxxxx mac set appeui xxxxxxxx mac set appkey xxxxxxxxxxxxxxxx mac save |
Pour vérifier deveui/appeui/appkey, remplacez set par get.
1 2 |
mac get deveui mac get appeui |
Commandes supplémentaires utilisées pour configurer le RN2483:
1 2 3 4 5 6 |
mac set adr on mac pause radio set pwr 15 mac resume mac set dr 5 mac save |
Pour voir toute les commandes supportées rendez-vous sur le guide d’utilisation du RN2483: http://ww1.microchip.com/downloads/en/DeviceDoc/RN2483-LoRa-Technology-Module-Command-Reference-User-Guide-DS40001784G.pdf
Votre objet est maintenant prêt a communiquer avec votre passerelle, pour ce faire il fa falloir ajouter notre objet dans la console de ttn.
Rendez-vous dans Applications, renseignez les divers paramètres demandés ainsi que les deveui (8 bits) appeui (8 bits) appkey (16 bits) que vous avez rentrés dans votre RN2483.
Vous pouvez normalement communiquer entre votre objet et votre passerelle.
Pour tester la communication envoyez un:
1 |
mac join otaa |
Si en réponse vous obtenez un « Accepted », c’est que tout va bien votre objet est accepté, ne fermez pas le moniteur série Arduino.
On va envoyer un premier message a notre passerelle, un « Hello World » encodé en hexadécimal:
1 |
mac tx cnf 1 48656C6C6F20576F726C6421 |
Pour vérifier que le message est bien passé, rendez-vous dans https://console.thethingsnetwork.org/applications / ==> votre objet ==> data là vous devriez voir le code hexadécimal envoyé.
Maintenant que nous savons communiquer avec notre passerelle, nous allons voir comment réceptionner les données envoyées par notre objet sur notre site et les mettre en forme.
Il va falloir d’abord mettre en forme les codes hexadécimal reçus histoire de les rendre lisible par un humain, pour ce faire rendez-vous dans Payload Format onglet « decoder », moi j’y met ce bout de code en javascript (je suis null en javascript …):
1 2 3 4 5 6 7 8 9 10 11 |
function Decoder(bytes, port) { var result = {Lumiere: "", Temperature: " "}; //if (port === 1) {} lum = String.fromCharCode(bytes[0], bytes[1], bytes[2]); //Virer les 00 ==> \u0000 tmp = String.fromCharCode(bytes[3], bytes[4], bytes[5], bytes[6]); //Virer les 00 ==> \u0000 lum = lum.replace(/ /g, ''); tmp = tmp.replace(/ /g, ''); result.Lumiere = lum.toString().replace(/[^\x20-\x7E]/g, ''); result.Temperature = tmp.toString().replace(/[^\x20-\x7E]/g, ''); return result; ''; } |
Pour vérifier rendez-vous dans: https://console.thethingsnetwork.org/ ==> applications ==> Application ID ==> Data
« The Things Network » met a notre disposition tout un tas de protocoles pour réceptionner ou envoyer des données .
Nous allons tester un export en .json, rendez-vous dans:
https://console.thethingsnetwork.org/ ==> applications ==> Application ID ==> integrations et ajoutez un « Data Storage ».
Vous pouvez tester son fonctionnement en cliquant sur « go to platform »
Vous pouvez réceptionner vos données au format json sur 7 jours au maximum a l’aide de curl avec la commande suivante:
1 2 3 |
curl -X GET --header 'Accept: application/json' \ --header 'Authorization: key ttn-account-v2.xxxxxxxxxxxxxxxxxxxxxxxxxxx' \ 'https://xxx-youruser-xxx.data.thethingsnetwork.org/api/v2/query?last=1d' |
- Ou xxx-youruser-xxx est votre « Application ID »
- et ttn-account-v2.xxxxxxxxxxxxxxxxxxxxxxxxxxx est votre « Access Keys »
- et last=1d la durée de réception souhaitée, ici 1d = 1 jour !
Nous allons réaliser une moulinette scriptée en bash a fin de mettre en forme nos données json pour highcharts.
Ci-dessous un exemple de moulinette qui va récupérer uniquement la date et la température.
Nous aurions pû adapter via l’API de Highcharts notre graphique de manière a utiliser directement le .json fourni par ttn, mais cela m’aurait pris beaucoup plus de temps. :-p
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#! /bin/bash chemin="$(cd "$(dirname "$0")";pwd)/$(basename "$0")"; dossier="$(dirname "$chemin")" export chemin dossier cd "${dossier}" #███████████████████RÉGLAGES███████████████████ fichier_json="temperature.json" tmp_file="tmp.json" ttn_account="ttn-account-v2.xxxxxxxxxxxxxxxxxxxxxxxxx" ApplicationID="xxxx" #███████████████████RÉGLAGES███████████████████ #Récupérer infos sur ttn ! echo -e "Content-type: text/html\n\n" curl -X GET --header "Accept: application/json" \ --header "Authorization: key ${ttn_account}" \ "https://${ApplicationID}.data.thethingsnetwork.org/api/v2/query?last=5d" > "${tmp_file}" #Mise en forme cat "${tmp_file}" | sed -e "s/},{/}\n{/g" | sed -e "s/\[{//g" | sed -e "s/}\]//g" | sed -e "s/{//g" | sed -e "s/}//g" | sed -e "s/ //g" | sed -e "s/u0000//g" > "${tmp_file}" #On supprime les lignes qui contiennent null echo -e "$(sed '/null/d' "${tmp_file}")" > "${tmp_file}" #On supprime les " sed -i 's/"//g' "${tmp_file}" #On supprime les \ sed -i 's/\\//g' "${tmp_file}" #On supprime les ° (Temporaire corrigé dans ttn) sed -i 's/°C//g' "${tmp_file}" #Temporaire corrigé dans ttn ! sed -i 's/Temperature:0/Temperature:/g' "${tmp_file}" #Memoriser les libellés T1="$(cat "${tmp_file}" | sed -n "1 p" | cut -d',' -f1 | cut -d':' -f1)" T2="$(cat "${tmp_file}" | sed -n "1 p" | cut -d',' -f2 | cut -d':' -f1)" T3="$(cat "${tmp_file}" | sed -n "1 p" | cut -d',' -f3 | cut -d':' -f1)" T4="$(cat "${tmp_file}" | sed -n "1 p" | cut -d',' -f4 | cut -d':' -f1)" T5="$(cat "${tmp_file}" | sed -n "1 p" | cut -d',' -f5 | cut -d':' -f1)" #On supprime les libellée sed -i "s/${T1}://g" "${tmp_file}" sed -i "s/${T2}://g" "${tmp_file}" sed -i "s/${T3}://g" "${tmp_file}" sed -i "s/${T4}://g" "${tmp_file}" sed -i "s/${T5}://g" "${tmp_file}" #Afficher uniquement valeur 5 et 2 (valeur de date / Temperature) echo -e "$(cat "${tmp_file}" | awk -F "," '{ print $5 "," $2}')" >${tmp_file} #On ajoute libellés en première ligne #sed -i "1i${T1},${T5}" "${tmp_file}" #On supprime les lignes ou champ Temperature est en erreur ? echo -e "$(sed '/Temp.*/d' "${tmp_file}")" > "${tmp_file}" # Supprimer les lignes ou le champ $2 est sup à 50 echo -e "$(awk '{FS=","} $2 < 50 { print }' "${tmp_file}")" > "${tmp_file}" #On change le format de date UTC ver FR echo -e "$(awk -f a.awk "${tmp_file}")" > "${tmp_file}" #date UNIX timestamp 000 #date --date='2020-08-08T21:46:16.363930962Z' +"%s" #▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ #Debug histoire de vérifier les dates function Debug() { sed -i 's/000,/,/g' "${tmp_file}" echo -e "$(awk -f a-debud.awk "${tmp_file}")" > "${tmp_file}" exit 0 } #Debug #▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ #On reconstruit en .json ! #on ajoute en debut de ligne [ sed -i "/^/s/^/\[/" "${tmp_file}" #on ajoute en fin de ligne ] sed -i "/$/s/$/\]/" "${tmp_file}" #On ajoute en première ligne un [ sed -i '0,/^/ s/^/\[/' "${tmp_file}" #On ajoute en dernière ligne un ] sed -i '$,/$/ s/$/\]/' "${tmp_file}" #On remet tout sur 1 ligne sed -i ':a;N;$!ba;s/\n//g' "${tmp_file}" #on ajoute ue virgile entre les ],[ sed -i "s/\]\[/\],\[/g" "${tmp_file}" #Vérification du fichier json généré ? if [ $(echo '{"test":true}' | jq . "${tmp_file}" > /dev/null 2>&1; echo $?) -eq 0 ]; then echo -e ".JSON est valide" cp -f "${tmp_file}" "${fichier_json}" rm "${tmp_file}" else echo -e "ERREUR .JSON est invalide !" fi exit 0 #F.I.N #▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬ |
Le fichier généré par le script: http://www.openhardware.eu/highcharts/ok/temperature.json
Nous disposons maintenant d’un fichier de donnée compatibles avec highcharts nous allons créer une jolie page .html en s’aidant du modèle suivant.
Highcharts (si utilisation non commerciale).
met différents modèles de graphiques a notre disposition: https://www.highcharts.com/demo/stock
Highcharts API: https://api.highcharts.com/highcharts/
Exemple Final: http://www.openhardware.eu/highcharts/ok/iframe.html
Nous disposons d’une page statique, si nous souhaitons la rendre dynamique, différentes solutions s’offrent a nous soit vous avec un accès à cron, dans ce cas mettez simplement une crontab pour exécuter les script bash quand vous le souhaitez.
Si vous n’avez pas accès a cron chez votre hébergeur vous pouvez par exemple sous wordpress utiliser wp-crontrol qui va vous permettre d’ajouter une page php qui sera mise a jour quand vous le souhaitez (a condition que il y ait du trafic sur le site).
Exemple basique de page php qui exécutera le script bash.
1 2 3 |
<?php shell_exec("votre-ficher.cgi 2>/dev/null"); ?> |