Aohzan / ipx800

IPX800 V4 integration for Home-Assistant
Apache License 2.0
20 stars 12 forks source link

Probleme avec l'api (refresh all) en docker #37

Closed zoic21 closed 1 year ago

zoic21 commented 1 year ago

Bonjour, J'ai un petit, j'utilise home assistant en docker avec un ipx800v4 et j'aimerais bien mettre en place le push global (ipx800v4_refresh/on), le soucis c'est que je suis en docker et donc l'ip avec laquelle arrive les demandes de l'ipx sont en 172.X.X.X et non avec l'ip réel de l'ipx. J'ai donc logs des erreurs comme quoi l'ip n'est pas celle d'un ipx...

Comment faire dans ce cas ?

Merci d'avance pour ta réponse.

Aohzan commented 1 year ago

Hello, Via docker en installation supervisée ?

zoic21 commented 1 year ago

Bonjour, Non docker sur un synology directement. Mais je pense il y a un autre soucis, quand je vais sur l'url depuis mon pc j'ai une comme erreur : empty reponse et rien dans les logs de home assistant (je devrait avoir ip non autorisé je pense). Je suis pas sur de m'y prendre correctement pour activer les logs en debug, je vais sur ma liste d’intégration je clique sur activer les journaux degug, je lance un test depuis l'ipx800 et je clic pour desactiver les journaux debug et la ca me télécharge un fichier mais j'ai rien concernant l'ipx800 dedans.

zoic21 commented 1 year ago

J'ai pu faire plus de test dans la fonction check_api_auth j'ai commenté :

if request.remote != host:
        raise ApiCallNotAuthorized("API call not coming from IPX800 IP.")

Et c'est bon le push marche, j'ai rajouté de la log et j'ai :

2023-05-26 17:30:58.976 DEBUG (MainThread) [custom_components.ipx800v4] Update asked from IPX PUSH, : 172.17.0.1 != 192.168.1.165

Donc oui j'arrive avec l'ip de mon docker et non l'ip de l'ipx. Je vais essayer de mettre un reverse proxy devant pour qu'il envoi la bonne ip.

zoic21 commented 1 year ago

Edit avec un reverse proxy qui passe l'ip plus aucun soucis tout marche. Par contre en regardant le code je me pose quelques questions :

class IpxRequestRefreshView(HomeAssistantView):
    """Provide a page for the device to force refresh data from coordinator."""

    requires_auth = False
    url = "/api/ipx800v4_refresh/{data}"
    name = "api:ipx800v4_refresh"

    def __init__(
        self, host: str, password: str, coordinator: DataUpdateCoordinator
    ) -> None:
        """Init the IPX view."""
        self.host = host
        self.password = password
        self.coordinator = coordinator
        super().__init__()

    async def get(self, request, data):
        """Respond to requests from the device."""
        if check_api_auth(request, self.host, self.password):
            _LOGGER.debug("Update asked from IPX PUSH")
            await self.coordinator.async_request_refresh()
            return web.Response(status=HTTPStatus.OK, text="OK")
        _LOGGER.warning("Authentication for PUSH invalid")

Sur cette partie, si check_api_auth est false on va jamais renvoyer de réponse a la demande et donc ca tourne dans le vide, ne devrait qu'il pas avoir un retour type 401 ?

2eme question check_api_auth renvoi pas de false mais une exeption en cas de soucis, ne devrait il pas avoir un try catch ?

Aohzan commented 1 year ago

Oui en effet il y a ces deux points à corriger/améliorer, je me note ça

Aohzan commented 1 year ago

fixé en https://github.com/Aohzan/ipx800/releases/tag/3.4.1