Asset Attributes
Concept overview
The asset attribute system provides a flexible way to define and store custom properties for different types of assets. It consists of four main components:
- AttributeType: Defines a reusable attribute template (e.g., "Power (kW)", "Manufacturer", "Installation Date")
- AssetTypeAttribute: Links an AttributeType to an AssetType, defining whether it's required and providing default values
- AssetAttributeValue: Stores the actual attribute values for a specific Asset instance
- AttributeOption: For dropdown/select attributes, defines the available options
This system allows different asset types to have different sets of attributes while maintaining consistency across assets of the same type.
Why it matters
- Flexibility: Different asset types can have completely different attribute sets without modifying the database schema
- Type safety: Each attribute has a defined data type (Text, Integer, Decimal, DateTime, Boolean, Option) with optional validation rules
- Consistency: All assets of the same type share the same attribute definitions, ensuring uniform data collection
- Defaults: Asset types can specify default values, streamlining asset creation
- Validation: Min/max ranges for numeric and datetime attributes ensure data quality
Data types
AttributeType supports six data types:
- Text: Free-form text strings (stored in
TextValue) - Integer: Whole numbers with optional min/max validation (stored in
IntValue) - Decimal: Numbers with decimal places and optional min/max validation (stored in
DecimalValue) - DateTime: Date and time values with optional min/max validation (stored in
DateTimeValue) - Boolean: True/false values (stored in
BoolValue) - Option: Single or multi-select from predefined options (stored as
OptionIdreference)
How it works
1. Define an AttributeType
First, create an AttributeType that can be reused across multiple asset types:
var powerAttribute = new AttributeType
{
Code = "POWER_KW",
Name = "Power (kW)",
Description = "Rated power consumption in kilowatts",
DataType = AttributeDataType.Decimal,
Unit = "kW",
MinDecimal = 0,
MaxDecimal = 10000,
IsMultiValued = false
};
For dropdown/select attributes:
var manufacturerAttribute = new AttributeType
{
Code = "MANUFACTURER",
Name = "Manufacturer",
DataType = AttributeDataType.Option,
IsMultiValued = false,
Options = new List<AttributeOption>
{
new() { Value = "ABB", DisplayName = "ABB", SortOrder = 1 },
new() { Value = "SIEMENS", DisplayName = "Siemens", SortOrder = 2 },
new() { Value = "GE", DisplayName = "General Electric", SortOrder = 3 }
}
};
2. Link to AssetType (AssetTypeAttribute)
When defining an AssetType, specify which attributes apply and whether they're required:
var pumpType = new AssetType { Title = "Centrifugal Pump" };
var pumpPowerAttribute = new AssetTypeAttribute
{
AssetType = pumpType,
AttributeType = powerAttribute,
IsRequired = true,
SortOrder = 1,
DefaultDecimalValue = 5.5m // Default 5.5 kW
};
var pumpManufacturerAttribute = new AssetTypeAttribute
{
AssetType = pumpType,
AttributeType = manufacturerAttribute,
IsRequired = true,
SortOrder = 2
// No default - user must select
};
3. Store values for Assets (AssetAttributeValue)
When creating or editing an Asset, store the actual attribute values:
var myPump = new Asset { Title = "Pump P-101", AssetType = pumpType };
// Store power rating
var powerValue = new AssetAttributeValue
{
Asset = myPump,
AttributeType = powerAttribute,
DecimalValue = 7.5m // This pump is rated 7.5 kW
};
// Store manufacturer selection
var manufacturerValue = new AssetAttributeValue
{
Asset = myPump,
AttributeType = manufacturerAttribute,
OptionId = abbOption.Uuid // Selected ABB
};
Key features
Multi-valued attributes
Set IsMultiValued = true on an AttributeType to allow multiple values for a single attribute. This is useful for attributes like "Certifications" or "Supported Fluids" where an asset might have multiple applicable values.
Validation rules
- Numeric ranges: Set
MinInt/MaxIntorMinDecimal/MaxDecimalto enforce valid ranges - DateTime ranges: Set
MinDateTime/MaxDateTimefor date validation (e.g., installation date must be in the past) - Required vs Optional: Use
IsRequiredon AssetTypeAttribute to make attributes mandatory
Units of measurement
The Unit field on AttributeType provides context for numeric attributes (e.g., "kW", "°C", "bar", "rpm"). This is informational and helps users understand what values to enter.
Default values
AssetTypeAttribute can specify default values for each data type:
DefaultTextValueDefaultIntValueDefaultDecimalValueDefaultBoolValueDefaultDateTimeValueDefaultOptionId
These defaults can streamline asset creation when most assets of a type share common values.
Relationships
AttributeType
├─→ AttributeOptions (many)
└─→ AssetTypeAttributes (many)
AssetType
└─→ AssetTypeAttributes (many)
└─→ AttributeType (one)
Asset
└─→ AssetAttributeValues (many)
├─→ AttributeType (one)
└─→ AttributeOption (optional, for Option type only)
Implementation Status (December 2025)
Implemented:
- ✅ AttributeType and AttributeOption entities
- ✅ AssetAttributeValue entity for storing readings
- ✅ Bidirectional sync for all attribute entities
- ✅ Reading capture during OperatorRounds
- ✅ Reading display in OperatorRound details
Not Yet Implemented (pending design decision):
- ⏳ AssetTypeAttribute junction (linking AttributeTypes to AssetTypes)
- ⏳ RouteStopAttributeType junction (defining which attributes to capture at each route stop)
- ⏳ Asset CRUD forms with attribute configuration
- ⏳ AssetType CRUD with attribute assignment
Current Status: Route Stops now define which specific attributes to capture at each stop.
Intended Implementation
The full implementation will include:
- CRUD for AttributeTypes: Admin interface to define reusable attribute templates
- AssetType configuration: When creating/editing an AssetType, specify which attributes apply and whether they're required
- Asset forms: When creating/editing an Asset, display a dynamic form with all attributes defined by its AssetType
- Type-appropriate inputs:
- Text → text input
- Integer/Decimal → numeric input with validation
- Boolean → checkbox
- DateTime → date/time picker
- Option → dropdown or radio buttons
Usage in Blueprint
Backend (API)
- AttributeType management endpoints for defining attribute templates
- AssetType configuration includes attribute assignment
- Asset create/update validates attribute values against their types and requirements
- Query assets by attribute values (e.g., "find all pumps with power > 10 kW")
Frontend (Web/Mobile)
- Admin screens for managing AttributeTypes and their options
- AssetType editor shows attribute assignment with required/optional toggles
- Asset form dynamically renders appropriate input controls based on AssetType's attributes
- Display attribute values on asset detail views
Offline support
- AttributeType and AssetTypeAttribute data synced to mobile devices
- Asset attribute values can be edited offline
- Validation rules enforced locally before sync
Example scenarios
Scenario 1: Electric Motors
AttributeType: "MOTOR_POWER"
- DataType: Decimal
- Unit: "kW"
- MinDecimal: 0.1
- MaxDecimal: 500
AttributeType: "MOTOR_SPEED"
- DataType: Integer
- Unit: "rpm"
- MinInt: 100
- MaxInt: 10000
AttributeType: "MOTOR_EFFICIENCY_CLASS"
- DataType: Option
- Options: IE1, IE2, IE3, IE4, IE5
AssetType: "Electric Motor"
- Requires: MOTOR_POWER (default: 5.5 kW)
- Requires: MOTOR_SPEED (default: 1500 rpm)
- Optional: MOTOR_EFFICIENCY_CLASS
Scenario 2: Temperature Sensors
AttributeType: "TEMP_RANGE_MIN"
- DataType: Decimal
- Unit: "°C"
AttributeType: "TEMP_RANGE_MAX"
- DataType: Decimal
- Unit: "°C"
AttributeType: "CALIBRATION_DATE"
- DataType: DateTime
AttributeType: "SENSOR_TYPE"
- DataType: Option
- Options: RTD, Thermocouple, Thermistor
AssetType: "Temperature Sensor"
- Requires: SENSOR_TYPE
- Requires: TEMP_RANGE_MIN (default: -50)
- Requires: TEMP_RANGE_MAX (default: 150)
- Optional: CALIBRATION_DATE
Example: Blueprint Paper Mill Digester Attributes
To illustrate how the attribute system works in practice, here's how Digester D-101 at Blueprint Paper Mill is configured:
AttributeType Definitions
Cooking Temperature
Code: DIGESTER_TEMP
Name: Cooking Temperature
DataType: Decimal
Unit: °C
MinDecimal: 0
MaxDecimal: 250
Digester Pressure
Code: DIGESTER_PRESSURE
Name: Digester Pressure
DataType: Decimal
Unit: bar
MinDecimal: 0
MaxDecimal: 10
H-Factor
Code: H_FACTOR
Name: H-Factor
DataType: Integer
Unit: (dimensionless)
MinInt: 0
MaxInt: 2000
Description: Cumulative cooking parameter integrating time and temperature
White Liquor Flow
Code: WHITE_LIQUOR_FLOW
Name: White Liquor Flow
DataType: Decimal
Unit: L/min
MinDecimal: 0
MaxDecimal: 100
Chip Level
Code: CHIP_LEVEL
Name: Chip Level
DataType: Integer
Unit: %
MinInt: 0
MaxInt: 100
AssetTypeAttribute Links for "Continuous Digester"
| Attribute | Required | Default Value | Sort Order |
|---|---|---|---|
| Cooking Temperature | Yes | – | 1 |
| Digester Pressure | Yes | – | 2 |
| H-Factor | Yes | – | 3 |
| White Liquor Flow | Yes | – | 4 |
| Chip Level | Yes | – | 5 |
AssetAttributeValue for Digester D-101
Last recorded readings (June 15, 2025 at 6:05 AM by John Smith):
| Attribute | Value | Within Normal Range? |
|---|---|---|
| Cooking Temperature | 168 °C | ✅ Yes (165–172 °C) |
| Digester Pressure | 5.5 bar | ✅ Yes (5.2–5.8 bar) |
| H-Factor | 1150 | ✅ Yes (1100–1200) |
| White Liquor Flow | 42 L/min | ✅ Yes (38–45 L/min) |
| Chip Level | 78% | ✅ Yes (70–85%) |
This example demonstrates:
- Type safety: Each attribute has appropriate data type (Decimal for temperature/pressure, Integer for H-Factor/percentage)
- Validation: Min/max ranges prevent invalid readings (e.g., negative pressure, >100% chip level)
- Units: Clear unit labels help operators understand what to measure
- Consistency: All Continuous Digester assets share these same attributes
- Normal ranges: Values can be compared against expected operating ranges for quality control
Example: Paper Mill Asset Attribute Categories
At Blueprint Paper Mill, attributes are organized into several categories across different asset types:
Process Parameters (Digesters, Boilers, Paper Machines)
- Cooking Temperature, Steam Pressure, Flue Gas Temperature, Basis Weight, Sheet Moisture
Mechanical Condition (Pumps, Motors, Rotating Equipment)
- Bearing Vibration, Bearing Temperature, Motor Amperage, Seal Temperature, Alignment
Fluid Properties (Tanks, Vessels, Piping)
- Tank Level, Liquor Temperature, Consistency, pH, Conductivity
Operational Metrics (All Equipment)
- Running Hours, Cycle Count, Production Count, Utilization (%)
Visual Inspections (All Equipment)
- Condition (Option: Good / Fair / Poor), Visible Leaks (Boolean), Unusual Noise (Boolean)
For hands-on experience configuring attributes for paper mill equipment, see the Blueprint Paper Mill Tutorial.
See also
- Asset Types - How asset types categorize assets
- Assets - The assets that these attributes describe