Telemetry

Telemetry

/IOTCONNECT™ Telemetry provides real-time device data ingestion and visualization. Sensor data flows continuously from connected devices to the cloud where it is validated, stored, and made available for monitoring, rule evaluation, and analytics. This page shows how to send telemetry as a JSON object with the /IOTCONNECT™ Python SDK, how to set up template attributes so your values are accepted as Reporting data instead of Faulty data, and how to check the result in the portal.

What is Telemetry

Telemetry is the continuous flow of sensor data from IoT devices to the /IOTCONNECT™ cloud platform. Devices publish measurements such as temperature, humidity, pressure, GPS location, and operational status at configured intervals via MQTT protocol.

When a device sends telemetry, the platform validates the message structure and attribute data types against the device template. Valid data is immediately available for real-time monitoring on the Live Data tab, evaluated by the rule engine for condition-based automation, and persisted to storage for historical analysis.

Telemetry ingestion supports high-frequency data from thousands of concurrent devices with sub-second latency from device publish to portal visibility.

How It Works

D2C Telemetry Workflow

Here is what happens from the moment the device starts to the moment the data appears in the portal, using the Python SDK:

1. Start the SDK: your app creates IoTConnectSDK(UniqueId, SdkOptions) and the SDK connects the device.

2. Sync: the SDK sends the Hello message (mt 200) and then asks for the template attributes (mt 201).

3. Attributes arrive: the response lists every attribute with its local name (ln), data type (dt) and validation rule (dv). The Hello response also carries the Data Frequency (df) and the rpt and flt topics.

4. Ready: the SDK calls your onReady() callback. Only start sending data after this.

5. Send: your app calls SendData() with a list of objects, each with a time and a data JSON object.

6. Check: the SDK checks every value against its attribute. A value of the right type that passes the validation rule is Reporting data. A value of the wrong type, a value outside the rule, or a key with no matching attribute is Faulty data. A call made sooner than the Data Frequency after the last accepted one is skipped.

7. Reporting message: the valid values are published on the rpt topic.

8. Faulty message: if any values failed, they are published in a second message, with the same shape, on the flt topic.

9. Reporting data in /IOTCONNECT™: it appears on the device’s Live Data tab, is checked by the rule engine, and is stored.

10. Faulty data: it is kept apart as faulty data. It does not appear as normal telemetry and is never evaluated by rules.

11. Result: SendData() returns True when the message was published. If the device is offline, the SDK saves the message to offline storage and publishes it when the connection comes back.

Reporting and Faulty Data

Every telemetry value ends up as one of two types. The split happens in the SDK on the device, before anything is sent, and it is based only on the attributes of the device template.

Type MQTT topic Which values What /IOTCONNECT™ does with it
Reporting rpt Values whose key matches an attribute local name, whose type matches the attribute data type, and which pass the attribute validation rule (if one is set). Shows it on Live Data (Telemetry, Graph and Tabular views), evaluates rules on it, stores it, and routes it to connectors that have the Telemetry data type selected.
Faulty flt Values of the wrong type, values outside the validation rule, and keys that have no matching attribute. Keeps it as faulty data for troubleshooting. It is not shown as normal telemetry and is not evaluated by rules. Connectors that have the Faulty data type selected receive it.

How the SDK decides

Per value, not per message: one SendData() call can produce both a Reporting and a Faulty message. A wrong value only moves that one value to Faulty; the rest of the object is still reported.

Names must match exactly: the key in your JSON must be the attribute’s Local Name, with the same case. A key with no attribute is sent to Faulty with its value unchanged.

Nested objects: for an OBJECT attribute, each child key is checked against the child attributes. Failed or unknown children go to Faulty under the same parent name.

Number strings are converted: for INTEGER, LONG and DECIMAL attributes the SDK converts number strings such as "25" to numbers, and the converted number is what gets reported.

Turning the checks off: with "skipValidation": True in the SDK options, the SDK does not check types or rules, and every value whose key matches an attribute is reported. Keys with no attribute are still sent to Faulty.

Edge devices: on a template with Edge enabled the SDK aggregates numeric values and publishes them on the erpt topic instead. See D2C Messages.

Viewing telemetry

Device telemetry can be viewed in real time from the device detail page under the Live Data tab. Three visualization modes are available:

Telemetry View: Displays the latest values for each attribute in a structured list format. Values update in real time as new messages arrive from the device. Ideal for quick status checks and monitoring current device state.

Graph View: Renders numeric attribute values as time-series line charts. Select one or more attributes to visualize trends over configurable time windows. Useful for spotting patterns, anomalies, and correlations between sensor readings.

