Libelium is a spanish company specialized in the development and manufacture of sensory devices.
One of its flagship products is the Waspmote plug & play, a sensor box with wireless connectivity that allows you to connect up to 6 probes to measure temperature, humidity, pressure, pollution, noise and many other atmospheric data.
Sentilo is a sensor/actuator platform developed by the Barcelona Council and adopted by many cities in Catalonia. This platform provides a simple HTTP REST API to publish and read the sensory data without dealing with the complexity and heterogeneity of the devices.
The Waspmote can be easily programmed in C++ (in a similar way to Arduino boards) to send the data of the probes to the Sentilo platform through a Wifi connection.
In this project we will see how to create a Brain4it module with a dashboard to visualize the sensory data provided by 4 Libelium stations (Waspmote plug & play) integrated in Sentilo.
Each Libelium station publishes a new observation of its sensors in Sentilo every 2 minutes. The name of these sensors follows this convention:
libelium_<station>_<sensor_type>Examples: libelium_MAG_tem, libelium_MAG_pre, libelium_ROS_tem, libelium_ROS_hum, etc.
On start, the Brain4it module creates a subscription to the sensors of the 4 Libelium stations. This is done by calling the function subscribe_sensor for each station and sensor type in the start code block:
("MAG" "ROS" "BRI" "PLA")
(for-each ("tem" "pre" "hum") sensor_type
(subscribe-sensor libelium_station sensor_type)
Where the subscribe_sensor function is:
(function (libelium_station sensor_type)
(list "IDENTITY_KEY" => setup/provider_key)
"body" => (list "endpoint" => setup/callback)
"input-format" => "json"
"output-format" => "json"
After that, whenever a station publishes a new data for a sensor, Sentilo will invoke the @callback exterior function:
(function (context data)
(set info (parse data "json"))
(set sensor (split info/sensor "_"))
(set station sensor/1)
(set sensor_type sensor/2)
(set sensor_value (number info/message))
(set timestamp info/time)
(### "save last value to history_data")
(if (not (has history_data sensor_type))
(put history_data sensor_type (list))
(has (get history_data sensor_type) station)
(get history_data sensor_type)
(get (get history_data sensor_type) station)
(get (get current_data sensor_type) station)
(push history_values last_value)
(### "remove oldest value if necessary")
(if (> (size history_values) 1000)
(remove history_values 0)
(### "save current value to current_data")
(if (not (has current_data sensor_type))
(put current_data sensor_type (list))
(get current_data sensor_type)
(list sensor_value timestamp)
(module-notify (concat "@get-" sensor_type))
(concat "@get-" sensor_type "-history")
This function reads the sensor data and save it in two global lists:
These lists are read by the graph widget of the dashboards of this module to plot the sensor values: