Source code for bac_py.objects.lighting

"""BACnet Lighting objects per ASHRAE 135-2020 Clauses 12.54-12.55."""

from __future__ import annotations

from typing import Any, ClassVar

from bac_py.objects.base import (
    BACnetObject,
    PropertyAccess,
    PropertyDefinition,
    commandable_properties,
    intrinsic_reporting_properties,
    register_object_type,
    standard_properties,
    status_properties,
)
from bac_py.types.constructed import BACnetLightingCommand
from bac_py.types.enums import (
    BinaryPV,
    EventType,
    LightingInProgress,
    LightingOperation,
    ObjectType,
    PropertyIdentifier,
)


[docs] @register_object_type class LightingOutputObject(BACnetObject): """BACnet Lighting Output object (Clause 12.54). Dimmable lighting control with fade, ramp, and step operations. Present_Value represents the current lighting level (0.0--100.0%). """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.LIGHTING_OUTPUT INTRINSIC_EVENT_ALGORITHM: ClassVar[EventType | None] = EventType.OUT_OF_RANGE PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), PropertyIdentifier.PRESENT_VALUE: PropertyDefinition( PropertyIdentifier.PRESENT_VALUE, float, PropertyAccess.READ_WRITE, required=True, default=0.0, ), PropertyIdentifier.TRACKING_VALUE: PropertyDefinition( PropertyIdentifier.TRACKING_VALUE, float, PropertyAccess.READ_ONLY, required=True, default=0.0, ), PropertyIdentifier.LIGHTING_COMMAND: PropertyDefinition( PropertyIdentifier.LIGHTING_COMMAND, BACnetLightingCommand, PropertyAccess.READ_WRITE, required=True, ), PropertyIdentifier.IN_PROGRESS: PropertyDefinition( PropertyIdentifier.IN_PROGRESS, LightingInProgress, PropertyAccess.READ_ONLY, required=True, default=LightingInProgress.IDLE, ), **status_properties(), **commandable_properties(float, 0.0), PropertyIdentifier.LIGHTING_COMMAND_DEFAULT_PRIORITY: PropertyDefinition( PropertyIdentifier.LIGHTING_COMMAND_DEFAULT_PRIORITY, int, PropertyAccess.READ_WRITE, required=True, default=16, ), PropertyIdentifier.COV_INCREMENT: PropertyDefinition( PropertyIdentifier.COV_INCREMENT, float, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.BLINK_WARN_ENABLE: PropertyDefinition( PropertyIdentifier.BLINK_WARN_ENABLE, bool, PropertyAccess.READ_WRITE, required=False, default=False, ), PropertyIdentifier.EGRESS_TIME: PropertyDefinition( PropertyIdentifier.EGRESS_TIME, int, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.EGRESS_ACTIVE: PropertyDefinition( PropertyIdentifier.EGRESS_ACTIVE, bool, PropertyAccess.READ_ONLY, required=False, default=False, ), PropertyIdentifier.DEFAULT_FADE_TIME: PropertyDefinition( PropertyIdentifier.DEFAULT_FADE_TIME, int, PropertyAccess.READ_WRITE, required=True, default=0, ), PropertyIdentifier.DEFAULT_RAMP_RATE: PropertyDefinition( PropertyIdentifier.DEFAULT_RAMP_RATE, float, PropertyAccess.READ_WRITE, required=True, default=100.0, ), PropertyIdentifier.DEFAULT_STEP_INCREMENT: PropertyDefinition( PropertyIdentifier.DEFAULT_STEP_INCREMENT, float, PropertyAccess.READ_WRITE, required=True, default=1.0, ), PropertyIdentifier.TRANSITION: PropertyDefinition( PropertyIdentifier.TRANSITION, LightingOperation, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.INSTANTANEOUS_POWER: PropertyDefinition( PropertyIdentifier.INSTANTANEOUS_POWER, float, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.MIN_ACTUAL_VALUE: PropertyDefinition( PropertyIdentifier.MIN_ACTUAL_VALUE, float, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.MAX_ACTUAL_VALUE: PropertyDefinition( PropertyIdentifier.MAX_ACTUAL_VALUE, float, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.POWER: PropertyDefinition( PropertyIdentifier.POWER, float, PropertyAccess.READ_ONLY, required=False, ), **intrinsic_reporting_properties(include_limit=True), } def __init__(self, instance_number: int, **initial_properties: Any) -> None: super().__init__(instance_number, **initial_properties) self._init_commandable(0.0) self._init_status_flags()
[docs] @register_object_type class BinaryLightingOutputObject(BACnetObject): """BACnet Binary Lighting Output object (Clause 12.55). On/off lighting control with optional blink and warn patterns. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.BINARY_LIGHTING_OUTPUT INTRINSIC_EVENT_ALGORITHM: ClassVar[EventType | None] = EventType.CHANGE_OF_STATE PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), PropertyIdentifier.PRESENT_VALUE: PropertyDefinition( PropertyIdentifier.PRESENT_VALUE, BinaryPV, PropertyAccess.READ_WRITE, required=True, default=BinaryPV.INACTIVE, ), **status_properties(), **commandable_properties(BinaryPV, BinaryPV.INACTIVE), PropertyIdentifier.LIGHTING_COMMAND: PropertyDefinition( PropertyIdentifier.LIGHTING_COMMAND, BACnetLightingCommand, PropertyAccess.READ_WRITE, required=True, ), PropertyIdentifier.LIGHTING_COMMAND_DEFAULT_PRIORITY: PropertyDefinition( PropertyIdentifier.LIGHTING_COMMAND_DEFAULT_PRIORITY, int, PropertyAccess.READ_WRITE, required=True, default=16, ), PropertyIdentifier.BLINK_WARN_ENABLE: PropertyDefinition( PropertyIdentifier.BLINK_WARN_ENABLE, bool, PropertyAccess.READ_WRITE, required=False, default=False, ), PropertyIdentifier.EGRESS_TIME: PropertyDefinition( PropertyIdentifier.EGRESS_TIME, int, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.EGRESS_ACTIVE: PropertyDefinition( PropertyIdentifier.EGRESS_ACTIVE, bool, PropertyAccess.READ_ONLY, required=False, default=False, ), PropertyIdentifier.POWER: PropertyDefinition( PropertyIdentifier.POWER, float, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.INSTANTANEOUS_POWER: PropertyDefinition( PropertyIdentifier.INSTANTANEOUS_POWER, float, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.FEEDBACK_VALUE: PropertyDefinition( PropertyIdentifier.FEEDBACK_VALUE, BinaryPV, PropertyAccess.READ_ONLY, required=False, ), **intrinsic_reporting_properties(), } def __init__(self, instance_number: int, **initial_properties: Any) -> None: super().__init__(instance_number, **initial_properties) self._init_commandable(BinaryPV.INACTIVE) self._init_status_flags()