Retrieving data in MATLAB¶
MATLAB R2016b has a built-in HTTP client function, webread. Moreover, this function returns already decoded MATLAB object if the received content is in JSON format. We use this function to retrieve and decode the JSON data.
tbl = query(Domain, ApiKey, TimeFilter, Name1, Value1, ..., NameN, ValueN)
To download the source of query.m, please use the
Download ZIP button on the GitHubGist page.
query fetches time series data from Domain according to TimeFilter, Name1, Value1, …, NameN, ValueN, and converts the returned data into a table object. Below are the required parameters.
query(___, Name1, Value1, ..., NameN, ValueN) specifies additional filters and the output format of the table.
- InfluxQL regular expression to select devices, the default value
"//"matches all devices
- InfluxQL regular expression to select locations, the default value
"//"matches all locations
- InfluxQL regular expression to select sensors, the default value
"//"matches all sensors
- allows returning network-related data
- filters out all network-related data
- InfluxQL regular expression to select channels, the default value
"//"matches all channels
- InfluxQL aggregate function evaluated on the selected data, default is no aggregation
- InfluxQL time interval value, used with AggFunc
- return time series into individual columns
- return all time series in a single column
- convert timestamps into date time objects
- return timestamps in unix time in milliseconds
- Timezone name, used with ConvertTimestamp, the default value is
The following MATLAB script demonstrates the main functionality of query function with our demo.decentlab.com server. Before running the script, please download query.m from our gist repository by clicking the
Raw button and save it in your MATLAB environment.
>> tbl = query(... 'demo.decentlab.com', ... 'eyJrIjoiclhMRFFvUXFzQXpKVkZydm52b0VMRVg3M3U2b3VqQUciLCJuIjoiZGF0YS1xdWVyeS1hcGktZGVtby0yIiwiaWQiOjF9', ... 'time > now() - 1d', ... 'Device', '/26/', ... 'Sensor', '/(temperature)|(humidity)/', ... 'AggFunc', 'mean', ... 'AggInterval', '7m');
The above example will retrieve the data from demo.decentlab.com server, matching the following criteria:
- devices with id
- sensor names containing either
- compute the mean of groups divided by 7 min interval
- received in the last one day
The result of the above script.
unstack operation may change the field names so that they become valid identifiers in MATLAB.
x is prepended to the series starting with digits, and
_. You should use the original names instead of these names in the query function. Please consult the original names in the Sensors dashboard.
>> summary(tbl) Variables: time: 205x1 datetime Values: min 05-Feb-2017 16:37:00 median 06-Feb-2017 04:31:00 max 06-Feb-2017 16:32:00 x266_sht_humidity: 205x1 double Values: min 28.977 median 29.942 max 31.498 NaNs 1 x266_sht_temperature: 205x1 double Values: min 20.15 median 20.193 max 22.155 x267_sensirion_sht21_humidity: 205x1 double Values: min 37.182 median 37.808 max 50.32 NaNs 199 x267_sensirion_sht21_temperature: 205x1 double Values: min 2.2066 median 10.186 max 13.135 NaNs 199
Another example demonstrates different possibilities.
>> tbl = query(... 'demo.decentlab.com', ... 'eyJrIjoiclhMRFFvUXFzQXpKVkZydm52b0VMRVg3M3U2b3VqQUciLCJuIjoiZGF0YS1xdWVyeS1hcGktZGVtby0yIiwiaWQiOjF9', ... 'time >= ''2016-12-01 00:00:00'' AND time < ''2017-01-01 00:00:00''', ... 'Device', '/^266$/', ... 'Sensor', '/^sht-/', ... 'Timezone', 'Europe/Zurich', ... 'DoUnstack', false);
In this example, we obtain data received from only 266.
$ indicates the beginning and ending of regular expression so that no other id containing
266, such as
_266a, matches the expression. In addition, all sensors starting with
sht- are selected. The casting was disabled to obtain single column output data.
>> summary(tbl) Variables: time: 17144x1 datetime Values: min 01-Dec-2016 01:02:43 median 16-Dec-2016 16:29:52 max 01-Jan-2017 00:57:02 series: 17144x1 cell array of character vectors value: 17144x1 double Values: min 15.469 median 24.258 max 33.417
Here, the data received in the December of 2016 is returned. Please be careful with absolute time value in a query because it is always interpreted in UTC, and the output is also in UTC by default. For instance, the output timezone is Europe/Zurich in this example, and therefore the time values are beyond 2016-12-31 23:59:59, which is in the timezone of UTC+01 (winter time).