SlideShare a Scribd company logo
1 of 28
!
1
@BorisAdryan - April 2014
Data Storage & Visualisation in the Internet of Things
Node-RED Interoperability Test
!
Summary
A signiļ¬cant proportion of developments in the Internet of Things (IoT) is driven by non-technical innovators and ambitious hobbyists.

Node-RED targets this audience and oļ¬€ers a widely used rapid prototyping platform for IoT data plumbing on the basis of JavaScript.

Data platforms for the IoT provide storage facilities and value in the form of visualisation & analytics to business and end users alike.

This report details how Node-RED connects to 11 diļ¬€erent platforms and what additional services these provide.

2
carriots
Emoncms
Evrythng
eyehub
exosite
Geras
opensensors.IO
Tinamous
Thinkspeak
ubidots
xively
Ease-of-use
with Node-RED
Documentation
of API and I/O
Functionality
Visualisation
&
Analytics
Introduction
One signiļ¬cant advantage of the Internet of Things is the worldwide availability of oneā€™s thingsā€™ data. That is, no matter where you are and
where your thing is, if youā€™re both connected to the internet, you can learn from it. Whatever your thing is, in many cases you can learn some
sort of numerical data from it: Let it be a temperature, energy consumption or cups of coļ¬€ee left.

Humans are visual animals and most people prefer to see their numbers in
a historical context. For any value we see, we implicitly compare it: Is it low? Is
it high? Is it higher on average than four weeks ago? Seeing the temporal
development of your data in a graph is often essential to making sense of it and
to informed decision making. Even the famous statistician John Tukey promoted
the thought of explorative data analysis before embarking on more sophisticated
analyses.

So what options are there? When we installed an internet-connected freezer,
we followed a recommendation for the matplotlib framework in Python to create
a graph. While it is totally possible to make powerful visualisations in this or
other scripting languages and make those available on the internet, without a lot
of coding they are static images and donā€™t oļ¬€er any interactivity.

This is where colourful names such as Carriots, Emoncms, Evrythng, Eyehub,
Exosite, Geras, Opensensors, Tinamous, Thinkspeak, Ubibots or Xively
come into play. The alternative to coding your own graphing solution for sensor
data is using an IoT platform (sometimes referred to as hub or silo) that takes data from you, stores it in the cloud, and provides interactive
display and ideally analysis of your information. This user experience is one of the key diļ¬€erences between the IoT and human interaction in
comparison to machine-to-machine (M2M) applications, as the graphical representation and interactivity is irrelevant for the latter.

!
3
A graph generated with matplotlib in Python.
!
The Node-RED Interoperability Test
We have chosen Node-RED (http://nodered.org) as our perceived game changer for many IoT developments that are not driven by
programmers and engineers. In the most simple terms, Node-RED is a graphical user interface that allows the creation of workļ¬‚ows for IoT
data plumbing. By connecting simple components with deļ¬ned functionality (the ā€œnodesā€), it is possibly to write applications that take data
from one source (e.g. a sensor, a website, a Twitter account) and publish or act on this information in many cases without any programming.

If programming should be necessary, Node-RED fully builds on node.js and allows the incorporation of JavaScript code. As such it is very
accessible even for innovators with limited previous programming experience. While Node-RED can be installed on any computer system that
supports node.js, it has been developed particularly with the Raspberry Pi in mind. This implies that a large proportion of Node-RED users
may have only a superļ¬cial understanding of web technologies - a potential constraint for grass roots IoT development. 

4
Here we are trying to see how IoT platforms facilitate access to their services, in what form they are provided and how much support they are
oļ¬€ering. We chose a common scenario of Raspberry Pi usage: The AirPi weather station is a hardware shield for the GPIO, whose default
software stores and shows weather data on Xively (formerly also known as Cosm/Pachube, an originally free service that supported the
AirPi.es project). It is not unreasonable to assume that it reļ¬‚ects what many hobby users consider ā€œtheir IoTā€.

The IoT platform market has grown enormously over the past few months and there are now more than a dozen players round (many of which
are included in our test), and there is possibly an even bigger number of services that are exclusively advertised and available to paying
customers (e.g. ThingWorx or Gemalto). What are their unique selling points? Most of these platforms have their own niche and follow
diļ¬€erent conceptual models. So which one should you use? Which one is easy to use with Node-RED? And what sort of visualisation and
analytics do they oļ¬€er?

In this review, weā€™re trying to compare the platforms for one particular use case: Which IoT platform works best with weather data
served from a Raspberry Pi AirPi shield using the Node-RED workļ¬‚ow we had published earlier?
!
Technical Background
Node-RED supports a range of input options. For interactions with the AirPi shield, we are using a modiļ¬ed version of their Python scripts that
broadcasts the measurements via UDP. The Node-RED workļ¬‚ow monitors the incoming traļ¬ƒc and can restart the Raspberry Pi if no
measurements have been received for several minutes, or by default restarts the system once a night. The workļ¬‚ow also coordinates the
setup of the Python scripts.

Node-RED can communicate with the outside world using TCP, UDP, HTTP, MQTT and can provide sockets. Some of the platforms we are
looking at support MQTT (http://mqtt.org), a simple and uniļ¬ed Message Queue Telemetry Transport protocol that has been developed with
IoT applications in mind. Others provide RESTful APIs that can be used with HTTP requests. These are more ļ¬‚exible and some APIs even
allow powerful manipulations of the data structures, at the cost of solution-speciļ¬c modiļ¬cations to HTTP header structure and message
body.

5
!
!
The Platforms
We have accounts and login details for the services listed above. These range from hobby projects to commercial IoT products of companies
with a large portfolio of IT solutions. We further looked at onion.io and ThingWorx. Unfortunately we were unable to include onion.io into our
test as it currently requires a library for the Arduino; a forum post indicates C/Python libraries for the Raspberry Pi are under development but
we couldnā€™t ļ¬nd any REST API. We had contact with ThingWorx and Gemalto, who both frequently sport powerfully looking dashboards at IoT
conferences, but despite verbal agreements from representatives and various emails we were unable to obtain access to these sites.

6
Ease-of-use
with Node-RED
Documentation
of API and I/O
Functionality
Visualisation
&
Analytics
carriots
Emoncms
Evrythng
eyehub
exosite
Geras
opensensors.IO
Tinamous
Thinkspeak
ubidots
xively
Money Talks
There is no free lunch. Most if not all IoT platform providers would like to make a living through their services. However, while commercial
usage of some can cost you a signiļ¬cant amount of money, developers and hobbyists can usually get away with free accounts.

!
Note that the terms and conditions of your free account may change, and that undocumented limits may exist for non-paying customers. 

The reasonable limitations on API calls per minute for some of the platforms has implications for our test scenario. While our AirPi outputs
data from two diļ¬€erent temperature sensors, barometric pressure, humidity, light level, volume, and relative CO and NO2 levels every 15
seconds (i.e. 4x 8 = 32 measurements per minute), for those platforms we aggregate the measurements for the submission in a single API call.

CARRIOTS free, limits on number of devices and incoming connections
EMONCMS free, but asking for donations and a reasonable post rate limit (5-10sec)
EVRYTHNG free for developers
EYEHUB free for developers
EXOSITE free for developers, limited on number of devices and users
GERAS free for developers
OPENSENSORS.IO free by agreeing to share the measurements with the public
TINAMOUS free, limits on number of devices and users
THINKSPEAK free, ā€œa rate limit of an update per channel every 15 secondsā€
UBIDOTS free, 30,000 ā€œdotsā€ included (could be data transmissions, triggered emails, etc.)
XIVELY free for developers, limited to 25 API calls per minute
7
Architectural Differences & Security
How is the measurement of the physical device represented? There are two extremes that we are brieļ¬‚y discussing:

We have seen the most device-agnostic and generally applicable data model at 1248.ioā€™s Geras platform, where each sensor can be
considered the ļ¬nal node in a directory structure and the measurements can be published via MQTT as time-dependent entries to, for
example, /instrument/sensor or any other logical path. The Geras web interface allows the aggregation of path elements and it is possible to
gain an overview of all instruments or all sensors by browsing to the appropriate level in the hierarchy.

This simplicity has advantages and disadvantages. While the directory structure is established ad hoc simply by posting to a directory entry
(so writing a value to /AirPi/humidity creates both the instrument and the sensor on Geras if they havenā€™t existed before), there is no policy for
the granularity of directory structure. It is entirely feasible to maintain /AirPi/humidity and a diļ¬€erent device /weather/AirPi/humidity at the
same time, with all the implications for redundancy and fragmentation.

The opposite is true for platforms with a complex device model. In
these cases, measurements are tied to sensors, which are mounted on
devices, based at locations, maintained by device owners in a detailed
network of relationships. Often the devices have then to be explicitly
created before Node-RED can write to them via MQTT or RESTful
APIs. This can either be done using diļ¬€erent sets of API commands via
HTTP requests, or directly on the web sites of the IoT platform.

In most cases Node-RED users can get away with just one password
(API key or device key), but there are notable exceptions where
privileges are ļ¬ne-grained and manipulations require diļ¬€erent keys that
are accessible through the platformsā€™ user settings.

8
The data model behind the Eyehub API.
Our Node-RED Test Flow
9
We receive data from the AirPi Python scripts via recUDP. The splitMessage node separates our measurements into {topic: sensor name,
payload: measurement} pairs. These are then published by reformatting them for RESTful API calls (via feedXXX function and http request
nodes) or by by adding path information for MQTT transmission. Depending on the platform, collectMessages nodes prepare data for bulk
transmission.

The ļ¬‚ow components in the upper right (TheServer) prepare data for display on an internal website and those in the lower left (onStartup) are
for general system maintenance.

!
Documentation and Ease-of-Use with Node-RED
We believe that the majority of Node-RED users are not necessarily experienced web developers. While it is clear that the IoT platforms
require some sort of authentication to allow users access and some sort of address system to assign a measured value to a sensor, there are
many ways how this information can be transmitted. The exact How-to should be described in a short and concise documentation. In the
following, sections, we describe our tour-de-force of connecting Node-RED with the various platforms.

While MQTT transmissions are standardised, there are three possible entry points for transmitting information as part of a HTTP request:

1. as part of the URL, as exempliļ¬ed in the EmonCMS or Thingspeak transmission, where password, sensor name and measurement are
part of the very internet address.

2. as part of the HTTP header, as seen in the majority of platforms for authentication purposes.

3. as part of the HTTP body, where we should point out that some but not all platforms insist in the deļ¬nition of the Content-Length
parameter in the header, as otherwise contents of the body are not correctly transmitted - this seemed to be highly platform speciļ¬c.

!
10
Another issue that we discovered as potentially tedious is how our sensors names are represented on the various platforms. While the
majority of platforms allowed the use of our actual sensor name, Tinamous, Thingspeak and Ubidots require a mapping to their ļ¬eld identiļ¬ers
(either broadly called ļ¬eld0..ļ¬eld8, or variable IDs in the case of Ubidots).

The precise notation of the sensor reads is also surprisingly diverse. Most platforms adhere to some sort of JSON format
{ā€œsensorā€:ā€measurementā€}, but virtually any deviation from this pattern such as { [{sensor = ā€œmeasurementā€ }] } etc seems to exist. We also
identiļ¬ed a case with Tinamous where node.js JSON.stringify produced a correctly looking string, but the platform would only accept the
input when we constructed the string manually. 

The following list summarises the code we have used for data transfer out of Node-RED. This is best understood in reference to the ļ¬gure on
page 9.

!
11
CARRIOTS. The control panel of Carriots is a complex beast. Their API documentation is openly accessible at
https://www.carriots.com/documentation and it took us a while to ļ¬gure out what exactly is needed to create
our device (the AirPi) and its sensors (here called Data streams).

The API key is available in your user control panel. We created our device manually on the website, but the
data streams are created dynamically on the basis of the data object, which is a JSON construct with sensor
name and measurement.

!
In the feedCarriots function node:
msg.url = "http://api.carriots.com/streams";
!
var stuff = "{ "+msg.topic+" : ""+msg.payload+""}";
msg.payload = JSON.stringify({
protocol: "v1",
at: "now",
device: "AirPi@adryan.adryan",
data: stuff
});
!
var alength = msg.payload.length;
!
msg.headers = {
'User-Agent' : 'AirPi@adryan.adryan',
'Content-Type' : 'application/json',
'carriots.apikey' : '9ce9e9cXXXXXXXXXXXXXXXXXXXX0923720be050ee3d0bd0023dacf14716fb869',
'Content-Length' : alength
}
!
msg.method = "POST";
!
return msg;
!
12
EMONCMS. Emoncms is an open-source energy management software that provides features that are useful in a
wider range of IoT application. The open documentation is extensive, but also details (for us unnecessary details)
building the Emoncms for your own server and such. Finding the relevant API information was a challenge, but
fortunately, feeding data into their platform is not: A JSON object as part of the URL generates the sensor ļ¬eld in
the database and populates it.

Your API key is available in your user settings at http://emoncms.org/user/view.

In the feedEmonCMS function node:
msg.url = ā€œhttp://emoncms.org/input/post.json? json={ā€œ+msg.topic+":"+msg.payload+"} &apikey=27bb0faeXXXXXXXXXXXXXXXc387c5bb3ā€;
return msg;
!
!
EVRYTHNG. The Evrythng Developer Resources (https://dev.evrythng.com/documentation) give well-structured
insight into architecture of the platform, where the most important component are your THNGs, which can have
properties (i.e. your sensor measurements). Evrythng is not necessarily built with hobbyist users in mind and there
are plenty of API functions for product management and the like that we didnā€™t need.

THNGs can be created through the API or on the website, but this needs to happen before populating them with
properties. Importantly, properties are created for your THNG on the ļ¬‚y while you submit data to them.

Your API end point contains a unique ID (the THNG ID), and authorisation requires a token, which is available from your account at https://
dev.evrythng.com/account/token.
!
In the feedEVRYTHNG function node:
msg.url = "https://api.evrythng.com/thngs/534XXXXXXXXXXXXXXXf821d7/properties";
13
!
msg.payload = "[{ "key" : ""+msg.topic+"", "value" : ""+msg.payload+""}]";
!
var alength = msg.payload.length;
!
msg.headers = {
'Content-Type' : 'application/json',
'Authorization' : 'tuyvvWMboGc3AxNAxjj4GPEORuYpRro1t1dunI0QxN7m6XXXXXXXXXXXXXXXXXXXXlPNdngo9ukMaA',
'Content-Length' : alength
}
!
msg.method = "POST";
!
return msg;
!
!
EYEHUB. Eyehub is by far the most complex system we have included in this test (the exemplary ļ¬gure on page 8
is from their API documentation, which is more than 150 pages long). Eyehub operates a public section on Github,
but access to the system requires an invitation.

It took us a while on their web tool https://hub.ļ¬‚exeye.com to ļ¬nd the appropriate entry point: We manually created
a Device Manager (AirPi_DM), to which we then assigned our AirPi as Device (automatically receiving a Device ID,
here: Device_1997, thatā€™s required for the API call), and the Sub Devices (our sensors - which we named according
to the incoming topic). The documentation describes how to create Manager and Devices via the API, but we needed the visual context of the
website to understand this logic.

As for the authentication password that is required in the HTTP header: We remember itā€™s base64 encoded, but we canā€™t remember how and
where we retrieved it. That much for complexity!

14
!
In the feedEyehub function node:
msg.url = ā€œhttps://hub.ļ¬‚exeye.com/v1/iot_Default/dms/AirPi_DM/devices/Device_1997/subDevices/"+msg.topic+"/events";
!
msg.payload = JSON.stringify({"payload": msg.payload, "type": 1.0});
!
var alength = msg.payload.length;
!
msg.headers = {
'Authorization' : 'Basic YmFkcnlhXXXXXXXXXX3MjFxYXo=',
'Content-Type' : 'application/json',
'Content-Length' : alength
};
!
msg.method = "POST";
!
return msg;
!
!
!
EXOSITE. Exosite maintains public API documentation on Github. Itā€™s not extremely well structured, but https://github.com/exosite/docs
contains a short straightforward description how to post data points to their platform.

Devices are created on the website (the dialogue also mentions your device identiļ¬er CIK, which is needed for
authentication). Sensors were created on the ļ¬‚y while posting data to them.

In the feedExosite function node:
msg.url = "http://m2.exosite.com/onep:v1/stack/alias";
!
msg.payload = msg.topic+"="+msg.payload;
15
!
var alength = msg.payload.length;
!
msg.headers = {
'X-Exosite-CIK': 'ac1696XXXXXXXXXXXXXXXXXXXXbbdebd657b799f',
'Content-Type' : 'application/x-www-form-urlencoded; charset=utf-8',
'Accept' : 'application/xhtml+xml',
'Content-Length' : alength
};
!
msg.method = "POST";
!
return msg;
!
GERAS. 1248.io have a fairly concise API for communication with Geras. Unfortunately, one has to be registered to
gain access to the documentation. However, most of their examples are then easy to use, as in fact all user
credentials in the examples are adjusted to the current user. Publishing data via MQTT is encouraged, using their
geras.1248.io server on port 1883 and using the data channel (e.g. ā€œ/AirPi/Temperatureā€) as topic in the Node-RED
MQTT node, and your personal key as user name. It is worth mentioning that once a data channel is present in the
database, one can automatically generate JSON code for import into Node-RED for future applications.

In the addPath function node:
msg.topic = "/AirPi/"+msg.topic;
msg.payload = msg.payload;
!
return msg;
!
MQTT settings:
!
Broker: geras.1248.io
16
Port: 1883
Username: your Master API key from http://geras.1248.io/user/settings
!!!
OPENSENSORS.IO The Opensensors.IO project is currently in pre-beta and access is by invitation only. Their ā€œGetting Startedā€ guide is a
simple description of the MQTT interface and help is provided mostly in form of the command line parameters one
would use with mosquitto. Topic names take the form of yourusername/devicename/sensorname. In contrast to the
other platforms that support MQTT in our test, Opensensors.IO make use of the client ID to authorise connections.
Care has to be taken when creating a new device in the account settings: Your device password will be displayed
once, and only once, when that device is created. If you miss taking note of it, you will have to create the device
again. From within the device, one has to create the topic for each sensor manually before submitting data to it.

!
In the addPath node:
msg.topic = "boris/AirPi2.0/"+msg.topic;
msg.payload = msg.payload;
!
return msg;
!
MQTT settings:
!
Broker: opensensors.io
Port: 1883
Client ID: YOUR DEVICE CLIENT ID
Username: YOUR LOGIN/USER NAME
Password: YOUR DEVICE PASSWORD
!
!
!
17
TINAMOUS. Tinamous haven an open API documentation at https://tinamous.com/ApiDocs. Submitting
measurements is easy, provided that one has deļ¬ned a device and appropriate data ļ¬elds. This is possible via the
API, but we found the GUI at http://yourusername.tinamous.com more convenient when ļ¬rst getting to grips with
this platform. The data ļ¬elds are labelled Field1..12, and we perceive this as a potential limitation for some users
with more sensors on their device. While it is possible to submit one sensor reading at the time, this has to be
done through the concept of ā€œchannelsā€, something which we found not extensively documented and therefore
resorted to collating measurements before invoking the API. Tinamous oļ¬€er a wizard on their website that
generates the http request header including the authorisation token.

In the collateMessages node:
var ļ¬eld = "";
switch(msg.topic) {
case "BMPTemperature":
ļ¬eld = "Field1";
break;
case "DHTTemperature":
ļ¬eld = "Field2";
break;
ā€¦
context.buff = context.buff || "";
context.count = context.count || 0;
!
if (msg.topic != "purge") {
if (context.buff.length > 0) {
context.buff = context.buff+", ""+ļ¬eld+"":""+msg.payload+""";
} else {
context.buff = """+ļ¬eld+"":""+msg.payload+""";
}
context.count += 1;
}
if (context.count == 8 || (msg.payload=="purge" && context.count >= 1)) {
msg.topic="";
msg.payload = context.buff;
18
context.buff = "";
context.count = 0;
return msg;
}
return null;
!
And in the feedTinamous call node:
msg.url = "https://adryan.Tinamous.com/api/v1/Measurements";
msg.payload = "{"Channel": 0,"+msg.payload+","Lite": false}";
!
var alength = msg.payload.length;
!
msg.headers = {
'Content-Type' : 'application/json',
'Authorization' : 'Basic QWlyXXXXXXXXXXJlcnJ5',
'Content-Length' : alength
}
!
msg.method = "POST";
!
return msg;
!!
THINGSPEAK. Thingspeak channels are documented openly at https://thingspeak.com/docs/channels#channels. We
created our AirPi on their website, where we also added the diļ¬€erent sensors. These got assigned data ļ¬elds
ļ¬eld1..8, a name which has to be used through the API. The Channel View also provides access to the API keys that
19
are needed to update or view the data. There are multiple places to learn about the API, and we found http://community.thingspeak.com/
documentation/api/ one of the better descriptions how to use the platform.

In the collateMessage node:
var ļ¬eld = "";
switch(msg.topic) {
case "BMPTemperature":
ļ¬eld = "ļ¬eld1";
break;
case "DHTTemperature":
ļ¬eld = "ļ¬eld2";
break;
ā€¦
}
!
context.buff = context.buff || "";
context.count = context.count || 0;
!
if (msg.topic != "purge") {
if (context.buff.length > 0) {
context.buff = context.buff+"&"+ļ¬eld+"="+msg.payload;
} else {
context.buff = ļ¬eld+"="+msg.payload;
}
context.count += 1;
}
if (context.count == 8 || (msg.payload=="purge" && context.count >= 1)) {
msg.topic="";
msg.payload = context.buff;
context.buff = "";
context.count = 0;
return msg;
}
return null;
20
!
In the API call node:
!
msg.url = "http://api.thingspeak.com/update?key=TUQOXXXXXXXXXXTZ2&"+msg.payload;
msg.method = "POST";
return msg;
!
UBIDOTS. Ubidots feature a Raspberry Pi on their home page and they have an extensive public documentation
section:Ā http://ubidots.com/docs. The documentation of their RESTful API is extensive and has many examples
that work directly from the command line.

Ubidots know a Data Source (our AirPi) and Variables (our sensors). The sensors need to be pre-deļ¬ned, either on
their website or through API commands that are submitted through HTTP POST calls. Each sensor is getting
assigned a 24 character variable ID, to which the POST requests have access if they know the authentication
token, which are managed at http://app.ubidots.com/userdata/api.

!
In the feedUbidots function node:
var varid = "";
switch(msg.topic) {
case "BMPTemperature":
varid = "5336c5acXXXXXXXb639aa9ba";
break;
case "DHTTemperature":
varid = "5336f998XXXXXXX2c45a81b4";
break;
ā€¦.
}
21
!
msg.url = "http://things.ubidots.com/api/v1.6/variables/"+varid+"/values";
msg.headers = {
'Content-Type' : 'application/json',
'X-Auth-Token' : 'fxh0fCSY6V82XXXXXXXXXXXXXXXngBvPZPByuCJiqWLdsAWiMzrhTQHjUtPF'
}
msg.payload = "{"value":"+msg.payload+"}";
msg.method = "POST";
!
return msg;
!


XIVELY. Xively operates a Developer Center (https://xively.com/dev), and once you choose a Development Device
(here: our AirPi), you can see the Device Key needed to deposit data in your ā€œdata channelsā€ (i.e. one channel per
type of measurement). Note that you need to create your channels manually (i.e. either using the website or the
API) before submitting any measurements - this is something that caused us some confusion in the beginning. The
API Documentation (https://xively.com/dev/docs/api) is very clear and has a few examples how the RESTful
communication toĀ  api.xively.comĀ  works. While it would be possible to create a JSON, XML or CSV object and
submit that via a Node-RED http request, the MQTT node can encapsulate the information and send it to /v2/feeds/YOUR FEED ID.csv to
api.xively.com on port 1883, using your device key as user name.

In the collectMessages function node:
context.buff = context.buff || "";
context.count = context.count || 0;
!
if (msg.topic != "purge") {
if (context.buff.length > 0) {
context.buff = context.buff+"n"+msg.topic+", "+msg.payload;
22
} else {
context.buff = msg.topic+", "+msg.payload;
}
context.count += 1;
}
if (context.count == 8 || (msg.payload=="purge" && context.count >= 1)) {
msg.topic="";
msg.payload = context.buff;
context.buff = "";
context.count = 0;
return msg;
}
return null;
!
In the MQTT settings:
Broker: api.xively.com
Port: 1883
Username: YOUR DEVICE API KEY
Topic: /v2/feeds/YOUR FEED ID.csv
!
23
Visualisation, Analytics & Functions
The primary motivator for our test was the search for a convenient platform for visualisation of IoT data. We further looked for useful tools to
analyse our data, or if that was not possible, what options we had to share our information with others or how to download whatever we
had stored. A systematic assessment is beyond the scope of this document, but we are trying to give our readers some insight into what is
currently in store for them. What we found most disappointing at this stage was the lack of meaningful data analytics on all of the IoT
platforms.

!
CARRIOTS. Carriots have an extensive Data Management section on their web interface at https://cpanel.carriots.com/data-management. We
were pleased to see a Data Export service that lets you download slices of your data in JSON, XML and CSV formats. A wizard allows the
conļ¬guration of a data stream that can post your data as a JSON object at a speciļ¬ed URL. Another wizard takes care of visualisation:
However, in our hands, it did not produce any useful output. We believe that the graphics API, which is documented at https://
www.carriots.com/documentation/graphs, may be your best bet for visualisation. We perceived this route as ā€˜too involvedā€™ for our quick test.

!
EMONCMS. It took us a moment to understand the logic behind the EmonCMS
Dashboard. In fact, close to giving up, we discovered that measurements need
to be translated into ā€œfeedsā€ (of which the conļ¬guration happens in the Input
arena). Those feeds might be your raw data, but also time averaged means or
your data where an arithmetic operation has been performed on the data are
available. Feeds can be downloaded for deļ¬ned intervals and time slices. Feeds
further provide the input for graphs, where EmonCMS oļ¬€ers a wide selection of
common types. Diļ¬€erent graphs and widgets can be arranged on a dashboard,
which can be shared with others.

24
EVRYTHNG. As in the case of their competitor Carriots, the power of Evrythng comes packaged in complex APIs that allow the creation of
attractive front-end applications or retrieving any of your data back. For the purposes of our test, we focussed on what we could get on
screen without much further development work. In your THNG section, a list of all properties (here: the sensors) is available. The click on any
of the properties brings up a vanilla graph with your sensor readings - this is a static display without any on-the-ļ¬‚y updates. These graphs can
be printed or downloaded in various graphic formats. We couldnā€™t see any option for sharing these images with the public.



EYEHUB. At this stage, Eyehub does not oļ¬€er any data retrieval or visualisation
through their web interface. We have been told that a D3.js based library for
custom-designed graphs is in development, but for now, without using the
really extensive API, the Eyehub looks more like a data one-way street.

!
EXOSITE. Exosite have a very intuitive way of creating Dashboards from your
data. They provide a wide selection of graphs, some of which can take more
than one measurement and lend themselves for comparing data. As with most
other sites, axis scaling is not a particular strength of Exosite and we missed
logarithmic scaling and better interactivity with the graphs. However, amongst
the blind, the deaf is king and therefore our criticism shouldnā€™t be taken to
harshly. It is easily possible to declare a dashboard as public and it can then be
viewed through a URL.

The Scripts section of Exosite is a possible entry point for exporting your data -
if you know how to write code in Lua.

!
25
GERAS. 1248.ioā€™s Geras provides a plain directory structure to navigate your
devices and sensors. On the device level, a tabular view with your sensor
names, a thumbnail with a graph of the past 12 hours and the current value are
displayed. This view also shows little Node-RED icons that link to code that one
can use for MQTT-based in- and output. Geras allows command line or
programmatic access to all stored data. This is simpliļ¬ed to an extent that a simple copy & paste to a terminal console retrieved all of our
temperature data. Clicking on a sensor calls up a larger graph. The graphical interface that is available for each sensor spits out a warning if
this would require more than 5k data points, but in principle any time frame can be deļ¬ned. Data can be shown as rolling averages or raw
measurements. Those graphs cannot be shared.

!
OPENSENSORS.IO do not provide any visualisation at the moment. Live data sharing is the key purpose of this platform at the moment, and
we understand it as a dispatcher of MQTT-based feeds for your data. Weā€™ve been told that super analytics goodness [...] including all the usual
real time charting is going to arrive at the end of May.

!
TINAMOUS. Tinamous wants to be understood as a Twitter for the IoT. Their
graphing solution reminded us much of Evrythng, in fact we believe that both
platforms use the same library with the same functionality (e.g. saving of
images). Unfortunately, the axis are pre-deļ¬ned and just focus on the past four
or so hours. Data retrieval seems possible through the API.

!
THINGSPEAK. Thingspeak have an intuitive interface that allows the creation
of live graphs and provides simple data export, either as ļ¬le export or an online
API. We were very pleased with a many options that are available for
customisation of the graphs: The number of past data points or a time frame
26
can be deļ¬ned for the temporal axis, and the unit axis can either adjust dynamically or be set to deļ¬ned min and max values. The settings for
each graph (column, bar, line) also allow to specify whether data is to be shown as raw value, as average, or have an arithmetic operation
applied to it. Creating dashboards with multiple of these graphs is easily possible, so is their sharing on the internet with a deļ¬ned URL.



UBIDOTS. Ubidots easily wins the prize for the most striking ā€˜on ļ¬rst sightā€™
display of our data. The status of our AirPi greets us with our recent readings
shown in large letters (unfortunately with a lack if sensible scaling in some
cases). The overall impression remains good, but we found the graphs that
are accessible through clicking on these sensor images slightly inļ¬‚exible.
There is no sensible scaling for the measurements, and zooming on the time
frame was a little bit hit and miss with the sliders that appear underneath the
graph. While the currently displayed data can be downloaded in CSV format
using the GUI, your best bet for large-scale retrieval of your information may
be the API.



XIVELY. Xively probably oļ¬€ers the most convenient way to graphically browse
through your data. The data can be viewed with varying temporal resolutions
of 5 min to 1 hour for raw data points, or with average values for longer
intervals of up to 3 months, and by navigating using the prominent left and
right buttons underneath the graphs. By default each of your feeds also has a
public URL for viewing the data, which is quite similar to your private view of
the data except it lacks API key information. Bulk download of historical data
is only possible through the API.
!
27
Concluding Remarks
With the notable exception of arithmetic operations on incoming data a few of the platforms (EmonCMS, Thingspeak) or multiple line graphs
and scatterplots in Ubidots, not a single platform could convince us in terms of analytics. We missed histograms, box plots or even
simple tables informing us of the basic descriptive statistics for our measurements. This is where all of them need to do better!

If you need graphs for your own website, Ubidots and Thingspeak provide you with iFrame code that one can simply use for plug & play.
Alternatively, Eyehub are promising D3.js based graphs for the near future, and Carriots also have examples in their API documentation how
to bring their graphical goodness to your website.

In cases where fancy dashboards are desirable, have a look at EmonCMS, Exosite and Ubidots.

When it comes to the simple display of numerical data, not a single platform could take home the cup. While we liked Xivelyā€™s way of
navigating through historical data, we were not happy with the lack of scaling that is essential when looking at sensor data which follows a
logarithmic scale. Also, we would have hoped for better outlier detection in all of the tools. We also quite liked Gerasā€™ tabular summary of data
including the thumbnail picture, or the quite interactive way that Thingspeak have with their widgets.

We were positively surprised that most platforms export historical data, although using an API to do so may not be everyoneā€™s taste.

!
Acknowledgements
Boris Adryan (@BorisAdryan) wishes to acknowledge the help of Dave Conway-Jones & Nick Oā€™Leary from the Node-RED team (@NodeRED),
as well as all platform providers that granted us free and sometimes early access to their services, and often free email support to resolve
administrative and technical issues. Further comments on this document came from Andy Stanford-Clark (@andysc), Christopher Mobberley
(@hardware_hacks) and Andrew Lindsay (@andrewdlindsay).
28

More Related Content

What's hot

Zops intelligent platform
Zops intelligent platformZops intelligent platform
Zops intelligent platformGokhan Boranalp
Ā 
Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...
Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...
Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...AI Frontiers
Ā 
LPC4300_two_cores
LPC4300_two_coresLPC4300_two_cores
LPC4300_two_coresMassimo Manca
Ā 
Introducing HPC with a Raspberry Pi Cluster
Introducing HPC with a Raspberry Pi ClusterIntroducing HPC with a Raspberry Pi Cluster
Introducing HPC with a Raspberry Pi Clusterinside-BigData.com
Ā 
FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote)
FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote) FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote)
FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote) Wim Vanderbauwhede
Ā 
Azure Digital Twins.pdf
Azure Digital Twins.pdfAzure Digital Twins.pdf
Azure Digital Twins.pdfTomasz Kopacz
Ā 
Versal Premium ACAP for Network and Cloud Acceleration
Versal Premium ACAP for Network and Cloud AccelerationVersal Premium ACAP for Network and Cloud Acceleration
Versal Premium ACAP for Network and Cloud Accelerationinside-BigData.com
Ā 

What's hot (7)

Zops intelligent platform
Zops intelligent platformZops intelligent platform
Zops intelligent platform
Ā 
Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...
Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...
Kevin Shaw at AI Frontiers: AI on the Edge: Bringing Intelligence to Small De...
Ā 
LPC4300_two_cores
LPC4300_two_coresLPC4300_two_cores
LPC4300_two_cores
Ā 
Introducing HPC with a Raspberry Pi Cluster
Introducing HPC with a Raspberry Pi ClusterIntroducing HPC with a Raspberry Pi Cluster
Introducing HPC with a Raspberry Pi Cluster
Ā 
FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote)
FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote) FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote)
FPGAs as Components in Heterogeneous HPC Systems (paraFPGA 2015 keynote)
Ā 
Azure Digital Twins.pdf
Azure Digital Twins.pdfAzure Digital Twins.pdf
Azure Digital Twins.pdf
Ā 
Versal Premium ACAP for Network and Cloud Acceleration
Versal Premium ACAP for Network and Cloud AccelerationVersal Premium ACAP for Network and Cloud Acceleration
Versal Premium ACAP for Network and Cloud Acceleration
Ā 

