Discovery and COV

Who-Is / I-Am

Who-Is and I-Am services per ASHRAE 135-2016 Clause 16.10.

class bac_py.services.who_is.WhoIsRequest(low_limit=None, high_limit=None)[source]

Bases: object

Who-Is-Request service parameters (Clause 16.10.1).

Both limits must be present or both absent.

Parameters:
  • low_limit (int | None)

  • high_limit (int | None)

low_limit: int | None
high_limit: int | None
encode()[source]

Encode Who-Is-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes (may be empty if no range is set).

classmethod decode(data)[source]

Decode Who-Is-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

WhoIsRequest

Returns:

Decoded WhoIsRequest.

class bac_py.services.who_is.IAmRequest(object_identifier, max_apdu_length, segmentation_supported, vendor_id)[source]

Bases: object

I-Am-Request service parameters (Clause 16.10.2).

All fields use APPLICATION tags (not context-specific).

Parameters:
object_identifier: ObjectIdentifier
max_apdu_length: int
segmentation_supported: Segmentation
vendor_id: int
encode()[source]

Encode I-Am-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode I-Am-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

IAmRequest

Returns:

Decoded IAmRequest.

Who-Has / I-Have

Who-Has and I-Have services per ASHRAE 135-2016 Clause 16.9.

class bac_py.services.who_has.WhoHasRequest(object_identifier=None, object_name=None, low_limit=None, high_limit=None)[source]

Bases: object

Who-Has-Request service parameters (Clause 16.9.1).

Who-Has-Request ::= SEQUENCE {
    limits   SEQUENCE {
        deviceInstanceRangeLowLimit   [0] Unsigned (0..4194303),
        deviceInstanceRangeHighLimit  [1] Unsigned (0..4194303)
    } OPTIONAL,
    object   CHOICE {
        objectIdentifier  [2] BACnetObjectIdentifier,
        objectName        [3] CharacterString
    }
}
Parameters:
object_identifier: ObjectIdentifier | None
object_name: str | None
low_limit: int | None
high_limit: int | None
encode()[source]

Encode Who-Has-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode Who-Has-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

WhoHasRequest

Returns:

Decoded WhoHasRequest.

class bac_py.services.who_has.IHaveRequest(device_identifier, object_identifier, object_name)[source]

Bases: object

I-Have-Request service parameters (Clause 16.9.2).

All fields use APPLICATION tags (not context-specific).

I-Have-Request ::= SEQUENCE {
    deviceIdentifier  BACnetObjectIdentifier,
    objectIdentifier  BACnetObjectIdentifier,
    objectName        CharacterString
}
Parameters:
device_identifier: ObjectIdentifier
object_identifier: ObjectIdentifier
object_name: str
encode()[source]

Encode I-Have-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode I-Have-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

IHaveRequest

Returns:

Decoded IHaveRequest.

Device Discovery

Device discovery services per ASHRAE 135-2020 Clause 16.11.

Who-Am-I (new in 2020) and You-Are for device identity assignment.

class bac_py.services.device_discovery.WhoAmIRequest(vendor_id, model_name, serial_number)[source]

Bases: object

Who-Am-I-Request (Clause 16.11, new in 2020).

Sent by an unconfigured device to request identity assignment. All fields use APPLICATION tags.

Who-Am-I-Request ::= SEQUENCE {
    vendorID      Unsigned16,
    modelName     CharacterString,
    serialNumber  CharacterString
}
Parameters:
  • vendor_id (int)

  • model_name (str)

  • serial_number (str)

vendor_id: int
model_name: str
serial_number: str
encode()[source]

Encode Who-Am-I-Request service parameters.

Return type:

bytes

classmethod decode(data)[source]

Decode Who-Am-I-Request from service request bytes.

Return type:

WhoAmIRequest

Parameters:

data (memoryview | bytes)

class bac_py.services.device_discovery.YouAreRequest(device_identifier, device_mac_address, device_network_number=None)[source]

Bases: object

You-Are-Request (Clause 16.11, new in 2020).

Sent by a supervisor to assign identity to a device.

You-Are-Request ::= SEQUENCE {
    deviceIdentifier     [0] BACnetObjectIdentifier,
    deviceMACAddress     [1] OCTET STRING,
    deviceNetworkNumber  [2] Unsigned16 OPTIONAL
}
Parameters:
device_identifier: ObjectIdentifier
device_mac_address: bytes
device_network_number: int | None
encode()[source]

