← API Reference Home
ESP RainMaker Neo Node MQTT API 0.8.0

MQTT API definitions for ESP RainMaker Neo platform for nodes.

This spec documents every MQTT topic a node publishes to or subscribes to, including AWS IoT Core managed topics.

Boot Sequence

  1. MQTT connect
  2. Subscribe from_cloud (required before reporting online = true)
  3. Subscribe shadow update-accepted topics as needed
  4. Publish to_cloud with events: getGroupInfo, getAlexaEn, getGVAEn, getSchedVer, getTriggerVer (optionally getTimeSync for a fast coarse clock sync while SNTP converges)
  5. Receive from_cloud response → derive {groupInfoStr}
  6. Subscribe control topics:
    • Unicast params: user/params-{groupInfoStr}/params
    • Group broadcast (device-type addressed): groups/{groupId}/control and per-subgroup groups/{groupId}/subgroups/{subgroupId}/control
  7. If config changed → publish setNodeConfig via to_cloud
  8. When all prerequisites hold (node registered, MQTT connected, from_cloud subscribed, params topic(s) subscribed) → report online: true to both shadows
  9. Report full reported state to both shadows

Online flag: Node sets online = true only after the above; cloud sets online = false when the device disconnects (e.g. presence). The node does not publish online = false; it may clear local online state on disconnect.

Servers

  • mqtt://{iot-endpoint}-ats.iot.{region}.amazonaws.com/mqttproduction

    AWS IoT Core endpoint (region-specific, TLS mutual auth)

    Security:
    • X509:

      X.509 certificate-based mutual TLS authentication with AWS IoT Core. Each node has a unique certificate issued and registered by the ESP RainMaker Neo platform. The IoT policy restricts topics to ${iot:Connection.Thing.ThingName} and ${iot:Connection.Thing.Attributes[group_id]} for group control.

      Devices connect using TLS mutual authentication.

Operations

  • SEND $aws/events/presence/connected/{nodeId}

    [AWS IoT Core → Cloud] Node connection lifecycle event (auto-generated).

    AWS IoT Core lifecycle event — node connected

    Operation IDonPresenceConnected

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"

    Accepts the following message:

    connected

    AWS IoT Core connection lifecycle event

    Message IDconnected
    object

    Examples

  • SEND $aws/events/presence/disconnected/{nodeId}

    [AWS IoT Core → Cloud] Node disconnection lifecycle event (auto-generated).

    AWS IoT Core lifecycle event — node disconnected

    Operation IDonPresenceDisconnected

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"

    Accepts the following message:

    disconnected

    AWS IoT Core disconnection lifecycle event

    Message IDdisconnected
    object

    Examples

  • SEND rainmaker/nodes/{nodeId}/to_cloud

    [Node → Cloud] Unified channel for all node-initiated events.

    Note: Use Basic Ingest topic $aws/rules/node_to_cloud_rule/rainmaker/nodes/<node_id>/to_cloud to save costs.

    Node publishes event requests to the cloud

    Node sends one or more named events (get/set) to the cloud.

    Operation IDpublishToCloud

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"

    Accepts the following message:

    deviceEvent

    Node-to-cloud event request

    Message IDdeviceEvent

    The node publishes one or more named events. set events carry a payload; get events are name-only (the cloud returns the data in from_cloud).

    object

    Examples

  • RECEIVE rainmaker/nodes/{nodeId}/from_cloud

    [Cloud → Node] Unified channel for cloud responses and unsolicited events. Subscribed immediately after MQTT connect (first subscription).

    Node receives event responses and unsolicited pushes from the cloud

    Cloud sends event responses (e.g. group info, schedule details) and unsolicited pushes (e.g. updated schedule/trigger versions) to the node.

    Operation IDsubscribeFromCloud

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"

    Accepts the following message:

    cloudEvent

    Cloud-to-node event response

    Message IDcloudEvent

    Cloud returns event payloads keyed by event name. set events return { "status": "success" } or { "status": "error", "message": "..." }. get events return event-specific data. Events may arrive unsolicited (e.g. schedule push after user edits).

    object

    Examples

  • RECEIVE rainmaker/nodes/{nodeId}/user/params-{groupInfoStr}/params

    [Cloud → Node] Unicast parameter control. Subscribed after group info is received. User/app-initiated commands.

    Node receives user-initiated parameter control commands (unicast)

    Operation IDsubscribeUserParams

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    paramControl

    Unicast parameter update command to node

    Message IDparamControl

    User/app-initiated parameter changes delivered to a single node.

    Default data model: device name → { param name → value }.

    Matter data model: endpoint hex → { c → { s|c → { cluster hex → { c → { command hex → TLV hex } } } } }.

    object

    Examples

  • RECEIVE rainmaker/nodes/groups/{groupId}/control

    [Cloud → Node] Group broadcast control (device-type addressed). All nodes in the group receive this message; each node applies the payload only to its own devices whose type matches a top-level key.

    Node receives device-type-addressed control commands for the group

    Operation IDsubscribeGroupControl

    Available only on servers:

    object
    groupId
    required
    string

    6-character alphanumeric primary group ID

      Examples values:
    • "a1bc2d"

    Accepts the following message:

    groupControlBroadcast

    Control command broadcast to all nodes in a group or subgroup

    Message IDgroupControlBroadcast

    Control payload broadcast on rainmaker/nodes/groups/{groupId}/control (group) or rainmaker/nodes/groups/{groupId}/subgroups/{subgroupId}/control (subgroup).

    Default data model: top-level keys are device types (e.g. esp.device.light). Each device's value is an object that holds nested sub-keys describing what to apply — currently only params is defined, with room for additional sub-keys (e.g. cmd, meta) in future without another topic rename. Nodes apply the payload only to their own devices that match the listed device types; other devices are ignored.

    Matter data model: command invocations only. Same nested structure as the unicast ParamControl message, except the top-level endpoint key is the wildcard endpoint "0xffff" (not a specific endpoint): 0xffff → c → s|c → cluster → c → { command hex → TLV hex }. Each node invokes the command on every endpoint that supports the addressed cluster + command, resolved from its own support list.

    object

    Default: map of device type → control envelope. Matter: the unicast ParamControl command structure.

    Examples

  • RECEIVE rainmaker/nodes/groups/{groupId}/subgroups/{subgroupId}/control

    [Cloud → Node] Subgroup-specific control (device-type addressed). One subscription per subgroup the node belongs to.

    Node receives device-type-addressed control commands for a specific subgroup

    Operation IDsubscribeSubgroupControlBroadcast

    Available only on servers:

    object
    groupId
    required
    string

    6-character alphanumeric primary group ID

      Examples values:
    • "a1bc2d"
    subgroupId
    required
    string

    3-character alphanumeric individual subgroup ID

      Examples values:
    • "sg1"
    • "sg2"

    Accepts the following message:

    subgroupControlBroadcast

    Control command broadcast to all nodes in a group or subgroup

    Message IDsubgroupControlBroadcast

    Control payload broadcast on rainmaker/nodes/groups/{groupId}/control (group) or rainmaker/nodes/groups/{groupId}/subgroups/{subgroupId}/control (subgroup).

    Default data model: top-level keys are device types (e.g. esp.device.light). Each device's value is an object that holds nested sub-keys describing what to apply — currently only params is defined, with room for additional sub-keys (e.g. cmd, meta) in future without another topic rename. Nodes apply the payload only to their own devices that match the listed device types; other devices are ignored.

    Matter data model: command invocations only. Same nested structure as the unicast ParamControl message, except the top-level endpoint key is the wildcard endpoint "0xffff" (not a specific endpoint): 0xffff → c → s|c → cluster → c → { command hex → TLV hex }. Each node invokes the command on every endpoint that supports the addressed cluster + command, resolved from its own support list.

    object

    Default: map of device type → control envelope. Matter: the unicast ParamControl command structure.

    Examples

  • SEND $aws/things/{nodeId}/shadow/name/params-{groupInfoStr}/update

    [Node → AWS IoT Shadow] Named shadow update (group-scoped). Contains full reported state of all node parameters, online status, config version, and notify settings. Shadow name: params-{groupInfoStr}.

    Node reports full/delta state to the named (group-scoped) shadow

    Operation IDpublishNamedShadowUpdate

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    shadowUpdate

    Node reports state to named shadow

    Message IDshadowUpdate

    Shadow name: params-{groupInfoStr}. Contains reported node params, online status, config version, and notify metadata. Delta updates (only changed params) except on reconnection (full state).

    object

    Examples

  • SEND $aws/things/{nodeId}/shadow/name/params-{groupInfoStr}/delete

    [Node → AWS IoT Shadow] Delete old named shadow during group migration. When group info changes, the old shadow is deleted before creating a new one.

    Node deletes old named shadow during group migration

    Operation IDpublishNamedShadowDelete

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    shadowDelete
    Message IDshadowDelete
    object

    Empty or minimal JSON

    Examples

  • RECEIVE $aws/things/{nodeId}/shadow/name/params-{groupInfoStr}/update/delta

    [AWS IoT Shadow → Node] Delta between desired and reported state for the group-scoped named shadow. Delivered when the cloud sets desired state (e.g. an app or automation writes params). This is how a node learns of cloud-driven parameter changes.

    Node receives desired-vs-reported delta for the named shadow

    Operation IDsubscribeNamedShadowUpdateDelta

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    shadowDelta
    Message IDshadowDelta
    object

    { state, metadata, version, timestamp } — state carries the desired delta

    Examples

  • RECEIVE $aws/things/{nodeId}/shadow/name/params-{groupInfoStr}/update/accepted

    [AWS IoT Shadow → Node] Confirmation that a shadow update was accepted, carrying the resulting shadow document.

    Node receives confirmation that a shadow update was accepted

    Operation IDsubscribeNamedShadowUpdateAccepted

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    shadowAccepted
    Message IDshadowAccepted
    object

    Full shadow document { state: { reported, desired }, metadata, version, timestamp }

    Examples

  • RECEIVE $aws/things/{nodeId}/shadow/name/params-{groupInfoStr}/update/rejected

    [AWS IoT Shadow → Node] Notification that a shadow update was rejected (e.g. version conflict), so the node can retry or re-sync.

    Node receives notification that a shadow update was rejected

    Operation IDsubscribeNamedShadowUpdateRejected

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    shadowRejected
    Message IDshadowRejected
    object

    { code, message, timestamp }

    Examples

  • SEND $aws/things/{nodeId}/shadow/name/params-{groupInfoStr}/get

    [Node → AWS IoT Shadow] Request the current named shadow document (typically on connect/reconnect). The document is returned on .../get/accepted.

    Node requests the current named shadow document (response on get/accepted)

    Operation IDpublishNamedShadowGet

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    shadowGet
    Message IDshadowGet
    object

    Empty JSON

    Examples

  • RECEIVE $aws/things/{nodeId}/shadow/name/params-{groupInfoStr}/get/accepted

    [AWS IoT Shadow → Node] Current named shadow document returned in response to a get request.

    Node receives the current named shadow document

    Operation IDsubscribeNamedShadowGetAccepted

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    shadowGetAccepted
    Message IDshadowGetAccepted
    object

    Full shadow document { state: { reported, desired }, metadata, version, timestamp }

    Examples

  • SEND $aws/things/{nodeId}/shadow/name/iparams/update

    [Node → AWS IoT Shadow] Indexed shadow update. Contains only indexed parameters and node tags for fleet indexing. Shadow name is always iparams (static, not group-scoped).

    Node reports indexed parameters and tags to the iparams shadow

    Operation IDpublishIndexedShadowUpdate

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"

    Accepts the following message:

    indexedUpdate

    Node reports indexed params and tags to iparams shadow

    Message IDindexedUpdate

    Shadow name: iparams (static, not group-scoped). Same state.reported wrapper as the named shadow: optional data (tags), params (only parameters with the indexed config property), online, ncfg_ver, notify.

    Tags: state.reported.data.<who>.t with <who>admin | device | user. Firmware should update device tags only.

    Matter: Same nested reporting shape as the named shadow for params, filtered to indexed attributes.

    object

    Examples

  • SEND rainmaker/nodes/{nodeId}/ts/{groupInfoStr}

    [Node → Cloud] Timeseries data.

    Note: Use Basic Ingest topic $aws/rules/node_ts_rule/rainmaker/nodes/<node_id>/ts/<group_info_str> to save costs.

    Node publishes timestamped sensor/telemetry data

    Operation IDpublishTimeseries

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    tsData

    Timestamped sensor/telemetry data point

    Message IDtsData
    object

    Examples

  • SEND rainmaker/nodes/{nodeId}/notify/{groupInfoStr}

    [Node → Cloud] Direct notifications.

    Note: Use Basic Ingest topic $aws/rules/node_notify_rule/rainmaker/nodes/<node_id>/notify/<group_info_str> to save costs.

    Node publishes direct notifications (e.g. automation trigger state)

    Operation IDpublishNotification

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    groupInfoStr
    required
    string

    Group info string: <group_id>[-<sub1>-<sub2>-…] with subgroups sorted alphabetically. Empty string if node is unassociated (e.g. shadow name becomes params-).

      Examples values:
    • "a1bc2d"
    • "a1bc2d-sg1-sg2"
    • ""

    Accepts the following message:

    notifyData

    Direct notification from node

    Message IDnotifyData

    Notification payload grouped by notification type. The top-level notify object is an open map: each key selects a backend notification service that consumes the value.

    Built-in service keys:

    • automation — Automation trigger state updates
    • push — Mobile push notifications
    • node_reset — Node reports a self factory-reset; backend notifies group members and disassociates the node
    • webhook_<platform> — Configured webhook service, keyed by platform name

    For push, automation, and node_reset, the value under the key is a flag — the payload content is ignored by the backend; the service derives its message from notification metadata (node ID, shadow delta, trigger state). For webhook_<platform>, the value is forwarded to the configured webhook.

    The same notify object structure is reused inside state.reported.params.notify on the named shadow update — dispatch logic is identical for both paths.

    object

    Examples

  • RECEIVE $aws/things/{nodeId}/jobs/notify-next

    [AWS IoT Jobs → Node] Notification of next pending job. Node subscribes on startup to receive OTA job notifications.

    Node subscribes to next pending job notification (OTA)

    Operation IDsubscribeJobNotifyNext

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"

    Accepts the following message:

    jobNotify

    Next pending job notification

    Message IDjobNotify
    object

    Examples

  • SEND $aws/things/{nodeId}/jobs/{jobId}/get

    [Node → AWS IoT Jobs] Request full job document.

    Node requests full job document for a specific job

    Operation IDpublishJobGet

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    jobId
    required
    string

    AWS IoT Jobs job ID

      Examples values:
    • "AFR_OTA-ota_job_20240115"

    Accepts the following message:

    jobGetRequest
    Message IDjobGetRequest
    object

    Empty object to request job document

    Examples

  • RECEIVE $aws/things/{nodeId}/jobs/{jobId}/get/accepted

    [AWS IoT Jobs → Node] Job document response.

    Node receives job document

    Operation IDsubscribeJobGetAccepted

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    jobId
    required
    string

    AWS IoT Jobs job ID

      Examples values:
    • "AFR_OTA-ota_job_20240115"

    Accepts the following message:

    jobDocument

    Full job document response

    Message IDjobDocument
    object

    Examples

  • SEND $aws/things/{nodeId}/jobs/{jobId}/update

    [Node → AWS IoT Jobs] Report job execution status.

    Node reports job execution status (IN_PROGRESS, SUCCEEDED, FAILED)

    Operation IDpublishJobUpdate

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    jobId
    required
    string

    AWS IoT Jobs job ID

      Examples values:
    • "AFR_OTA-ota_job_20240115"

    Accepts the following message:

    jobStatus

    Node reports job execution status

    Message IDjobStatus
    object

    Examples

  • SEND $aws/things/{nodeId}/streams/{streamName}/get/{dataType}

    [Node → AWS IoT Streams] GetStream request. data_type is json or cbor; body encoding must match. Use the same data_type on streamsData for block delivery.

    Reference: AWS IoT — MQTT-based file delivery in devices (GetStream request fields, limits, optional bitmap).

    Node publishes GetStream requests (`…/get/{dataType}`)

    Operation IDpublishStreamRequest

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    streamName
    required
    string

    AWS IoT Streams stream name (for MQTT-based OTA file transfer)

      Examples values:
    • "AFR_OTA-stream-1234567890"
    dataType
    required
    string

    Message encoding suffix for MQTT-based file delivery: json or cbor. Must match across the paired …/get/{dataType} publish and …/data/{dataType} subscription.

      Examples values:
    • "json"
    • "cbor"

    Accepts the following message:

    streamReq
    Message IDstreamReq
    object

    AWS GetStream request body. Field names and rules: AWS IoT — MQTT-based file delivery in devices.

    Examples

  • RECEIVE $aws/things/{nodeId}/streams/{streamName}/data/{dataType}

    [AWS IoT Streams → Node] GetStream response — file blocks. data_type must match the paired …/get/{dataType} topic.

    Reference: AWS IoT — MQTT-based file delivery in devices (GetStream response shape, Base64 vs CBOR).

    Node receives file blocks (`…/data/{dataType}`)

    Operation IDsubscribeStreamData

    Available only on servers:

    object
    nodeId
    required
    string

    Unique node identifier (Thing Name / Node ID / MQTT Client ID)

      Examples values:
    • "ABCDEF1234567890"
    • "ESP32_Light_001"
    streamName
    required
    string

    AWS IoT Streams stream name (for MQTT-based OTA file transfer)

      Examples values:
    • "AFR_OTA-stream-1234567890"
    dataType
    required
    string

    Message encoding suffix for MQTT-based file delivery: json or cbor. Must match across the paired …/get/{dataType} publish and …/data/{dataType} subscription.

      Examples values:
    • "json"
    • "cbor"

    Accepts the following message:

    streamBlock
    Message IDstreamBlock
    Payload
    string
    format: binary

    GetStream response payload: JSON with Base64 p when data_type = json, or CBOR when data_type = cbor. AWS IoT — MQTT-based file delivery in devices.

    Examples

