from dataclasses import dataclass from urllib.parse import urlparse @dataclass(frozen=True) class MqttConfig: broker: str client_id: str mock_client_id: str sender_client_id: str subscriber_client_id: str username: str | None password: str | None pub_topic: str | None sub_topic: str | None ack_topic: str | None data_file: str @dataclass(frozen=True) class TmsConfig: device_code: str equipment_sn: str timeout: int keepalive: int server_ip: str | None server_port: int | None @dataclass(frozen=True) class WitsConfig: host: str port: int timeout: int source_file: str @dataclass(frozen=True) class TdengineConfig: url: str = "" username: str = "" password: str = "" database: str = "" stable: str = "drilling_realtime_st" device_code: str = "GJ-304-0088" pool_size: int = 2 timeout: int = 10 @property def base_url(self): if not self.url: return "" raw = str(self.url).strip() if raw.lower().startswith("jdbc:taos-rs://"): raw = "http://" + raw[len("jdbc:TAOS-RS://") :] elif "://" not in raw: raw = "http://" + raw parsed = urlparse(raw) return f"{parsed.scheme or 'http'}://{parsed.hostname or '127.0.0.1'}:{parsed.port or 6041}" @property def enabled(self): return bool(self.base_url and self.database and self.username) @dataclass(frozen=True) class AppConfig: mqtt: MqttConfig tms: TmsConfig wits: WitsConfig tdengine: TdengineConfig raw: dict