« Les vacances scolaires sont là » ou « Comment dépenser notre temps libre en activités chronophages ».
Bien connue pour ses solutions d’hébergement de sites web, OVH innove souvent et propose des produits révolutionnaires comme ces derniers temps l’outil d’agrégation d’ADSL https://www.ovhtelecom.fr/overthebox/ par exemple.
Mais il ne s’agit pas aujourd’hui de présenter un produit fini mais plutôt un concept à tester.
Je voulais faire découvrir dans cet article une des dernières innovations issue du laboratoire de la société OVH. Il s’agit de IOT, time series , autrement dit une base de données pour l’internet des objets (Internet Of Things) que OVH nous met à disposition pour tester. Suivront des outils de reporting dans un avenir proche.
Notez bien qu’il s’agit d’un produit de laboratoire dont on ne connait pas la durée de vie. Pour l’instant c’est gratuit mais cela ne durera pas. Ne construisez donc rien de définitif basé la dessus pour l’instant.
De quoi s’agit il ?
Il s’agit d’une base de données cloud destinée à stocker des données issues d’objets communicants et à mon avis Domoticz fait partie du lot.
Un descriptif général ici https://www.runabove.com/iot-paas-timeseries.xml
La caractéristique majeure de cette base de données est qu’elle est faite pour stocker des millions de points, rapide à la milliseconde, sans SQL dedans.
Elle appartient à la famille des bases de données dites temporelles ou chronologiques (RRDtools, InfluxDB) qui sont conçues pour ne conserver « QUE » une date/heure, une valeur, le nom à laquelle est relié cette valeur et des tags. 20152013153945125,34,raspberry.temp.cpu,rasp:temp serait un exemple de stockage.
L »idée est donc de pousser des valeurs récupérées de Domoticz dans cette base par quelque programme Lua et python et ensuite d’en faire des graphiques via un outil nommé grafana.
Envoi des données vers iot-pass-timeseries.
Ouvrons un compte par ici https://cloud.runabove.com/signup/?launch=iot
Une fois identifié allez dans le menu de gauche dans « Internet of Things »
Création de la base de donnée et des métriques associées.
- Nous créerons une application que nous nommerons »Domotique » puisque elle contiendra toutes mes mesures liées à la domotique (y compris des valeurs externes à mon Domoticz). Le storage cluster est SBG qui correspond au data center OVH de Strasbourg.
- Ensuite il faut créer un « token » par le bouton en haut à droite « New Token », il s’agit d’un identifiant unique qui permet de stocker /retrouver les valeurs.
Pour tester j’ai fait le choix de créer UN token par paramètre, d’autres possibilités existent d’avoir un token unique et des « sous token » par le biais de tags, plus souples elles permettent d’avoir des courbes comparatives plus facilement.
Ainsi je crée un token temp.rasp, un autre mem.rasp …. J’y associe respectivement des tags temp/cpu et mem/ram
- En enregistrant on obtient :
ou l’on voit que à ce token nous avons un identifiant et un password associés nécessaires pour lire (Read) et un autre pour écrire (Write) nos données.Ainsi cela permet à une application d’écrire et à d’autres multiples appli de lire les valeurs.
En fait ce token se nomme « métrique ou metric » dans la base de données et dans la suite de cet article. Ovh n’ayant pas repris le terme dédié à ces bases de données.
Le fonctionnement sera donc le suivant, pour chaque métrique (temp.rasp, mem.rasp, temp.salon, hum.salon, etc.) je vais avoir des login/password dédiés à l’écriture et d’autres pour la lecture, j’associe à ces métriques des tags sous la forme clé:valeur pour mieux retrouver mes petits.
Les programmes d’envoi des données
L’idée est d’avoir un premier programme Lua basé sur un script_device_xxxx qui envoie vers OVH les données dés que le device à changé de valeur, (on aurait aussi bien pu faire un script_time_ pour envoyer régulièrement des données à la base de données).
Puis ce programme Lua appelle un programme python qui se connecte à iot et écrit les données avec les metriques,tags,keys correspondants.
Le programme Lua
device='Temp' metric='rasp.temp' tag='temp' key='cpu' commandArray = {} if (devicechanged[device]) then val_rasp = tonumber(otherdevices_svalues[device]) -- print("memoire = "..val_rasp) os.execute(string.format("/home/pi/domoticz/scripts/python/temprasp_iot.py %s %s %s %.2f", metric, tag, key, val_rasp)) end return commandArray
Introduisez dans device le nom du matériel Domoticz et dans metric, tag,key , les paramètres de métrique iot.
Le programme python
Ce programme est appelé par le Lua , dans mon cas il se nomme temprasp_iot.py et se trouve dans le dossier
/home/pi/domoticz/scripts/python/
C’est le programme Lua qui lui donne toutes les valeurs, tag,métriques à écrire.
Les seules choses à y définir sont les Id et password du mode écriture (qui seront différents à chaque métrique)
#!/usr/bin/python # -*- coding: utf8 -*- ########################################################### # OpenTSDB REST API session in a HTTPS connection example # ########################################################### from __future__ import print_function, unicode_literals import json #installer requests pour python avec # pip install requests # ou # apt-get install python-requests # yum install python-requests import requests import time import sys import os #-------------------------------------------- #introduisez ici vos identifiant iot pour le mode Write # Vote Id du mode Write ici token_id = 'a5aqrgesssaacag2oy3' #Votre key du mode write token_key = 'ggedµGDiAKqpAFOFoWulyZ' #-------------------------------------------- # code pour python iot # IoT Lab OpenTSDB Endpoint end_point = 'https://opentsdb.iot.runabove.io/api/put' timestamp=int (time.time()) if len(sys.argv) ==1: print ("*erreur") sys.exit(0) else: metric =sys.argv[1] tag =sys.argv[2] key =sys.argv[3] valeur =float(sys.argv[4]) # Raw body data to send #metric='temp.rasp' #value=34 #tag='temp' #key='rasp' data = [ { 'metric': metric, 'timestamp': timestamp, 'value': valeur, 'tags': { tag: key } } ] #print (data) try: # Send request and fetch response response = requests.post(end_point, data=json.dumps(data), auth=(token_id, token_key)) # Raise error if any response.raise_for_status() # Print the http response code on success print('Send successful\nResponse code from server: {}'. format(response.status_code)) except requests.exceptions.HTTPError as e: print('HTTP code is {} and reason is {}'.format(e.response.status_code, e.response.reason))
A partir de ce moment les données sont envoyées dans iot paas time-series.
Pour debugger vous pouvez « mettre » en dur dans le programme python vos
metric = 'rasp.temp" tag ='temp' key ='cpu' valeur =23
juste avant le data =
# Raw body data to send data = [ { 'metric': metric, 'timestamp': timestamp, 'value': valeur, 'tags': { tag: key } } ]
en lançant le script python ./temprasp_iot.py temp.rasp temp cpu 666 on doit avoir un message http 204: réussite.
Sinon si cela ne marche pas , vérifier que
- Le module requests est bien installé ( apt-get install python-requests)
- Si il y a simplement *erreur c’est que le script ne reçoit pas les 4 paramètres attendus.
- L’erreur 401 (erreurs d’identification) signale des erreurs dans les token
- iot ne reçoit QUE des floats, pas de texte. Dans ce cas le lancement de ./temprasp_iot.py temp.rasp temp cpu totoon obtient une erreur :
valeur =float(sys.argv[4]) ValueError: could not convert string to float: 'toto'
N.B le script à besoin de 4 paramètres : metrique tag key valeur que l’on passe par le programme Lua ou que l’on doit taper depuis la ligne de commande même si ils sont remplacés par ceux que vous avez mis en dur dans le script. Décommentez les quelques print pour voir ce qui se passe.
N.B2 : Bien entendu j’utilise ici des données issues de Domoticz via Lua, mais rien n’aurait empêché d’aller chercher des données de n’importe quoi d’autre depuis des scripts shell/python/lua et les envoyer dans iot, comme par exemple des
L’affichage des données
Cela se passe ici https://easydomoticz.com/iot-2/
Bonjour,
Le end point est encore valable actuellement ?
https://opentsdb.iot.runabove.io/api/put
J’ai une erreur sur le script de ce type.
Bonjour
Pourrais tu me donner l’erreur que tu obtient (elle n’est pas dans ton commentaire)
Est ce que requests est bien installé ?
si tu as simplement *erreur c’est que tu passe aucun des 4 parametres
Sinon dans les erreurs il y a les 401 (erreurs d’identification)
C’est effectivement le request qui manquait 🙂
Tt fonctionne maintenant et j’ai bien le code retour. Encore merci pour ton aide.
Bonjour
J’ai l’erreur suivante
pi@rasparzon:~/domoticz/scripts/python $ ./temprasp_iot.py temp.rasp temp cpu 666
-bash: ./temprasp_iot.py: Permission non accordée
Bonsoir
Permission non accordée égale sudo oublié
ça fait presque un alexandrin
Pingback: Domotique - rick57 | Pearltrees
Bonjour,
ça me parait très compliqué à mettre en oeuvre alors que Domoticz intègre ça en série via le HttpLink (voir https://www.domoticz.com/wiki/HttpLink)
Il suffit de pointer vers l’url d’OVH et hop !
Seb
Oui en effet , merci