Source code for bac_py.objects.channel

"""BACnet Channel object type per ASHRAE 135-2016 Clause 12.53."""

from __future__ import annotations

from typing import Any, ClassVar

from bac_py.objects.base import (
    BACnetObject,
    PropertyAccess,
    PropertyDefinition,
    register_object_type,
    standard_properties,
    status_properties,
)
from bac_py.types.enums import (
    ObjectType,
    PropertyIdentifier,
    WriteStatus,
)


[docs] @register_object_type class ChannelObject(BACnetObject): """BACnet Channel object (Clause 12.53). Provides multi-object control via a single write operation. A Channel can simultaneously command multiple other objects (e.g. lighting groups, HVAC zones) by writing to its Present_Value property. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.CHANNEL PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), PropertyIdentifier.PRESENT_VALUE: PropertyDefinition( PropertyIdentifier.PRESENT_VALUE, object, # type varies - can be any BACnet value type PropertyAccess.READ_WRITE, required=True, ), **status_properties(), PropertyIdentifier.LAST_PRIORITY: PropertyDefinition( PropertyIdentifier.LAST_PRIORITY, int, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.WRITE_STATUS: PropertyDefinition( PropertyIdentifier.WRITE_STATUS, WriteStatus, PropertyAccess.READ_ONLY, required=True, default=WriteStatus.IDLE, ), PropertyIdentifier.LIST_OF_OBJECT_PROPERTY_REFERENCES: PropertyDefinition( PropertyIdentifier.LIST_OF_OBJECT_PROPERTY_REFERENCES, list, PropertyAccess.READ_WRITE, required=True, default=[], ), PropertyIdentifier.CHANNEL_NUMBER: PropertyDefinition( PropertyIdentifier.CHANNEL_NUMBER, int, PropertyAccess.READ_WRITE, required=True, ), PropertyIdentifier.CONTROL_GROUPS: PropertyDefinition( PropertyIdentifier.CONTROL_GROUPS, list, PropertyAccess.READ_WRITE, required=True, default=[], ), PropertyIdentifier.EXECUTION_DELAY: PropertyDefinition( PropertyIdentifier.EXECUTION_DELAY, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.ALLOW_GROUP_DELAY_INHIBIT: PropertyDefinition( PropertyIdentifier.ALLOW_GROUP_DELAY_INHIBIT, bool, PropertyAccess.READ_WRITE, required=False, ), } def __init__( self, instance_number: int, *, channel_number: int = 0, **initial_properties: Any, ) -> None: super().__init__(instance_number, **initial_properties) self._set_default(PropertyIdentifier.CHANNEL_NUMBER, channel_number) self._init_status_flags()