Viewers also liked

An introduction to workflow-based programming with Node-RED
An introduction to workflow-based programming with Node-REDAn introduction to workflow-based programming with Node-RED
An introduction to workflow-based programming with Node-REDBoris Adryan
Ā 
Using Node-RED for building IoT workflows
Using Node-RED for building IoT workflowsUsing Node-RED for building IoT workflows
Using Node-RED for building IoT workflowsAniruddha Chakrabarti
Ā 
Web of Things (wiring web objects with Node-RED)
Web of Things (wiring web objects with Node-RED)Web of Things (wiring web objects with Node-RED)
Web of Things (wiring web objects with Node-RED)Francesco Collova'
Ā 
Flow Base Programming with Node-RED and Functional Reactive Programming with ...
Flow Base Programming with Node-RED and Functional Reactive Programming with ...Flow Base Programming with Node-RED and Functional Reactive Programming with ...
Flow Base Programming with Node-RED and Functional Reactive Programming with ...Sven Beauprez
Ā 
IBM Bluemix Demo with Anki Overdrive Cars
IBM Bluemix Demo with Anki Overdrive CarsIBM Bluemix Demo with Anki Overdrive Cars
IBM Bluemix Demo with Anki Overdrive CarsNiklas Heidloff
Ā 
Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14
Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14
Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14Boris Adryan
Ā 
IoT ( M2M) - Big Data - Analytics: Emulation and Demonstration
IoT ( M2M) - Big Data - Analytics: Emulation and DemonstrationIoT ( M2M) - Big Data - Analytics: Emulation and Demonstration
IoT ( M2M) - Big Data - Analytics: Emulation and DemonstrationCHAKER ALLAOUI
Ā 
02 Raspberry Pi GPIO Interface on Node-RED (Some correction)
02 Raspberry Pi GPIO Interface on Node-RED (Some correction)02 Raspberry Pi GPIO Interface on Node-RED (Some correction)
02 Raspberry Pi GPIO Interface on Node-RED (Some correction)Mr.Nukoon Phimsen
Ā 