Encode You-Are-Request service parameters.

Return type:

bytes

classmethod decode(data)[source]

Decode You-Are-Request from service request bytes.

Return type:

YouAreRequest

Parameters:

data (memoryview | bytes)

COV (Change of Value)

COV (Change of Value) services per ASHRAE 135-2016 Clause 13.1/13.14.

class bac_py.services.cov.BACnetPropertyReference(property_identifier, property_array_index=None)[source]

Bases: object

BACnetPropertyReference – property identifier with optional array index.

BACnetPropertyReference ::= SEQUENCE {
    propertyIdentifier   [0] BACnetPropertyIdentifier,
    propertyArrayIndex   [1] Unsigned OPTIONAL
}
Parameters:
  • property_identifier (int)

  • property_array_index (int | None)

property_identifier: int
property_array_index: int | None
encode()[source]

Encode BACnetPropertyReference as context-tagged fields.

Return type:

bytes

Returns:

Encoded bytes for this property reference.

classmethod decode(data, offset=0)[source]

Decode BACnetPropertyReference from data at a given offset.

Parameters:
  • data (memoryview | bytes) – Raw bytes containing encoded property reference data.

  • offset (int (default: 0)) – Byte offset to start decoding from.

Return type:

tuple[BACnetPropertyReference, int]

Returns:

Tuple of (decoded BACnetPropertyReference, new offset).

class bac_py.services.cov.BACnetPropertyValue(property_identifier, property_array_index=None, value=b'', priority=None)[source]

Bases: object

BACnetPropertyValue per Clause 21.

BACnetPropertyValue ::= SEQUENCE {
    propertyIdentifier  [0] BACnetPropertyIdentifier,
    propertyArrayIndex  [1] Unsigned OPTIONAL,
    value               [2] ABSTRACT-SYNTAX.&Type,
    priority            [3] Unsigned (1..16) OPTIONAL
}

The value field contains raw application-tagged bytes.

Parameters:
property_identifier: PropertyIdentifier
property_array_index: int | None
value: bytes
priority: int | None
encode()[source]

Encode BACnetPropertyValue.

Return type:

bytes

Returns:

Encoded bytes for this property value sequence.

classmethod decode_from(data, offset=0)[source]

Decode BACnetPropertyValue from data at a given offset.

Parameters:
  • data (memoryview | bytes) – Raw bytes containing encoded property value data.

  • offset (int (default: 0)) – Byte offset to start decoding from.

Return type:

tuple[BACnetPropertyValue, int]

Returns:

Tuple of (decoded BACnetPropertyValue, new offset).

Raises:

BACnetRejectError – If priority is outside the 1–16 range.

class bac_py.services.cov.COVNotificationMultipleRequest(subscriber_process_identifier, initiating_device_identifier, time_remaining, timestamp, list_of_cov_notifications)[source]

Bases: object

Confirmed/Unconfirmed COVNotification-Multiple-Request per Clause 13.17/13.18.

COVNotification-Multiple-Request ::= SEQUENCE {
    subscriberProcessIdentifier  [0] Unsigned32,
    initiatingDeviceIdentifier   [1] BACnetObjectIdentifier,
    timeRemaining                [2] Unsigned,
    timestamp                    [3] BACnetTimeStamp,
    listOfCOVNotifications       [4] SEQUENCE OF COVObjectNotification
}
Parameters:
subscriber_process_identifier: int
initiating_device_identifier: ObjectIdentifier
time_remaining: int
timestamp: BACnetTimeStamp
list_of_cov_notifications: list[COVObjectNotification]
encode()[source]

Encode COVNotificationMultiple-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode COVNotificationMultiple-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

COVNotificationMultipleRequest

Returns:

Decoded COVNotificationMultipleRequest.

class bac_py.services.cov.COVNotificationRequest(subscriber_process_identifier, initiating_device_identifier, monitored_object_identifier, time_remaining, list_of_values)[source]

Bases: object

Confirmed/Unconfirmed COVNotification-Request per Clause 13.14.7/13.14.8.

