Topics¶
Topic structure¶
All topics must use this structure. When a level is not applicable, this level must be replaced by -:
1/2/3/4/5/6...n
| Level | Description |
|---|---|
| 1 | Module name |
| 2 | Principal. By default it is interpreted as business partner ID. For system providers prefix the ID with sp-, for system distributors with sd-. I. e. sp-f0eef712-234f-4d4c-aa89-ae1bd39239c0 or sd-ec12fae1-dacf-4e6f-bd15-aafce92cfe45. You can pass an asterisk (*) instead of the ID if the topic is for all principals of that level. E. g. (sp-*). |
| 3 | Administration unit ID |
| 4 | spu (for system provider user), sdu (for system distributor user), bpu (for business partner user) or eu (for enduser) |
| 5 | User ID |
| 6 to n | Custom topic levels |
For example:
c1-core/48109350-1db6-11e9-8e66-2f71a0be4cc5/71.1000.103.2.1/spu/0604b020-7905-11eb-ad7b-f9e2c6c59018/...
If there is no associated administration unit:
c1-core/48109350-1db6-11e9-8e66-2f71a0be4cc5/-/spu/0604b020-7905-11eb-ad7b-f9e2c6c59018/...
If there is no associated user:
c1-core/48109350-1db6-11e9-8e66-2f71a0be4cc5/71.1000.103.2.1/-/-/...
Available topics¶
The following topics are available:
Payload¶
The payload must be in JSON format and it must be an object. Apart from that there are no restrictions.
Verified information¶
The modules and C1 Core add a key named verifiedData to the JSON objects. verifiedData includes all relevant fields, the data is associated to. The module adding this information must make sure, it is correct. verifiedData must only be added by trusted modules. Like this you can rely on this information and can use it for ACL checks. An example verifiedData object might look like this:
"verifiedData": {
"time": <Unix epoch time in ms (UTC)>,
"sp": "<system provider ID>",
"sd": "<system distributor ID>",
"bp": "<business partner ID>",
"au": "<full administration unit ID>",
"homeClientAu": "<full administration unit ID of edge client>",
"userType": "sp" | "sd" | "bp" | "eu",
"userId": "user ID",
"nodeName": "<node name>"
}
homeClientAu contains the administration unit ID of the edge client. It differs from au in some cases. au always starts with homeClientAu though, i. e. it can only be the same or hierarchically below homeClientAu (an edge client can not and is not allowed to generate events for another edge client). It differs for example when there is only one edge client for the whole economic unit but the event is for a building or apartment.
nodeName is set to the host's name of the module connected to C1 Core.
C1 Core¶
User administration unit association¶
Topic¶
c1-core/<business partner ID>/<full administration unit ID>/eu/<enduser ID>/association
Description¶
Called whenever an end user is associated to or unassociated from an administration unit.
Payload¶
{
"verifiedData": ...,
"event": "association" | "unassociation",
"au": "{full administration unit ID}",
"userId": "{enduser ID}"
}
Asset updated¶
Migrated to Kafka in 2026-04. This event no longer fans out via the legacy module-event RPC mechanism (
moduleEventSubscriptions). Subscribe with a librdkafka consumer using your module's Kafka client certificate; events are partitioned by<bp>:<asset>so all events for one asset arrive on one partition in order.
Kafka topic¶
c1-core.asset-updated (24 partitions, replication factor 3)
Key¶
<business partner ID>:<asset ID>, e.g. 00b8692a-7789-484f-9916-0a41b4af5444:2:1002.2
Headers¶
| Name | Value |
|---|---|
event-version |
1 |
producer-module |
c1-core |
bp |
<business partner ID> (mirrors the key prefix) |
Description¶
Published whenever an economic unit, property or administration unit is updated (including address changes).
Payload¶
{
"verifiedData": {"bp": "<business partner ID>", ...},
"event": "asset-updated",
"asset": { ... },
"userId": { ... }
}
Asset deleted¶
Migrated to Kafka in 2026-04. Same migration as
asset-updatedabove — subscribe via librdkafka, not viamoduleEventSubscriptions.
Kafka topic¶
c1-core.asset-deleted (24 partitions, replication factor 3)
Key¶
<business partner ID>:<asset ID>, e.g. 00b8692a-7789-484f-9916-0a41b4af5444:2:1002.2
Headers¶
| Name | Value |
|---|---|
event-version |
1 |
producer-module |
c1-core |
bp |
<business partner ID> (mirrors the key prefix) |
Description¶
Published whenever an economic unit, property or administration unit is deleted.
Payload¶
{
"verifiedData": {"bp": "<business partner ID>", ...},
"event": "asset-deleted",
"asset": { ... },
"userId": { ... }
}
Edge clients¶
Telemetry¶
Migrated to Kafka in 2026-04. This event no longer fans out via the legacy module-event RPC mechanism (
moduleEventSubscriptions). Subscribe with a librdkafka consumer using your module's Kafka client certificate; events are partitioned by<bp>:<edge_client_id>so events for one edge client arrive in order on one partition.
Kafka topic¶
c1-home.telemetry (24 partitions, replication factor 3)
Key¶
<business partner ID>:<edge client ID>, e.g. 3b63a6e0-115d-11ec-b71b-e5c263011554:22:ac27c6c1-1f97-4be3-b1f6-4f4da86b0a68.1.1.
The <edge client ID> value may itself contain colons (portfolio-prefixed
administration unit IDs have the form <portfolioId>:<eu>.<p>.<au>), so
consumers must split on the first colon only and treat the remainder of the
key verbatim.
Headers¶
| Name | Value |
|---|---|
event-version |
1 |
producer-module |
c1-device-management |
bp |
<business partner ID> (mirrors the key prefix) |
edge-client-id |
<edge client ID> (mirrors the key suffix) |
sub-id |
<sub ID> (edge client sub-instance, usually 1) |
telemetry-path |
sub-path below telemetry/, e.g. device/<peer>/<channel>/<data point>, interface/<interface>/<data point>, or system/<data point> |
Description¶
Published whenever a data point of an actual device (telemetry-path
prefix device/), a communication interface (interface/), or a system
value (system/) on an edge client is updated.
Note
Always use the time stored in the JSON object. There might be huge latencies or you might receive a cached value, so you cannot use the reception time.
Payload¶
{
"verifiedData": ...,
"time": <time of event generation>,
"value": <actual value>
}
Service messages from edge clients¶
Topic¶
c1-home/<business partner ID>/<administration unit ID>/-/-/<sub ID>/service-message
Description¶
Called when a service message is generated or deleted.
Note
The topic part c1-home/<business partner ID>/<administration unit ID>/-/-/<sub ID>/ is prepended in C1 Proxy so it cannot be forged. I. e. this can be treated as verified information.
Payload¶
There is always a property named type present depending on the value of type there are different properties available. type can be global, family or device.
Type "global"¶
Global service messages are not associated to a device or a communication interface. They are associated to the whole edge client instance, i. e. the whole gateway.
{
"verifiedData": ...,
"type": "global",
"message": {"en-US": "<message>", "en": "<message>", "de-DE": "<message>", "de-AT": "<message>", "de": "<message>", ...},
"active": true | false,
"timestamp": <unix epoch time in seconds>,
"priority": <priority>,
"messageId": "<message ID>"
}
| Property | Type | Description |
|---|---|---|
message |
Object | Contains all available message translations. Fall back language is en, so this translation is always present. |
active |
Boolean | true means the service message is active, false means, it should be removed. |
timestamp |
Number | The time the service message was generated in seconds. |
priority |
Number | The priority of the service message. 1 for critical, 2 for error, 3 for warning and 4 for info. |
messageId |
String | A unique service message ID. Every service message type gets it's own ID. When a service message with an existing ID arrives, the old service message should be overridden. |
data |
Variant | Optional additional data associated with the service message. |
Type "family"¶
Family service messages are associated to a device family. When interface is set, they are associated to a communication interface.
{
"verifiedData": ...,
"type": "family",
"message": {"en-US": "<message>", "en": "<message>", "de-DE": "<message>", "de-AT": "<message>", "de": "<message>", ...},
"active": true | false,
"timestamp": <unix epoch time in seconds>,
"priority": <priority>,
"messageId": "<message ID>",
"familyId": <family ID>,
"interface": "<interface ID>"
}
| Property | Type | Description |
|---|---|---|
message |
Object | Contains all available message translations. Fallback language is en, so this translation is always present. |
active |
Boolean | true means the service message is active, false means, it should be removed. |
timestamp |
Number | The time the service message was generated in seconds. |
priority |
Number | The priority of the service message. 1 for critical, 2 for error, 3 for warning and 4 for info. |
messageId |
String | A unique service message ID. Every service message type gets it's own ID. When a service message with an existing ID arrives, the old service message should be overridden. |
familyId |
Number | The ID of the device family the service message is associated to. |
interface |
String | The interface the service message is associated to. |
Type "device"¶
Device service messages are associated to a specific. When interface is set, they are associated to a communication interface.
{
"verifiedData": ...,
"type": "device",
"message": {"en-US": "<message>", "en": "<message>", "de-DE": "<message>", "de-AT": "<message>", "de": "<message>", ...},
"active": true | false,
"timestamp": <unix epoch time in seconds>,
"priority": <priority>,
"messageId": "<message ID>",
"peerId": <peer ID>,
"channel": <channel>,
"variable": "<variable>"
}
| Property | Type | Description |
|---|---|---|
message |
Object | Contains all available message translations. Fallback language is en, so this translation is always present. |
active |
Boolean | true means the service message is active, false means, it should be removed. |
timestamp |
Number | The time the service message was generated in seconds. |
priority |
Number | The priority of the service message. 1 for critical, 2 for error, 3 for warning and 4 for info. |
messageId |
String | A unique service message ID. Every service message type gets it's own ID. When a service message with an existing ID arrives, the old service message should be overridden. |
peerId |
Number | The ID of the device the service message is associated to. |
channel |
Number | The channel of the device the service message is associated to. |
variable |
String | The data point the service message is associated to. |
All modules¶
Service messages¶
Topic¶
<module ID>/<business partner ID>/-/-/-/-/service-message
Description¶
Called when a service message is generated or deleted by an Sensaru Cloud module.
Note
The topic part <module ID>/ must match the module's ID as specified in the client certificate. Otherwise the RPC call will be rejected by C1 Core.
Payload¶
{
"verifiedData": ...,
"id": "<service message UUID>"
"message": {"en-US": "<message>", "en": "<message>", "de-DE": "<message>", "de-AT": "<message>", "de": "<message>", ...},
"active": true | false,
"timestamp": <unix epoch time in milliseconds>,
"priority": <priority>,
"header": "<header>",
"footer": "<footer>",
"entityId": "<entity ID>",
"locationId": "<location ID>",
"roles": [<role 1>, <role 2>, ...],
"url": "<url>"
}
| Property | Type | Description |
|---|---|---|
id |
String | The UUID of the service message. |
message |
Object | Contains all available message translations. Fallback language is en, so this translation is always present. |
active |
Boolean | true means the service message is active, false means, it should be removed. |
timestamp |
Number | The time the service message was generated in milliseconds. |
priority |
Number | The priority of the service message. 1 for critical, 2 for error, 3 for warning and 4 for info. |
header |
String | A line describing the entity the service message is associated to. E. g. the name of the device. |
footer |
String | A line further describing the entity the service message is associated to. E. g. the address. |
entityId |
String | An ID identifying the entity that triggered the service message, e. g. the ERP system ID of the device. |
roles |
Array[Integer] | Only applicable for service messages for edge devices. The array contains the roles of the device or data point. |
url |
String | The URL for the detailed service message view. This URL is opened within an iframe next to the service message. |
Telemetry¶
Topic¶
<module ID>/sp-*/-/-/-/<server>/service-telemetry/<data-point>
Description¶
Called whenever a service telemetry data point is updated.