Commit e8472a47 authored by Nicolas Seydoux's avatar Nicolas Seydoux
Browse files

Reorganization

parent 93965e84
......@@ -25,3 +25,4 @@ itl_results/*
**/*.*.*/**
**/localhost/**
results_*/**
debug/
......@@ -10,7 +10,9 @@ fig = plt.figure()
ax = fig.add_subplot(111)
results = [
"/home/nseydoux/dev/edr/results/coopis/clone_f_0_reproduce/results_clone_f_0_reproduce_8"
"/home/nseydoux/dev/edr/results/coopis/iter_12/scala/results_clone_f_0_rpi23sb",
"/home/nseydoux/dev/edr/results/coopis/iter_12/scala/results_clone_f_1_rpi23sb",
"/home/nseydoux/dev/edr/results/coopis/iter_12/scala/results_clone_f_2_rpi23sb"
]
index = 0
......@@ -21,7 +23,8 @@ processing = []
idle = []
for path in results:
for method in ["adp", "cdp", "cdr", "cir"]:
# for method in ["adp", "cip", "cdp", "cdr", "cir"]:
for method in ["adp", "cir"]:
index += 1
journeys = []
with open(path+"/journeys_{0}.pkl".format(method), "rb") as f:
......@@ -45,6 +48,7 @@ for path in results:
# p1 = plt.bar(["C", "D"], transit_mean, width, color="blue")
# p2 = plt.bar(["C", "D"], processing_mean, width, bottom=transit_mean, color="yellow")
# p3 = plt.bar(["C", "D"], idle_mean, width, bottom=[x + y for x, y in zip(transit_mean, processing_mean)], color="red")
p1 = plt.bar(labels, transit, width, color="blue")
p2 = plt.bar(labels, processing, width, bottom=transit, color="yellow")
p3 = plt.bar(labels, idle, width, bottom=[x + y for x, y in zip(transit, processing)], color="red")
......
......@@ -3,5 +3,5 @@
"uri":"http://syndream.laas.fr/",
"port":8002,
"endpoint":"http://syndream.laas.fr:6001/rules/add",
"ruleset":["rules-syndream/comfort/aboveThresholdTemperature.ttl", "rules-syndream/comfort/comfortableSpot.ttl", "rules-syndream/comfort/veryComfortableSpot.ttl","rules-syndream/comfort/uncomfortableSpot.ttl"]
"ruleset":["shapes-syndream/comfort/comfortableShape.ttl", "shapes-syndream/comfort/uncomfortableShape.ttl", "shapes-syndream/comfort/thresholdShape.ttl"]
}
......@@ -3,5 +3,5 @@
"uri":"http://syndream.laas.fr/",
"port":8003,
"endpoint":"http://syndream.laas.fr:6001/rules/add",
"ruleset":["rules-syndream/energy/costlyPolicy.ttl"]
"ruleset":["shapes-syndream/energy/costlyPolicy.ttl"]
}
......@@ -187,9 +187,7 @@ ex:officeLightComfortResultTransferShape
FILTER NOT EXISTS {
$this a lmu:Node ;
edr:isInterestedIn ex:ComfortableSpot ;
lmu:hasDownstreamNode [
a lmu:HostNode;
].
lmu:hasDownstreamNode [a lmu:HostNode;].
FILTER NOT EXISTS {
{$this edr:consumesResult ex:officeLightComfortRule.}
}
......
......@@ -2,6 +2,7 @@ import sys
import pickle
import matplotlib.pyplot as plt
import glob
import re
data = []
labels = []
......@@ -9,157 +10,37 @@ fig = plt.figure()
ax = fig.add_subplot(111)
results = [
#"/home/nseydoux/dev/edr/results/results_rpi23sb_1",
#"/home/nseydoux/dev/edr/results/results_rpi23sb_2",
#"/home/nseydoux/dev/edr/results/results_rpi23sb_3",
#"/home/nseydoux/dev/edr/results/results_rpi23sb_4",
#"/home/nseydoux/dev/edr/results/results_rpi23sb_5",
# "/home/nseydoux/dev/edr/results_tmp"
# "/home/nseydoux/dev/edr/results_shapes_rpi23sb_1",
# "/home/nseydoux/dev/edr/results/results_shapes_rpi23sb_2",
# "/home/nseydoux/dev/edr/results/results_shapes_rpi23sb_3",
# "/home/nseydoux/dev/edr/results/results_shapes_rpi23sb_4"
"/home/nseydoux/dev/edr/results_minimal_cdp"
]
"/home/nseydoux/dev/edr/results/coopis/iter_11/specialisation_baseline/results_specialisation_baseline_3",
"/home/nseydoux/dev/edr/results/coopis/iter_11/specialisation_implementation/results_specialisation_implementation_3"
# "results/coopis/iter_12/distribution/results_distribution_0",
# "results/coopis/iter_12/distribution/results_distribution_3"
# "results/coopis/iter_9/specialisation_baseline_reproduce/results_specialisation_baseline_1",
# "results/coopis/iter_9/specialisation_implementation_reproduce/results_specialisation_implementation_4"
# "results/coopis/iter_11/specialisation_baseline/results_specialisation_baseline_3",
# "results/coopis/iter_11/specialisation_implementation/results_specialisation_implementation_3"
# "results/coopis/iter_11/distribution/results_distribution_0_1",
# "results/coopis/iter_11/distribution/results_distribution_1_1",
# "results/coopis/iter_11/distribution/results_distribution_2_1"
]
for method in ["cir", "cdr", "cdp", "cip", "adp"]:
# for method in ["cir", "cdr"]:
for path in results:
centralized = []
print("Opening "+path+"/journ_delays_{0}".format(method))
for data_file in glob.glob(path+"/journ_delays_{0}".format(method)):
with open(data_file, "rb") as f:
centralized.append(pickle.load(f))
data.append([x for l in centralized for x in l if x<3000.0])
# lbl = path.split("/")[5]
# lbl = "s"+"0"
labels.append(method)
for path in results:
centralized = []
for data_file in glob.glob(path+"/journ_delays_0"):
# print(data_file)
with open(data_file, "rb") as f:
centralized.append(pickle.load(f))
data.append([x for l in centralized for x in l if x<3000.0])
lbl = path.split("/")[5]
lbl = "s"+"0"
labels.append(lbl)
print("Centralized deductions : "+str(len(data[0])))
# decentralized = []
# for data_file in glob.glob(path+"/journ_delays_1"):
# # print(data_file)
# with open(data_file, "rb") as f:
# decentralized.append(pickle.load(f))
# data.append([x for l in decentralized for x in l])
# lbl = path.split("/")[5]
# lbl = "s"+"1"
# labels.append(lbl)
# print("Decentralized deductions : "+str(len(data[1])))
# plt.boxplot(data,0, '')
# with open("/home/nseydoux/dev/edr/results_rpi23sb_1/ded_delays_0_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S1, centralized")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_1/ded_delays_1_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S1, distributed")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_2/ded_delays_0_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S2, centralized")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_2/ded_delays_1_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S2, distributed")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_3/ded_delays_0_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S3, centralized")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_3/ded_delays_1_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S3, distributed")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_4/ded_delays_0_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S4, centralized")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_4/ded_delays_1_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S4, distributed")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_5/ded_delays_0_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S5, centralized")
#
# with open("/home/nseydoux/dev/edr/results_rpi23sb_5/ded_delays_1_officeLightComfortRule", "rb") as f:
# data.append(pickle.load(f))
# labels.append("S5, distributed")
# with open("/home/nseydoux/dev/edr/results_sb_d1/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D1, centralized")
# with open("/home/nseydoux/dev/edr/results_sb_d1/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D1, decentralized")
# with open("/home/nseydoux/dev/edr/results_sb_d11/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D11, centralized")
# with open("/home/nseydoux/dev/edr/results_sb_d11/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D11, decentralized")
# with open("/home/nseydoux/dev/edr/results_sb_d12/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D12, centralized")
# with open("/home/nseydoux/dev/edr/results_sb_d12/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D12, decentralized")
# with open("/home/nseydoux/dev/edr/results_sb_d2/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D2, centralized")
# with open("/home/nseydoux/dev/edr/results_sb_d2/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D2, decentralized")
#
# with open("/home/nseydoux/dev/edr/results_sb_d21/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D21, centralized")
# with open("/home/nseydoux/dev/edr/results_sb_d21/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D21, decentralized")
#
# with open("/home/nseydoux/dev/edr/results_sb_d22/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D22, decentralized")
# with open("/home/nseydoux/dev/edr/results_sb_d22/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D22, centralized")
# with open("/home/nseydoux/dev/edr/results_sb_d3/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D3, centralized")
# with open("/home/nseydoux/dev/edr/results_sb_d3/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D3, decentralized")
# with open("/home/nseydoux/dev/edr/results_sb_d4/ded_delays_0_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D4, centralized")
#
# with open("/home/nseydoux/dev/edr/results_sb_d4/ded_delays_1_R1", "rb") as f:
# data.append(pickle.load(f))
# labels.append("D4, decentralized")
# ax_1 = plt.subplot(122, sharex=ax_0, sharey=ax_0)
plt.boxplot(data,0, '')
# plt.boxplot(data)
ax.set_ylabel('Delay (s)')
# ax.set_xlabel('Topologies and strategies')
ax.set_xticklabels(labels, fontsize=14)
# ax.set_xticklabels(labels, rotation=30, fontsize=8)
# ax.set_xticklabels(labels, fontsize=14)
ax.set_xticklabels(labels, rotation=30, fontsize=8)
plt.show()
......@@ -192,3 +192,30 @@ python3 simulator/generator.py -t simulator/iswc/sb_d4.json -o simulator/coopis/
# python3 simulator/generator.py -t simulator/coopis/distribution_distributed/distribution_3.json -o simulator/coopis/distribution_rpi23sb_3_cdp -c cdp
# python3 simulator/generator.py -t simulator/coopis/distribution_distributed/distribution_3.json -o simulator/coopis/distribution_rpi23sb_3_cip -c cip
# python3 simulator/generator.py -t simulator/coopis/distribution_distributed/distribution_3.json -o simulator/coopis/distribution_rpi23sb_3_adp -c adp
#########
# echo "ITL distribution"
# python3 simulator/generator.py -t simulator/itl/itl-topology-d1.json -o simulator/itl/itl_d1_cdr -c cdr
# python3 simulator/generator.py -t simulator/itl/itl-topology-d1.json -o simulator/itl/itl_d1_cir -c cir
# python3 simulator/generator.py -t simulator/itl/itl-topology-d1.json -o simulator/itl/itl_d1_cdp -c cdp
# python3 simulator/generator.py -t simulator/itl/itl-topology-d1.json -o simulator/itl/itl_d1_cip -c cip
# python3 simulator/generator.py -t simulator/itl/itl-topology-d1.json -o simulator/itl/itl_d1_adp -c adp
#
# python3 simulator/generator.py -t simulator/itl/itl-topology-d2.json -o simulator/itl/itl_d2_cdr -c cdr
# python3 simulator/generator.py -t simulator/itl/itl-topology-d2.json -o simulator/itl/itl_d2_cir -c cir
# python3 simulator/generator.py -t simulator/itl/itl-topology-d2.json -o simulator/itl/itl_d2_cdp -c cdp
# python3 simulator/generator.py -t simulator/itl/itl-topology-d2.json -o simulator/itl/itl_d2_cip -c cip
# python3 simulator/generator.py -t simulator/itl/itl-topology-d2.json -o simulator/itl/itl_d2_adp -c adp
#
# python3 simulator/generator.py -t simulator/itl/itl-topology-d3.json -o simulator/itl/itl_d3_cdr -c cdr
# python3 simulator/generator.py -t simulator/itl/itl-topology-d3.json -o simulator/itl/itl_d3_cir -c cir
# python3 simulator/generator.py -t simulator/itl/itl-topology-d3.json -o simulator/itl/itl_d3_cdp -c cdp
# python3 simulator/generator.py -t simulator/itl/itl-topology-d3.json -o simulator/itl/itl_d3_cip -c cip
# python3 simulator/generator.py -t simulator/itl/itl-topology-d3.json -o simulator/itl/itl_d3_adp -c adp
#
# python3 simulator/generator.py -t simulator/itl/itl-topology-d4.json -o simulator/itl/itl_d4_cdr -c cdr
# python3 simulator/generator.py -t simulator/itl/itl-topology-d4.json -o simulator/itl/itl_d4_cir -c cir
# python3 simulator/generator.py -t simulator/itl/itl-topology-d4.json -o simulator/itl/itl_d4_cdp -c cdp
# python3 simulator/generator.py -t simulator/itl/itl-topology-d4.json -o simulator/itl/itl_d4_cip -c cip
# python3 simulator/generator.py -t simulator/itl/itl-topology-d4.json -o simulator/itl/itl_d4_adp -c adp
......@@ -109,7 +109,7 @@ for room in rooms:
####################### WAITING FOR NODES TO START...
time.sleep(2*len(processes))
time.sleep(45)
####################### RESTORING SENSOR NAMES...
os.chdir("../")
sensors = glob.glob(topo_folder+'ensor*.json')
......
......@@ -4,6 +4,7 @@ from rdflib.graph import Graph
import sys
import dateutil.parser
import datetime
import pytz
import glob
import json
import numpy as np
......@@ -54,15 +55,15 @@ def compute_delay(graph):
PREFIX edr: <http://w3id.org/laas-iot/edr#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX san: <http://www.irit.fr/recherches/MELODI/ontologies/SAN#>
SELECT ?ded ?obstimestamp ?dedtime ?rule ?node ?obs
SELECT ?ded ?obstimestamp ?dedtime ?rule ?node ?obs ?dedAppTimestamp
WHERE {
?ded edr:deducedAt ?dedtime;
edr:deducedWith ?rule;
edr:deducedBy ?node;
edr:receivedAt ?dedAppTimestamp;
edr:deducedFrom ?obs.
?obs a ssn:Observation ;
edr:receivedAt ?obstimestamp.
#?obstime <http://www.irit.fr/recherches/MELODI/ontologies/IoT-O#hasTimeStamp> ?obstimestamp.
}
""")
print("Graph queried, analyzing results")
......@@ -75,9 +76,10 @@ def compute_delay(graph):
rules[rule] = {}
deduction_uri = row[0]
deduction_time = dateutil.parser.parse(row[2])
deduction_received = dateutil.parser.parse(row[6])
last_symptom = dateutil.parser.parse(row[1])
if not(deduction_uri in rules[rule]):
rules[rule][deduction_uri] = {"deduction_time":deduction_time, "last_symptom":last_symptom, "node":node, "obs_uri":str(obs_uri)}
rules[rule][deduction_uri] = {"deduction_received":deduction_received, "deduction_time":deduction_time, "last_symptom":last_symptom, "node":node, "obs_uri":str(obs_uri)}
else:
if last_symptom > rules[rule][deduction_uri]["last_symptom"]:
rules[rule][deduction_uri]["last_symptom"] = last_symptom
......@@ -86,7 +88,7 @@ def compute_delay(graph):
# Computation of the delays
for rule in rules:
for deduction in rules[rule]:
delay = (rules[rule][deduction]["deduction_time"]-rules[rule][deduction]["last_symptom"]).total_seconds()
delay = (rules[rule][deduction]["deduction_received"]-rules[rule][deduction]["last_symptom"]).total_seconds()
rules[rule][deduction]["delay"]=delay
return rules
......@@ -166,10 +168,18 @@ def summarize_journey(journey, deduction, rule):
summary["creation"] = event["time"]
summary["idle"] = (dateutil.parser.parse(journey[i+1]["time"]) - dateutil.parser.parse(event["time"])).total_seconds()
# If the deducer sent the data, it is processed elsewhere
if event["event"] == "Sending data" and event["node"] != deduction["node"]:
if event["event"] == "Sending data":
#if event["node"] != deduction["node"]:
for j in range(len(journey[i:])):
if journey[j]["event"] == "Received observation" and journey[j]["node"] == event["target"]:
summary["transit"] += (dateutil.parser.parse(journey[j]["time"]) - dateutil.parser.parse(event["time"])).total_seconds()
break
else:
# The application does not log the reception event
naive_deduction_received = deduction["deduction_received"].replace(tzinfo=None)
day_agnostic_deduction = dateutil.parser.parse(str(naive_deduction_received.time()))
event_time = dateutil.parser.parse(event["time"])
summary["transit"] += (day_agnostic_deduction - dateutil.parser.parse(event["time"])).total_seconds()
if event["event"] == "Received observation":
summary["idle"] += (dateutil.parser.parse(journey[i+1]["time"]) - dateutil.parser.parse(event["time"])).total_seconds()
if event["event"] == "Reasoning starts":
......@@ -310,7 +320,11 @@ def histogram_journeys(journeys_list, folder):
for journey in journeys:
if "delay" in journey and journey["delay"] > 0 and journey["delay"]<7000:
ded_delay.append(journey["delay"])
plot_histogram_kde(method, ax_n, ded_delay, 75)
if len(ded_delay) == 0:
print("For "+method+", a list of delays is empty")
print(journeys)
else:
plot_histogram_kde(method, ax_n, ded_delay, 75)
with open(folder+"/journ_delays_"+method, "wb") as f:
pickle.dump(ded_delay, f)
index += 1
......@@ -519,7 +533,7 @@ if args.adp != None or args.cir != None or args.cdp != None or args.cip != None
with open(args.output+"/delays_{0}.pkl".format(method), "wb") as f:
pickle.dump(delay, f)
with open(args.output+"/messages_{0}.txt".format(method), "w") as f:
f.write(str(count_messages(trace))
f.write(str(count_messages(trace)))
del(trace)
del(graph)
del(delay)
......
{
"name": "building-notimediff",
"centralized": true,
"layers": {
"type": "building",
"count": 1,
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature_request",
"count": 8,
"cycleDuration": 2000
}, {
"type": "floor",
"count": 2,
"host": "http://140.93.48.5",
"feature": "self",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "luminosity",
"count": 4,
"cycleDuration": 2000
}, {
"type": "gallery",
"count": 1,
"feature": "self",
"host": "http://140.93.48.5",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature",
"count": 2,
"cycleDuration": 2000
}, {
"type": "room",
"count": 2,
"feature": "self",
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "power_production",
"count": 1,
"cycleDuration": 2000
}]
}]
},{
"type": "gallery",
"count": 1,
"feature": "self",
"host": "http://140.93.48.5",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature",
"count": 2,
"cycleDuration": 2000
}, {
"type": "room",
"count": 1,
"feature": "self",
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "power_production",
"count": 1,
"cycleDuration": 2000
}]
},{
"type": "room",
"count": 1,
"feature": "self",
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "power_production",
"count": 1,
"cycleDuration": 2000
}]
}]
}]
}]
}
}
{
"name": "building-notimediff",
"centralized": true,
"layers": {
"type": "building",
"count": 1,
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "floor",
"count": 2,
"host": "http://140.93.48.5",
"feature": "self",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature_request",
"count": 4,
"cycleDuration": 2000
},{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "luminosity",
"count": 4,
"cycleDuration": 2000
}, {
"type": "gallery",
"count": 1,
"feature": "self",
"host": "http://140.93.48.5",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature",
"count": 2,
"cycleDuration": 2000
}, {
"type": "room",
"count": 2,
"feature": "self",
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "power_production",
"count": 1,
"cycleDuration": 2000
}]
}]
},{
"type": "gallery",
"count": 1,
"feature": "self",
"host": "http://140.93.48.5",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature",
"count": 2,
"cycleDuration": 2000
}, {
"type": "room",
"count": 1,
"feature": "self",
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "power_production",
"count": 1,
"cycleDuration": 2000
}]
},{
"type": "room",
"count": 1,
"feature": "self",
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "power_production",
"count": 1,
"cycleDuration": 2000
}]
}]
}]
}]
}
}
{
"name": "building-notimediff",
"centralized": true,
"layers": {
"type": "building",
"count": 1,
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "floor",
"count": 2,
"host": "http://140.93.48.5",
"feature": "self",
"concentrates": [{
"type": "gallery",
"count": 1,
"feature": "self",
"host": "http://140.93.48.5",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature_request",
"count": 2,
"cycleDuration": 2000
},{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "luminosity",
"count": 2,
"cycleDuration": 2000
},{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "temperature",
"count": 2,
"cycleDuration": 2000
}, {
"type": "room",
"count": 2,
"feature": "self",
"host": "http://syndream.laas.fr",
"concentrates": [{
"type": "sensor",
"host": "http://syndream.laas.fr",
"measures": "power_production",
<