diff --git a/api/src/dooris_api/__init__.py b/api/src/dooris_api/__init__.py index cd488a6..8ee8809 100644 --- a/api/src/dooris_api/__init__.py +++ b/api/src/dooris_api/__init__.py @@ -52,6 +52,12 @@ def main(): default=os.environ.get("DOORIS_CCUJACK_URL", "https://hmdooris-ccu.ccchh.net:2122"), help="The URL under which a CCUJACK instance is hosted that actually operates the locks", ) + argp.add_argument( + "--ccujack-mqtt", + required=False, + default=os.environ.get("DOORIS_CCUJACK_MQTT", "hmdooris-ccu.ccchh.net:1883"), + help="The $HOSTNAME:$PORT of the CCUJack embedded MQTT server", + ) argp.add_argument( "--ccujack-user", required="DOORIS_CCUJACK_USER" not in os.environ, diff --git a/api/src/dooris_api/app.py b/api/src/dooris_api/app.py index 3bcd848..3b53d35 100644 --- a/api/src/dooris_api/app.py +++ b/api/src/dooris_api/app.py @@ -36,11 +36,14 @@ async def lifespan(app: FastAPI): scope=app_cfg.openid_scope, ) + # TODO: regularly re-query CCUJACK to discover new locks app.extra["ccujack"] = CCUJackClient( base_uri=app_cfg.ccujack_url, - auth=BasicAuth(app_cfg.ccujack_user, app_cfg.ccujack_password) + auth=BasicAuth(app_cfg.ccujack_user, app_cfg.ccujack_password), + mqtt_conn=app_cfg.ccujack_mqtt, ) await app.extra["ccujack"].find_locks() + await app.extra["ccujack"].connect_mqtt() yield diff --git a/api/src/dooris_api/ccujack.py b/api/src/dooris_api/ccujack.py index 5d5eca0..78c9e00 100644 --- a/api/src/dooris_api/ccujack.py +++ b/api/src/dooris_api/ccujack.py @@ -4,6 +4,8 @@ import logging import asyncio from pydantic import BaseModel, Field +from dooris_api.mqtt_client import AsyncMqttClient + logger = logging.getLogger(__name__) @@ -69,7 +71,7 @@ class CCUJackClient: base_uri: str locks: LockData - def __init__(self, base_uri: str, auth: BasicAuth): + def __init__(self, base_uri: str, auth: BasicAuth, mqtt_conn: str): self.http = ClientSession( base_url=base_uri, auth=auth, @@ -77,6 +79,10 @@ class CCUJackClient: connector=TCPConnector(ssl=False), ) self.locks = None + self.mqtt = AsyncMqttClient(mqtt_conn, auth.login, auth.password) + + async def connect_mqtt(self): + await self.mqtt.connect() async def find_locks(self): logger.debug("Inspecting lock devices present in CCUJack")