Zlinky_TIC icon indicating copy to clipboard operation
Zlinky_TIC copied to clipboard

Intégration zha

Open max5962 opened this issue 2 years ago • 135 comments

Hello,

Plus un ticket de demande qu'un vrai bug. Mais c'est essentiel pour l'utilisation. Qui s'occupe de l'intégration via ZHA de zlinky ? Merci

max5962 avatar Nov 07 '21 09:11 max5962

Bonjour, Pour le moment personne à ma connaissance, je n'ai pas eu le temps de vraiment regarder comment faire la requête auprès des dev ZHA. J'imagine qu'il n'y a pas grand chose à faire mais peut-être que cela requiert un zha-quirks. J'essaie de regarder dans la semaine ...

fairecasoimeme avatar Nov 07 '21 10:11 fairecasoimeme

Bonjour,

merci beaucoup. Dans le doute, j'avais créé un ticket ici : https://github.com/zigpy/zigpy-zigate/issues/103

max5962 avatar Nov 08 '21 15:11 max5962

Bonjour, Je pense que c'est plus sur ZHA qui faut faire la demande. Zigpy est capable de gérer l'appareil je pense. C'est plus l'intégration vers HA qui faut faire

fairecasoimeme avatar Nov 08 '21 15:11 fairecasoimeme

Cela semble s'intégrer nativement dans ZHA:

image

image image

Mais il y a comme un problème d'unité ou de virgule.

pdecat avatar Nov 08 '21 15:11 pdecat

Etonnant chez moi, j'ai beaucoup moins d'informations . Même en supprimant et relançant l'association ... : image

EDIT : vous ne semblez pas utiliser de zigate. Cela est peut être la différence. (zigpy plus à jour chez vous)

max5962 avatar Nov 08 '21 16:11 max5962

J'utilise effectivement une passerelle zzh avec firmware Z-Stack supportée par zigpy-znp, et il s'agit d'une version de développement de Home Assistant mise à jour le 31 octobre.

pdecat avatar Nov 08 '21 16:11 pdecat

J'ai la même chose que @pdecat avec une zigate

2021-11-11_11-40-20_grim

J'imagine qu'il doit manquer quelques informations :)

Le fait que le module apparaisse comme "Router" semble indiquer qu'il faudra probablement un zha_quirks pour mieux le configurer non ?

MichaelBitard avatar Nov 11 '21 10:11 MichaelBitard

@MichaelBitard tu es sous quel version de hass ? vraiment étonné de ne pas voir les mêmes fonctionnalités :S j'espère pas une version casé du zlinky :/

EDIT : tu as quoi dans "informations zigbee" ? @fairecasoimeme une idée ce qui peut cause la non exposition de certaines fonctionnalités ?

merci :)

max5962 avatar Nov 11 '21 13:11 max5962

La dernière à jour normalement:

System Health

version core-2021.11.2
installation_type Home Assistant OS
dev false
hassio true
docker true
user root
virtualenv false
python_version 3.9.7
os_name Linux
os_version 5.10.17-v7
arch armv7l
timezone Europe/Paris
Home Assistant Community Store
GitHub API ok
Github API Calls Remaining 5000
Installed Version 1.15.2
Stage running
Available Repositories 904
Installed Repositories 7
Home Assistant Cloud
logged_in false
can_reach_cert_server ok
can_reach_cloud_auth ok
can_reach_cloud ok
Home Assistant Supervisor
host_os Home Assistant OS 6.6
update_channel stable
supervisor_version supervisor-2021.10.8
docker_version 20.10.8
disk_total 13.9 GB
disk_used 7.0 GB
healthy true
supported true
board rpi3
supervisor_api ok
version_api ok
installed_addons Terminal & SSH (9.2.1), Syncthing (1.18.3), Signal (10.16.0), Z-Wave JS (0.1.47)
Lovelace
dashboards 2
resources 4
views 9
mode storage

Il est où le panel "informations zigbee" ?

