guerrerotook / securitas-direct-new-api

This repository contains the new securitas direct API that can be integrated in Home Assistant
Apache License 2.0
79 stars 30 forks source link

If older unused alarms instalations are present, new version fails and breaks integration #113

Open jacontre-c opened 1 year ago

jacontre-c commented 1 year ago

On all recent versions (including 2.1.0.3), on the scenario of several alarm l installations present, if one of them is inactive, the API will fail, and block further alarm panel processing Example:

2023-02-22 18:01:36.340 ERROR (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] No hemos podido verificar el estado de tu alarma. Por favor contacta con nosotros a través de MyVerisure 2023-02-22 18:01:36.341 ERROR (MainThread) [homeassistant.components.alarm_control_panel] Error while setting up securitas platform for alarm_control_panel Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 281, in _async_setup_platform await asyncio.shield(task) File "/config/custom_components/securitas/alarm_control_panel.py", line 58, in async_setup_entry current_state: CheckAlarmStatus = await client.update_overview( File "/config/custom_components/securitas/init.py", line 390, in update_overview status.status, AttributeError: 'str' object has no attribute 'status'

This is due to returning a string, instead of SStatus object in check_general_status, in case of errors

I solved using this code change:


   async def check_general_status(self, installation: Installation) -> SStatus:
        """Check current status of the alarm."""
        content = {
            "operationName": "Status",
            "variables": {"numinst": str(installation.number)},
            "query": "query Status($numinst: String!) {\n  xSStatus(numinst: $numinst) {\n    status\n    timestampUpdate\n  }\n}\n",
        }
        response: ClientResponse = await self._execute_request(content, "Status")
        result_json = json.loads(await response.text())

        if "errors" in result_json:
            error_message = result_json["errors"][0]["message"]
            _LOGGER.error(error_message)
            time = result_json["errors"][0]["time_thrown"]
            return SStatus("ERROR",time)

        raw_data = result_json["data"]["xSStatus"]
        return SStatus(raw_data["status"], raw_data["timestampUpdate"])