Source code for bac_py.objects.load_control

"""BACnet Load Control object per ASHRAE 135-2020 Clause 12.28."""

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.constructed import BACnetDateTime, BACnetShedLevel
from bac_py.types.enums import (
    ObjectType,
    PropertyIdentifier,
    ShedState,
)


[docs] @register_object_type class LoadControlObject(BACnetObject): """BACnet Load Control object (Clause 12.28). Manages demand-limiting shed operations. Accepts shed requests specifying level and duration, and reports compliance state. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.LOAD_CONTROL PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), PropertyIdentifier.PRESENT_VALUE: PropertyDefinition( PropertyIdentifier.PRESENT_VALUE, ShedState, PropertyAccess.READ_ONLY, required=True, default=ShedState.SHED_INACTIVE, ), **status_properties(), PropertyIdentifier.STATE_DESCRIPTION: PropertyDefinition( PropertyIdentifier.STATE_DESCRIPTION, str, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.REQUESTED_SHED_LEVEL: PropertyDefinition( PropertyIdentifier.REQUESTED_SHED_LEVEL, BACnetShedLevel, PropertyAccess.READ_WRITE, required=True, ), PropertyIdentifier.EXPECTED_SHED_LEVEL: PropertyDefinition( PropertyIdentifier.EXPECTED_SHED_LEVEL, BACnetShedLevel, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.ACTUAL_SHED_LEVEL: PropertyDefinition( PropertyIdentifier.ACTUAL_SHED_LEVEL, BACnetShedLevel, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.SHED_DURATION: PropertyDefinition( PropertyIdentifier.SHED_DURATION, int, PropertyAccess.READ_WRITE, required=True, default=0, ), PropertyIdentifier.DUTY_WINDOW: PropertyDefinition( PropertyIdentifier.DUTY_WINDOW, int, PropertyAccess.READ_WRITE, required=True, default=0, ), PropertyIdentifier.FULL_DUTY_BASELINE: PropertyDefinition( PropertyIdentifier.FULL_DUTY_BASELINE, float, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.SHED_LEVELS: PropertyDefinition( PropertyIdentifier.SHED_LEVELS, list, PropertyAccess.READ_WRITE, required=True, default=[], ), PropertyIdentifier.SHED_LEVEL_DESCRIPTIONS: PropertyDefinition( PropertyIdentifier.SHED_LEVEL_DESCRIPTIONS, list, PropertyAccess.READ_WRITE, required=True, default=[], ), PropertyIdentifier.START_TIME: PropertyDefinition( PropertyIdentifier.START_TIME, BACnetDateTime, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.NOTIFICATION_CLASS: PropertyDefinition( PropertyIdentifier.NOTIFICATION_CLASS, int, PropertyAccess.READ_WRITE, required=False, ), } def __init__(self, instance_number: int, **initial_properties: Any) -> None: super().__init__(instance_number, **initial_properties) self._init_status_flags()