Viewers also liked (10)

An introduction to workflow-based programming with Node-RED
An introduction to workflow-based programming with Node-REDAn introduction to workflow-based programming with Node-RED
An introduction to workflow-based programming with Node-RED
Ā 
01 Node-RED Basic
01 Node-RED Basic01 Node-RED Basic
01 Node-RED Basic
Ā 
Using Node-RED for building IoT workflows
Using Node-RED for building IoT workflowsUsing Node-RED for building IoT workflows
Using Node-RED for building IoT workflows
Ā 
Web of Things (wiring web objects with Node-RED)
Web of Things (wiring web objects with Node-RED)Web of Things (wiring web objects with Node-RED)
Web of Things (wiring web objects with Node-RED)
Ā 
Flow Base Programming with Node-RED and Functional Reactive Programming with ...
Flow Base Programming with Node-RED and Functional Reactive Programming with ...Flow Base Programming with Node-RED and Functional Reactive Programming with ...
Flow Base Programming with Node-RED and Functional Reactive Programming with ...
Ā 
IBM Bluemix Demo with Anki Overdrive Cars
IBM Bluemix Demo with Anki Overdrive CarsIBM Bluemix Demo with Anki Overdrive Cars
IBM Bluemix Demo with Anki Overdrive Cars
Ā 
Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14
Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14
Wiring the Internet of Things with Node-RED, @IoTConf talk, September '14
Ā 
IoT ( M2M) - Big Data - Analytics: Emulation and Demonstration
IoT ( M2M) - Big Data - Analytics: Emulation and DemonstrationIoT ( M2M) - Big Data - Analytics: Emulation and Demonstration
IoT ( M2M) - Big Data - Analytics: Emulation and Demonstration
Ā 
02 Raspberry Pi GPIO Interface on Node-RED (Some correction)
02 Raspberry Pi GPIO Interface on Node-RED (Some correction)02 Raspberry Pi GPIO Interface on Node-RED (Some correction)
02 Raspberry Pi GPIO Interface on Node-RED (Some correction)
Ā 
Internet of Things - Advantech IoT Gateway Starter Kit
Internet of Things - Advantech IoT Gateway Starter KitInternet of Things - Advantech IoT Gateway Starter Kit
Internet of Things - Advantech IoT Gateway Starter Kit
Ā 

Similar to Node-RED Interoperability Test: Comparing 11 IoT Platforms for Data Storage, Visualization & Analytics

Iot presentation
Iot presentationIot presentation
Iot presentationhuma742446
Ā 
Io t standard_bis_arpanpal
Io t standard_bis_arpanpalIo t standard_bis_arpanpal
Io t standard_bis_arpanpalArpan Pal
Ā 
Hands on-intro to Node-RED
Hands on-intro to Node-REDHands on-intro to Node-RED
Hands on-intro to Node-REDPooja Mistry
Ā 
MachinePulse at the November Open Hardware Meetup, Mumbai 2014
MachinePulse at the November Open Hardware Meetup, Mumbai 2014MachinePulse at the November Open Hardware Meetup, Mumbai 2014
MachinePulse at the November Open Hardware Meetup, Mumbai 2014MachinePulse
Ā 
DDDP 2019 - Brown to Green
DDDP 2019  - Brown to GreenDDDP 2019  - Brown to Green
DDDP 2019 - Brown to GreenJohn Archer
Ā 
IOT Based Smart City: Weather, Traffic and Pollution Monitoring System
IOT Based Smart City: Weather, Traffic and Pollution Monitoring System      IOT Based Smart City: Weather, Traffic and Pollution Monitoring System
IOT Based Smart City: Weather, Traffic and Pollution Monitoring System IRJET Journal
Ā 
AF-2599-P.docx
AF-2599-P.docxAF-2599-P.docx
AF-2599-P.docxSami Siddiqui
Ā 
IoT Cloud architecture
IoT Cloud architectureIoT Cloud architecture
IoT Cloud architectureMachinePulse
Ā 
Node red & IoT - IEDC Hardware Club, April 8th 2016
Node red & IoT - IEDC Hardware Club, April 8th 2016Node red & IoT - IEDC Hardware Club, April 8th 2016
Node red & IoT - IEDC Hardware Club, April 8th 2016Sebin Benjamin
Ā 
Programming IoT Gateways with macchina.io
Programming IoT Gateways with macchina.ioProgramming IoT Gateways with macchina.io
Programming IoT Gateways with macchina.ioGĆ¼nter Obiltschnig
Ā 
IAB3948 Wiring the internet of things with Node-RED
IAB3948 Wiring the internet of things with Node-REDIAB3948 Wiring the internet of things with Node-RED
IAB3948 Wiring the internet of things with Node-REDPeterNiblett
Ā 
Fin fest 2014 - Internet of Things and APIs
Fin fest 2014 - Internet of Things and APIsFin fest 2014 - Internet of Things and APIs
Fin fest 2014 - Internet of Things and APIsRobert Greiner
Ā 
Phoenix Data Conference - Big Data Analytics for IoT 11/4/17
Phoenix Data Conference - Big Data Analytics for IoT 11/4/17Phoenix Data Conference - Big Data Analytics for IoT 11/4/17
Phoenix Data Conference - Big Data Analytics for IoT 11/4/17Mark Goldstein
Ā 
Open Source Edge Computing Platforms - Overview
Open Source Edge Computing Platforms - OverviewOpen Source Edge Computing Platforms - Overview
Open Source Edge Computing Platforms - OverviewKrishna-Kumar
Ā 

Similar to Node-RED Interoperability Test: Comparing 11 IoT Platforms for Data Storage, Visualization & Analytics (20)

Iot presentation
Iot presentationIot presentation
Iot presentation
Ā 
Io t standard_bis_arpanpal
Io t standard_bis_arpanpalIo t standard_bis_arpanpal
Io t standard_bis_arpanpal
Ā 
Hands on-intro to Node-RED
Hands on-intro to Node-REDHands on-intro to Node-RED
Hands on-intro to Node-RED
Ā 
FIWARE Overview
FIWARE OverviewFIWARE Overview
FIWARE Overview
Ā 
MachinePulse at the November Open Hardware Meetup, Mumbai 2014
MachinePulse at the November Open Hardware Meetup, Mumbai 2014MachinePulse at the November Open Hardware Meetup, Mumbai 2014
MachinePulse at the November Open Hardware Meetup, Mumbai 2014
Ā 
DDDP 2019 - Brown to Green
DDDP 2019  - Brown to GreenDDDP 2019  - Brown to Green
DDDP 2019 - Brown to Green
Ā 
IOT Based Smart City: Weather, Traffic and Pollution Monitoring System
IOT Based Smart City: Weather, Traffic and Pollution Monitoring System      IOT Based Smart City: Weather, Traffic and Pollution Monitoring System
IOT Based Smart City: Weather, Traffic and Pollution Monitoring System
Ā 
AF-2599-P.docx
AF-2599-P.docxAF-2599-P.docx
AF-2599-P.docx
Ā 
IoT Cloud architecture
IoT Cloud architectureIoT Cloud architecture
IoT Cloud architecture
Ā 
iot
iotiot
iot
Ā 
Designing Internet of things
Designing Internet of thingsDesigning Internet of things
Designing Internet of things
Ā 
Node red & IoT - IEDC Hardware Club, April 8th 2016
Node red & IoT - IEDC Hardware Club, April 8th 2016Node red & IoT - IEDC Hardware Club, April 8th 2016
Node red & IoT - IEDC Hardware Club, April 8th 2016
Ā 
Programming IoT Gateways with macchina.io
Programming IoT Gateways with macchina.ioProgramming IoT Gateways with macchina.io
Programming IoT Gateways with macchina.io
Ā 
IAB3948 Wiring the internet of things with Node-RED
IAB3948 Wiring the internet of things with Node-REDIAB3948 Wiring the internet of things with Node-RED
IAB3948 Wiring the internet of things with Node-RED
Ā 
Fin fest 2014 - Internet of Things and APIs
Fin fest 2014 - Internet of Things and APIsFin fest 2014 - Internet of Things and APIs
Fin fest 2014 - Internet of Things and APIs
Ā 
Phoenix Data Conference - Big Data Analytics for IoT 11/4/17
Phoenix Data Conference - Big Data Analytics for IoT 11/4/17Phoenix Data Conference - Big Data Analytics for IoT 11/4/17
Phoenix Data Conference - Big Data Analytics for IoT 11/4/17
Ā 
Project Document
Project Document Project Document
Project Document
Ā 
abstract.docx
abstract.docxabstract.docx
abstract.docx
Ā 
abstract.pdf
abstract.pdfabstract.pdf
abstract.pdf
Ā 
Open Source Edge Computing Platforms - Overview
Open Source Edge Computing Platforms - OverviewOpen Source Edge Computing Platforms - Overview
Open Source Edge Computing Platforms - Overview
Ā 

More from Boris Adryan

Computational decision making
Computational decision makingComputational decision making
Computational decision makingBoris Adryan
Ā 
Development and Deployment: The Human Factor
Development and Deployment: The Human FactorDevelopment and Deployment: The Human Factor
Development and Deployment: The Human FactorBoris Adryan
Ā 
ZĆ¼hlke Meetup - Mai 2017
ZĆ¼hlke Meetup - Mai 2017ZĆ¼hlke Meetup - Mai 2017
ZĆ¼hlke Meetup - Mai 2017Boris Adryan
Ā 
Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16
Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16
Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16Boris Adryan
Ā 
Industry of Things World - Berlin 19-09-16
Industry of Things World - Berlin 19-09-16Industry of Things World - Berlin 19-09-16
Industry of Things World - Berlin 19-09-16Boris Adryan
Ā 
Just because you can doesn't mean that you should - thingmonk 2016
Just because you can doesn't mean that you should - thingmonk 2016Just because you can doesn't mean that you should - thingmonk 2016
Just because you can doesn't mean that you should - thingmonk 2016Boris Adryan
Ā 
Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16
Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16
Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16Boris Adryan
Ā 
Eclipse IoT - Day 0 of thingmonk 2016
Eclipse IoT - Day 0 of  thingmonk 2016Eclipse IoT - Day 0 of  thingmonk 2016
Eclipse IoT - Day 0 of thingmonk 2016Boris Adryan
Ā 
Geo-IoT World, 25/05/16
Geo-IoT World, 25/05/16Geo-IoT World, 25/05/16
Geo-IoT World, 25/05/16Boris Adryan
Ā 
Smart IoT London, 13th April 2016
Smart IoT London, 13th April 2016Smart IoT London, 13th April 2016
Smart IoT London, 13th April 2016Boris Adryan
Ā 
Eclipse IoT - ecosystem
Eclipse IoT - ecosystemEclipse IoT - ecosystem
Eclipse IoT - ecosystemBoris Adryan
Ā 
TopConf Linz, 02/02/2016
TopConf Linz, 02/02/2016TopConf Linz, 02/02/2016
TopConf Linz, 02/02/2016Boris Adryan
Ā 
IoT - Be Open or Miss Out
IoT - Be Open or Miss OutIoT - Be Open or Miss Out
IoT - Be Open or Miss OutBoris Adryan
Ā 
Thingmonk 2015
Thingmonk 2015Thingmonk 2015
Thingmonk 2015Boris Adryan
Ā 
Node-RED and Minecraft - CamJam September 2015
Node-RED and Minecraft - CamJam September 2015Node-RED and Minecraft - CamJam September 2015
Node-RED and Minecraft - CamJam September 2015Boris Adryan
Ā 
EclipseCon France 2015 - Science Track
EclipseCon France 2015 - Science TrackEclipseCon France 2015 - Science Track
EclipseCon France 2015 - Science TrackBoris Adryan
Ā 
Node-RED workshop at IoT Toulouse
Node-RED workshop at IoT ToulouseNode-RED workshop at IoT Toulouse
Node-RED workshop at IoT ToulouseBoris Adryan
Ā 
Data Science London - Meetup, 28/05/15
Data Science London - Meetup, 28/05/15Data Science London - Meetup, 28/05/15
Data Science London - Meetup, 28/05/15Boris Adryan
Ā 
O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...
O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...
O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...Boris Adryan
Ā 
What the IoT should learn from the life sciences
What the IoT should learn from the life sciencesWhat the IoT should learn from the life sciences
What the IoT should learn from the life sciencesBoris Adryan
Ā 

More from Boris Adryan (20)

Computational decision making
Computational decision makingComputational decision making
Computational decision making
Ā 
Development and Deployment: The Human Factor
Development and Deployment: The Human FactorDevelopment and Deployment: The Human Factor
Development and Deployment: The Human Factor
Ā 
ZĆ¼hlke Meetup - Mai 2017
ZĆ¼hlke Meetup - Mai 2017ZĆ¼hlke Meetup - Mai 2017
ZĆ¼hlke Meetup - Mai 2017
Ā 
Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16
Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16
Mehr und schneller ist nicht automatisch besser - data2day, 06.10.16
Ā 
Industry of Things World - Berlin 19-09-16
Industry of Things World - Berlin 19-09-16Industry of Things World - Berlin 19-09-16
Industry of Things World - Berlin 19-09-16
Ā 
Just because you can doesn't mean that you should - thingmonk 2016
Just because you can doesn't mean that you should - thingmonk 2016Just because you can doesn't mean that you should - thingmonk 2016
Just because you can doesn't mean that you should - thingmonk 2016
Ā 
Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16
Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16
Plattformen fĆ¼r das Internet der Dinge, solutions.hamburg, 05.09.16
Ā 
Eclipse IoT - Day 0 of thingmonk 2016
Eclipse IoT - Day 0 of  thingmonk 2016Eclipse IoT - Day 0 of  thingmonk 2016
Eclipse IoT - Day 0 of thingmonk 2016
Ā 
Geo-IoT World, 25/05/16
Geo-IoT World, 25/05/16Geo-IoT World, 25/05/16
Geo-IoT World, 25/05/16
Ā 
Smart IoT London, 13th April 2016
Smart IoT London, 13th April 2016Smart IoT London, 13th April 2016
Smart IoT London, 13th April 2016
Ā 
Eclipse IoT - ecosystem
Eclipse IoT - ecosystemEclipse IoT - ecosystem
Eclipse IoT - ecosystem
Ā 
TopConf Linz, 02/02/2016
TopConf Linz, 02/02/2016TopConf Linz, 02/02/2016
TopConf Linz, 02/02/2016
Ā 
IoT - Be Open or Miss Out
IoT - Be Open or Miss OutIoT - Be Open or Miss Out
IoT - Be Open or Miss Out
Ā 
Thingmonk 2015
Thingmonk 2015Thingmonk 2015
Thingmonk 2015
Ā 
Node-RED and Minecraft - CamJam September 2015
Node-RED and Minecraft - CamJam September 2015Node-RED and Minecraft - CamJam September 2015
Node-RED and Minecraft - CamJam September 2015
Ā 
EclipseCon France 2015 - Science Track
EclipseCon France 2015 - Science TrackEclipseCon France 2015 - Science Track
EclipseCon France 2015 - Science Track
Ā 
Node-RED workshop at IoT Toulouse
Node-RED workshop at IoT ToulouseNode-RED workshop at IoT Toulouse
Node-RED workshop at IoT Toulouse
Ā 
Data Science London - Meetup, 28/05/15
Data Science London - Meetup, 28/05/15Data Science London - Meetup, 28/05/15
Data Science London - Meetup, 28/05/15
Ā 
O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...
O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...
O'Reilly Webcast: Organizing the Internet of Things - Actionable Insight Thro...
Ā 
What the IoT should learn from the life sciences
What the IoT should learn from the life sciencesWhat the IoT should learn from the life sciences
What the IoT should learn from the life sciences
Ā 

Recently uploaded

Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
Ā 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
Ā 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Paola De la Torre
Ā 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024Scott Keck-Warren
Ā 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
Ā 
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | DelhiFULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhisoniya singh
Ā 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
Ā 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesSinan KOZAK
Ā 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
Ā 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
Ā 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
Ā 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
Ā 
Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...
Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...
Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...Alan Dix
Ā 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...HostedbyConfluent
Ā 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGSujit Pal
Ā 
Finology Group ā€“ Insurtech Innovation Award 2024
Finology Group ā€“ Insurtech Innovation Award 2024Finology Group ā€“ Insurtech Innovation Award 2024
Finology Group ā€“ Insurtech Innovation Award 2024The Digital Insurer
Ā 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
Ā 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
Ā 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
Ā 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
Ā 

Recently uploaded (20)

Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Ā 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Ā 
Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101Salesforce Community Group Quito, Salesforce 101
Salesforce Community Group Quito, Salesforce 101
Ā 
SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024SQL Database Design For Developers at php[tek] 2024
SQL Database Design For Developers at php[tek] 2024
Ā 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
Ā 
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | DelhiFULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
FULL ENJOY šŸ” 8264348440 šŸ” Call Girls in Diplomatic Enclave | Delhi
Ā 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
Ā 
Unblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen FramesUnblocking The Main Thread Solving ANRs and Frozen Frames
Unblocking The Main Thread Solving ANRs and Frozen Frames
Ā 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
Ā 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
Ā 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
Ā 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
Ā 
Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...
Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...
Swan(sea) Song ā€“ personal research during my six years at Swansea ... and bey...
Ā 
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Transforming Data Streams with Kafka Connect: An Introduction to Single Messa...
Ā 
Google AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAGGoogle AI Hackathon: LLM based Evaluator for RAG
Google AI Hackathon: LLM based Evaluator for RAG
Ā 
Finology Group ā€“ Insurtech Innovation Award 2024
Finology Group ā€“ Insurtech Innovation Award 2024Finology Group ā€“ Insurtech Innovation Award 2024
Finology Group ā€“ Insurtech Innovation Award 2024
Ā 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
Ā 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
Ā 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Ā 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
Ā 