MichaelBitard avatar Nov 11 '21 13:11 MichaelBitard

La dernière à jour normalement:

System Health

version core-2021.11.2 installation_type Home Assistant OS dev false hassio true docker true user root virtualenv false python_version 3.9.7 os_name Linux os_version 5.10.17-v7 arch armv7l timezone Europe/Paris Home Assistant Community Store Home Assistant Cloud Home Assistant Supervisor Lovelace Il est où le panel "informations zigbee" ?

image Just ici :)

max5962 avatar Nov 11 '21 14:11 max5962

Ha ok, en anglais c'est zigbee device signature :)

{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4151, maximum_buffer_size=127, maximum_incoming_transfer_size=100, server_mask=11264, maximum_outgoing_transfer_size=100, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0x0053",
      "in_clusters": [
        "0x0000",
        "0x0003",
        "0x0702",
        "0x0b01",
        "0x0b04",
        "0xff66"
      ],
      "out_clusters": [
        "0x0019"
      ]
    },
    "242": {
      "profile_id": 41440,
      "device_type": "0x0061",
      "in_clusters": [
        "0x0021"
      ],
      "out_clusters": [
        "0x0021"
      ]
    }
  },
  "manufacturer": "LiXee",
  "model": "ZLinky_TIC",
  "class": "zigpy.device.Device"
}

J'imagine que si quirk il y a, ça sera ici : https://github.com/zigpy/zha-device-handlers par contre mes compétences s'arrêtent là malheureusement.

MichaelBitard avatar Nov 11 '21 14:11 MichaelBitard

Ha ok, en anglais c'est zigbee device signature :)

{
  "node_descriptor": "NodeDescriptor(logical_type=<LogicalType.Router: 1>, complex_descriptor_available=0, user_descriptor_available=0, reserved=0, aps_flags=0, frequency_band=<FrequencyBand.Freq2400MHz: 8>, mac_capability_flags=<MACCapabilityFlags.AllocateAddress|RxOnWhenIdle|MainsPowered|FullFunctionDevice: 142>, manufacturer_code=4151, maximum_buffer_size=127, maximum_incoming_transfer_size=100, server_mask=11264, maximum_outgoing_transfer_size=100, descriptor_capability_field=<DescriptorCapability.NONE: 0>, *allocate_address=True, *is_alternate_pan_coordinator=False, *is_coordinator=False, *is_end_device=False, *is_full_function_device=True, *is_mains_powered=True, *is_receiver_on_when_idle=True, *is_router=True, *is_security_capable=False)",
  "endpoints": {
    "1": {
      "profile_id": 260,
      "device_type": "0x0053",
      "in_clusters": [
        "0x0000",
        "0x0003",
        "0x0702",
        "0x0b01",
        "0x0b04",
        "0xff66"
      ],
      "out_clusters": [
        "0x0019"
      ]
    },
    "242": {
      "profile_id": 41440,
      "device_type": "0x0061",
      "in_clusters": [
        "0x0021"
      ],
      "out_clusters": [
        "0x0021"
      ]
    }
  },
  "manufacturer": "LiXee",
  "model": "ZLinky_TIC",
  "class": "zigpy.device.Device"
}

J'imagine que si quirk il y a, ça sera ici : https://github.com/zigpy/zha-device-handlers par contre mes compétences s'arrêtent là malheureusement.

La mise à jour a permit de remonter plus d'informations. (étonnant car il est noté nul part dans le changelog un upgrade de la lib zigpy )

Plus qu'à corriger l'unité/virgule et vérifier qu'il y ai bien une évolution des métriques :)

Après quelques jours de suivis, la remontée est hératique, parfois j'en ai tous les heures, parfois plusieurs heures sans rien. Espérons qu'une intégration ZHA réel corrige tout ça :)

max5962 avatar Nov 11 '21 14:11 max5962

Pour info, j'ai ouvert une issue pour l'ajout du quirk : https://github.com/zigpy/zha-device-handlers/issues/1146

