Files
modbus_rtu_monitor/const.py
T
2025-12-28 10:58:51 +02:00

74 lines
2.2 KiB
Python

"""Constants for the Modbus RTU Monitor integration."""
from dataclasses import dataclass
from datetime import datetime, timedelta
from typing import TYPE_CHECKING
if TYPE_CHECKING:
pass
DOMAIN = "modbus_rtu_monitor"
# Default values
DEFAULT_PORT = 502
# Modbus register configuration
TEMP_HUMIDITY_REGISTER = 0x83 # Register 131 (decimal)
SETPOINT_REGISTER = 144 # Register 144 (decimal, 0x90 hex)
REGISTER_COUNT = 4
# Coil configuration
COIL_START_ADDRESS = 0x01 # Starting coil address (1 in decimal)
COIL_COUNT = 40 # Number of coils to monitor
# Register monitoring configuration
REGISTER_START_ADDRESS = 0xA5 # Register 165 (decimal)
REGISTER_MONITOR_COUNT = 20 # Number of registers to monitor (165-184)
# Additional register monitoring
REGISTER_START_ADDRESS_2 = 0xD2 # Register 210 (decimal)
REGISTER_MONITOR_COUNT_2 = 8 # Number of registers to monitor (210-217)
# Third register range
REGISTER_START_ADDRESS_3 = 0x8C # Register 140 (decimal)
REGISTER_MONITOR_COUNT_3 = 23 # Number of registers to monitor (140-162)
# Availability timeout (if no data for 5 minutes, mark unavailable)
AVAILABILITY_TIMEOUT = timedelta(minutes=5)
# Update throttling (prevent overwhelming HA with high-frequency Modbus traffic)
COORDINATOR_UPDATE_INTERVAL = timedelta(seconds=5) # Minimum time between coordinator updates
FRAME_PROCESSING_DELAY = 0.1 # Seconds to sleep between frame processing batches
# Device info
MANUFACTURER = "Modbus RTU"
MODEL = "Temperature/Humidity Monitor"
@dataclass
class SlaveData:
"""Data for a discovered Modbus slave."""
slave_id: int
temperature: float | None
humidity: float | None
last_seen: datetime
available: bool = True
coils: list[bool] | None = None # 40 coil states (True=ON, False=OFF)
registers: dict[int, int] | None = None # Register address -> int16 value
@dataclass
class ModbusRTUFrame:
"""Decoded Modbus RTU frame."""
slave_id: int
function_code: int
data: bytes
is_request: bool
is_response: bool
start_address: int | None = None
register_count: int | None = None
values: list[int] | None = None
coil_values: list[bool] | None = None # For function code 01 (Read Coils) responses