COVNotification-Request ::= SEQUENCE {
    subscriberProcessIdentifier  [0] Unsigned32,
    initiatingDeviceIdentifier   [1] BACnetObjectIdentifier,
    monitoredObjectIdentifier    [2] BACnetObjectIdentifier,
    timeRemaining                [3] Unsigned,
    listOfValues                 [4] SEQUENCE OF BACnetPropertyValue
}

The same encoding is used for both ConfirmedCOVNotification-Request (service choice 1) and UnconfirmedCOVNotification-Request (service choice 2).

Parameters:
subscriber_process_identifier: int
initiating_device_identifier: ObjectIdentifier
monitored_object_identifier: ObjectIdentifier
time_remaining: int
list_of_values: list[BACnetPropertyValue]
encode()[source]

Encode COVNotification-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode COVNotification-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

COVNotificationRequest

Returns:

Decoded COVNotificationRequest.

class bac_py.services.cov.COVObjectNotification(monitored_object_identifier, list_of_values)[source]

Bases: object

A single object notification within COVNotificationMultiple.

SEQUENCE {
    monitoredObjectIdentifier [0] BACnetObjectIdentifier,
    listOfValues              [1] SEQUENCE OF COVPropertyValue
}
Parameters:
monitored_object_identifier: ObjectIdentifier
list_of_values: list[COVPropertyValue]
encode()[source]

Encode COVObjectNotification.

Return type:

bytes

Returns:

Encoded bytes for this object notification.

classmethod decode(data, offset=0)[source]

Decode COVObjectNotification from data at a given offset.

Parameters:
  • data (memoryview | bytes) – Buffer to decode from.

  • offset (int (default: 0)) – Starting byte offset.

Return type:

tuple[COVObjectNotification, int]

Returns:

Tuple of (decoded COVObjectNotification, new offset).

class bac_py.services.cov.COVPropertyValue(property_identifier, value, array_index=None, time_of_change=None)[source]

Bases: object

A single property value within a COV notification.

SEQUENCE {
    propertyIdentifier  [0] BACnetPropertyIdentifier,
    arrayIndex          [1] Unsigned OPTIONAL,
    value               [2] ABSTRACT-SYNTAX.&Type,
    timeOfChange        [3] BACnetTimeStamp OPTIONAL
}
Parameters:
property_identifier: int
value: bytes
array_index: int | None
time_of_change: BACnetTimeStamp | None
encode()[source]

Encode COVPropertyValue.

Return type:

bytes

Returns:

Encoded bytes for this property value.

classmethod decode(data, offset=0)[source]

Decode COVPropertyValue from data at a given offset.

Parameters:
  • data (memoryview | bytes) – Buffer to decode from.

  • offset (int (default: 0)) – Starting byte offset.

Return type:

tuple[COVPropertyValue, int]

Returns:

Tuple of (decoded COVPropertyValue, new offset).

class bac_py.services.cov.COVReference(monitored_property, cov_increment=None)[source]

Bases: object

A single COV reference within a COV subscription specification.

SEQUENCE {
    monitoredProperty  [0] BACnetPropertyReference,
    covIncrement       [1] REAL OPTIONAL
}
Parameters:
monitored_property: BACnetPropertyReference
cov_increment: float | None
encode()[source]

Encode COVReference.

Return type:

bytes

Returns:

Encoded bytes for this COV reference.

classmethod decode(data, offset=0)[source]

Decode COVReference from data at a given offset.

Parameters:
  • data (memoryview | bytes) – Buffer to decode from.

  • offset (int (default: 0)) – Starting byte offset.

Return type:

tuple[COVReference, int]

Returns:

Tuple of (decoded COVReference, new offset).

class bac_py.services.cov.COVSubscriptionSpecification(monitored_object_identifier, list_of_cov_references)[source]

Bases: object

A single subscription specification within SubscribeCOVPropertyMultiple.

SEQUENCE {
    monitoredObjectIdentifier [0] BACnetObjectIdentifier,
    listOfCOVReferences       [1] SEQUENCE OF COVReference
}
Parameters:
monitored_object_identifier: ObjectIdentifier
list_of_cov_references: list[COVReference]
encode()[source]

Encode COVSubscriptionSpecification.

Return type:

bytes

Returns:

Encoded bytes for this subscription specification.

classmethod decode(data, offset=0)[source]

Decode COVSubscriptionSpecification from data at a given offset.