pdecat avatar Nov 11 '21 17:11 pdecat

J'ai creusé un peu la question pour faire un quirk. Il y a quelques subtilités sur comment remonter les infos qui ne fonctionnent pas encore. La puissance par exemple: avec Zlinky c'est remonté sur le endpoint 1, Cluster 0x0B04, attribut 0x050F. Si l'on regarde dans gérer les clusters, c'est l'attribut apparent_power. image Hors, celui qui est remonté par ZHA comme sensor, c'est active_power. image Ces deux valeurs proviennent du même cluster (0xB04, "ElectricalMeasurement") et il semblerait que ZHA ne permette qu'un sensor par cluster : https://github.com/zigpy/zha-device-handlers/issues/605#issuecomment-753713044 L'info n'est pas super récente. Je ne sais pas si c'est encore le cas. Si ça l'est, je pense qu'il faut écrire un quirks qui prend la valeur de "apparent_power" et la renvoie pour "active_power".

Pour ce qui est du voltage, je crois que le mode historique ne renvoit pas cette info, c'est seulement le mode standard. @fairecasoimeme pourra surement confirmer. Ayant mon linky en mode historique je ne peux pas tester.

Les info de courrant fonctionnent bien.

L'index de consommation fonctionne correctement mais il faut explicitement demander la valeur dans le menu "gérer les clusters" pour que ce soit mis à jour. Je ne sais pas pourquoi c'est comme ça, mais je ne suis pas le seul dans ce cas : https://github.com/fairecasoimeme/Zlinky_TIC/issues/19#issue-1048835803 Il faut peut être spécifier dans le quirk sur c'est une valeur à actualiser. C'est à creuser...

J'ai commencé à faire le quirk et pour l'instant j'en suis là :

from zigpy.quirks import CustomDevice
from zigpy.types import basic
from zhaquirks import Bus, LocalDataCluster
from zigpy.profiles import zha

from zhaquirks.const import (

   DEVICE_TYPE,
   ENDPOINTS,
   INPUT_CLUSTERS,
   MODELS_INFO,
   OUTPUT_CLUSTERS,
   PROFILE_ID,
)

from zigpy.zcl.clusters.general import (
   Basic,
   GreenPowerProxy,
   Identify,
   Ota,
)
from zigpy.zcl.clusters.smartenergy import Metering
from zigpy.zcl.clusters.homeautomation import (
   ElectricalMeasurement,
   MeterIdentification

)


LIXEE = "LiXee"

class ZLinkyTIC(CustomDevice):
   """ZLinky_TIC from LiXee"""
   signature = {
       MODELS_INFO: [(LIXEE, "ZLinky_TIC")],
       ENDPOINTS:{
           1: {
               PROFILE_ID: zha.PROFILE_ID,
               DEVICE_TYPE: zha.DeviceType.METER_INTERFACE,
               INPUT_CLUSTERS: [
                   Basic.cluster_id,
                   Identify.cluster_id,
                   Metering.cluster_id,
                   MeterIdentification.cluster_id,
                   ElectricalMeasurement.cluster_id,
                   0xff66, # Manufacturer Specific
               ],
               OUTPUT_CLUSTERS : [
                   Ota.cluster_id
               ]

           },
           242: {
               PROFILE_ID: 41440,
               DEVICE_TYPE: 0x0061,
               INPUT_CLUSTERS: [
                   GreenPowerProxy.cluster_id
               ],
               OUTPUT_CLUSTERS: [
                   GreenPowerProxy.cluster_id
               ]
               
           }
       }
   }
   replacement= {}

Pour le endpoint 242, je n'ai rien trouvé dans zigpy pour le PROFILE_ID et DEVICE_TYPE, donc j'ai hardcodé les valeurs.

Il faut maintenant remplir le dictionnaire replacement. Il faudra probablement créer un cluster ElectricalMeasurement custom pour faire ce que je décrivais plus haut (renvoyer la valeur de apparent_power pour active_power), et peut être d'autres choses, mais pour l'instant je ne sais pas encore bien comment faire ça.