Tabular View: Shows telemetry history as a paginated data table with timestamp, attribute name, and value columns. Supports filtering by date range and attribute. Best for detailed data inspection and export.

Quick Start

Follow these steps to start receiving and viewing device telemetry in /IOTCONNECT™:

Step 1: Create a Device Template with Attributes — Navigate to Devices > Templates and create a new template. Define the attributes (sensor fields) your device will send, specifying the data type for each (e.g., temperature as DECIMAL, status as STRING).

Step 2: Create a Device — Navigate to Devices > Devices and click Create Device. Select your template, provide a unique ID, and configure the authentication method (certificate or symmetric key).

Step 3: Connect Your Device or Use the Simulator — Connect your physical device using the /IOTCONNECT™ SDK, or use the built-in device simulator to generate test telemetry data immediately without hardware.

Step 4: Navigate to the Live Data Tab — Open the device detail page and click the Live Data tab. This is where real-time telemetry appears as your device sends messages.

Step 5: View Real-Time Data — Once the device is connected and sending data, telemetry values update in real time. Switch between Telemetry View, Graph View, and Tabular View to explore your data.

Configure Attributes for Telemetry

The attributes on the device template decide which values are Reporting data, so set them up to match the JSON your device sends.

1. Open the template: go to Devices → Templates and click the template your device uses.

2. Set the Data Frequency: on the Properties tab, set Data Frequency (In Seconds). The SDK accepts at most one SendData() call per this interval and skips calls that come sooner, so send no faster than this value.

3. Add one attribute per key: on the Attributes tab, add an attribute for every key in your data object. The Local Name must be exactly the JSON key, for example temperature. Use Display Name, Unit and Color Code to control how it looks on Live Data and dashboards.

4. Choose the data type: pick the Data Type that matches the JSON value you send. Use the table below; a mismatch makes every value of that attribute Faulty.

5. Add nested values as an OBJECT: for a nested JSON object such as "gyroscope": {"x": 1.2}, create an OBJECT attribute named gyroscope and add a child attribute for each key inside it.

6. Add a validation rule (optional): if the attribute has a validation rule, the SDK receives it as dv and treats values outside it as Faulty. A rule is a comma-separated list of allowed values and ranges, for example 10 to 50, 0 to 100,255 or red,green,blue.

7. Save: save the attributes. A connected SDK receives an attribute change command and syncs the attributes again on its own; if you don’t see the change, restart the device app.

JSON values the SDK accepts for each data type

Data type Send this JSON value Reporting example Faulty example
INTEGER A whole number (32-bit) or a whole-number string 25 25.5, "abc"
LONG A whole number (64-bit) or a whole-number string 1234567890 12.5
DECIMAL Any number, or a number string 25.5, 25 "warm"
STRING A string "red" 25
BIT The number 0 or 1 1 2, true
BOOLEAN JSON true or false true "true", 1
DATE A string in YYYY-MM-DD format "2026-10-22" "22-10-2026"
TIME A string in HH:MM:SS format "11:55:22" "11:55"
DATETIME A string in exactly YYYY-MM-DDTHH:MM:SS.000Z format "2026-10-22T10:30:00.000Z" "2026-10-22T10:30:00Z"
LATLONG An array of two numbers [23.0225, 72.5714] "23.0225,72.5714"
OBJECT A JSON object; each child is checked against its own child attribute {"x": 1.2, "y": -0.4} A child key with no child attribute

The Python SDK checks DATETIME values against the literal pattern %Y-%m-%dT%H:%M:%S.000Z, so format them exactly like the sample does: datetime.now(timezone.utc).strftime("%Y-%m-%dT%H:%M:%S.000Z").

Send Telemetry with SendData()

SendData() takes a list. Each entry has a time (the timestamp of the reading) and a data object whose keys are attribute local names. Gateway devices add a uniqueId per entry to send for child devices.

Example: Attributes for the SDK Sample

The Python SDK sample sends one value of every data type, including a nested object. Create these attributes on the template so all of them are reported:

Local Name Data Type Value sent by the sample
long1 LONG Random whole number from 6000 to 9000
integer1 INTEGER Random whole number from 100 to 200
decimal1 DECIMAL Random decimal from 10.5 to 75.5
date1 DATE Today’s UTC date, YYYY-MM-DD
time1 TIME "11:55:22"
bit1 BIT 1
string1 STRING "red"
datetime1 DATETIME Current UTC time, YYYY-MM-DDTHH:MM:SS.000Z
gyroscope OBJECT Parent of the child attributes below
  bit1, boolean1 BIT, BOOLEAN 0, true
  date1, time1, datetime1 DATE, TIME, DATETIME Same formats as above
  decimal1, integer1, long1 DECIMAL, INTEGER, LONG Random numbers
  latlong1 LATLONG Array of two decimals
  string1 STRING "green"
  temperature INTEGER Random whole number from 50 to 90

Telemetry JSON Examples

The data object you pass to SendData() and the matching JSON. Keys are attribute local names; nested objects map to OBJECT attributes.

Reporting and Faulty Messages

What the SDK publishes for one SendData() call. In this example the template has DECIMAL temperature, INTEGER humidity and STRING status, and the device sends {“temperature”: “hot”, “humidity”: 60, “status”: “active”, “pressure”: 1012}.

Complete Example

A trimmed version of the /IOTCONNECT™ Python SDK sample: connect with an X.509 certificate, wait for the attributes, and send telemetry in a loop.

Verify the Telemetry Flow

On the device

Ready: with "IsDebug": True the SDK prints Atrributes Get Successfully (spelled this way in the SDK) when the attributes are synced, and your onReady callback runs.

Split: on every accepted call the SDK prints the two messages it built, as rtp: (Reporting) and flt: (Faulty). A value you expected to see in Reporting but find in Faulty points to a name, type or rule mismatch.

Publish: Publish data sucessfully... means the broker accepted the message, and the sample prints Data Publish Success.

In the portal

1. Open the device: go to Devices → Device, click the device’s Unique ID, and open the Live Data tab.

2. Telemetry view: check that every attribute shows its latest value and updates about once per Data Frequency.

3. Graph view: select numeric attributes (INTEGER, LONG, DECIMAL) to see them as time-series lines. The attribute’s Color Code and Unit are used here.

4. Tabular view: check the timestamps. They come from the time you passed, so a wrong clock or time zone on the device shows up here.

5. Look for gaps: an attribute that never gets a value on Live Data is being sent as Faulty data (or not sent at all). Compare its key, type and rule with the template.

6. Inspect Faulty data: Faulty data is not shown as telemetry. To keep and inspect it, turn on a connector and select the Faulty data type. See Connectors.

Troubleshooting

Problem Likely cause What to do
SendData() publishes nothing right after start-up The attributes are not synced yet. Wait for the onReady callback before calling SendData().
Some calls print Data Publish Fail Calls come faster than the template’s Data Frequency, so the SDK skips them. It can also mean the device is offline. Send no faster than Data Frequency, or change the value on the template. Check the connection; offline messages are stored and sent later.
An attribute never appears on Live Data The value is Faulty: the key does not match the Local Name (case matters), the type is wrong, or it fails the validation rule. Compare the JSON with the template using the data type table above, and check the flt: output on the device.
DATETIME values are always Faulty The value is not in exactly YYYY-MM-DDTHH:MM:SS.000Z format, for example it has no milliseconds or real milliseconds. Format with strftime("%Y-%m-%dT%H:%M:%S.000Z").
LATLONG values are Faulty The value was sent as a string such as "23.0225,72.5714". Send an array of two numbers: [23.0225, 72.5714].
BOOLEAN or BIT values are Faulty BOOLEAN got a string or number, or BIT got something other than 0 or 1. Send JSON true/false for BOOLEAN and 0/1 for BIT.
Decimal readings are Faulty The attribute is INTEGER or LONG. Change the attribute to DECIMAL, or round the value before sending.
Device is barred SendData() method is not permitted The SDK has not finished starting, or the device was barred from the platform. Check the device status in the portal and the SDK start-up log.

Data retention and storage

Telemetry data is retained based on your subscription plan and storage configuration. /IOTCONNECT™ supports two storage tiers:

Hot Storage — Recent telemetry data stored for fast, real-time queries. Hot storage powers the Live Data tab, dashboard widgets, and API queries. Default retention ranges from 7 to 90 days depending on your plan.

Cold Storage — Historical telemetry archived for long-term analytics and compliance. Cold storage data can be queried via export tools or connected analytics services. Retention can be configured from months to years.

You can also route telemetry to external storage via Connectors (S3, DynamoDB, DocumentDB) for custom retention and analytics pipelines. See the Connectors documentation for setup instructions.

ⓘ NOTE

Telemetry data is validated against the device template attributes. Messages containing unrecognized attribute names or mismatched data types are rejected and logged as faulty messages. Ensure your device template matches the data your device sends. With the Python SDK this check happens on the device: values that fail it are published separately on the flt topic, and only valid values are published on the rpt topic.