guerrerotook / securitas-direct-new-api

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

Homeassistant no puede ver estado alarma en servidor. #166

Closed FranGG87 closed 9 months ago

FranGG87 commented 10 months ago

Desde que actualicé a la ultima versión tanto la integración personalizada de securitas direct como el HA os y el core la integración no es capaz de obtener la información del estado de la alarma en el servidor de securitas. El error registrado en el registro es el siguiente: Logger: homeassistant.helpers.entity Source: helpers/entity.py:732 First occurred: 15:29:00 (9 occurrences) Last logged: 15:36:00

Update for alarm_control_panel.XXXXXXXXXXXX fails Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 732, in async_update_ha_state await self.async_device_update() File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 991, in async_device_update await self.async_update() File "/config/custom_components/securitas/alarm_control_panel.py", line 313, in async_update alarm_status: CheckAlarmStatus = await self.client.update_overview( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/securitas/init.py", line 397, in update_overview status.status, ^^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'status'

danise76 commented 10 months ago

Mismo error. Aparece normalmente asociado a que ha perdido la "sesion" con securitas. Si haces un reload al componente, actualiza y va... al menos de inicio

danise76 commented 10 months ago

Confirmado. Perdida de sesion con la ultima version.

Update for alarm_control_panel.calle____ fails 20:10:40 – (ERROR) helpers/entity.py - message first occurred at October 30, 2023 at 23:38:13 and shows up 264 times Invalid session. Please, try again later. 20:10:40 – (ERROR) Securitas Direct (custom integration) - message first occurred at October 30, 2023 at 23:38:13 and shows up 265 times

Despues de un reload de la integracion funciona un rato pero no refresca sesion por algun motivo. Estaba con la ultima version, 2.4.0.1. He vuelto a la 2.3 a ver si con esa soluciona

danise76 commented 10 months ago

Mismo error con la 2.3

FranGG87 commented 10 months ago

A mi el estado en el servidor nunca me lo ha refrescado, para poder tenerlo actualizado cree una automatización que fuerza a actualizar el alarm control panel y con eso me ha estado funcionando mucho tiempo bien, programaba el reinicio de HA cada noche por qué a veces se colgaba la integración de Securitas y con eso iba mas o menos bien. Os dejo el código de la automatización que me permite tener el estado de la alarma sincronizado con el servidor:

alias: Estado alarma Securitas description: "" trigger:

Si lo necesitáis alguno, solo es cambiar el tiempo por el intervalo que queráis para actualizar y poner vuestro entity_id

A raíz de haber actualizado la integración y HA ( si, todo a la vez, por lo que no se de donde viene el problema, si de la actualización de la integración de Securitas o de la actualización de HA) me falla como a los 5 min de reiniciar HA. Lo he solucionado creando una automatización que recarga la integración cada x tiempo. Os dejo el código de la automatización que recarga la integración cada x tiempo para que vuelva a conectar con la sesión de Securitas:

alias: Reload Securitas description: Recarga la integración de Securitas Direct cada 5 minutos trigger:

Lo mismo que la anterior automatización solo tenéis que cambiar el tiempo de refresco y poner vuestro entity_id.

De momento con las dos automatizaciones me funciona perfecto, pero son apaños, no sé si se podrá corregir para futuras versiones.

guerrerotook commented 10 months ago

Ten cuidado con este tipo de actualizaciones porque puede que la gente de securitas te diga algo.

Con respecto al problema que mencionas arriba del todo. Puedes habilitar los logs de DEBUG para ver cual es el json del mensaje que devuelve el servidor cuando falla?

FranGG87 commented 10 months ago

He deshabilitado la automatización que recarga la integración cada 5 min y he restablecido la automatización que fuerza a actualizar el alarm control panel al tiempo que tenía puesto cuando empezó a fallar que era 1 min. Espero a que falle y te cuento. Gracias.

FranGG87 commented 10 months ago

Ya ha fallado y tengo el debug log de la integración activado pero no tengo ni idea de ver el json que me dices. Si me puedes orientar te lo agradezco.

FranGG87 commented 10 months ago

Esto es lo que genera en el archivo /config/home-assistant.log al fallar y teniendo el debug log de la integración habilitado, no se si es lo que necesitas, ya me diras. 2023-11-06 21:55:00.360 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] Making request with device_id XXXXXXXXXXXXXXXX, uuid XXXXXXXXXXXXXXXX and idDeviceIndigitall 2023-11-06 21:55:00.415 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] --------------Response-------------- 2023-11-06 21:55:00.415 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] {"errors":[{"message":"Invalid session. Please, try again later.","name":"ExpiredSessionError","time_thrown":"2023-11-06T20:55:00.405Z","data":{"status":403,"err":"ExpiredSessionError"},"path":["xSStatus"]}],"data":null}