Parameters:
  • data (memoryview | bytes) – Buffer to decode from.

  • offset (int (default: 0)) – Starting byte offset.

Return type:

tuple[COVSubscriptionSpecification, int]

Returns:

Tuple of (decoded COVSubscriptionSpecification, new offset).

class bac_py.services.cov.SubscribeCOVPropertyMultipleRequest(subscriber_process_identifier, list_of_cov_subscription_specifications, issue_confirmed_notifications=None, lifetime=None, max_notification_delay=None)[source]

Bases: object

SubscribeCOVPropertyMultiple-Request service parameters (Clause 13.16.1).

SubscribeCOVPropertyMultiple-Request ::= SEQUENCE {
    subscriberProcessIdentifier        [0] Unsigned32,
    issueConfirmedNotifications         [1] BOOLEAN OPTIONAL,
    lifetime                            [2] Unsigned OPTIONAL,
    maxNotificationDelay                [3] Unsigned OPTIONAL,
    listOfCOVSubscriptionSpecifications [4] SEQUENCE OF ...
}
Parameters:
subscriber_process_identifier: int
list_of_cov_subscription_specifications: list[COVSubscriptionSpecification]
issue_confirmed_notifications: bool | None
lifetime: int | None
max_notification_delay: int | None
encode()[source]

Encode SubscribeCOVPropertyMultiple-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode SubscribeCOVPropertyMultiple-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

SubscribeCOVPropertyMultipleRequest

Returns:

Decoded SubscribeCOVPropertyMultipleRequest.

class bac_py.services.cov.SubscribeCOVPropertyRequest(subscriber_process_identifier, monitored_object_identifier, monitored_property_identifier, issue_confirmed_notifications=None, lifetime=None, cov_increment=None)[source]

Bases: object

SubscribeCOVProperty-Request service parameters (Clause 13.15.1).

SubscribeCOVProperty-Request ::= SEQUENCE {
    subscriberProcessIdentifier  [0] Unsigned32,
    monitoredObjectIdentifier    [1] BACnetObjectIdentifier,
    issueConfirmedNotifications  [2] BOOLEAN OPTIONAL,
    lifetime                     [3] Unsigned OPTIONAL,
    monitoredPropertyIdentifier  [4] BACnetPropertyReference,
    covIncrement                 [5] REAL OPTIONAL
}
Parameters:
subscriber_process_identifier: int
monitored_object_identifier: ObjectIdentifier
monitored_property_identifier: BACnetPropertyReference
issue_confirmed_notifications: bool | None
lifetime: int | None
cov_increment: float | None
encode()[source]

Encode SubscribeCOVProperty-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode SubscribeCOVProperty-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

SubscribeCOVPropertyRequest

Returns:

Decoded SubscribeCOVPropertyRequest.

class bac_py.services.cov.SubscribeCOVRequest(subscriber_process_identifier, monitored_object_identifier, issue_confirmed_notifications=None, lifetime=None)[source]

Bases: object

SubscribeCOV-Request service parameters (Clause 13.14.1).

SubscribeCOV-Request ::= SEQUENCE {
    subscriberProcessIdentifier  [0] Unsigned32,
    monitoredObjectIdentifier    [1] BACnetObjectIdentifier,
    issueConfirmedNotifications  [2] BOOLEAN OPTIONAL,
    lifetime                     [3] Unsigned OPTIONAL
}

Per the spec, omitting both issueConfirmedNotifications and lifetime constitutes a subscription cancellation request.

Parameters:
  • subscriber_process_identifier (int)

  • monitored_object_identifier (ObjectIdentifier)

  • issue_confirmed_notifications (bool | None)

  • lifetime (int | None)

subscriber_process_identifier: int
monitored_object_identifier: ObjectIdentifier
issue_confirmed_notifications: bool | None
lifetime: int | None
property is_cancellation: bool

Check whether this request is a subscription cancellation.

Returns:

True when both optional fields are None (cancellation per spec).

encode()[source]

Encode SubscribeCOV-Request service parameters.

Return type:

bytes

Returns:

Encoded service request bytes.

classmethod decode(data)[source]

Decode SubscribeCOV-Request from service request bytes.

Parameters:

data (memoryview | bytes) – Raw service request bytes.

Return type:

SubscribeCOVRequest

Returns:

Decoded SubscribeCOVRequest.