Data Pool & Connectors
The data pool provides central data and data management access in a dashboard. It manages connectors and their tables on demand, so a dashboard component only loads data when requested.
Data connectors manage the transaction and preparation of data. Loading data from a source is an asynchronous process as the source is usually a web server.
DataPool
Each dashboard has one DataPool instance for all components. It is available
via the Board.dataPool class property and can be configured with the
BoardOptions.dataPool option. Usually, one or more connectors get defined,
including the ID, the data source, and whether the data needs
additional modification. The ID is used to retrieve a connector, which is an
asynchronous process.
DataPool Example
async function run() {
const board = await Dashboards.board('container', {
// ...
dataPool: {
connectors: [{
type: 'JSON',
id: 'My Series Data',
enablePolling: true,
jsonURL: 'https://'
}, {
type: 'CSV',
id: 'My Currency Data',
csvURL: 'https://'
dataModifier: {
type: 'Math',
columnFormulas: [{
column: 'My Fixed Rate',
formula: 'A1*7.8'
}]
}
}]
}
// ...
}, true);
// A component usually performs access to the data pool.
const table = await board.dataPool.getConnectorTable('My Currency Data');
const modifiedTable = table.modified;
}
run();DataConnector
The DataConnector is the base class for all connectors; as a stand-alone, it can not load or save data.
It includes common functionality like events, server polling, and managing meta information like the column order.
Additionally, the DataConnector contains the registry of all available
connectors. You can access the registry via DataConnector.types.
CSVConnector
The CSVConnector allows the loading of structured text data, where a comma or semicolon separates each table
cell, while a line break separates each row. You can provide data via a URL or directly with a CSV string. Details
of all available options can be found in the
API documentation .
CSVConnector Example
async function run() {
const connector = new DataConnector.types.CSV({
csvURL: 'https://demo-live-data.highcharts.com/updating-set.csv'
});
await connector.load();
}
run();GoogleSheetsConnector
With the GoogleSheetsConnector, is it possible to load table data from a Google
Docs spreadsheet. The connector needs the API key related to a Google account
and the document ID. See the
API documentation
for all options.
Please note that the Google account needs read access to the document. Usually the Google account should not be the owner of the document, as this decreases the possibilities of limiting access.
GoogleSheetsConnector Example
async function run() {
const connector = new DataConnector.types.GoogleSheets({
googleAPIKey: 'Aa...zz',
googleSpreadsheetKey: 'Bb...wW'
});
await connector.load();
}
run();GoogleSheetsConnector Tutorial
Google Sheets is a spreadsheet application included in Google’s free, web-based Google Docs Editors suite.
With the GoogleSheetsConnector in Highcharts Dashboards, you can load tables from a Google spreadsheet into one of your dashboard
components, whether a Grid, KPI, or chart. Like with other connectors, DataModifiers may be applied during parsing.
Alternatively, the data may be filtered or modified before it is parsed in the beforeParse callback.
The connector requires two API keys: one for the Google Spreadsheets API and one for the document itself. In addition, the Google account owner must grant read access to the document. See the GoogleSheetsConnector API for further details.
Google API key
Prerequisite
The document owner must have a Google Cloud Project where the API/Service with Google Sheets API is enabled and an API key exists.
Providing the Google Sheet API exists, the API key can be extracted from the Credentials Panel .
Spreadsheet Key
The spreadsheet key can be extracted directly from the URL of the document as illustrated below:
https://docs.google.com/spreadsheets/d/1U17c4GljMWpgk1bcTvUzIuWT8vdOnlCBHTm5S8Jh8tw/editSpreadsheet key: 1U17c4GljMWpgk1bcTvUzIuWT8vdOnlCBHTm5S8Jh8tw
Basic demo
HTMLTableConnector
The HTMLTableConnector allows the import and export of an HTML table as a
DataTable. It is the only connector not supporting loading from a
remote source. Instead, one provides an element reference from the current web
page. Details are listed in the
API documentation .
HTMLTableConnector Example
async function run() {
const connector = new DataConnector.types.HTMLTable({
dataTable: document.querySelector('#table');
});
await connector.load();
}
run();JSONConnector
The JSONConnector supports loading data in a row-oriented structure, as found
in Highcharts series types. The connector options can also control how columns
and rows are structured in the JSON array to support other structures. See the
API documentation
for all possible combinations.
JSONConnector Example
async function run() {
const connector = new DataConnector.types.JSON({
data: [
['row 1', 1, 2, 3],
['row 2', 2, 3, 4],
['row 3', 0, 1, 2]
]
});
await connector.load();
}
run();Custom Data Connectors
It is possible to create additional DataConnectors based on the DataConnector
base class. An implementation usually has three steps to fulfil:
- Load the data from the source and react to possible transaction errors.
- Create a
DataTableand add the data to it. - Make the table available, and in case of related options, update the table with incoming changes from the source.
You can see a typical implementation of this in the
GoogleSheetsConnector .
Please note that the included connectors use a separate converter instance for the second step, which involves adding the data to the DataTable.
Custom Data Connector Tutorial (MQTT)
This tutorial shows how to implement a Custom Data Connector for the
MQTT protocol and how to deploy it in a simple Highcharts Dashboards application. The connector is implemented as a JavaScript class and is independent of the application.
About MQTT
MQTT is the de facto standard protocol for low-resource, low-power devices and is widely used in IoT applications across a wide range of industries: mobile internet, Smart Hardware, the Internet of Vehicles, Smart Cities, Telemedicine, Power, Oil, Energy, and other fields.
The hub of the MQTT network infrastructure is the so-called broker, a server to which applications can send messages and where clients (e.g., a web application) can subscribe to a topic. MQTT is a protocol on top of TCP/IP and for web clients available as WebSocket or TCP.
MQTT data
The MQTT data packet consists of a topic that uniquely defines a data set for a specific connection and a text payload. The payload is typically a JSON object, and the MQTT custom connector described in this tutorial supports JSON only.
MQTT connect
Establishing a data link to an MQTT broker typically consists of these steps:
- Connect to the
brokerwith a given host name and port number, with optional authentication (user, password). - Wait for a successful connection.
- Subscribe to one or more
topics. - Wait for confirmation of the subscription.
- Packets now arrive at a rate determined by the data provider (often a wireless sensor application).
- Process the incoming packets.
The MQTT client may also send packets to a broker, but this feature is not implemented in the custom DataConnector we use for this tutorial.
MQTT Custom Connector
The base class for the MQTTConnector is the DataConnector, where the constructor and the load methods are re-implemented. The load method differs from that of the CSV and JSON connectors in that data is not waiting for arrival (due to the nature of the MQTT protocol, no data may be available immediately). However, it establishes the connection and subscribes to the subject defined in the connector options, providing that the autoConnect and autoSubscribe options are set (the default behavior).
The MQTT Connector uses the JSONConverter for parsing, thus providing the application with a beforeParse callback invoked on every packet reception. This callback is crucial to implementing an application because the payload of the incoming packet is typically a hierarchical JSON object whereas the dashboard implementation requires a single-level data structure.
In addition, the MQTTConnector provides these custom methods:
- connect
- subscribe
- unsubscribe
- disconnect
In a typical application, these are unnecessary as the whole connect/subscribe sequence is executed by default using the load method.
The MQTT connector supports the following optional callbacks:
- beforeParse - fired before an incoming packet is parsed
- connectEvent - handles both connect/disconnect
- subscribeEvent - handles subscribe/unsubscribe
- packetEvent - fired on an incoming packet
- errorEvent - reports errors from the MQTT client or the connector
The standard DataConnector events load, afterLoad and loadError are not used, but stub callbacks are provided for reference.
Although the JSONConnector and the MQTTConnector have much in common, there are some important differences:
- The MQTT Connector does not use polling
- The
loadmethod does not return any data - The
orientationoption is fixed tocolumns - The options
dataUrl,dataModifierandfirstRowAsNamesare not supported - The MQTT connector has some additional options:
autoConnect- automatically connect after loadautoSubscribe- automatically subscribe on connectautoReset- clear data table on subscribemaxRows- maximum number of rows in the data table
MQTT client options
The MQTTConnector uses the PAHO client library (version 1.1.0) for access control and communication with the MQTT Broker. This library supports MQTT versions 3.1 and 3.1.1.
The client options are the following:
- host - the name of the MQTT broker (e.g. mqtt.mosquitto.org or broker.hivemq.com)
- port - WebSocket port (depends on the broker). See HiveMQ for an example.
- user - empty for anonymous clients
- password - empty for anonymous clients
- useSSL - true for a secure connection
- topic - MQTT topic
- timeout - connection timeout, value in seconds
- qOs - quality of service
The sample application
The MQTTConnector is implemented in a sample application that displays incoming data from two connectors, one for each MQTT topic.
Each connector provides data for a spline chart and a Grid Component. In addition, timestamped events and the raw data are displayed as unformatted text in a message log that resides outside the Dashboards container. The user may clear the log.
The sample application relies on data being published to the two MQTT topics (highcharts/topic1 and highcharts/topic2). The payload of the MQTT packet must be in a specific format to work correctly (see the example below).
The data is generated by an MQTT client hosted by Highcharts. It uses the HiveMQ Websocket Client , publishing to the topics highcharts/topic1 and highcharts/topic2.
NB! Clicking the Connect button connects the application to the MQTT broker and subscribes to the two mentioned topics. Data should immediately appear in the charts and data grids.
Example data:
highcharts/topic1Message
{
"name": "North Sea",
"value": 35.69,
"timestamp": "2024-09-12T08:12:01.028Z"
}Reuse
The MQTTConnector can be reused for other applications by copying the entire class from the demo’s Javascript file. The implementation is found at the bottom of the file. It is also important to copy the MQTTConnector.defaultOptions and the code line that registers the connector as a Dashboards component.
// Register the connector
MQTTConnector.registerType('MQTT', MQTTConnector);