Skip to content

1. EMIT Architecture

BastSamson edited this page Jul 6, 2017 · 14 revisions

a) Introduction

EMIT est une plate-forme de collecte et d'analyse de données relatives à la consommation énergétique de logiciels en exécution. Elle est composée de matériel (serveurs, PC, instruments de mesure, etc...) et de services Web permettant de :

  • créer des expériences : observer, via des instruments de mesure, des environnements (EN:environment) de travail (PC) qui exécutent des algorithmes (EN:measurand)
  • gérer des instruments, environnements de travail, algorithmes ou logiciels
  • retrouver les résultats des expériences et des analyses

Cette page a pour objectif de présenter la plate-forme d'une manière globale. La structure physique, logicielle ainsi que différents modèles de données sont expliqués ci-dessous afin d'avoir une vue générale du projet EMIT.

b) Structure physique

Tout le matériel est situé dans les locaux de l'Icam de Nantes. La plate-forme est composée de tout le nécessaire pour : héberger des services Web, faire tourner des algorithmes sur différents postes ainsi qu'observer l'activité de ces derniers. L'image ci-dessous donne un aperçu du design physique d'EMIT :

Design EMIT.jpg

On y aperçoit le serveur hébergeant les services Web et supervisant l'installation, les différentes machines (CM1...CM4) sur lesquelles tournent les algorithmes/logiciels et les 3 instruments (PMO1...PMO4) actuellement en place qui permettent d'observer la consommation électrique des environnements (centrales de PC). Tout est relié par un réseau Ethernet.

La photo ci-dessous présente la plate-forme dans l'état où elle est aujourd'hui :

Photo plate-forme.jpg

c) Structure Logicielle

EMIT est une plate-forme en client/serveur. L'architecture est présentée ci-dessous :

Client serveur.png

Le client, depuis son navigateur Web, a accès à des pages Web. De là, il va envoyer des requêtes HTTP au serveur, qui va les traiter. Une base de données MySQL est à disposition du serveur pour qu'il y stocke tout ce dont il a besoin. L'interaction serveur/BDD se fait par l'intermédiaire de requêtes SQL. Ces dernières permettent de créer, retrouver, modifier ou supprimer des données en base. Le serveur renvoie ensuite les réponses au client, toujours sous forme de pages Web.

Le fonctionnement interne de la plate-forme est décrit plus en détails dans les autres pages de ce wiki.

d) Modèle de données

Une des premières étapes de la conception de la plate-forme EMIT a été de créer un modèle de données correspondant au besoin des expériences. Il en est ressorti le modèle suivant :

Data model.png

Composition du Data Model

On y retrouve par ordre logique :

  • instrument : instruments qui observent les expériences. Défini par un nom et un URL (ici appelé uri).
  • feature : correspond à tous les canaux d'un instrument. Par exemple, pour ArduinoMeter : Canal1 = Voltage; C2, C5, C8 = Intensity; C3, C6, C9 : Power; C4, C7, C10 = Power factor cos(φ). La feature est définie par un nom, une unité (lié à measure), un instrument et un factor (puissance de 10) permettant de définir plus précisément la grandeur physique renvoyée par l'instrument
  • measure : spécifie les grandeurs physiques. Défini par un nom (Voltage) et une unité (V).
  • environment : environnements de travail (PC) sur lesquels se déroulent les expériences. Défini par un nom et un URL.
  • measurand : exécutable (algorithme, processus) lancé pendant l'expérience. Défini par un nom et un emplacement sur le serveur (pour l'instant : /var/local/emit/NomDuFichier).
  • experiment : Enregistrement en BDD correspondant au déroulement d'un experiment (expérience). Comprend la date de création et de fin de l'expérience, le measurand exécuté et l'environment, l'instrument étant renseigné avec le measurementSet.
  • measurementSet : Pour un experiment donné, il existe autant de measurementSets que d'un instrument. Un measurementSet est un fichier .csv contenant l'ensemble des séries temporelles obtenues par les différentes voies (feature) d'un instrument.
  • measurement : Un measurement est fichier JSON* comprenant une série temporelle (grandeur physique en fonction du temps). Il est simplement la décomposition des measurementSet en séries temporelles uniques. L'enregistrement en BDD du measurement comprend le nom du JSON (data), l'unité de la série temporelle (measure) et le measurementSet duquel il est extrait.

*voir : https://fr.wikipedia.org/wiki/JavaScript_Object_Notation

Flux de création

La première étape avant de créer une expérience, est de créer en base de données tous les éléments correspondant à l'installation physique : toutes les measures (grandeurs physiques) observées, les instruments et leurs features, les measurands implémentés et stockées sur le serveur ainsi que les environments installés.

A la planification de l'experiment, un enregistrement est créé avec tous les paramètres de l'expérience (excepté l'instrument). Un timestamp est spécifié (= date de planification). Dans la foulée, sont créés autant de measurementSet que d'instruments actifs pour l'expérience. Ces measurementSets sont donc liés aux instruments, et à l'experiment par son id.

Une fois l'expérience planifiée, c'est la plate-forme qui la lance en automatique (pour l'instant, l'opération est manuelle), dès que toutes celles déjà planifiées ont été réalisées. Pendant l'expérience, l'instrument déversera ses données dans le measurementSet qui lui est associé. Un timestamp de fin d'expérience est écrit sur l'enregistrement de cette dernière, et chaque measurementSet est ensuite découpé en autant de measurement qu'il existe de features (canaux, voies) à l'instrument de mesure (cette opération est aussi manuelle à l'heure actuelle).

Les résultats de l'expérience (measurement) sont désormais prêts à être visualisés ou exploités par la plate-forme d'analyse. Ils sont stockés sur le serveur sous forme de séries temporelles (timestamp, donnée) dans des fichiers JSON sur le serveur. Un exemple du format JSON est écrit ci-dessous :

`[{"x":0,"y":23},{"x":80,"y":24},{"x":160,"y":23},{"x":240,"y":23},{"x":320,"y":24},{"x":400,"y":24},{"x":480,"y":23},{"x":560,"y":23},{"x":640,"y":20},{"x":720,"y":23},{"x":800,"y":20},{"x":880,"y":25}]`