Source code for bac_py.services.errors
"""BACnet protocol error types per ASHRAE 135-2016 Clause 18."""
from __future__ import annotations
from typing import TYPE_CHECKING
if TYPE_CHECKING:
from bac_py.types.enums import AbortReason, ErrorClass, ErrorCode, RejectReason
[docs]
class BACnetBaseError(Exception):
"""Base exception for BACnet protocol errors."""
[docs]
class BACnetError(BACnetBaseError):
"""BACnet Error-PDU received (Clause 18).
Contains error class and code per the specification.
"""
def __init__(
self,
error_class: ErrorClass,
error_code: ErrorCode,
error_data: bytes = b"",
) -> None:
"""Initialise a BACnet error.
:param error_class: The error class enumeration.
:param error_code: The error code enumeration.
:param error_data: Additional raw error data following the base
error class/code pair. Currently preserved but not
decoded (extended error types are service-specific).
"""
self.error_class = error_class
self.error_code = error_code
self.error_data = error_data
super().__init__(f"{error_class.name}: {error_code.name}")
[docs]
class BACnetRejectError(BACnetBaseError):
"""BACnet Reject-PDU received (Clause 18.9).
Indicates a syntax or protocol error in the request.
"""
def __init__(self, reason: RejectReason) -> None:
"""Initialise a BACnet reject error.
:param reason: The reject reason enumeration.
"""
self.reason = reason
super().__init__(f"Reject: {reason.name}")
[docs]
class BACnetAbortError(BACnetBaseError):
"""BACnet Abort-PDU received (Clause 18.10).
Indicates the transaction was aborted.
"""
def __init__(self, reason: AbortReason) -> None:
"""Initialise a BACnet abort error.
:param reason: The abort reason enumeration.
"""
self.reason = reason
super().__init__(f"Abort: {reason.name}")
[docs]
class BACnetTimeoutError(BACnetBaseError):
"""Request timed out after all retries exhausted."""