Messages

  • #1toCloudMessage

    Node-to-cloud event request

    Message IDtoCloudMessage

    The node publishes one or more named events. set events carry a payload; get events are name-only (the cloud returns the data in from_cloud).

    object
  • #2fromCloudMessage

    Cloud-to-node event response

    Message IDfromCloudMessage

    Cloud returns event payloads keyed by event name. set events return { "status": "success" } or { "status": "error", "message": "..." }. get events return event-specific data. Events may arrive unsolicited (e.g. schedule push after user edits).

    object
  • #3paramControlMessage

    Unicast parameter update command to node

    Message IDparamControlMessage

    User/app-initiated parameter changes delivered to a single node.

    Default data model: device name → { param name → value }.

    Matter data model: endpoint hex → { c → { s|c → { cluster hex → { c → { command hex → TLV hex } } } } }.

    object
  • #4groupControlBroadcastMessage

    Control command broadcast to all nodes in a group or subgroup

    Message IDgroupControlBroadcastMessage

    Control payload broadcast on rainmaker/nodes/groups/{groupId}/control (group) or rainmaker/nodes/groups/{groupId}/subgroups/{subgroupId}/control (subgroup).

    Default data model: top-level keys are device types (e.g. esp.device.light). Each device's value is an object that holds nested sub-keys describing what to apply — currently only params is defined, with room for additional sub-keys (e.g. cmd, meta) in future without another topic rename. Nodes apply the payload only to their own devices that match the listed device types; other devices are ignored.

    Matter data model: command invocations only. Same nested structure as the unicast ParamControl message, except the top-level endpoint key is the wildcard endpoint "0xffff" (not a specific endpoint): 0xffff → c → s|c → cluster → c → { command hex → TLV hex }. Each node invokes the command on every endpoint that supports the addressed cluster + command, resolved from its own support list.

    object

    Default: map of device type → control envelope. Matter: the unicast ParamControl command structure.

  • #5namedShadowUpdateMessage

    Node reports state to named shadow

    Message IDnamedShadowUpdateMessage

    Shadow name: params-{groupInfoStr}. Contains reported node params, online status, config version, and notify metadata. Delta updates (only changed params) except on reconnection (full state).

    object
  • #6indexedShadowUpdateMessage

    Node reports indexed params and tags to iparams shadow

    Message IDindexedShadowUpdateMessage

    Shadow name: iparams (static, not group-scoped). Same state.reported wrapper as the named shadow: optional data (tags), params (only parameters with the indexed config property), online, ncfg_ver, notify.

    Tags: state.reported.data.<who>.t with <who>admin | device | user. Firmware should update device tags only.

    Matter: Same nested reporting shape as the named shadow for params, filtered to indexed attributes.

    object
  • #7timeseriesMessage

    Timestamped sensor/telemetry data point

    Message IDtimeseriesMessage
    object
  • #8notificationMessage

    Direct notification from node

    Message IDnotificationMessage

    Notification payload grouped by notification type. The top-level notify object is an open map: each key selects a backend notification service that consumes the value.

    Built-in service keys:

    • automation — Automation trigger state updates
    • push — Mobile push notifications
    • node_reset — Node reports a self factory-reset; backend notifies group members and disassociates the node
    • webhook_<platform> — Configured webhook service, keyed by platform name

    For push, automation, and node_reset, the value under the key is a flag — the payload content is ignored by the backend; the service derives its message from notification metadata (node ID, shadow delta, trigger state). For webhook_<platform>, the value is forwarded to the configured webhook.

    The same notify object structure is reused inside state.reported.params.notify on the named shadow update — dispatch logic is identical for both paths.

    object
  • #9presenceConnectedMessage

    AWS IoT Core connection lifecycle event

    Message IDpresenceConnectedMessage
    object
  • #10presenceDisconnectedMessage

    AWS IoT Core disconnection lifecycle event

    Message IDpresenceDisconnectedMessage
    object
  • #11jobNotifyNextMessage

    Next pending job notification

    Message IDjobNotifyNextMessage
    object
  • #12jobDocumentMessage

    Full job document response

    Message IDjobDocumentMessage
    object
  • #13jobUpdateMessage

    Node reports job execution status

    Message IDjobUpdateMessage
    object