2023-11-06 21:55:00.416 ERROR (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] Invalid session. Please, try again later. 2023-11-06 21:55:00.416 ERROR (MainThread) [homeassistant.helpers.entity] Update for alarm_control_panel.XXXXXXXXXXXX fails Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 696, in async_update_ha_state await self.async_device_update() File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 957, in async_device_update await self.async_update() File "/config/custom_components/securitas/alarm_control_panel.py", line 313, in async_update alarm_status: CheckAlarmStatus = await self.client.update_overview( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/securitas/init.py", line 397, in update_overview status.status, ^^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'status'

guerrerotook commented 10 months ago

El error es de "Invalid session. Please, try again later." que es que la sesión se ha caducado, pero tengo código especifico para gestionar eso. ¿Cómo has instalado la integration? La tienes actualizada a la ultima version?

FranGG87 commented 10 months ago

instalada a través de HACS y si, actualizada a la ultima versión V2.4.0.1

FranGG87 commented 10 months ago

Acabo de ver que también escribe en el registro lo siguiente:

Este error se originó a partir de una integración personalizada.

Logger: custom_components.securitas.securitas_direct_new_api.apimanager Source: custom_components/securitas/securitas_direct_new_api/apimanager.py:159 Integration: Securitas Direct (documentation, issues) First occurred: 10:41:25 (103 occurrences) Last logged: 22:40:00

Internal Server Error Required request header 'x-installationNumber' for method parameter type String is not present Invalid session. Please, try again later.

Por si te sirve de algo.

guerrerotook commented 10 months ago

Ah, pues eso me sirve, tienes más de una instalación? Hay mas logs antes y después de eso que puedas compartir?

FranGG87 commented 10 months ago

Solo tengo una instalación y simple sin los sensores esos de humedad ni historias. Los logs que genera la integración de securitas son siempre los mismos. En orden son: Primero al rato de reiniciar HA da el siguiente error:

Logger: homeassistant.helpers.service Source: helpers/service.py:547 First occurred: 22:49:49 (1 occurrences) Last logged: 22:49:49

Unable to find services.yaml for the securitas integration

Después de este error funciona con normalidad y a los 5min aprox falla y empieza a generar los errores que puse arriba de invalid session y luego el de update control panel.

Después de eso si no recargo la integración sigue fallando y dando esos errores en bucle cada vez que actualiza alarm control panel.

pedropaislopes commented 10 months ago

He deshabilitado la automatización que recarga la integración cada 5 min y he restablecido la automatización que fuerza a actualizar el alarm control panel al tiempo que tenía puesto cuando empezó a fallar que era 1 min. Espero a que falle y te cuento. Gracias.

Hola @FranGG87 ! Podrías compartir como hiciste para establecer la automatización que fuerza a actualizar la alarma? Fue con en servicio securitas.refresh_alarm_status? Gracias!

FranGG87 commented 10 months ago

Hola, lo hice con el servicio home assistant update entity. Yo tengo configurada la integración para que no pida el estado al panel de alarma, sino que lo coja del último estado almacenado en el servidor, es más rápido y no le estas haciendo peticiones constantemente al propio panel. Si has configurado la integración para que haga la petición al panel no te va a funcionar esta automatización o eso creo.

alias: Estado alarma Securitas description: "" trigger:

platform: time_pattern seconds: /5 condition: [] action: service: homeassistant.update_entity data: {} target: entity_id: alarm_control_panel.XXXXXXXXXXXX mode: single

danise76 commented 10 months ago

Ah, pues eso me sirve, tienes más de una instalación? Hay mas logs antes y después de eso que puedas compartir?

En mi caso ahora que lo pienso, ha aparecido desde que he añadido una segunda instalacion. Y sucede con versiones anteriores a las 2.4.0.1 que tengo instalada (en la 2.3 con una instalacion no pasaba, y no me di cuenta de achacarlo al añadir una segunda instalacion al contrato)

danise76 commented 10 months ago

El debug que me ha dejado.

2023-11-07 00:29:48.909 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] Making request with device_id XXXXXXXXXXXXXXXX, uuid XXXXXXXXXXXXXXXX and idDeviceIndigitall 
2023-11-07 00:29:48.911 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] Making request with device_id XXXXXXXXXXXXXXXX, uuid XXXXXXXXXXXXXXXX and idDeviceIndigitall 
2023-11-07 00:29:49.005 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] --------------Response--------------
2023-11-07 00:29:49.006 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] {"errors":[{"message":"Invalid session. Please, try again later.","name":"ExpiredSessionError","time_thrown":"2023-11-06T23:29:48.991Z","data":{"status":403,"err":"ExpiredSessionError"},"path":["xSStatus"]}],"data":null}

