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

Error handling return data in case of alarm status failure #27

Closed jacontre-c closed 8 months ago

jacontre-c commented 2 years ago

Fiction update_overview expects to receive CheckAlarmStatus object from self.session.check_alarm_status, but in case of errors, the function returns a string This causes the following exception:

Logger: homeassistant Source: custom_components/securitas/init.py:137 Integration: Securitas Direct (documentation, issues) First occurred: 7:56:49 AM (1 occurrences) Last logged: 7:56:49 AM Error doing job: Future exception was never retrieved

Traceback (most recent call last): File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 52, in run result = self.fn(*self.args, *self.kwargs) File "/config/custom_components/securitas/alarm_control_panel.py", line 58, in setup_platform current_state: CheckAlarmStatus = hub.update_overview( File "/usr/src/homeassistant/homeassistant/util/init.py", line 277, in wrapper result = method(args, **kwargs) File "/config/custom_components/securitas/init.py", line 137, in update_overview while alarm_status.operationStatus == "WAIT": AttributeError: 'str' object has no attribute 'operationStatus'

jacontre-c commented 2 years ago

A possible fix , would be for the API function to return proper object containing the error status, tested in my setup, it works, and it may be applicable to other areas, but I don't know interaction with HA API:

def check_alarm_status(
    self, installation: Installation, referenceId: str
) -> CheckAlarmStatus:
    """Check status of the operation check alarm."""
    content = {
        "operationName": "CheckAlarmStatus",
        "variables": {
            "numinst": str(installation.number),
            "panel": installation.panel,
            "referenceId": referenceId,
            "idService": "11",
            "counter": 2,
        },
        "query": "query CheckAlarmStatus($numinst: String!, $idService: String!, $panel: String!, $referenceId: String!) {\n  xSCheckAlarmStatus(numinst: $numinst, idService: $idService, panel: $panel, referenceId: $referenceId) {\n    res\n    msg\n    status\n    numinst\n    protomResponse\n    protomResponseDate\n  }\n}\n",
    }
    response = self._execute_request(content)
    result_json = json.loads(response.text)
    if "errors" in result_json:
        error_message = result_json["errors"][0]["message"]
        #return error_message  <<<< THIS
        # _LOGGER.debug(result_json)
        return CheckAlarmStatus(
            "ERROR",
            error_message,
            "",
            "",
            "",
            "",
        )
    else:
        raw_data = result_json["data"]["xSCheckAlarmStatus"]
        return CheckAlarmStatus(
            raw_data["res"],
            raw_data["msg"],
            raw_data["status"],
            raw_data["numinst"],
            raw_data["protomResponse"],
            raw_data["protomResponseDate"],
        )
guerrerotook commented 2 years ago

Can you check this with the new release v1.1.0.0 I just publish, #33 ?

cantupaz commented 8 months ago

This seems to be solved many releases ago.