BACnet Accumulator Object

The BACnet Accumulator object (Clause 12.61) is a counting register that totals input pulses for utility metering

What the Accumulator Object Is

The Accumulator object, defined in Clause 12.61 of ANSI/ASHRAE 135-2024, is the standardized way a BACnet device represents a counting register that totals incoming pulses over time. It is the object type behind utility metering: each pulse from an electricity, water, gas, or steam meter increments the count, and Present_Value reports the running total.

Present_Value holds the accumulated count as an integer, Scale and the optional Prescale describe how raw pulses relate to metered quantity, and Max_Pres_Value sets the rollover point where the count wraps back to zero. When an Accumulator supports intrinsic reporting it applies the UNSIGNED_RANGE event algorithm, raising an alarm through the event notification services when the count leaves configured limits; a device that also detects faults may apply the FAULT_OUT_OF_RANGE fault algorithm.

Where You’ll See It

  • Utility meters. A pulse-output kWh, water, or gas meter wired to a controller appears on the network as an Accumulator whose count advances with each pulse.
  • Sub-metering and tenant billing. Per-floor or per-tenant consumption totals a head end (the central BMS server) reads periodically for billing and energy dashboards.
  • Paired scaling. An Accumulator’s raw count is often handed to a Pulse Converter, which presents the same flow already scaled into engineering units.

Required Properties

Clause 12.61 requires every Accumulator object to provide these properties. Datatypes are the spec’s names: Unsigned is an integer, BOOLEAN a true/false flag, and the BACnet-prefixed types are structured values defined by the standard.

PropertyDatatypeWhat it holds
Object_IdentifierBACnetObjectIdentifierThe object’s type and instance number, unique within the device
Object_NameCharacterStringThe human-readable point name, unique within the device
Object_TypeBACnetObjectTypeAlways accumulator for this object
Present_ValueUnsignedThe accumulated pulse count. Read-only in normal operation; required to be writable while Out_Of_Service is true
Status_FlagsBACnetStatusFlagsFour health flags: in-alarm, fault, overridden, out-of-service
Event_StateBACnetEventStateThe object’s current event state (normal, high-limit, low-limit, or fault for this object type)
Out_Of_ServiceBOOLEANWhen true, Present_Value is decoupled from the physical input for testing and override
ScaleBACnetScaleThe multiplier or divisor that converts accumulated pulses to the metered quantity in Units
UnitsBACnetEngineeringUnitsThe engineering units of the scaled quantity (kilowatt-hours, cubic meters)
Max_Pres_ValueUnsignedThe count at which Present_Value rolls over back to zero
Property_ListBACnetARRAY[N] of BACnetPropertyIdentifierThe list of properties this instance actually implements

Optional Properties

The properties integrators meet most are Prescale (raw-pulse divisor applied before Scale), Value_Set (writable override of the count for meter alignment), and the Logging_Record / Logging_Object pair that feeds a reliable metering snapshot into a Trend Log. The intrinsic-reporting group generally appears or is absent as a set.

PropertyDatatypeGroup
DescriptionCharacterStringGeneral
Device_TypeCharacterStringGeneral
PrescaleBACnetPrescaleMetering
Value_Change_TimeBACnetDateTimeMetering
Value_Before_ChangeUnsignedMetering
Value_SetUnsignedMetering
Pulse_RateUnsignedMetering
Logging_RecordBACnetAccumulatorRecordLogging
Logging_ObjectBACnetObjectIdentifierLogging
High_LimitUnsignedIntrinsic reporting
Low_LimitUnsignedIntrinsic reporting
Limit_Monitoring_IntervalUnsignedIntrinsic reporting
Notification_ClassUnsignedIntrinsic reporting
Time_DelayUnsignedIntrinsic reporting
Limit_EnableBACnetLimitEnableIntrinsic reporting
Event_EnableBACnetEventTransitionBitsIntrinsic reporting
Acked_TransitionsBACnetEventTransitionBitsIntrinsic reporting
Notify_TypeBACnetNotifyTypeIntrinsic reporting
Event_Time_StampsBACnetARRAY[3] of BACnetTimeStampIntrinsic reporting
Event_Message_TextsBACnetARRAY[3] of CharacterStringIntrinsic reporting
Event_Message_Texts_ConfigBACnetARRAY[3] of CharacterStringIntrinsic reporting
Event_Detection_EnableBOOLEANIntrinsic reporting
Event_Algorithm_Inhibit_RefBACnetObjectPropertyReferenceIntrinsic reporting
Event_Algorithm_InhibitBOOLEANIntrinsic reporting
Time_Delay_NormalUnsignedIntrinsic reporting
ReliabilityBACnetReliabilityFault detection
Fault_High_LimitUnsignedFault detection
Fault_Low_LimitUnsignedFault detection
Reliability_Evaluation_InhibitBOOLEANFault detection
Audit_LevelBACnetAuditLevelAuditing
Auditable_OperationsBACnetAuditOperationFlagsAuditing
TagsBACnetARRAY[N] of BACnetNameValueTagging and profile
Profile_LocationCharacterStringTagging and profile
Profile_NameCharacterStringTagging and profile
  • Pulse Converter: scales an Accumulator’s raw pulse count into engineering units and presents it as an analog value.
  • Analog Input: a directly measured analog value, where the Accumulator instead totals discrete pulses.
  • Trend Log: records the count over time, often using the Accumulator’s Logging_Record for a clean metering snapshot.

What Chipkin Provides

The Accumulator object is a first-class object type in the CAS BACnet Stack, modeled with its scaling and metering properties. Talk to us about modeling your device’s points.