Node-RED Interoperability Test: Comparing 11 IoT Platforms for Data Storage, Visualization & Analytics

  • 1. ! 1 @BorisAdryan - April 2014 Data Storage & Visualisation in the Internet of Things Node-RED Interoperability Test
  • 2. ! Summary A signiļ¬cant proportion of developments in the Internet of Things (IoT) is driven by non-technical innovators and ambitious hobbyists. Node-RED targets this audience and oļ¬€ers a widely used rapid prototyping platform for IoT data plumbing on the basis of JavaScript. Data platforms for the IoT provide storage facilities and value in the form of visualisation & analytics to business and end users alike. This report details how Node-RED connects to 11 diļ¬€erent platforms and what additional services these provide. 2 carriots Emoncms Evrythng eyehub exosite Geras opensensors.IO Tinamous Thinkspeak ubidots xively Ease-of-use with Node-RED Documentation of API and I/O Functionality Visualisation & Analytics
  • 3. Introduction One signiļ¬cant advantage of the Internet of Things is the worldwide availability of oneā€™s thingsā€™ data. That is, no matter where you are and where your thing is, if youā€™re both connected to the internet, you can learn from it. Whatever your thing is, in many cases you can learn some sort of numerical data from it: Let it be a temperature, energy consumption or cups of coļ¬€ee left. Humans are visual animals and most people prefer to see their numbers in a historical context. For any value we see, we implicitly compare it: Is it low? Is it high? Is it higher on average than four weeks ago? Seeing the temporal development of your data in a graph is often essential to making sense of it and to informed decision making. Even the famous statistician John Tukey promoted the thought of explorative data analysis before embarking on more sophisticated analyses. So what options are there? When we installed an internet-connected freezer, we followed a recommendation for the matplotlib framework in Python to create a graph. While it is totally possible to make powerful visualisations in this or other scripting languages and make those available on the internet, without a lot of coding they are static images and donā€™t oļ¬€er any interactivity. This is where colourful names such as Carriots, Emoncms, Evrythng, Eyehub, Exosite, Geras, Opensensors, Tinamous, Thinkspeak, Ubibots or Xively come into play. The alternative to coding your own graphing solution for sensor data is using an IoT platform (sometimes referred to as hub or silo) that takes data from you, stores it in the cloud, and provides interactive display and ideally analysis of your information. This user experience is one of the key diļ¬€erences between the IoT and human interaction in comparison to machine-to-machine (M2M) applications, as the graphical representation and interactivity is irrelevant for the latter. ! 3 A graph generated with matplotlib in Python.
  • 4. ! The Node-RED Interoperability Test We have chosen Node-RED (http://nodered.org) as our perceived game changer for many IoT developments that are not driven by programmers and engineers. In the most simple terms, Node-RED is a graphical user interface that allows the creation of workļ¬‚ows for IoT data plumbing. By connecting simple components with deļ¬ned functionality (the ā€œnodesā€), it is possibly to write applications that take data from one source (e.g. a sensor, a website, a Twitter account) and publish or act on this information in many cases without any programming. If programming should be necessary, Node-RED fully builds on node.js and allows the incorporation of JavaScript code. As such it is very accessible even for innovators with limited previous programming experience. While Node-RED can be installed on any computer system that supports node.js, it has been developed particularly with the Raspberry Pi in mind. This implies that a large proportion of Node-RED users may have only a superļ¬cial understanding of web technologies - a potential constraint for grass roots IoT development. 4
  • 5. Here we are trying to see how IoT platforms facilitate access to their services, in what form they are provided and how much support they are oļ¬€ering. We chose a common scenario of Raspberry Pi usage: The AirPi weather station is a hardware shield for the GPIO, whose default software stores and shows weather data on Xively (formerly also known as Cosm/Pachube, an originally free service that supported the AirPi.es project). It is not unreasonable to assume that it reļ¬‚ects what many hobby users consider ā€œtheir IoTā€. The IoT platform market has grown enormously over the past few months and there are now more than a dozen players round (many of which are included in our test), and there is possibly an even bigger number of services that are exclusively advertised and available to paying customers (e.g. ThingWorx or Gemalto). What are their unique selling points? Most of these platforms have their own niche and follow diļ¬€erent conceptual models. So which one should you use? Which one is easy to use with Node-RED? And what sort of visualisation and analytics do they oļ¬€er? In this review, weā€™re trying to compare the platforms for one particular use case: Which IoT platform works best with weather data served from a Raspberry Pi AirPi shield using the Node-RED workļ¬‚ow we had published earlier? ! Technical Background Node-RED supports a range of input options. For interactions with the AirPi shield, we are using a modiļ¬ed version of their Python scripts that broadcasts the measurements via UDP. The Node-RED workļ¬‚ow monitors the incoming traļ¬ƒc and can restart the Raspberry Pi if no measurements have been received for several minutes, or by default restarts the system once a night. The workļ¬‚ow also coordinates the setup of the Python scripts. Node-RED can communicate with the outside world using TCP, UDP, HTTP, MQTT and can provide sockets. Some of the platforms we are looking at support MQTT (http://mqtt.org), a simple and uniļ¬ed Message Queue Telemetry Transport protocol that has been developed with IoT applications in mind. Others provide RESTful APIs that can be used with HTTP requests. These are more ļ¬‚exible and some APIs even allow powerful manipulations of the data structures, at the cost of solution-speciļ¬c modiļ¬cations to HTTP header structure and message body. 5
  • 6. ! ! The Platforms We have accounts and login details for the services listed above. These range from hobby projects to commercial IoT products of companies with a large portfolio of IT solutions. We further looked at onion.io and ThingWorx. Unfortunately we were unable to include onion.io into our test as it currently requires a library for the Arduino; a forum post indicates C/Python libraries for the Raspberry Pi are under development but we couldnā€™t ļ¬nd any REST API. We had contact with ThingWorx and Gemalto, who both frequently sport powerfully looking dashboards at IoT conferences, but despite verbal agreements from representatives and various emails we were unable to obtain access to these sites. 6 Ease-of-use with Node-RED Documentation of API and I/O Functionality Visualisation & Analytics carriots Emoncms Evrythng eyehub exosite Geras opensensors.IO Tinamous Thinkspeak ubidots xively
  • 7. Money Talks There is no free lunch. Most if not all IoT platform providers would like to make a living through their services. However, while commercial usage of some can cost you a signiļ¬cant amount of money, developers and hobbyists can usually get away with free accounts. ! Note that the terms and conditions of your free account may change, and that undocumented limits may exist for non-paying customers. The reasonable limitations on API calls per minute for some of the platforms has implications for our test scenario. While our AirPi outputs data from two diļ¬€erent temperature sensors, barometric pressure, humidity, light level, volume, and relative CO and NO2 levels every 15 seconds (i.e. 4x 8 = 32 measurements per minute), for those platforms we aggregate the measurements for the submission in a single API call. CARRIOTS free, limits on number of devices and incoming connections EMONCMS free, but asking for donations and a reasonable post rate limit (5-10sec) EVRYTHNG free for developers EYEHUB free for developers EXOSITE free for developers, limited on number of devices and users GERAS free for developers OPENSENSORS.IO free by agreeing to share the measurements with the public TINAMOUS free, limits on number of devices and users THINKSPEAK free, ā€œa rate limit of an update per channel every 15 secondsā€ UBIDOTS free, 30,000 ā€œdotsā€ included (could be data transmissions, triggered emails, etc.) XIVELY free for developers, limited to 25 API calls per minute 7
  • 8. Architectural Differences & Security How is the measurement of the physical device represented? There are two extremes that we are brieļ¬‚y discussing: We have seen the most device-agnostic and generally applicable data model at 1248.ioā€™s Geras platform, where each sensor can be considered the ļ¬nal node in a directory structure and the measurements can be published via MQTT as time-dependent entries to, for example, /instrument/sensor or any other logical path. The Geras web interface allows the aggregation of path elements and it is possible to gain an overview of all instruments or all sensors by browsing to the appropriate level in the hierarchy. This simplicity has advantages and disadvantages. While the directory structure is established ad hoc simply by posting to a directory entry (so writing a value to /AirPi/humidity creates both the instrument and the sensor on Geras if they havenā€™t existed before), there is no policy for the granularity of directory structure. It is entirely feasible to maintain /AirPi/humidity and a diļ¬€erent device /weather/AirPi/humidity at the same time, with all the implications for redundancy and fragmentation. The opposite is true for platforms with a complex device model. In these cases, measurements are tied to sensors, which are mounted on devices, based at locations, maintained by device owners in a detailed network of relationships. Often the devices have then to be explicitly created before Node-RED can write to them via MQTT or RESTful APIs. This can either be done using diļ¬€erent sets of API commands via HTTP requests, or directly on the web sites of the IoT platform. In most cases Node-RED users can get away with just one password (API key or device key), but there are notable exceptions where privileges are ļ¬ne-grained and manipulations require diļ¬€erent keys that are accessible through the platformsā€™ user settings. 8 The data model behind the Eyehub API.
  • 10. We receive data from the AirPi Python scripts via recUDP. The splitMessage node separates our measurements into {topic: sensor name, payload: measurement} pairs. These are then published by reformatting them for RESTful API calls (via feedXXX function and http request nodes) or by by adding path information for MQTT transmission. Depending on the platform, collectMessages nodes prepare data for bulk transmission. The ļ¬‚ow components in the upper right (TheServer) prepare data for display on an internal website and those in the lower left (onStartup) are for general system maintenance. ! Documentation and Ease-of-Use with Node-RED We believe that the majority of Node-RED users are not necessarily experienced web developers. While it is clear that the IoT platforms require some sort of authentication to allow users access and some sort of address system to assign a measured value to a sensor, there are many ways how this information can be transmitted. The exact How-to should be described in a short and concise documentation. In the following, sections, we describe our tour-de-force of connecting Node-RED with the various platforms. While MQTT transmissions are standardised, there are three possible entry points for transmitting information as part of a HTTP request: 1. as part of the URL, as exempliļ¬ed in the EmonCMS or Thingspeak transmission, where password, sensor name and measurement are part of the very internet address. 2. as part of the HTTP header, as seen in the majority of platforms for authentication purposes. 3. as part of the HTTP body, where we should point out that some but not all platforms insist in the deļ¬nition of the Content-Length parameter in the header, as otherwise contents of the body are not correctly transmitted - this seemed to be highly platform speciļ¬c. ! 10
  • 11. Another issue that we discovered as potentially tedious is how our sensors names are represented on the various platforms. While the majority of platforms allowed the use of our actual sensor name, Tinamous, Thingspeak and Ubidots require a mapping to their ļ¬eld identiļ¬ers (either broadly called ļ¬eld0..ļ¬eld8, or variable IDs in the case of Ubidots). The precise notation of the sensor reads is also surprisingly diverse. Most platforms adhere to some sort of JSON format {ā€œsensorā€:ā€measurementā€}, but virtually any deviation from this pattern such as { [{sensor = ā€œmeasurementā€ }] } etc seems to exist. We also identiļ¬ed a case with Tinamous where node.js JSON.stringify produced a correctly looking string, but the platform would only accept the input when we constructed the string manually. The following list summarises the code we have used for data transfer out of Node-RED. This is best understood in reference to the ļ¬gure on page 9. ! 11
  • 12. CARRIOTS. The control panel of Carriots is a complex beast. Their API documentation is openly accessible at https://www.carriots.com/documentation and it took us a while to ļ¬gure out what exactly is needed to create our device (the AirPi) and its sensors (here called Data streams). The API key is available in your user control panel. We created our device manually on the website, but the data streams are created dynamically on the basis of the data object, which is a JSON construct with sensor name and measurement. ! In the feedCarriots function node: msg.url = "http://api.carriots.com/streams"; ! var stuff = "{ "+msg.topic+" : ""+msg.payload+""}"; msg.payload = JSON.stringify({ protocol: "v1", at: "now", device: "AirPi@adryan.adryan", data: stuff }); ! var alength = msg.payload.length; ! msg.headers = { 'User-Agent' : 'AirPi@adryan.adryan', 'Content-Type' : 'application/json', 'carriots.apikey' : '9ce9e9cXXXXXXXXXXXXXXXXXXXX0923720be050ee3d0bd0023dacf14716fb869', 'Content-Length' : alength } ! msg.method = "POST"; ! return msg; ! 12
  • 13. EMONCMS. Emoncms is an open-source energy management software that provides features that are useful in a wider range of IoT application. The open documentation is extensive, but also details (for us unnecessary details) building the Emoncms for your own server and such. Finding the relevant API information was a challenge, but fortunately, feeding data into their platform is not: A JSON object as part of the URL generates the sensor ļ¬eld in the database and populates it. Your API key is available in your user settings at http://emoncms.org/user/view. In the feedEmonCMS function node: msg.url = ā€œhttp://emoncms.org/input/post.json? json={ā€œ+msg.topic+":"+msg.payload+"} &apikey=27bb0faeXXXXXXXXXXXXXXXc387c5bb3ā€; return msg; ! ! EVRYTHNG. The Evrythng Developer Resources (https://dev.evrythng.com/documentation) give well-structured insight into architecture of the platform, where the most important component are your THNGs, which can have properties (i.e. your sensor measurements). Evrythng is not necessarily built with hobbyist users in mind and there are plenty of API functions for product management and the like that we didnā€™t need. THNGs can be created through the API or on the website, but this needs to happen before populating them with properties. Importantly, properties are created for your THNG on the ļ¬‚y while you submit data to them. Your API end point contains a unique ID (the THNG ID), and authorisation requires a token, which is available from your account at https:// dev.evrythng.com/account/token. ! In the feedEVRYTHNG function node: msg.url = "https://api.evrythng.com/thngs/534XXXXXXXXXXXXXXXf821d7/properties"; 13
  • 14. ! msg.payload = "[{ "key" : ""+msg.topic+"", "value" : ""+msg.payload+""}]"; ! var alength = msg.payload.length; ! msg.headers = { 'Content-Type' : 'application/json', 'Authorization' : 'tuyvvWMboGc3AxNAxjj4GPEORuYpRro1t1dunI0QxN7m6XXXXXXXXXXXXXXXXXXXXlPNdngo9ukMaA', 'Content-Length' : alength } ! msg.method = "POST"; ! return msg; ! ! EYEHUB. Eyehub is by far the most complex system we have included in this test (the exemplary ļ¬gure on page 8 is from their API documentation, which is more than 150 pages long). Eyehub operates a public section on Github, but access to the system requires an invitation. It took us a while on their web tool https://hub.ļ¬‚exeye.com to ļ¬nd the appropriate entry point: We manually created a Device Manager (AirPi_DM), to which we then assigned our AirPi as Device (automatically receiving a Device ID, here: Device_1997, thatā€™s required for the API call), and the Sub Devices (our sensors - which we named according to the incoming topic). The documentation describes how to create Manager and Devices via the API, but we needed the visual context of the website to understand this logic. As for the authentication password that is required in the HTTP header: We remember itā€™s base64 encoded, but we canā€™t remember how and where we retrieved it. That much for complexity! 14
  • 15. ! In the feedEyehub function node: msg.url = ā€œhttps://hub.ļ¬‚exeye.com/v1/iot_Default/dms/AirPi_DM/devices/Device_1997/subDevices/"+msg.topic+"/events"; ! msg.payload = JSON.stringify({"payload": msg.payload, "type": 1.0}); ! var alength = msg.payload.length; ! msg.headers = { 'Authorization' : 'Basic YmFkcnlhXXXXXXXXXX3MjFxYXo=', 'Content-Type' : 'application/json', 'Content-Length' : alength }; ! msg.method = "POST"; ! return msg; ! ! ! EXOSITE. Exosite maintains public API documentation on Github. Itā€™s not extremely well structured, but https://github.com/exosite/docs contains a short straightforward description how to post data points to their platform. Devices are created on the website (the dialogue also mentions your device identiļ¬er CIK, which is needed for authentication). Sensors were created on the ļ¬‚y while posting data to them. In the feedExosite function node: msg.url = "http://m2.exosite.com/onep:v1/stack/alias"; ! msg.payload = msg.topic+"="+msg.payload; 15
  • 16. ! var alength = msg.payload.length; ! msg.headers = { 'X-Exosite-CIK': 'ac1696XXXXXXXXXXXXXXXXXXXXbbdebd657b799f', 'Content-Type' : 'application/x-www-form-urlencoded; charset=utf-8', 'Accept' : 'application/xhtml+xml', 'Content-Length' : alength }; ! msg.method = "POST"; ! return msg; ! GERAS. 1248.io have a fairly concise API for communication with Geras. Unfortunately, one has to be registered to gain access to the documentation. However, most of their examples are then easy to use, as in fact all user credentials in the examples are adjusted to the current user. Publishing data via MQTT is encouraged, using their geras.1248.io server on port 1883 and using the data channel (e.g. ā€œ/AirPi/Temperatureā€) as topic in the Node-RED MQTT node, and your personal key as user name. It is worth mentioning that once a data channel is present in the database, one can automatically generate JSON code for import into Node-RED for future applications. In the addPath function node: msg.topic = "/AirPi/"+msg.topic; msg.payload = msg.payload; ! return msg; ! MQTT settings: ! Broker: geras.1248.io 16
  • 17. Port: 1883 Username: your Master API key from http://geras.1248.io/user/settings !!! OPENSENSORS.IO The Opensensors.IO project is currently in pre-beta and access is by invitation only. Their ā€œGetting Startedā€ guide is a simple description of the MQTT interface and help is provided mostly in form of the command line parameters one would use with mosquitto. Topic names take the form of yourusername/devicename/sensorname. In contrast to the other platforms that support MQTT in our test, Opensensors.IO make use of the client ID to authorise connections. Care has to be taken when creating a new device in the account settings: Your device password will be displayed once, and only once, when that device is created. If you miss taking note of it, you will have to create the device again. From within the device, one has to create the topic for each sensor manually before submitting data to it. ! In the addPath node: msg.topic = "boris/AirPi2.0/"+msg.topic; msg.payload = msg.payload; ! return msg; ! MQTT settings: ! Broker: opensensors.io Port: 1883 Client ID: YOUR DEVICE CLIENT ID Username: YOUR LOGIN/USER NAME Password: YOUR DEVICE PASSWORD ! ! ! 17
  • 18. TINAMOUS. Tinamous haven an open API documentation at https://tinamous.com/ApiDocs. Submitting measurements is easy, provided that one has deļ¬ned a device and appropriate data ļ¬elds. This is possible via the API, but we found the GUI at http://yourusername.tinamous.com more convenient when ļ¬rst getting to grips with this platform. The data ļ¬elds are labelled Field1..12, and we perceive this as a potential limitation for some users with more sensors on their device. While it is possible to submit one sensor reading at the time, this has to be done through the concept of ā€œchannelsā€, something which we found not extensively documented and therefore resorted to collating measurements before invoking the API. Tinamous oļ¬€er a wizard on their website that generates the http request header including the authorisation token. In the collateMessages node: var ļ¬eld = ""; switch(msg.topic) { case "BMPTemperature": ļ¬eld = "Field1"; break; case "DHTTemperature": ļ¬eld = "Field2"; break; ā€¦ context.buff = context.buff || ""; context.count = context.count || 0; ! if (msg.topic != "purge") { if (context.buff.length > 0) { context.buff = context.buff+", ""+ļ¬eld+"":""+msg.payload+"""; } else { context.buff = """+ļ¬eld+"":""+msg.payload+"""; } context.count += 1; } if (context.count == 8 || (msg.payload=="purge" && context.count >= 1)) { msg.topic=""; msg.payload = context.buff; 18
  • 19. context.buff = ""; context.count = 0; return msg; } return null; ! And in the feedTinamous call node: msg.url = "https://adryan.Tinamous.com/api/v1/Measurements"; msg.payload = "{"Channel": 0,"+msg.payload+","Lite": false}"; ! var alength = msg.payload.length; ! msg.headers = { 'Content-Type' : 'application/json', 'Authorization' : 'Basic QWlyXXXXXXXXXXJlcnJ5', 'Content-Length' : alength } ! msg.method = "POST"; ! return msg; !! THINGSPEAK. Thingspeak channels are documented openly at https://thingspeak.com/docs/channels#channels. We created our AirPi on their website, where we also added the diļ¬€erent sensors. These got assigned data ļ¬elds ļ¬eld1..8, a name which has to be used through the API. The Channel View also provides access to the API keys that 19
  • 20. are needed to update or view the data. There are multiple places to learn about the API, and we found http://community.thingspeak.com/ documentation/api/ one of the better descriptions how to use the platform. In the collateMessage node: var ļ¬eld = ""; switch(msg.topic) { case "BMPTemperature": ļ¬eld = "ļ¬eld1"; break; case "DHTTemperature": ļ¬eld = "ļ¬eld2"; break; ā€¦ } ! context.buff = context.buff || ""; context.count = context.count || 0; ! if (msg.topic != "purge") { if (context.buff.length > 0) { context.buff = context.buff+"&"+ļ¬eld+"="+msg.payload; } else { context.buff = ļ¬eld+"="+msg.payload; } context.count += 1; } if (context.count == 8 || (msg.payload=="purge" && context.count >= 1)) { msg.topic=""; msg.payload = context.buff; context.buff = ""; context.count = 0; return msg; } return null; 20
  • 21. ! In the API call node: ! msg.url = "http://api.thingspeak.com/update?key=TUQOXXXXXXXXXXTZ2&"+msg.payload; msg.method = "POST"; return msg; ! UBIDOTS. Ubidots feature a Raspberry Pi on their home page and they have an extensive public documentation section:Ā http://ubidots.com/docs. The documentation of their RESTful API is extensive and has many examples that work directly from the command line. Ubidots know a Data Source (our AirPi) and Variables (our sensors). The sensors need to be pre-deļ¬ned, either on their website or through API commands that are submitted through HTTP POST calls. Each sensor is getting assigned a 24 character variable ID, to which the POST requests have access if they know the authentication token, which are managed at http://app.ubidots.com/userdata/api. ! In the feedUbidots function node: var varid = ""; switch(msg.topic) { case "BMPTemperature": varid = "5336c5acXXXXXXXb639aa9ba"; break; case "DHTTemperature": varid = "5336f998XXXXXXX2c45a81b4"; break; ā€¦. } 21
  • 22. ! msg.url = "http://things.ubidots.com/api/v1.6/variables/"+varid+"/values"; msg.headers = { 'Content-Type' : 'application/json', 'X-Auth-Token' : 'fxh0fCSY6V82XXXXXXXXXXXXXXXngBvPZPByuCJiqWLdsAWiMzrhTQHjUtPF' } msg.payload = "{"value":"+msg.payload+"}"; msg.method = "POST"; ! return msg; ! XIVELY. Xively operates a Developer Center (https://xively.com/dev), and once you choose a Development Device (here: our AirPi), you can see the Device Key needed to deposit data in your ā€œdata channelsā€ (i.e. one channel per type of measurement). Note that you need to create your channels manually (i.e. either using the website or the API) before submitting any measurements - this is something that caused us some confusion in the beginning. The API Documentation (https://xively.com/dev/docs/api) is very clear and has a few examples how the RESTful communication toĀ  api.xively.comĀ  works. While it would be possible to create a JSON, XML or CSV object and submit that via a Node-RED http request, the MQTT node can encapsulate the information and send it to /v2/feeds/YOUR FEED ID.csv to api.xively.com on port 1883, using your device key as user name. In the collectMessages function node: context.buff = context.buff || ""; context.count = context.count || 0; ! if (msg.topic != "purge") { if (context.buff.length > 0) { context.buff = context.buff+"n"+msg.topic+", "+msg.payload; 22
  • 23. } else { context.buff = msg.topic+", "+msg.payload; } context.count += 1; } if (context.count == 8 || (msg.payload=="purge" && context.count >= 1)) { msg.topic=""; msg.payload = context.buff; context.buff = ""; context.count = 0; return msg; } return null; ! In the MQTT settings: Broker: api.xively.com Port: 1883 Username: YOUR DEVICE API KEY Topic: /v2/feeds/YOUR FEED ID.csv ! 23
  • 24. Visualisation, Analytics & Functions The primary motivator for our test was the search for a convenient platform for visualisation of IoT data. We further looked for useful tools to analyse our data, or if that was not possible, what options we had to share our information with others or how to download whatever we had stored. A systematic assessment is beyond the scope of this document, but we are trying to give our readers some insight into what is currently in store for them. What we found most disappointing at this stage was the lack of meaningful data analytics on all of the IoT platforms. ! CARRIOTS. Carriots have an extensive Data Management section on their web interface at https://cpanel.carriots.com/data-management. We were pleased to see a Data Export service that lets you download slices of your data in JSON, XML and CSV formats. A wizard allows the conļ¬guration of a data stream that can post your data as a JSON object at a speciļ¬ed URL. Another wizard takes care of visualisation: However, in our hands, it did not produce any useful output. We believe that the graphics API, which is documented at https:// www.carriots.com/documentation/graphs, may be your best bet for visualisation. We perceived this route as ā€˜too involvedā€™ for our quick test. ! EMONCMS. It took us a moment to understand the logic behind the EmonCMS Dashboard. In fact, close to giving up, we discovered that measurements need to be translated into ā€œfeedsā€ (of which the conļ¬guration happens in the Input arena). Those feeds might be your raw data, but also time averaged means or your data where an arithmetic operation has been performed on the data are available. Feeds can be downloaded for deļ¬ned intervals and time slices. Feeds further provide the input for graphs, where EmonCMS oļ¬€ers a wide selection of common types. Diļ¬€erent graphs and widgets can be arranged on a dashboard, which can be shared with others. 24
  • 25. EVRYTHNG. As in the case of their competitor Carriots, the power of Evrythng comes packaged in complex APIs that allow the creation of attractive front-end applications or retrieving any of your data back. For the purposes of our test, we focussed on what we could get on screen without much further development work. In your THNG section, a list of all properties (here: the sensors) is available. The click on any of the properties brings up a vanilla graph with your sensor readings - this is a static display without any on-the-ļ¬‚y updates. These graphs can be printed or downloaded in various graphic formats. We couldnā€™t see any option for sharing these images with the public. EYEHUB. At this stage, Eyehub does not oļ¬€er any data retrieval or visualisation through their web interface. We have been told that a D3.js based library for custom-designed graphs is in development, but for now, without using the really extensive API, the Eyehub looks more like a data one-way street. ! EXOSITE. Exosite have a very intuitive way of creating Dashboards from your data. They provide a wide selection of graphs, some of which can take more than one measurement and lend themselves for comparing data. As with most other sites, axis scaling is not a particular strength of Exosite and we missed logarithmic scaling and better interactivity with the graphs. However, amongst the blind, the deaf is king and therefore our criticism shouldnā€™t be taken to harshly. It is easily possible to declare a dashboard as public and it can then be viewed through a URL. The Scripts section of Exosite is a possible entry point for exporting your data - if you know how to write code in Lua. ! 25
  • 26. GERAS. 1248.ioā€™s Geras provides a plain directory structure to navigate your devices and sensors. On the device level, a tabular view with your sensor names, a thumbnail with a graph of the past 12 hours and the current value are displayed. This view also shows little Node-RED icons that link to code that one can use for MQTT-based in- and output. Geras allows command line or programmatic access to all stored data. This is simpliļ¬ed to an extent that a simple copy & paste to a terminal console retrieved all of our temperature data. Clicking on a sensor calls up a larger graph. The graphical interface that is available for each sensor spits out a warning if this would require more than 5k data points, but in principle any time frame can be deļ¬ned. Data can be shown as rolling averages or raw measurements. Those graphs cannot be shared. ! OPENSENSORS.IO do not provide any visualisation at the moment. Live data sharing is the key purpose of this platform at the moment, and we understand it as a dispatcher of MQTT-based feeds for your data. Weā€™ve been told that super analytics goodness [...] including all the usual real time charting is going to arrive at the end of May. ! TINAMOUS. Tinamous wants to be understood as a Twitter for the IoT. Their graphing solution reminded us much of Evrythng, in fact we believe that both platforms use the same library with the same functionality (e.g. saving of images). Unfortunately, the axis are pre-deļ¬ned and just focus on the past four or so hours. Data retrieval seems possible through the API. ! THINGSPEAK. Thingspeak have an intuitive interface that allows the creation of live graphs and provides simple data export, either as ļ¬le export or an online API. We were very pleased with a many options that are available for customisation of the graphs: The number of past data points or a time frame 26
  • 27. can be deļ¬ned for the temporal axis, and the unit axis can either adjust dynamically or be set to deļ¬ned min and max values. The settings for each graph (column, bar, line) also allow to specify whether data is to be shown as raw value, as average, or have an arithmetic operation applied to it. Creating dashboards with multiple of these graphs is easily possible, so is their sharing on the internet with a deļ¬ned URL. UBIDOTS. Ubidots easily wins the prize for the most striking ā€˜on ļ¬rst sightā€™ display of our data. The status of our AirPi greets us with our recent readings shown in large letters (unfortunately with a lack if sensible scaling in some cases). The overall impression remains good, but we found the graphs that are accessible through clicking on these sensor images slightly inļ¬‚exible. There is no sensible scaling for the measurements, and zooming on the time frame was a little bit hit and miss with the sliders that appear underneath the graph. While the currently displayed data can be downloaded in CSV format using the GUI, your best bet for large-scale retrieval of your information may be the API. XIVELY. Xively probably oļ¬€ers the most convenient way to graphically browse through your data. The data can be viewed with varying temporal resolutions of 5 min to 1 hour for raw data points, or with average values for longer intervals of up to 3 months, and by navigating using the prominent left and right buttons underneath the graphs. By default each of your feeds also has a public URL for viewing the data, which is quite similar to your private view of the data except it lacks API key information. Bulk download of historical data is only possible through the API. ! 27
  • 28. Concluding Remarks With the notable exception of arithmetic operations on incoming data a few of the platforms (EmonCMS, Thingspeak) or multiple line graphs and scatterplots in Ubidots, not a single platform could convince us in terms of analytics. We missed histograms, box plots or even simple tables informing us of the basic descriptive statistics for our measurements. This is where all of them need to do better! If you need graphs for your own website, Ubidots and Thingspeak provide you with iFrame code that one can simply use for plug & play. Alternatively, Eyehub are promising D3.js based graphs for the near future, and Carriots also have examples in their API documentation how to bring their graphical goodness to your website. In cases where fancy dashboards are desirable, have a look at EmonCMS, Exosite and Ubidots. When it comes to the simple display of numerical data, not a single platform could take home the cup. While we liked Xivelyā€™s way of navigating through historical data, we were not happy with the lack of scaling that is essential when looking at sensor data which follows a logarithmic scale. Also, we would have hoped for better outlier detection in all of the tools. We also quite liked Gerasā€™ tabular summary of data including the thumbnail picture, or the quite interactive way that Thingspeak have with their widgets. We were positively surprised that most platforms export historical data, although using an API to do so may not be everyoneā€™s taste. ! Acknowledgements Boris Adryan (@BorisAdryan) wishes to acknowledge the help of Dave Conway-Jones & Nick Oā€™Leary from the Node-RED team (@NodeRED), as well as all platform providers that granted us free and sometimes early access to their services, and often free email support to resolve administrative and technical issues. Further comments on this document came from Andy Stanford-Clark (@andysc), Christopher Mobberley (@hardware_hacks) and Andrew Lindsay (@andrewdlindsay). 28