Skip to content
guyzmo edited this page Mar 12, 2013 · 2 revisions

Création d’un nouveau module d’envoi de données pour Pollux

Ce document explique comment créer et configurer dans un système Pollux’NZ City en version beta 2.0, un nouveau module d’envoi des données vers des silos de données, quels qu’ils soient. Afin de simplifier au maximum la tâche de conversion et de traitement des données avant envoi, ce module est à programmer en python et sera exécuter par la passerelle Pollux’NZ City à chaque envoi de données.

création d’un module python

Ainsi, pour créer un module d’envoi de données, 2 éléments sont absoluments nécessaires : d’une part la chaîne « DEFAULT_CONFIG » qui défini les éléments de configurations accessibles par le module et configurables à travers l’interface « Datastores » de la passerelle, et la fonction « push_to_datastore() », qui effectue l’envoi des données. Seule la clef « activated »
doit être absolument déclarée, ou il ne sera pas possible d’activer le module une fois chargé dans la passerelle Pollux’NZ City.

squelette de base


"""
Contains the default configuration to be included in the
config json file. This will be done by the PolluxConfig
interface at load.

Only the 'activated' key is mandatory for the plugin to
be activated.
"""
DEFAULT_CONFIG = {
        "activated": False,
}

def push_to_datastore(values_list, config):
    """
    This method processes the measured values from values_list
    with all the parameters set in config.

    @param values_list list of values, each value being a dict 
                       with "k"ey, "v"alue, "u"nit, "p"recision.
    @param config dict containing all the parameters for the plugin.
    @return >0 if success, <0 if failure, ==0 if loading error
    """
    return 1

def test():
    """
    This is a test run to verify the validity of the plugin.
    """
    c = DEFAULT_CONFIG[DEFAULT_CONFIG.keys()[0]]
    l = [{'p': '0.1', 'k': 'temp', 'u': 'degre celcius', 'v': '42'},
         {'p': '0.0001', 'k': 'dust', 'u': 'ppm', 'v': '0.001'}]
    exit(push_to_datastore(l,c))

Ci-dessus, vous trouverez le squelette de base d’un module d’envoi des données. On y retrouve deux méthodes :

  • push_to_datastore(values_list, config) a pour rôle de transformer la liste des valeurs dans un format correct pour le destinataire des mesures, et les y envoyer ; cette fonction prend en paramètre
    • la liste de valeurs values_list, qui est une liste de dictionnaires sous la forme
      • ‘k’ pour le nom de la mesure,
      • ‘u’ pour l’unite,
      • ‘v’ pour la ’valeur,
      • ‘p’ pour la precision
    • et la configuration config, sous la même forme que « DEFAULT_CONFIG ».
    • la valeur de retour positive indique un succès de l’opération, négative indique une erreur d’envoi, et 0 pour une erreur de chargement (notamment des dépendances…).
  • test() : qui permet de vérifier le plugin python, notamment via la ligne de commande suivante :

python monmodule.py -c "monmodule.setup()"

Exemple pour Cosm, alias Pachube

Ainsi, pour l’aggrégateur « Cosm », voici un module de récupération des données :


import json
import urllib2

DEFAULT_CONFIG = \
{
    "activated": False, 
    "post_url": "http://api.pachube.com/v2/feeds/",
    "feed_id" : "",
    "api_key": ""
}

def push_to_pachube(url, key, content):
    opener = urllib2.build_opener(urllib2.HTTPHandler)
    request = urllib2.Request(url, data=content)
    request.add_header('Content-Type', 'application/json')
    request.add_header('X-PachubeApiKey', key)
    request.get_method = lambda: 'PUT'
    try:
        opener.open(request, timeout=5)
    except urllib2.URLError,e:
        print "[Error pushing data in pachube.py: ", e, "]",
        return -1

def push_to_datastore(values_list, config):
    data_str = dict(version="1.0.0",datastreams=[])
    for v in values_list:
        data_str["datastreams"].append(dict(id=v["k"], current_value=v["v"]))
    return push_to_pachube(config["post_url"]+config["feed_id"], config["api_key"],json.dumps(data_str))


def test():
    l = [{'p': '0.1', 'k': 'temp', 'u': 'degre celcius', 'v': '42'},
         {'p': '0.0001', 'k': 'dust', 'u': 'ppm', 'v': '0.001'}]
    exit(push_to_datastore(l,DEFAULT_CONFIG))

Y est effectué la transformation de la liste de valeurs en données JSON telles que souhaitées pour le silo Cosm, suivi d’un envoi des données
à l’aide de la bibliothèque « urllib2 » de python sur la plateforme Cosm.

Installation par l’interface

Pour installer le module, il suffit de se connecter à l’interface web de Pollux’NZ City (en trouvant
son adresse IP attribuée par le réseau local).

page d'accueil

A partir de cette interface, cliquez sur « Advanced », pour accèder aux options de configuration avancé. Sur cette interface, entrez le nom du module à ajouter (qui sera le nom final du module dans l’interface de la passerelle. Attention, le nom du module doit commencer par une lettre et ne contenir que des caractères alphanumériques.

ajout d'un module

Une fois terminé, cliquer sur « Submit Query » dans la section en « Datastore plugin uploader ». Ensuite, vous pouvez modifier les paramètres dans l’onglet « Datastores ». Notamment, bien penser à cocher « activated » pour prendre en compte le module au prochain lancement du service.

configuration datastore

Une fois les modifications terminées, bien penser à cliquer sur le bouton « Restart Gateway » pour relancer le service d’interrogation du capteur.

bouton de restart

Installation à la main

Connectez vous en « SSH » à la passerelle Pollux’NZ City (le mot de passe pourra être donné indépendament de cette documentation).

Copier le module python dans :


/usr/lib/pollux/extensions/datastores/

ajouter la partie dictionaire dans :

/etc/pollux/config.json

sous la clef « datastores » et avec comme clef racine le nom du module python ajouté. i.e. pour pachube:

{
    "configuration": {
        "tty_port": "/dev/ttyO2", 
        "wud_sleep_time": "900"
    }, 
    "datastores": {
        //...other datastores here..., 
        "pachube": {
            "activated": false, 
            "api_key": "", 
            "feed_id": "",
            "post_url": "http://api.pachube.com/v2/feeds/"
        }
    }, 
    "geolocalisation": {
        "address": "CKAB", 
        "latitude": "48.8706573", 
        "longitude": "2.3413066"
    }
}

N.B.: Toujours penser à transformer les True/False de python en true/false de javascript, toutes les autres valeurs doivent absolument être des chaînes de caractères.