Schemas

  • object

    Node configuration payload (sent via setNodeConfig event)

  • object

    Clusters on this endpoint. s = server-side clusters; inner c = client-side clusters. Cluster map keys are cluster IDs in lowercase hex (e.g., 0x3d).

  • object

    Server cluster — exposed attributes, events, accepted commands, indexed, timeseries and config-only attributes. i (indexed) and ts (timeseries) are independent property sets and may overlap — an attribute that is both indexed and timeseries appears in both arrays. v holds config-only attribute values (reported in node config only, never in state). a lists the remaining plain attribute IDs and is omitted when empty.

  • object

    Client cluster — available generated commands

  • object

    Parameter definition within node config

  • object

    Schedule definition

  • object

    Date-based schedule trigger

  • object

    Solar (sunrise/sunset) schedule trigger

  • object

    One-shot relative trigger (fires once, N seconds from now)

  • object

    Automation trigger definition

  • object

    ESP RainMaker Neo OTA job document (extends AFR-OTA format)

      Examples values:
    • {"name":"MQTT+HTTP OTA with download window","payload":{"afr_ota":{"protocols":["MQTT","HTTP"],"streamname":"AFR_OTA-stream-1234567890","files":[{"filepath":"/firmware.bin","filesize":1048576,"fileid":"firmware_v2.1.0","certfile":"/ota-test-cert","sig-sha256-ecdsa":"MEQCIG...signature..."}]},"rmng_ota":{"fw_version":"2.1.0","min_fw_version":"1.0.0","metadata":{"release_notes":"Bug fixes and performance improvements"},"download_window":{"validity":{"start":1704067200,"end":1706745600},"daily":{"start":60,"end":360}}}}}