IoT FAQ

Find answers to common questions about configuring and using the Internet of Things (IoT) Platform.

Use these questions and answers to find the related concepts, tasks, scenarios, and reference information for OCI IoT resources and integrations.

IoT Domains and Domain Groups

How do I manage an IoT domain group?
See IoT Domain Groups for the available Console, CLI, and API operations for creating, listing, updating, moving, configuring, and deleting domain groups.
How do I manage an IoT domain?
See IoT Domains for the available Console, CLI, and API operations for creating, listing, updating, moving, configuring data access and retention, and deleting domains.
Is there an example of using an IoT domain group?
Yes. Working with an IoT Domain Group shows how to create a domain group, associate a domain, and configure database access. For more examples, see Scenarios.
Is there an example of using an IoT domain?
Yes. Working with an IoT Domain shows how to create a domain and configure database access. For more examples, see Scenarios.
How does timeObserved affect data retention?
Retention for historized data is calculated from when a sample is inserted into the database, not from its timeObserved value. Buffered or delayed telemetry can therefore remain longer than its observation timestamp alone suggests. A record becomes eligible for removal when the elapsed time since insertion exceeds the configured retention period. See Managing Data Retention.

Work Requests

How do I view work requests?
See Work Requests to list work requests, review their lifecycle states, and retrieve associated errors and logs by using the Console, CLI, or API.

Digital Twin Resources

How do I work with digital twin instances?
See Digital Twin Instances to create, list, get, update, and delete instances, retrieve their content, configure connectivity, and invoke commands.
How do I configure authentication for a digital twin instance?
Configure basic authentication with an OCI Vault secret or configure production authentication with an mTLS certificate. See Digital Twin Instances for related instance operations.
How do I work with digital twin models?
A digital twin model defines the semantics of a digital twin and uses a Digital Twin Model Identifier (DTMI). See DTDL v3 for the supported Digital Twins Definition Language requirements and Creating a Digital Twin Model.
How do I work with digital twin adapters?
A digital twin adapter defines the data mappings and reference payload associated with a digital twin. See Digital Twin Adapters for the available operations and examples.
How do I work with digital twin relationships?
A digital twin relationship describes a link to another digital twin instance. See Digital Twin Relationships for the available operations.
When do I use a plain-text secret value or base64 secret contents?
Use the decoded plain-text secret value as the device password when authenticating with HTTPS or MQTTS. HTTP and MQTT clients perform the required protocol encoding, so don't supply an already base64-encoded password. Encode secret contents as required when creating or uploading an OCI Vault secret. When you obtain an OAuth access token for ORDS, follow that procedure's requirements for the secret value.

JQ Expressions

What timestamp formats are accepted for timeObserved?
Direct JSONPath mapping accepts a JSON number containing a Unix epoch value in seconds, milliseconds, or microseconds, or a UTC string in exactly the form yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z', such as 2025-08-20T16:07:09.888841Z. See Mapping timeObserved.
Is direct JSONPath assignment, such as timeObserved: $.timestamp, supported?
Yes. Use "timeObserved": "$.timestamp" when the selected value is already in an accepted form. JSONPath selects the value without converting it. See Mapping timeObserved.
What happens when the mapped timestamp field is missing or null?
A missing direct-mapped field causes the platform to use the message receive time. An explicit JSON null selected by direct JSONPath isn't a supported timestamp. If the field can be missing or null, use the guarded expression in Handle a missing or null timestamp.
When are timestamp conversion functions required in the adapter?
Use the OCI IoT JQ extension fromdateformat when the payload timestamp uses another format, such as a custom-formatted string. It parses the value with the specified pattern and returns epoch microseconds. See Mapping timeObserved.
Where should timestamp parsing errors appear in adapter diagnostics or logs?
Static JSON, JQ syntax, or configuration errors are reported by Console or API validation when the adapter is created or updated. An HTTP 202 Accepted response to a device request only confirms acceptance for asynchronous processing. For runtime timestamp conversion or validation failures, check the domain database REJECTED_DATA table and its REASON_CODE and REASON_MESSAGE columns. An adapter-specific OCI Logging location for these failures is not documented. See Troubleshooting timeObserved mappings.
Are there reference examples showing how to map a device payload timestamp into digital twin observation time?
Yes. Mapping timeObserved includes direct JSONPath and fromdateformat examples and links to the public OCI IoT sample.

