Skip to content

KeyError sur les entités XDimmer et préfixe de clé incorrect pour les entités XPWM #82

Description

@ytorres

Deux bugs identifiés dans light.py et entity.py provoquant des erreurs répétées à chaque cycle de polling du coordinator lorsque des appareils XDimmer et/ou XPWM sont configurés.

Bug 1 — KeyError: 'G1' à 'G4' sur les entités XDimmer
Lors du rafraîchissement du coordinator, si coordinator.data est None ou pas encore alimenté (ex: au démarrage de HA ou après une erreur de connexion passagère), la propriété XDimmerLight.is_on lève une KeyError non gérée qui remonte jusqu'à la couche entité de HA et génère des entrées ERROR en boucle dans les journaux.
Stack trace relevée en production :

ERROR [custom_components.ipx800v4] Unexpected error updating listener for ipx800v4
  File "homeassistant/helpers/entity.py", line 1731, in state
    if (is_on := self.is_on) is None:
  File "custom_components/ipx800v4/light.py", line 154, in is_on
    return self.coordinator.data[f"G{self._id}"]["Etat"] == "ON"
KeyError: 'G1'

Cause racine : is_on et brightness accèdent directement à coordinator.data sans vérifier la disponibilité au préalable. HA appelle is_on avant que les données soient prêtes.
Correction — ajouter la propriété available dans entity.py :

@property
def available(self) -> bool:
    """Return entity availability based on coordinator data presence."""
    if not super().available or not self.coordinator.data:
        return False
    if self._ipx_type == TYPE_XDIMMER and self._id:
        return f"G{self._id}" in self.coordinator.data
    if self._ipx_type == TYPE_RELAY and self._id:
        return f"R{self._id}" in self.coordinator.data
    if self._ipx_type in [TYPE_XPWM, TYPE_XPWM_RGB, TYPE_XPWM_RGBW]:
        if self._ids:
            return all(f"PW{i}" in self.coordinator.data for i in self._ids)
        if self._id:
            return f"PW{self._id}" in self.coordinator.data
    return True

Bug 2 — Préfixe de clé incorrect PWM au lieu de PW pour les entités XPWM
light.py utilise f"PWM{self._id}" pour lire les valeurs XPWM depuis coordinator.data, mais la clé réellement retournée par l'API IPX800 (Get=all) est PW1, PW2, etc. — et non PWM1.
Preuve — réponse brute de l'API IPX800 V4 :

"PW1": 0,
"PW2": 0,
...
"PW32": 0

La clé PWM{n} n'existe pas dans la réponse de l'API. Cela provoque une KeyError pour tout utilisateur disposant d'appareils XPWM.
Lignes concernées dans light.py :

Classe Propriété Incorrect Correct
XPWMLight is_on f"PWM{self._id}" f"PW{self._id}"
XPWMLight brightness f"PWM{self._id}" f"PW{self._id}"
XPWMRGBLight rgb_color f"PWM{self._ids[x]}" f"PW{self._ids[x]}"
XPWMRGBWLight rgbw_color f"PWM{self._ids[x]}" f"PW{self._ids[x]}"

Environnement

Version Home Assistant : 2026.5.4
Intégration installée via HACS
Version pypx800 : 2.5.1
Matériel : IPX800 V4
Extensions : X-Dimmer (4 canaux), pas de module X-PWM physique présent

Les deux corrections ont été testées en production et confirmées fonctionnelles. Plus aucune erreur dans les journaux après rechargement de l'intégration.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions