Skip to content

Generic Data Model Extensions

Introduction

This document outlines the well-known properties and schema extensions for the Generic Data Model (GDM) schema. By utilizing these extension properties, you can incorporate additional information into your GDM messages, which in turn, offers more context and insights for the ingested data. Buhler Insights leverages these extensions to deliver enhanced functionality.

Well-known message-level metadata

Message metadata location

{
    "deviceId": "Fast_Baker_42",
    "messageId": "d32779a6-9b8e-4fa0-9941-9a147040f24a",
    "messageType": "state",
    "messageVersion": "1.0",
    "metadata": {
        "jobStart": "2022-09-23T14:30:59.1234567Z" // Message metadata property
    },
    "data": [...]
}

Well known custom message types

In addition to the standard message types defined in the GDM specification, the following custom message types are recognized:

Message Type CustomType Description
event asset-health-event Used to report the current health status of a machine or component.

Message metadata properties

The following table lists the well-known message metadata properties that can be used in GDM messages.

Property Type Access Scope Description
topologyReference String Public Used to reference a topology element, e.g. a machine number.
topologyReferenceType String Public Defines the TopologyReference "type", e.g. topology-machine-machineNumber.
messageIntervalMilliseconds Integer Public Expected interval in milliseconds of the message type. This information is used to setup message tracking.
plantId String Internal The plant identifier.
tenantId String Internal The tenant identifier.
timeZoneId String Internal IANA Time Zone Database identifier.
correlationId String Internal Large messages are split and related using this GUID property.
jobStartTime String Internal The start time of the job.
jobEndTime String Internal The end time of the job.
jobId String Internal The job identifier.
jobName String Internal The name of the job.
recipeName String Internal The name of the recipe.
dataTransmissionType String Internal Specifies if the data points in the message are 'delta' or a 'keyFrame' items.

Important

Internal properties must not be set by the producer. Those will be set by the ingestion process.

Well-known data metadata

Data metadata location

{
    "deviceId": "Fast_Baker_42",
    "messageId": "d32779a6-9b8e-4fa0-9941-9a147040f24a",
    "messageType": "state",
    "messageVersion": "1.0",
    "data": [
        {
            "name": "Temperature_Heater",
            "metadata": {
                "unit": "C",
                "datapointSourceId": "oven1" // Data metadata property
            },
            "values": [
                {
                    "deviceTimestamp": "2020-01-16T09:30:02.500Z",
                    "value": 120.3
                },
                {
                    "deviceTimestamp": "2020-01-16T09:31:09.000+01:00",
                    "value": 139.8
                }
            ]
        },
        {
            "name": "Temperature_Heater",
            "metadata": {
                "unit": "C",
                "datapointSourceId": "oven2" // Data metadata property
            },
            "values": [
                {
                    "deviceTimestamp": "2020-01-16T09:30:02.500Z",
                    "value": 120.3
                },
                {
                    "deviceTimestamp": "2020-01-16T09:31:09.000+01:00",
                    "value": 139.8
                }
            ]
        }
    ]
}

Data metadata properties

The following table lists the well-known message metadata properties that can be used in GDM messages.

Property Type Access Scope Description
datapointSourceId String Public Used to reference a data source, e.g. a room number and distinguish data points with the same names, e.g. temperature.
datapointAddress String Public The exact address of the data source e.g. OPC UA node id.
logicalPath String Public Hierarchical path to the data source e.g. roll1::left::temperature.
logicalName String Public Logical name of the data source e.g. Top roll, left sensor.
conditionId String Public Used to correlate job events e.g. Die Casting start/stop events.
conditionName String Internal The name of an opc ua condition
sourceName String Internal The source of an opc ua condition
topologyReference String Public Used to reference a topology element, e.g. a machine number.
topologyReferenceType String Public Defines the TopologyReference "type", e.g. topology-machine-machineNumber.
active Boolean Public Used to indicate if an alarm is active or not.
severity String Public Used to indicate the severity of an alarm.
reason String Public Used to indicate the reason of an alarm.
state String Public Used to indicate the state of an alarm.
text String Public The text description of an alarm.
jobStartTime String Internal The start time of the job.
jobEndTime String Internal The end time of the job.
jobId String Internal The job identifier.
jobName String Internal The name of the job.
recipeName String Internal The name of the recipe.
dataTransmissionType String Internal Specifies if the data point is a 'delta' or a 'keyFrame'.
eventId String Internal ID coming from producer, should Uniquely identify the event.
diagnosisCode String Internal Acts as identifier of the diagnosed issue.

Health Event

A health event message is a special kind of event with a fixed custom message type (event:asset-health-event_v1.0). This message type allows the system to reliably determine the health state of a machine or component. Health events are utilized by Condition Based Maintenance (CBM) systems to trigger maintenance actions, generate work orders, and monitor asset health over time. The message structure includes well-known metadata fields and custom properties that provide context about the event, its origin, and the diagnosed issue.

Metadata Properties

Key Type Description
topologyReference String References the topology element (e.g., machine number) associated with the health event.
topologyReferenceType String Defines the type of topology reference (e.g., topology-machine-machineNumber).
eventId String Uniquely identifies the health event instance; typically set by the rule engine.
conditionId String Identifies the reason or rule for raising the health event (e.g., RuleId from Rule Service).
diagnosisCode String Identifier for the diagnosed issue (e.g., RING_WEIGHT_LOW).
text String Descriptive text about the health event;
severity String Severity of the health event; possible values: "Info", "Warning", "Error".

Sample message

{
  "deviceId":       "rule-service", // well known virtual device for Rule service
  "messageId":      "d32779a6-9b8e-4fa0-9941-9a147040f24a",
  "messageType":    "event:asset-health-event_v1.0", // well known custom message type for health event 
  "messageVersion": "1.0",
  "metadata": { "plantId": "123123" },// Will be added implicitely, producer will not care about it
  "data": [
    {
      "name": "RING_WEIGHT_HEALTH", // It can be same as Machine/Component Health
      /* ←––––– CUSTOM FIELDS live here ––––––→ */
      "metadata": {
        "topologyReference":  "000012341234",
        "topologyReferenceType": "topology-machine-machineNumber",

        /* The two IDs that form the HA → AG contract */ Well Known
        "eventId": "he-20251016-0901", // ID coming from Rule Engine or any producer, and should Uniquely identify the event, may be another GUID ,mandatory for health event

         // For Rule Service it should be the RuleId, and nothing to do with the conditionId of the Rule service          
        "conditionId" : "b32779a6-9b8e-4fa0-9941-9a147040f28a"    //   inspired by OPC-UA structure 

        "diagnosisCode": "RING_WEIGHT_LOW", // acts as identifier of the diagnosed issue.
        "text": "The value OurRingWeight Level was lower than 25. Actual value was 18." // Additional information about conditions . // 200 char in UTF-8 will be taken for creation of workorder request. Producer application should strip at 197 character and add ellipses (...)
        "severity" : "error" // Possible values  "Info","Warning", "Error" // default is error, but user can override, and it should co-relate the value specified

      },

      "values": [
        {
          "deviceTimestamp": "2025-10-16T06:32:54.500Z",
          "value": 0.1 /* 
            0 - 1, 0 for unhealthy and 1 for healthy where values in between would be possible in the future.
            */
        }
      ]
    }    
  ]
}