Device Connectivity and Data Access

Are there examples of connecting devices?
Yes. Connecting a Device includes HTTPS and MQTTS examples for sending structured and unstructured telemetry and receiving commands.
Are there examples of accessing data in the IoT Platform?
Yes. Connecting to IoT Data covers APEX, ORDS, direct database connections, Oracle Analytics Cloud, and other supported data-access patterns.

Select AI

What can I ask Select AI about IoT data?
You can ask about device readings, telemetry trends, missing data, abnormal events, and recent device activity when the Select AI profile has access to the relevant IoT tables, views, or schemas. See Querying IoT Data with Select AI in APEX.
Does Select AI replace SQL review?
No. Select AI can generate and run SQL from a natural-language prompt, but review generated SQL before using the results for operational decisions, automation, or incident response.
How does Select AI know which IoT tables to use?
Select AI uses the database objects and metadata from the IoT database schema.
Can Select AI query IoT data that isn't stored locally in Autonomous AI Database?
Yes, when the data is exposed through supported database objects such as views over database links, cloud links, external tables, or federated tables. See Use an AI Data Gateway for Select AI NL2SQL.
Do I have to set up Select AI?
Yes. Configure the database connection for the IoT domain, and then follow the Select AI scenario to create a profile and query the IoT data.

Indirectly Connected Devices and Gateways

For an end-to-end gateway workflow, see Create Digital Twins for Indirectly Connected Devices Using a Gateway. For advanced route-level targeting and nested payload examples, see Route Indirect Device Data Using target and contentRoot.

