Source code for bac_py.objects.transportation

"""BACnet Transportation objects per ASHRAE 135-2020 Clauses 12.58-12.60."""

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 (
    EscalatorMode,
    LiftCarDirection,
    LiftGroupMode,
    ObjectType,
    PropertyIdentifier,
)


[docs] @register_object_type class ElevatorGroupObject(BACnetObject): """BACnet Elevator Group object (Clause 12.58). Represents a group of lifts managed together for landing calls. Primarily a data container -- physical logic runs on the transportation controller. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.ELEVATOR_GROUP PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), PropertyIdentifier.GROUP_ID: PropertyDefinition( PropertyIdentifier.GROUP_ID, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.GROUP_MEMBERS: PropertyDefinition( PropertyIdentifier.GROUP_MEMBERS, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.GROUP_MODE: PropertyDefinition( PropertyIdentifier.GROUP_MODE, LiftGroupMode, PropertyAccess.READ_ONLY, required=True, default=LiftGroupMode.UNKNOWN, ), PropertyIdentifier.LANDING_CALLS: PropertyDefinition( PropertyIdentifier.LANDING_CALLS, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.LANDING_CALL_CONTROL: PropertyDefinition( PropertyIdentifier.LANDING_CALL_CONTROL, object, PropertyAccess.READ_WRITE, required=True, ), PropertyIdentifier.MACHINE_ROOM_ID: PropertyDefinition( PropertyIdentifier.MACHINE_ROOM_ID, object, PropertyAccess.READ_ONLY, required=False, ), } def __init__(self, instance_number: int, **initial_properties: Any) -> None: super().__init__(instance_number, **initial_properties)
[docs] @register_object_type class LiftObject(BACnetObject): """BACnet Lift object (Clause 12.59). Represents a single elevator car with position, direction, and door status. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.LIFT PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), **status_properties(), PropertyIdentifier.TRACKING_VALUE: PropertyDefinition( PropertyIdentifier.TRACKING_VALUE, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.CAR_ASSIGNED_DIRECTION: PropertyDefinition( PropertyIdentifier.CAR_ASSIGNED_DIRECTION, LiftCarDirection, PropertyAccess.READ_ONLY, required=True, default=LiftCarDirection.UNKNOWN, ), PropertyIdentifier.CAR_MOVING_DIRECTION: PropertyDefinition( PropertyIdentifier.CAR_MOVING_DIRECTION, LiftCarDirection, PropertyAccess.READ_ONLY, required=True, default=LiftCarDirection.UNKNOWN, ), PropertyIdentifier.CAR_POSITION: PropertyDefinition( PropertyIdentifier.CAR_POSITION, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.CAR_DOOR_STATUS: PropertyDefinition( PropertyIdentifier.CAR_DOOR_STATUS, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.CAR_DOOR_TEXT: PropertyDefinition( PropertyIdentifier.CAR_DOOR_TEXT, list, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.CAR_DOOR_ZONE: PropertyDefinition( PropertyIdentifier.CAR_DOOR_ZONE, bool, PropertyAccess.READ_ONLY, required=True, default=False, ), PropertyIdentifier.CAR_DRIVE_STATUS: PropertyDefinition( PropertyIdentifier.CAR_DRIVE_STATUS, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.CAR_LOAD: PropertyDefinition( PropertyIdentifier.CAR_LOAD, float, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.CAR_LOAD_UNITS: PropertyDefinition( PropertyIdentifier.CAR_LOAD_UNITS, int, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.CAR_MODE: PropertyDefinition( PropertyIdentifier.CAR_MODE, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.ELEVATOR_GROUP: PropertyDefinition( PropertyIdentifier.ELEVATOR_GROUP, object, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.ENERGY_METER: PropertyDefinition( PropertyIdentifier.ENERGY_METER, float, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.ENERGY_METER_REF: PropertyDefinition( PropertyIdentifier.ENERGY_METER_REF, object, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.FAULT_SIGNALS: PropertyDefinition( PropertyIdentifier.FAULT_SIGNALS, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.FLOOR_TEXT: PropertyDefinition( PropertyIdentifier.FLOOR_TEXT, list, PropertyAccess.READ_WRITE, required=True, default=[], ), PropertyIdentifier.HIGHER_DECK: PropertyDefinition( PropertyIdentifier.HIGHER_DECK, object, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.LOWER_DECK: PropertyDefinition( PropertyIdentifier.LOWER_DECK, object, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.LANDING_DOOR_STATUS: PropertyDefinition( PropertyIdentifier.LANDING_DOOR_STATUS, list, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.MAKING_CAR_CALL: PropertyDefinition( PropertyIdentifier.MAKING_CAR_CALL, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.NEXT_STOPPING_FLOOR: PropertyDefinition( PropertyIdentifier.NEXT_STOPPING_FLOOR, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.PASSENGER_ALARM: PropertyDefinition( PropertyIdentifier.PASSENGER_ALARM, bool, PropertyAccess.READ_ONLY, required=True, default=False, ), PropertyIdentifier.REGISTERED_CAR_CALL: PropertyDefinition( PropertyIdentifier.REGISTERED_CAR_CALL, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.CAR_DOOR_COMMAND: PropertyDefinition( PropertyIdentifier.CAR_DOOR_COMMAND, int, PropertyAccess.READ_WRITE, required=True, default=0, ), } 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 EscalatorObject(BACnetObject): """BACnet Escalator object (Clause 12.60). Represents an escalator with mode and fault reporting. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.ESCALATOR PROPERTY_DEFINITIONS: ClassVar[dict[PropertyIdentifier, PropertyDefinition]] = { **standard_properties(), **status_properties(), PropertyIdentifier.ESCALATOR_MODE: PropertyDefinition( PropertyIdentifier.ESCALATOR_MODE, EscalatorMode, PropertyAccess.READ_ONLY, required=True, default=EscalatorMode.UNKNOWN, ), PropertyIdentifier.FAULT_SIGNALS: PropertyDefinition( PropertyIdentifier.FAULT_SIGNALS, list, PropertyAccess.READ_ONLY, required=True, default=[], ), PropertyIdentifier.ENERGY_METER: PropertyDefinition( PropertyIdentifier.ENERGY_METER, float, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.ENERGY_METER_REF: PropertyDefinition( PropertyIdentifier.ENERGY_METER_REF, object, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.INSTALLATION_ID: PropertyDefinition( PropertyIdentifier.INSTALLATION_ID, int, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.POWER_MODE: PropertyDefinition( PropertyIdentifier.POWER_MODE, bool, PropertyAccess.READ_ONLY, required=False, ), PropertyIdentifier.OPERATION_DIRECTION: PropertyDefinition( PropertyIdentifier.OPERATION_DIRECTION, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.PASSENGER_ALARM: PropertyDefinition( PropertyIdentifier.PASSENGER_ALARM, bool, PropertyAccess.READ_ONLY, required=True, default=False, ), } def __init__(self, instance_number: int, **initial_properties: Any) -> None: super().__init__(instance_number, **initial_properties) self._init_status_flags()