2023-11-07 00:29:49.006 ERROR (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] Invalid session. Please, try again later.
2023-11-07 00:29:49.006 ERROR (MainThread) [homeassistant.helpers.entity] Update for alarm_control_panel.calle_XXXXXXXXXXXXXXXXXXXXXXX fails
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 696, in async_update_ha_state
    await self.async_device_update()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 957, in async_device_update
    await self.async_update()
  File "/config/custom_components/securitas/alarm_control_panel.py", line 313, in async_update
    alarm_status: CheckAlarmStatus = await self.client.update_overview(
                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/securitas/__init__.py", line 397, in update_overview
    status.status,
    ^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'status'
2023-11-07 00:29:49.034 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] --------------Response--------------
2023-11-07 00:29:49.034 DEBUG (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] {"errors":[{"message":"Invalid session. Please, try again later.","name":"ExpiredSessionError","time_thrown":"2023-11-06T23:29:49.019Z","data":{"status":403,"err":"ExpiredSessionError"},"path":["xSStatus"]}],"data":null}

2023-11-07 00:29:49.035 ERROR (MainThread) [custom_components.securitas.securitas_direct_new_api.apimanager] Invalid session. Please, try again later.
2023-11-07 00:29:49.035 ERROR (MainThread) [homeassistant.helpers.entity] Update for alarm_control_panel.calle_YYYYYYYYYYYYYYYYYYYYYYYYY fails
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 696, in async_update_ha_state
    await self.async_device_update()
  File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 957, in async_device_update
    await self.async_update()
  File "/config/custom_components/securitas/alarm_control_panel.py", line 313, in async_update
    alarm_status: CheckAlarmStatus = await self.client.update_overview(
                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/securitas/__init__.py", line 397, in update_overview
    status.status,
    ^^^^^^^^^^^^^
AttributeError: 'str' object has no attribute 'status'

XXXXXXXXXXXXX y YYYYYYYYYYYYYYYY son los nombres de las 2 instalaciones.

Y aparte marca el error que indicaban antes:

Logger: custom_components.securitas.securitas_direct_new_api.apimanager
Source: custom_components/securitas/securitas_direct_new_api/apimanager.py:159
Integration: Securitas Direct ([documentation](https://github.com/guerrerotook/securitas-direct-new-api), [issues](https://github.com/guerrerotook/securitas-direct-new-api/issues))
First occurred: November 6, 2023 at 01:35:24 (1094 occurrences)
Last logged: 00:39:09

Invalid session. Please, try again later.
Internal Server Error
Required request header 'x-installationNumber' for method parameter type String is not present
FranGG87 commented 10 months ago

En mi caso device_id e uuid son el mismo número, solo tengo una instalación.

guerrerotook commented 10 months ago

Creo que he encontrado el problema, lo estoy probando en mi casa y saco un fix esta tarde

FranGG87 commented 10 months ago

Genial, muchas gracias!

pedropaislopes commented 10 months ago

Gracias @guerrerotook por la dedicación! Y gracias @FranGG87 por la respuesta!

guerrerotook commented 10 months ago

He publicado una versión nueva. Dime si soluciona el problema.

pedropaislopes commented 10 months ago

Por la noche, quando pueda activarla, pruebo y te contesto. Gracias!

FranGG87 commented 10 months ago

Actualizado, ya te diré. Gracias por la dedicación.

FranGG87 commented 10 months ago

Hace dos horas que actualicé y reinicié y no ha vuelto a fallar lo de invalid sesión. Muchas gracias por todo @guerrerotook

danise76 commented 10 months ago

Hace dos horas que actualicé y reinicié y no ha vuelto a fallar lo de invalid sesión. Muchas gracias por todo @guerrerotook

Por mi parte lleva ya 3 horas y sin problema. No ha dado aviso. Muchas gracias @guerrerotook

Por cierto el valor que se pude marca para comprobar el estado de alarma en el servidor, ¿es en minutos o segundos? No lo veo en la documentacion

pedropaislopes commented 10 months ago

@guerrerotook increible! Ahora llamar el servicio homeassistant.update_entity funciona muy bien. Cambiar el status en el panel fisico y llamar el servicio sincroniza el status en el HA al instante! Perfecto! Muchas gracias!

FranGG87 commented 10 months ago

Ha estado todo el día funcionando perfecto hasta estar tarde que ha empezado con un nuevo error: Este error se originó a partir de una integración personalizada.

Logger: custom_components.securitas.securitas_direct_new_api.apimanager Source: custom_components/securitas/securitas_direct_new_api/apimanager.py:159 Integration: Securitas Direct (documentation, issues) First occurred: 19:35:00 (109 occurrences) Last logged: 20:09:55

Invalid token: Expired

Y como consecuencia el mismo error de actualizar el alarm control panel:

Logger: homeassistant.helpers.entity Source: helpers/entity.py:696 First occurred: 19:35:00 (109 occurrences) Last logged: 20:09:55

Update for alarm_control_panel.XXXXXXXXX fails Traceback (most recent call last): File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 696, in async_update_ha_state await self.async_device_update() File "/usr/src/homeassistant/homeassistant/helpers/entity.py", line 957, in async_device_update await self.async_update() File "/config/custom_components/securitas/alarm_control_panel.py", line 313, in async_update alarm_status: CheckAlarmStatus = await self.client.update_overview( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/config/custom_components/securitas/init.py", line 397, in update_overview status.status, ^^^^^^^^^^^^^ AttributeError: 'str' object has no attribute 'status'

guerrerotook commented 10 months ago

Acabo de verlo si. He hecho un cambio en el código y lo voy a probar en mi instalación hasta mañana a ver que pasa.

danise76 commented 10 months ago

Efectivamente sucede, pero el error que me da no es el mismo. La parte interesante. Parece como si no renovara el token inicial de autorizacion de la API. He puesto "0000000" en el usuario.

Logger: custom_components.securitas.securitas_direct_new_api.apimanager Source: custom_components/securitas/securitas_direct_new_api/apimanager.py:159 Integration: Securitas Direct (documentation, issues) First occurred: November 8, 2023 at 17:30:31 (4216 occurrences) Last logged: 11:34:04

Invalid token: Expired Not able to connect: request to http://verisureservicesecuritylayer-svc.owa-ns.svc.cluster.local:8080/remoteservices/main?Country=ES&ID=OWA_______________0000000000000_______________202311XXXXXXXXXXX&callby=OWA_10&hash=xxxxxxxxxxxxxxxxxxxxxxxxx&lang=es&numinst=XXXXXXXX&request=ESTINV&user=00000000000000 failed, reason: read ECONNRESET

guerrerotook commented 10 months ago

Acabo de publicar otra version a ver si con esta ya solucionamos el problema. Desde ayer yo en mi instalación no he tenido más mensajes de esos.

FranGG87 commented 10 months ago

Actualizada la integración, a ver si suerte.

@guerrerotook Te quería hacer alguna consulta mas sobre la integración:

En primer lugar, la integración por si misma no me actualiza el estado de la alarma del servidor, es decir si yo armo la alarma desde HA cambia el alarm control panel a Armado Ausente, pero si armo la alarma desde el panel físico de Securitas la integración no actualiza el estado en el alarm control panel de HA, para que si actualice el estado utilizo una automatización que fuerza a actualizar el estado de la entidad, llamar al servicio: homeassistant.update_entity y target: entity_id: alarm_control_panel.XXXXXXXXXXXX. En la configuración de la integración tengo puesto false en check_alarm_panel para que no haga petición al panel sino que lea el estado del servidor. ¿Es esta la manera correcta de funcionar de la integración, actualizando mediante una automatización? o por el contrario debería actualizar el estado por si sola y hay algo mal en mi integración.

En segundo lugar, cuando empezamos con los problemas de invalid session, borre la integración y la volví a instalar, al ir a configurarla como una nueva me daba error todo el rato, no podía iniciar sesión con mis credenciales de Securitas, el usuario y contraseña eran los correctos pero no podía iniciar sesión y por lo tanto no podía configurar la integración, por lo que tuve que restaurar la última copia de seguridad de HA. Si algún día tengo algún problema con HA y tengo que cambiar la instalación, bien sea por hardware o software, ¿no voy a poder volver a configurar la integración si no es restaurando una copia? No se si tienes alguna idea de qué podía estar pasando ahí.

Muchas gracias por tu trabajo, tu ayuda y perdón si estas consultas no debieran estar en este hilo.

guerrerotook commented 10 months ago

La integración utiliza las APIs de Securitas Direct, pero estas no estan documentadas, es decir, que no hay forma oficial de hacer lo que tu quieres, porque Securitas no hace una especie de llamada de vuelta cuando hay un cambio en el servidor. Esto es lo que hay, no se puede hacer nada en ese sentido.

Con respecto a lo que comentas de quitar la integracion por supuesto que lo puedes hacer y hay muchos usuarios que lo han hecho en muchas ocasiones por varios motivos.

FranGG87 commented 10 months ago

Ok, entonces seguiré usando el update entity que funciona bien para lo que quiero, simplemente era por saber si estaba haciendo algo mal. Respecto a borrar e instalar otra vez a ver si mañana tengo tiempo y lo vuelvo a probar y si no me deja apunto el mensaje de error y te digo.

La actualización de la integración de momento va bien.

Muchas gracias por todo.

pedropaislopes commented 10 months ago

Hola! Estuve pendiente de toda la platica, los fix y versiones. También sufrí del mismo error "Invalid token: Expired", y estoy con la última versión actualizada. "So far, so good", todo va bien, pero fueron menos de 3 horas de actualización de la integración y no se que pasará en los próximos dias. Ojalá que el error no regrese!

A respecto de la integración primero que es un tremendo trabajo de "reverse engineering" lo que @guerrerotook y otras personas hicieron! Y todo todo es por puro "guessing" de lo que pasa con la comunicación con el servidor de Securitas. Pero entiendo algo de lo que pasa entre el panel fisico y la APP (y, por similitud, en la integración con el HA).

La APP se comunica con el servidor. El "refresh ligero", digamos asi, solo actualiza el status de la APP con el servidor, y no se comunica con el panel. Esto no aparece en el historial de acciones.

El panel físico se comunica con el servidor cuando 1. es solicitado un refresh del panel (opción check_alarm_panel en la integración HA o en "actualización de status" en la APP de Securitas) y 2. cuando hay un cambio de modo (arming o disarming) por medio de la APP o HA. Y estas dos acciones si ponen una entrada en el historial de acciones.

Pero, la novedad (buena) es que, a lo que parece en mi instalación, cambiar el modo por medio del panel físico también se comunica con el servidor, sin que el servidor solicite un "check_alarm_panel" o similar (claro, el panel es quien inicia la comunicación actualizando su status en el servidor). Esta acción también pone una entrada en el historial.

Eso no pasaba cuando empezé con esta nueva integración, dias después de la implementación del OTP, casi un año atrás. Y, gracias a @FranGG87 y su automación con el servicio "update_entity", pude desmarcar en "check_alarm_panel" de la integración. Y el check a cada 20 min del panel (y sus muchas y muchas entradas en el historial de solicitaciones) no dejaron de aparecer (por supuesto!).

Lo que viene a mi idea es que quitar el "check_alarm_panel" puede traer algún problema de falta de sincronismo si el panel cambia de modo (fisicamente) y, en este momento, la red de celular no esté funcionando y/o los servidores de Securitas están offline. Pero eso es raro, bien raro.

Para lo que quiero, que es un refresh con poca frecuencia (cada 30 minutos), y "por debajo del radar" (sin estressar a Securitas, panel y servidores), está tremendamente bien!

Saludos a todos!

FranGG87 commented 9 months ago

Bueno pues con estos días de prueba no ha vuelto a fallar la integración, así que podemos cerrar la incidencia. Muchas gracias por el trabajo @guerrerotook