Source code for bac_py.objects.pulse_converter

"""BACnet Pulse Converter object per ASHRAE 135-2020 Clause 12.23."""

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.enums import (
    EngineeringUnits,
    EventType,
    ObjectType,
    PropertyIdentifier,
)


[docs] @register_object_type class PulseConverterObject(BACnetObject): """BACnet Pulse Converter object (Clause 12.23). Converts pulse counts to analog values using a scale factor. """ OBJECT_TYPE: ClassVar[ObjectType] = ObjectType.PULSE_CONVERTER 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, ), **status_properties(), PropertyIdentifier.UNITS: PropertyDefinition( PropertyIdentifier.UNITS, EngineeringUnits, PropertyAccess.READ_WRITE, required=True, default=EngineeringUnits.NO_UNITS, ), PropertyIdentifier.SCALE_FACTOR: PropertyDefinition( PropertyIdentifier.SCALE_FACTOR, float, PropertyAccess.READ_WRITE, required=True, default=1.0, ), PropertyIdentifier.INPUT_REFERENCE: PropertyDefinition( PropertyIdentifier.INPUT_REFERENCE, object, PropertyAccess.READ_WRITE, required=True, ), PropertyIdentifier.COUNT: PropertyDefinition( PropertyIdentifier.COUNT, int, PropertyAccess.READ_WRITE, required=True, default=0, ), PropertyIdentifier.COUNT_BEFORE_CHANGE: PropertyDefinition( PropertyIdentifier.COUNT_BEFORE_CHANGE, int, PropertyAccess.READ_ONLY, required=True, default=0, ), PropertyIdentifier.COUNT_CHANGE_TIME: PropertyDefinition( PropertyIdentifier.COUNT_CHANGE_TIME, object, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.UPDATE_TIME: PropertyDefinition( PropertyIdentifier.UPDATE_TIME, object, PropertyAccess.READ_ONLY, required=True, ), PropertyIdentifier.COV_INCREMENT: PropertyDefinition( PropertyIdentifier.COV_INCREMENT, float, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.COV_PERIOD: PropertyDefinition( PropertyIdentifier.COV_PERIOD, int, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.ADJUST_VALUE: PropertyDefinition( PropertyIdentifier.ADJUST_VALUE, float, PropertyAccess.READ_WRITE, required=False, ), PropertyIdentifier.LIMIT_MONITORING_INTERVAL: PropertyDefinition( PropertyIdentifier.LIMIT_MONITORING_INTERVAL, int, PropertyAccess.READ_WRITE, required=False, ), **commandable_properties(float, 0.0, required=False), **intrinsic_reporting_properties(include_limit=True), } def __init__( self, instance_number: int, *, commandable: bool = False, **initial_properties: Any, ) -> None: super().__init__(instance_number, **initial_properties) if commandable: self._init_commandable(0.0) self._init_status_flags()