N0ciple avatar Nov 16 '21 20:11 N0ciple

Je crois que développer un quirk n'est pas ce qu'il faudrait faire (ou en tout cas pas la seule chose à faire). Le problème vient du fait que ZHA n'a pas de sensor pour apparent_power mais en a un pour active_power (pour la partie power). Visiblement c'est pas bien compliqué de rajouter un sensor pour un nouvel attribut. cf ici (et également les classes du dessous ElectricalMeasurementRMSCurrent, etc...) Il faut juste spécifier correctement les attributs du cluster. L'unité Volt-Ampères existe déjà dans Home Asisstant, pas besoin de la céer.

Je crois que quelque chose comme ça devrait être suffisant :

@MULTI_MATCH(channel_names=CHANNEL_ELECTRICAL_MEASUREMENT)
class ElectricalMeasurementApparentPower(ElectricalMeasurement, id_suffix="apparent_power"): # pas sûr pour le id_suffix
    """Apparent Power measurement."""

    SENSOR_ATTR = "apparent_power"
    _device_class = DEVICE_CLASS_POWER
    _unit = POWER_VOLT_AMPERE
    _div_mul_prefix = "ac_power"

    @property
    def should_poll(self) -> bool:
        """Poll indirectly by ElectricalMeasurementSensor."""
        return False

Cependant ça va bloquer. En effet, les devices de la classe power ne supportent (pas encore) les Volt-Ampères comme unité : https://github.com/home-assistant/core/issues/57236

On peut toujours dire qu'il s'agit de Watt en changeant POWER_VOLT_AMPERE par POWER_WATT. Puisqu'un Watt est homogène à une puissance et un Volt-Ampère aussi. Physiquement ce n'est pas faux mais c'est pas la bonne unité en pratique. (Pour les histoire d'homogénéité, voir ici spécifiquement la section Principes généraux d'homogénéité)

Je crois qu'il faudra quand même faire un quirk pour définir les ac_power_multiplier et ac_power_divisor (0X0604 et 0X0605 du cluster ElectricalMeasurement). Sinon le sensor va multiplier par None et on aura pas de valeur exploitable.

N0ciple avatar Nov 17 '21 17:11 N0ciple

Bonne nouvelle, il suffit "juste" de rajouter un nouveau sensor comme je le disais dans mon dernier post et ça fonctionne (enfin presque) : image

J'ai testé en éditant le fichier homeassistant/components/zha/sensor.py. Dans une installation Docker il est situé dans /usr/src/homeassistant. Si vous faites la manip, attention à bien importer POWER_VOLT_AMPERE dans le from homeassistant.const import ... Pas de problèmes avec l'unité en Volt-Ampères finalement. Il reste cependant le problème de l'actualisation. Tout comme l'indexe de consommation, il faut explicitement demander via l'interface "gérer les clusters" la valeur du champ pour qu'il soit mis à jour. Peut-être est-ce lié à cette isssue https://github.com/fairecasoimeme/Zlinky_TIC/issues/24 ?

N0ciple avatar Nov 17 '21 19:11 N0ciple

J'ai fait la PR qui est ici : https://github.com/home-assistant/core/pull/59857

N0ciple avatar Nov 17 '21 21:11 N0ciple

Il reste cependant le problème de l'actualisation. Tout comme l'indexe de consommation, il faut explicitement demander via l'interface "gérer les clusters" la valeur du champ pour qu'il soit mis à jour.

La réponse semble avoir été apportée dans la PR: https://github.com/home-assistant/core/pull/59857#discussion_r751705878

pdecat avatar Nov 17 '21 23:11 pdecat

Il reste cependant le problème de l'actualisation. Tout comme l'indexe de consommation, il faut explicitement demander via l'interface "gérer les clusters" la valeur du champ pour qu'il soit mis à jour.