Can I configure a digital twin instance to be indirectly connected so that another device sends data on its behalf?
Yes. Create the instance with the INDIRECT connectivity type and associate it with one or more gateway digital twin instances instead of giving the device its own authentication ID. See Working with Indirectly Connected Devices and Gateways.
Can I change the connectivity type of an existing digital twin instance?
Yes. You can change an existing instance between DIRECT, INDIRECT, and GATEWAY. Include the complete model, adapter, authentication ID, and gateway configuration required by the destination type. See Change a Digital Twin Instance Connectivity Type for the end-to-end scenario and Updating a Digital Twin Instance for the authoritative operation requirements.
Can I change an existing digital twin instance to Not connected or NONE?
No. Not connected is the Console label for the CLI and API value NONE, but it isn't a supported update destination. Create a new digital twin instance with that connectivity type instead.
Can I select a different model while changing connectivity?
Only when the model is compatible. It must have the same DTMI path and major version as the current model, and the same or a higher minor version. You can't switch to an unrelated model in the same update.
Why can't I change a gateway to another connectivity type?
Active indirectly connected instances still depend on it. Reassign those downstream instances to another gateway or change them to a supported connectivity type, and then retry the gateway update.
How can I tell which devices are connected through a specific gateway and understand the impact of losing that gateway?
Use the gateway details page to review the associated device count and dependent digital twin instances before maintenance, migration, or delete operations. Find the Gateway details on the IoT domain page, by selecting the Gateway tab to view the gateway list, select a gateway to go to the Gateway details page. See Listing IoT Domains.
How do I know which digital twin instances are directly connected, indirectly connected, or gateways?
Review the connectivity type for each digital twin instance and use the digital twin instance or gateway list pages to identify gateway associations and understand the domain topology.
How can I configure a gateway adapter so incoming telemetry is routed to the correct target device?
Resolve target in the inbound envelope when forwarded messages use one consistent device identification and payload convention. Resolve it in the inbound routes when device families require different target expressions, content roots, endpoint conditions, or payload mappings. See Create Digital Twin Adapters and Route Indirect Device Data Using target and contentRoot.
When should I use envelope-level targeting instead of route-level targeting?
Use envelope-level targeting when forwarded device messages follow one consistent device identification and payload convention. Use route-level targeting when device families require different target expressions, content roots, endpoint conditions, or payload mappings. See Choose a Gateway Adapter Pattern.
When are the gateway's inbound routes evaluated?
The service evaluates the inbound routes only when the gateway envelope's target expression is absent or resolves to null. If an envelope-level target resolves to a non-null value, the message is delegated immediately and the inbound routes are not evaluated.
What does a route-level target identify?
It is a JQ expression that must resolve to the external key of a digital twin instance associated with the gateway. In the content root scenario, ${endpoint(2)} resolves to hvac1 or compressor1.
Does target change the incoming endpoint?
No. The target expression resolves the indirectly connected digital twin and its adapter, but it does not rewrite the endpoint. The target adapter receives the original endpoint and then evaluates its own inbound routes.
Can the target adapter have multiple inbound routes?
Yes. The target adapter can use condition-based routes, including a wildcard route. Because the original endpoint is preserved, design the route conditions carefully when an adapter is shared by directly and indirectly connected devices.
When is a route-level contentRoot used?
It is used only when that route's target resolves to a non-null value. The service delegates the selected object to the target device's adapter. See Route by target and contentRoot.
What happens when a route's target resolves to null?
The route's contentRoot is ignored. If the route also contains payloadMapping, the mapping is applied to the current digital twin instance.
How can the gateway process its own telemetry?
Define a gateway route whose target is absent or resolves to null, and use payloadMapping to map the data to the gateway digital twin. Gateway telemetry and indirectly connected device telemetry can use separate endpoints so that each route has a clear condition.
Can the target external key come from the message instead of the endpoint?
Yes. The target expression can resolve an external key from a shared envelope field, such as a device key at the top level of the incoming JSON message. This can be useful when clients use a stable topic instead of placing each device key in the endpoint.
Can one digital twin model have multiple adapters?
Yes. You can create multiple adapters for the same model when devices use different data structures. Each digital twin instance is associated with the adapter that matches its incoming data.
Can directly and indirectly connected devices share an adapter?
Yes, when their payload structures and endpoint-routing requirements are compatible. Adapters typically represent the structure of incoming data rather than the connectivity topology.
How many envelope mapping sections can an adapter define?
An adapter has one envelopeMapping section. Use route-level target and contentRoot values when the adapter must route multiple indirectly connected device types or payload structures.
How is timeObserved handled after delegation?
The target adapter inherits the non-null timeObserved value resolved by the gateway envelope. If the target adapter resolves its own non-null value, that value overrides the inherited timestamp.
Why are the wrong-content-root test messages rejected?
The HVAC route delegates $.data, so a payload that contains only $.telemetry does not provide the expected HVAC data. The compressor route delegates $.telemetry, so a payload that contains only $.data does not provide the expected compressor data. See Send Telemetry Data.
Can I reuse one gateway across directly and indirectly connected devices without duplicating definitions?
Yes. Treat the gateway as a reusable asset, create the matching adapters once, and associate the gateway with each indirectly connected device that uses the adapter route condition.
Can I send unstructured telemetry from indirectly connected devices?
Yes. If you don't need structured payload mapping for the target device, send the raw payload through the gateway and omit the device-specific adapter.
Can I invoke unstructured commands on indirectly connected devices and on the gateway itself?
Yes. Use raw command endpoints for both patterns. Add a response endpoint when the gateway must publish an application-level acknowledgment for the target device. See Invoke Unstructured Commands.
For example, use boilers/boiler1/actions/reset as the request endpoint and boilers/boiler1/actions/response as the response endpoint.
Can I associate a device with multiple gateways so that it can roam?
Yes. An indirectly connected device can be associated with one or more gateways so it retains the same digital twin identity while moving between available gateways.
Use the --gateways option with an array of gateway digital twin instance OCIDs:
oci iot digital-twin-instance create \
  --iot-domain-id <iot-domain-OCID> \
  --connectivity-type INDIRECT \
  --display-name "Roaming Wireless Device 1" \
  --gateways '["<gateway-instance-1-OCID>","<gateway-instance-2-OCID>"]' \
  --external-key roaming-device1
