Dans le lab d’OVH : l’internet des objets et Runabove iot pour Domoticz

« 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.

runabove

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

create_iot_token

  • En enregistrant on obtient :

iot_token

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.

id_and_keys_iot

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/

 

Pour toute question technique concernant cet article, veuillez utiliser les forum situés à https://easydomoticz.com/forum/
Posted in domoticz, logiciel, python, scripts.

8 Comments

  1. 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)

  2. C’est effectivement le request qui manquait 🙂

    Tt fonctionne maintenant et j’ai bien  le code retour. Encore merci pour ton aide.

  3. 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

  4. Pingback: Domotique - rick57 | Pearltrees

Comments are closed.