Source code for bac_py.objects.life_safety

"""BACnet Life Safety object types per ASHRAE 135-2020 Clause 12.15-12.16."""

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 (
    EventType,
    LifeSafetyMode,
    LifeSafetyOperation,
    LifeSafetyState,
    ObjectType,
    PropertyIdentifier,
    Reliability,
    SilencedState,
)


[docs] @register_object_type class LifeSafetyPointObject(BACnetObject): """BACnet Life Safety Point object (Clause 12.15). Represents a fire/smoke/gas detector point or similar life safety sensor. Present_Value reflects the current sensor state. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.LIFE_SAFETY_POINT INTRINSIC_EVENT_ALGORITHM: ClassVar[EventType | None] = EventType.CHANGE_OF_LIFE_SAFETY PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), PropertyIdentifier.PRESENT_VALUE: PropertyDefinition( PropertyIdentifier.PRESENT_VALUE, LifeSafetyState, PropertyAccess.READ_ONLY, required=True, default=LifeSafetyState.QUIET, ), PropertyIdentifier.TRACKING_VALUE: PropertyDefinition( PropertyIdentifier.TRACKING_VALUE, LifeSafetyState, PropertyAccess.READ_ONLY, required=True, default=LifeSafetyState.QUIET, ), **status_properties( reliability_required=True, reliability_default=Reliability.NO_FAULT_DETECTED, ), PropertyIdentifier.MODE: PropertyDefinition( PropertyIdentifier.MODE, LifeSafetyMode, PropertyAccess.READ_WRITE, required=True, default=LifeSafetyMode.ON, ), PropertyIdentifier.ACCEPTED_MODES: PropertyDefinition( PropertyIdentifier.ACCEPTED_MODES, list, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.SILENCED: PropertyDefinition( PropertyIdentifier.SILENCED, SilencedState, PropertyAccess.READ_ONLY, required=True, default=SilencedState.UNSILENCED, ), PropertyIdentifier.OPERATION_EXPECTED: PropertyDefinition( PropertyIdentifier.OPERATION_EXPECTED, LifeSafetyOperation, PropertyAccess.READ_ONLY, required=True, default=LifeSafetyOperation.NONE, ), PropertyIdentifier.SETTING: PropertyDefinition( PropertyIdentifier.SETTING, int, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.DIRECT_READING: PropertyDefinition( PropertyIdentifier.DIRECT_READING, float, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.UNITS: PropertyDefinition( PropertyIdentifier.UNITS, int, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.MEMBER_OF: PropertyDefinition( PropertyIdentifier.MEMBER_OF, list, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.ALARM_VALUES: PropertyDefinition( PropertyIdentifier.ALARM_VALUES, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.FAULT_VALUES: PropertyDefinition( PropertyIdentifier.FAULT_VALUES, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.LIFE_SAFETY_ALARM_VALUES: PropertyDefinition( PropertyIdentifier.LIFE_SAFETY_ALARM_VALUES, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.NOTIFICATION_CLASS: PropertyDefinition( PropertyIdentifier.NOTIFICATION_CLASS, int, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.EVENT_ENABLE: PropertyDefinition( PropertyIdentifier.EVENT_ENABLE, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.TIME_DELAY: PropertyDefinition( PropertyIdentifier.TIME_DELAY, 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()
[docs] @register_object_type class LifeSafetyZoneObject(BACnetObject): """BACnet Life Safety Zone object (Clause 12.16). Represents a grouped area containing one or more life safety points. Present_Value reflects the aggregate zone state. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.LIFE_SAFETY_ZONE INTRINSIC_EVENT_ALGORITHM: ClassVar[EventType | None] = EventType.CHANGE_OF_LIFE_SAFETY PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), PropertyIdentifier.PRESENT_VALUE: PropertyDefinition( PropertyIdentifier.PRESENT_VALUE, LifeSafetyState, PropertyAccess.READ_ONLY, required=True, default=LifeSafetyState.QUIET, ), PropertyIdentifier.TRACKING_VALUE: PropertyDefinition( PropertyIdentifier.TRACKING_VALUE, LifeSafetyState, PropertyAccess.READ_ONLY, required=True, default=LifeSafetyState.QUIET, ), **status_properties( reliability_required=True, reliability_default=Reliability.NO_FAULT_DETECTED, ), PropertyIdentifier.MODE: PropertyDefinition( PropertyIdentifier.MODE, LifeSafetyMode, PropertyAccess.READ_WRITE, required=True, default=LifeSafetyMode.ON, ), PropertyIdentifier.ACCEPTED_MODES: PropertyDefinition( PropertyIdentifier.ACCEPTED_MODES, list, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.SILENCED: PropertyDefinition( PropertyIdentifier.SILENCED, SilencedState, PropertyAccess.READ_ONLY, required=True, default=SilencedState.UNSILENCED, ), PropertyIdentifier.OPERATION_EXPECTED: PropertyDefinition( PropertyIdentifier.OPERATION_EXPECTED, LifeSafetyOperation, PropertyAccess.READ_ONLY, required=True, default=LifeSafetyOperation.NONE, ), PropertyIdentifier.ZONE_MEMBERS: PropertyDefinition( PropertyIdentifier.ZONE_MEMBERS, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.MEMBER_OF: PropertyDefinition( PropertyIdentifier.MEMBER_OF, list, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.ALARM_VALUES: PropertyDefinition( PropertyIdentifier.ALARM_VALUES, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.FAULT_VALUES: PropertyDefinition( PropertyIdentifier.FAULT_VALUES, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.LIFE_SAFETY_ALARM_VALUES: PropertyDefinition( PropertyIdentifier.LIFE_SAFETY_ALARM_VALUES, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.NOTIFICATION_CLASS: PropertyDefinition( PropertyIdentifier.NOTIFICATION_CLASS, int, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.EVENT_ENABLE: PropertyDefinition( PropertyIdentifier.EVENT_ENABLE, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.TIME_DELAY: PropertyDefinition( PropertyIdentifier.TIME_DELAY, 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()