Before using multi-gateway roaming in production, validate the gateway handoff behavior in a test environment.

Flow Runtimes

What is an IoT Flow Runtime?
An IoT Flow Runtime is a compartment-scoped resource that provides a managed Node-RED runtime within an IoT domain. Use it to build, deploy, and run flows that connect devices, applications, File Storage, and external endpoints.
Do I need separate credentials for the Node-RED editor?
No. Open the Node-RED editor from the OCI Console. Access to the IoT domain and Flow Runtime is controlled by OCI IAM policies.
How do I create a flow that integrates devices or applications?
First, create an IoT Flow Runtime. Open its Node-RED editor to build or import the flow, and then select Deploy. You can also replace the complete flows document by using the CLI or API. Review the Flow Runtime scenarios to understand how IoT Flow Runtimes work. Set up the shared resources, and then see ingesting live data from an external broker, ingesting batch data from Object Storage, and monitoring normalized IoT data and publishing an OCI Notification.
Do I repeat the common setup for each Flow Runtime scenario?
No. Complete the shared setup once and reuse its models, adapters, gateway, HVAC instances, and Boiler instances in all three individual scenarios.
When does the live-ingress scenario use an MQTT shared subscription?
Use $share/fr-guide/source/+/+ when multiple Flow Runtimes should divide broker messages in one group, and give every runtime a unique MQTT client ID. For one runtime, use source/+/+. See Live-ingress FAQs.
Why does batch data ingestion wait for sequential Object Storage names?
The flow processes iot-data-<counter>.csv objects in order and advances the counter only after a successful download. If the next object is missing, upload it or correct the bucket and counter before retrying. See Batch Data Ingestion FAQs.
Why didn't the monitoring scenario send an email notification?
Confirm that the email subscription is Active and the Dequeue node reads NORMALIZED_DATA with Batch Size set to 2. Only a normalized record that maps to a Boiler digital twin, has contentPath set to pressure, and has a value greater than 100 triggers the command. Also confirm that the Flow Runtime resource principal can invoke the command and publish to the Notifications topic, the command record ID reaches the SQL polling loop, and the notification branch completes. See Monitoring troubleshooting.
How does the monitoring scenario determine whether the Boiler reset succeeded?
The IoT Send Command node returns the command record ID as msg.rawCommandDataRecordId. The SQL node uses that ID to poll RAW_COMMAND_DATA. The notification reports success only when DELIVERY_STATUS is COMPLETED and RESET_RESULT is SUCCESS. The flow exits the polling loop immediately for any final delivery status. Any other final delivery status, or a COMPLETED status without a SUCCESS reset result, produces a failed-reset notification. See Validating the Polling Flow and Email Notification.
How long does the monitoring scenario poll for a command response?
The flow polls RAW_COMMAND_DATA every 5 seconds for up to 70 seconds. It exits immediately when a final delivery status is available. If no final status is available by the deadline, the flow sets DELIVERY_STATUS to POLL_TIMEOUT and sends a timeout notification. See Configuring the Monitoring Node-RED Flow.
Why did the Boiler reset command return REFUSED immediately?
A Gateway MQTT client must be connected and actively subscribed to the exact request endpoint boilers/fr-guide-boiler-01/command/reset before the flow sends the command. If no connected client has that subscription, the raw command finishes immediately with DELIVERY_STATUS set to REFUSED.
Can I use the live-ingestion flow to generate the monitoring scenario test message?
Yes. To publish directly to the IoT device host, send the payload to boilers/fr-guide-boiler-01 using the gateway credentials. To use the live-ingestion flow, publish the same payload to source/boilers/fr-guide-boiler-01 on the external broker. The live-ingestion flow converts the public topic to the device-host topic.
How do I send Node-RED system-console logs to OCI Logging?
Configure the Flow Runtime with an OCI Logging log group and, optionally, an existing log in the customer tenancy. Messages written to the Node-RED runtime log are delivered to the configured log. See Scenario: Configure Log Access for an IoT Flow Runtime to configure the destination, generate a test system-console message, and verify it by using the Console, CLI, or API.
Why can I see a message in the Node-RED Debug sidebar but not in OCI Logging?
The Debug sidebar is an interactive editor view and isn't the Flow Runtime's durable log destination. Configure the Debug node to send its output to the system console or runtime log, deploy the flow, trigger it again, and search the configured OCI log. See Generate a Node-RED System-Console Message.
How do I manage nodes in the Node-RED editor?
The Palette Manager is built into the Node-RED editor. It provides an integrated interface for installing, updating, disabling, and removing node modules and normally uses the public Node-RED module catalog. In an OCI IoT Flow Runtime, you can manage only the modules and versions that the service makes available or permits.
Can one IoT Flow Runtime contain multiple Node-RED flows?
Yes. An IoT Flow Runtime is identified by one OCID, but its complete Node-RED flows document can contain multiple flows. Export the flows from Node-RED as a JSON document, and then add the document to the Flow Runtime on the Flows configuration tab in the Console. Adding a document replaces the complete flows configuration, so retrieve the current document or export it from Node-RED first if you need a backup.
How do I enable or disable external network access for a Flow Runtime?
To enable external access, configure network access with a subnet that has the required routes and with network security groups that allow only the traffic the flow requires. To disable the customer VCN attachment, update the Flow Runtime and remove its networkConfig.
Can a flow use files from OCI File Storage?
Yes. Add one or more File Storage mounts to the runtime's network configuration. Each mount identifies a mount target, export, and relative mount path. For example, the value history makes the export available to the Flow Runtime at /mnt/history.
Which database schemas can a flow use?
A Flow Runtime has read access to its IoT domain's <domainShortId>__IOT schema and Read-Write access to its <domainShortId>_<flowRuntimeShortId>__FR schema. This contains any data Node-RED developer needs to store for the flow runtime. See IoT database schema.
Can I update or retrieve flows without using the Console?
Yes. Use the CLI or API procedures for updating the complete flows document and getting the current flows document.
How do I suspend or resume a Flow Runtime to control usage?
The current lifecycle operations are deactivate and activate. Deactivate the runtime when its flows don't need to run, and activate it when the flows are needed again. Monitor the associated work request until the lifecycle operation completes.
How do I monitor a Flow Runtime?
Review Flow Runtime metrics, events, and the log configured for the runtime. For common failures and recovery steps, see Troubleshooting IoT Flow Runtimes.
How do I protect access to Flow Runtimes?
Use OCI IAM policies to grant groups only the access required for their roles and compartments. Use a dynamic group and resource principal policies when a flow must access another OCI service. See Policies for Flow Runtime Resource Principals for policy syntax, placement, and least-privilege examples.
Which IAM policies does a Flow Runtime need?
The required policies depend on the runtime configuration and the supported nodes in the flow. When you create a runtime with a service log, create the applicable Logging policies. Supported OCI nodes use the Flow Runtime resource principal and need only the permissions for their target services, such as Object Storage or Notifications.
Where do I create Flow Runtime policies?
Create the applicable creation-time Logging policies in the compartment containing the log group or an appropriate parent compartment. Create resource principal policies in the compartment containing the target resource or an appropriate parent compartment. Create the resource principal dynamic group in the identity domain and use a matching rule that includes the intended Flow Runtimes.
Why does configuring Flow Runtime logging fail with an authorization error?
Confirm that the applicable creation-time Logging policies apply to the compartment containing the log group. An existing log requires read log-groups and use log-content. If you selected only a log group for automatic log creation, the policies require manage log-groups and use log-content. Also confirm that the configured log group and log OCIDs are correct. See Flow Runtime policy troubleshooting and Creating an IoT Flow Runtime.
What should I check when an OCI node reports an authorization error?
Confirm that the Flow Runtime matches the dynamic group rule, the policy names the correct target compartment, and the policy grants the exact permission required by the node operation. Verify the target resource OCID, then review the configured runtime log and policy troubleshooting steps.