La réponse semble avoir été apportée dans la PR: home-assistant/core#59857 (comment)

Oui effectivement je n'avais pas vu qu'il fallait rajouter l'attribut à cet endroit également ! Malheureusement ce n'était pas le seul soucis qui bloquait l'actualisation 😕. J'ai testé en faisant la correction en local et l'actualisation ne se fait toujours pas. Le problème ne vient peut-être pas de ZHA 🤔. Un autre indice qui va dans ce sens, c'est que l'indexe de consommation est déjà intégré dans ZHA ici (et également la partie reporting ici). L'actualisation fonctionne sur d'autres appareils Zigbee, mais pas pour le Zlinky_TIC. Je corrigerai la PR en ajoutant la partie reporting et aussi les test qui sont manquants pour que la PR soit acceptée. Il restera le quirk pour convertir les Wh en KWh pour l'indexe de consommation, mais ça, ça ne devrait pas être trop compliqué :crossed_fingers:

N0ciple avatar Nov 18 '21 10:11 N0ciple

La Pull Request sur ZHA est mergée 🥳 ! Ici le lien de la pull request pour le quirk : https://github.com/zigpy/zha-device-handlers/pull/1161 Le quirk sert juste à convertir les Wh en kWh pour pourvoir l'intégrer dans la partie Energie de home assistant.

Malheureusement, l'actualisation de l'index de consommation ne fonctionne pas. Cependant j'avais dit une bétise. J'ai une autre prise en zigbee qui rapport l'indexe et effectivement celui ci ne semple pas s'actualiser tout seul. Il doit falloir creuser du côté ZHA pour ça. Mais l'actualisation de la puissance en VA fonctionne elle !

@ralmn, est-ce que dans votre version du external_converters pour le ZLinky_TIC l'index de consommation s'actualise bien tout seul sans qu'il soit besoin d'aller requêter la valeur manuellement ?

N0ciple avatar Nov 19 '21 15:11 N0ciple

Non je suis obligé (comme pour pas mal de valeur) de lire la valeur périodiquement. Comme indiqué en #24 il faudra attendre une nouvelle version du firmware

ralmn avatar Nov 19 '21 16:11 ralmn

Hello,

Donc si je résume l'état des lieux :

  • soucis d'unité : corrigé via un Quirk merci @N0ciple !
  • soucis de valeur qui ne se met pas à jour (update à faire ou attendre la version du firmware qui corrige ça )
  • soucis des autres sensors qui ne remontent pas : corrigé via le Quirk.

J'ai tout bon ? ;)

D'autres choses avant d'avoir d'avoir une intégration au petits ognons ?

max5962 avatar Nov 19 '21 21:11 max5962

@max5962 C'est presque ça. Pour ce qui est du troisième point, ce n'est pas via un quirk mais via une modification directement dans l’intégration zha.

Pour info les sensors dispo dans zha (avant la PR) étaient rms_voltage, rms_current, active_power et current_summ_delivered (index de consommation). active_power n'est pas dispo sur ZLinky_TIC, c'est pour ça que j'ai rajouté le sensor apparent_power lui fonctionne. (Il y a une petite difference physique entre les deux, apparent_power, c'est la grandeur en Volt-Ampères que l'on peut voir sur son linky quand on appuie sur les boutons et qui correspond à la puissance apparente soutirée).

Si on résume les sensors dispo, ça nous fait : voltage, courrant, puissance apparente et indexe de consommation. Ça me semlble être les sensors plus pertinent. A savoir: le voltage n'est disponnible que sur les Linky en mode standard, pas en mode historique.

Les autres sensors (comme au pif : l'option tarifaire et la puissance souscrite) ne sont pas rapportés dans ZHA. Pour les rajoutés il faudrait faire une autre modification. Et pour le coup, pas sûr que ça soit accepté puisque ça ne servirait que pour le Zlinky_TIC.

Voilà, j'espères que c'est plus clair :ok_hand:

EDIT : Dans l'état actuel des choses, il y a 3 choses à attendre qui sont, dans l'ordre :

  • que la PR pour le quirk soit mergée + intégré dans une release
  • qu'il y ait une nouvelle release de Home assistant qui prenne ma PR + update la version des quirks
  • que le nouveau firmware du ZLinky_TIC soit dispo (pour la partie actualisation automatique)

N0ciple avatar Nov 19 '21 23:11 N0ciple

@N0ciple apparent_power remonte parfaitement et se met à jour tout seul, merci ! image

pdecat avatar Nov 20 '21 07:11 pdecat

La correction de l'unité Wh en kWh fonctionne aussi parfaitement et la mise à jour se fait toute seule également.

À noter, je vois ceci dans les logs :

2021-11-20 10:30:10 WARNING (Recorder) [homeassistant.components.sensor.recorder] sensor.lixee_zlinky_tic_electrical_measurement_apparent_power has unknown unit VA
2

pdecat avatar Nov 20 '21 12:11 pdecat

  • u ZLinky_TIC soit dispo (pour la partie actualisation automatique)

Une nouvelle version est disponible ou vous avez modifié votre instance locale ?

max5962 avatar Nov 20 '21 12:11 max5962

Une nouvelle version est disponible ou vous avez modifié votre instance locale ?

Il s'agit d'un environnement de développement local.

pdecat avatar Nov 20 '21 16:11 pdecat

La correction de l'unité Wh en kWh fonctionne aussi parfaitement et la mise à jour se fait toute seule également.

À noter, je vois ceci dans les logs :

2021-11-20 10:30:10 WARNING (Recorder) [homeassistant.components.sensor.recorder] sensor.lixee_zlinky_tic_electrical_measurement_apparent_power has unknown unit VA
2

Oui effectivement, l'unité Volt-Ampère existe mais je crois qu'elle n'a pas été ajouté comme une unité de puissance, ce qui explique le warning. Mais ça n'empêche pas le bon fonctionnement je crois. La documentation ne donne que les Watts comme unité de puissance : https://developers.home-assistant.io/docs/core/entity/sensor/

@pdecat avec la modif du quirk en local, même l'index de conso en kWh est bien updaté automatiquement ? Pour ma part je croyais que c'était le cas mais en fait c'était juste mis à jour au redémarrage de HA ou en requêtant la valeur à la main.

N0ciple avatar Nov 21 '21 17:11 N0ciple

Bonjour j'ai acheté un module ZLinky_TIC que j'ai recu recemment mais je n'arrive pas a avoir la conso ! Il a été reconnu comme le votre dans le module zigbee de HA mais après je n'ai pas vraiment compris comment vous avez pu avoir la conso instantannée! dsl je suis pas un psecialiste....une petite explication ou tuto serait cool merci d'avance a vous

seblang avatar Nov 26 '21 20:11 seblang

Bonjour @seblang,

Toutes les personnes ici (moi y compris) qui ont des infos que vous n'avez pas ont modifié les fichiers en local à la main pour avoir de nouvelles fonctionnalités.

La bonne nouvelle c'est que nous avons fait en sorte que ces modifications soient intégrées dans home assistant. Cependant, depuis que ces modifications ont été intégrées dans le code de home assistant, il n'y a pas eu de mise à jour de publiées.

Si tout va bien, dans la prochaine version de home assistant (2021.12.0 j'imagine), la puissance apparente soutirée sera disponible. Il y a également un quirk qui permettra entre autre de faire la conversion Wh vers kWh pour l'indexe de consommation; Cependant, je ne suis pas sûr que ce quirk sera intégré dans la prochaine version de home assistant, il faudra peut-être attendre encore un peu.

Et pour finir, l'indexe de consommation ne se met pas à jour tout seul. Je crois que ça sera réglé dans le prochain firmware sur ZLinky_TIC. Mais là encore, il faudra attendre encore peu qu'il soit publié.

N0ciple avatar Nov 26 '21 23:11 N0ciple