zwaveJS : ajout fonctionnalités FGMS001

Capteur de fumée :open_mouth:

Peux-tu s’il te plaît me transmettre les « Debug Info » de tes autres Fibaro Eyes ?
Ce qui m’intéresserait serait le Debug Info du node 4 et celui du node 50 par exemple.

Merci

FGMS001 ID4

{
  "id": 4,
  "name": "4 - Fibargroup Motion Sensor FGMS001",
  "loc": "Entrée",
  "values": [
    {
      "id": "4-32-0-currentValue",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 32,
      "commandClassName": "Basic",
      "endpoint": 0,
      "property": "currentValue",
      "propertyName": "currentValue",
      "type": "number",
      "readable": true,
      "writeable": false,
      "label": "Current value",
      "stateless": false,
      "commandClassVersion": 0,
      "min": 0,
      "max": 99,
      "list": false,
      "value": 0,
      "isCurrentValue": true,
      "lastUpdate": 1737538911140,
      "newValue": 0
    },
    {
      "id": "4-48-0-Any",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 48,
      "commandClassName": "Binary Sensor",
      "endpoint": 0,
      "property": "Any",
      "propertyName": "Any",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "label": "Sensor state (Any)",
      "ccSpecific": {
        "sensorType": 255
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1736673265417,
      "newValue": false
    },
    {
      "id": "4-48-0-General Purpose",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 48,
      "commandClassName": "Binary Sensor",
      "endpoint": 0,
      "property": "General Purpose",
      "propertyName": "General Purpose",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "label": "Sensor state (General Purpose)",
      "ccSpecific": {
        "sensorType": 1
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1737538911121,
      "newValue": false
    },
    {
      "id": "4-49-0-Air temperature",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 49,
      "commandClassName": "Multilevel Sensor",
      "endpoint": 0,
      "property": "Air temperature",
      "propertyName": "Air temperature",
      "type": "number",
      "readable": true,
      "writeable": false,
      "label": "Air temperature",
      "ccSpecific": {
        "sensorType": 1,
        "scale": 0
      },
      "stateless": false,
      "commandClassVersion": 5,
      "unit": "°C",
      "list": false,
      "value": 20.1,
      "lastUpdate": 1737538844015,
      "newValue": 20.1
    },
    {
      "id": "4-49-0-Illuminance",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 49,
      "commandClassName": "Multilevel Sensor",
      "endpoint": 0,
      "property": "Illuminance",
      "propertyName": "Illuminance",
      "type": "number",
      "readable": true,
      "writeable": false,
      "label": "Illuminance",
      "ccSpecific": {
        "sensorType": 3,
        "scale": 1
      },
      "stateless": false,
      "commandClassVersion": 5,
      "unit": "Lux",
      "list": false,
      "value": 0,
      "lastUpdate": 1737401481841,
      "newValue": 0
    },
    {
      "id": "4-112-0-1",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 112,
      "commandClassName": "Configuration",
      "endpoint": 0,
      "property": 1,
      "propertyName": "Motion Sensor Sensitivity",
      "type": "number",
      "readable": true,
      "writeable": true,
      "description": "The lower the value, the more sensitive the PIR sensor.",
      "label": "Motion Sensor Sensitivity",
      "default": 10,
      "stateless": false,
      "commandClassVersion": 1,
      "min": 8,
      "max": 255,
      "list": false,
      "value": 10,
      "lastUpdate": 1736436684771,
      "newValue": 10
    },
    {
      "id": "4-112-0-4",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 112,
      "commandClassName": "Configuration",
      "endpoint": 0,
      "property": 4,
      "propertyName": "Motion Window Time",
      "type": "number",
      "readable": true,
      "writeable": true,
      "description": "The amount of time the movements specified in parameter #3 need to take place in"}

FGMS001 ID50

{
  "id": 50,
  "name": "50 - Fibargroup Motion Sensor FGMS001",
  "loc": "1er étage",
  "values": [
    {
      "id": "50-32-0-currentValue",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 32,
      "commandClassName": "Basic",
      "endpoint": 0,
      "property": "currentValue",
      "propertyName": "currentValue",
      "type": "number",
      "readable": true,
      "writeable": false,
      "label": "Current value",
      "stateless": false,
      "commandClassVersion": 1,
      "min": 0,
      "max": 99,
      "list": false,
      "value": 0,
      "isCurrentValue": true,
      "targetValue": "32-0-targetValue",
      "lastUpdate": 1737538948645,
      "newValue": 0
    },
    {
      "id": "50-32-0-targetValue",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 32,
      "commandClassName": "Basic",
      "endpoint": 0,
      "property": "targetValue",
      "propertyName": "targetValue",
      "type": "number",
      "readable": true,
      "writeable": true,
      "label": "Target value",
      "stateless": false,
      "commandClassVersion": 1,
      "min": 0,
      "max": 255,
      "list": false,
      "lastUpdate": 1737408216512
    },
    {
      "id": "50-32-0-duration",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 32,
      "commandClassName": "Basic",
      "endpoint": 0,
      "property": "duration",
      "propertyName": "duration",
      "type": "duration",
      "readable": true,
      "writeable": false,
      "label": "Remaining duration",
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": {
        "unit": "seconds"
      },
      "lastUpdate": 1737408216512,
      "newValue": {
        "unit": "seconds"
      }
    },
    {
      "id": "50-32-0-restorePrevious",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 32,
      "commandClassName": "Basic",
      "endpoint": 0,
      "property": "restorePrevious",
      "propertyName": "restorePrevious",
      "type": "boolean",
      "readable": false,
      "writeable": true,
      "label": "Restore previous value",
      "stateless": false,
      "commandClassVersion": 1,
      "list": true,
      "states": [
        {
          "text": "Restore",
          "value": true
        }
      ],
      "lastUpdate": 1737408216512
    },
    {
      "id": "50-48-0-Any",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 48,
      "commandClassName": "Binary Sensor",
      "endpoint": 0,
      "property": "Any",
      "propertyName": "Any",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "label": "Sensor state (Any)",
      "ccSpecific": {
        "sensorType": 255
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1736505053910,
      "newValue": false
    },
    {
      "id": "50-48-0-General Purpose",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 48,
      "commandClassName": "Binary Sensor",
      "endpoint": 0,
      "property": "General Purpose",
      "propertyName": "General Purpose",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "label": "Sensor state (General Purpose)",
      "ccSpecific": {
        "sensorType": 1
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1737538948591,
      "newValue": false
    },
    {
      "id": "50-49-0-Air temperature",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 49,
      "commandClassName": "Multilevel Sensor",
      "endpoint": 0,
      "property": "Air temperature",
      "propertyName": "Air temperature",
      "type": "number",
      "readable": true,
      "writeable": false,
      "label": "Air temperature",
      "ccSpecific": {
        "sensorType": 1,
        "scale": 0
      },
      "stateless": false,
      "commandClassVersion": 5,
      "unit": "°C",
      "list": false,
      "value": 21.3,
      "lastUpdate": 1737536566206,
      "newValue": 21.3
    },
    {
      "id": "50-49-0-Illuminance",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 49,
      "commandClassName": "Multilevel Sensor",
      "endpoint": 0,
      "property": "Illuminance",
      "propertyName": "Illuminance",
      "type": "number",
      "readable": true,
      "writeable": false,
      "label": "Illuminance",
      "ccSpecific": {
        "sensorType": 3,
        "scale": 1
      },
      "stateless": false,
      "commandClassVersion": 5,
      "unit": "Lux",
      "list": false,
      "value": 23,
      "lastUpdate": 1737535417991,
      "newValue": 23
    },
    {
      "id": "50-112-0-1",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 112,
      "commandClassName": "Configuration",
      "endpoint": 0,
      "property": 1,
      "propertyName": "Motion Sensor Sensitivity",
      "type": "number",
      "readable": true,
      "writeable": true,
      "description": "The lower the value, the more sensitive the PIR sensor.",
      "label": "Motion Sensor Sensitivity",
      "default": 10,
      "stateless": false,
      "commandClassVersion": 1,
      "min": 8,
      "max": 255,
      "list": false,
      "value": 10,
      "lastUpdate": 1736421354669,
      "newValue": 10
    },
    {
      "id": "50-112-0-2",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 112,
      "commandClassName": "Configuration",
      "endpoint": 0,
      "property": 2,
      "propertyName": "After Motion Blind Time",
      "type": "number",
      "readable": true,
      "writeable": true,
      "description": "Period of time through which the PIR sensor is \"blind\".",
      "label": "After Motion Blind Time",
      "default": 15,
      "stateless": false,
      "commandClassVersion": 1,
      "min": 0,
      "max": 15,
      "list": false,
      "value": 15,
      "lastUpdate": 1736421354841,
      "newValue": 15
    },
    {
      "id": "50-112-0-3",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 112,
      "commandClassName": "Configuration",
      "endpoint": 0,
      "property": 3,
      "propertyName": "Motion Pulses Required",
      "type": "number",
      "readable": true,
      "writeable": true,
      "description": "Sets the number of moves required for the PIR sensor to report motion. The more the value is, the less sensitive it is.",
      "label": "Motion Pulses Required",
      "default": 1,
      "stateless": false,
      "commandClassVersion": 1,
      "min": 0,
      "max": 3,
      "list": true,
      "allowManualEntry": false,
      "states": [
        {
          "text": "1 move",
          "value": 0
        },
        {
          "text": "2 moves",
          "value": 1
        },
        {
          "text": "3 moves",
          "value": 2
        },
        {
          "text": "4 moves",
          "value": 3
        }
      ],
      "value": 1,
      "lastUpdate": 1736421355019,
      "newValue": 1
    },
    {
      "id": "50-112-0-4",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 112,
      "commandClassName": "Configuration",
      "endpoint": 0,
      "property": 4,
      "propertyName": "Motion Window Time",
      "type": "number",
      "readable": true,
      "writeable": true,
      "description": "The amount of time the movements specified in parameter #3 need to take place in

Merci @mutmut très utile !

Je ne comprends pas comment on peut avoir 2 choses différentes alors que ce sont bien les mêmes infos manifestement. On a 2 cas : les Binary Sensor + les Alarm Sensor.

Binary Sensor :
Noeud 4 :

{
      "id": "4-48-0-Any",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 48,
      "commandClassName": "Binary Sensor",
      "endpoint": 0,
      "property": "Any",
      "propertyName": "Any",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "label": "Sensor state (Any)",
      "ccSpecific": {
        "sensorType": 255
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1736673265417,
      "newValue": false
    },

Noeud 50 :

{
      "id": "50-48-0-Any",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 48,
      "commandClassName": "Binary Sensor",
      "endpoint": 0,
      "property": "Any",
      "propertyName": "Any",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "label": "Sensor state (Any)",
      "ccSpecific": {
        "sensorType": 255
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1736505053910,
      "newValue": false
    },

Alarm Sensor :
Noeud 4 :

{
      "id": "4-156-0-state-0",
      "nodeId": 4,
      "toUpdate": false,
      "commandClass": 156,
      "commandClassName": "Alarm Sensor",
      "endpoint": 0,
      "property": "state",
      "propertyName": "state",
      "propertyKey": 0,
      "propertyKeyName": "0",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "description": "Whether the alarm is active",
      "label": "General Purpose state",
      "ccSpecific": {
        "sensorType": 0
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1737401509546,
      "newValue": false
    },

Noeud 50 :

{
      "id": "50-156-0-state-0",
      "nodeId": 50,
      "toUpdate": false,
      "commandClass": 156,
      "commandClassName": "Alarm Sensor",
      "endpoint": 0,
      "property": "state",
      "propertyName": "state",
      "propertyKey": 0,
      "propertyKeyName": "0",
      "type": "boolean",
      "readable": true,
      "writeable": false,
      "description": "Whether the alarm is active",
      "label": "General Purpose state",
      "ccSpecific": {
        "sensorType": 0
      },
      "stateless": false,
      "commandClassVersion": 1,
      "list": false,
      "value": false,
      "lastUpdate": 1736686587142,
      "newValue": false
    },

J’ai du mal à expliquer du coup comment on peut avoir 2 features différentes.
Je pars du principe que l’ordre est préservé : donc le soucis serait au niveau de la partie Alarm Sensor…
Je vais creuser ça (pas avant lundi par contre, désolé)

Merci pour les infos

Bonjour !

Je viens de pousser une nouvelle version de la PR. Le build Docker est à jour pour faire un test.
Je reste toujours très perplexe de pourquoi on arrivait à cette situation (le détecteur de Fumée…). Même en ajoutant tes devices dans les tests unitaires, je n’obtenais pas ces résultats… mais passons.

Grâce à tes logs, j’ai pu constater que sur tes 3 FGMS001, on observe 2 comportements différents. L’un d’entre eux (le noeud 41) n’expose pas les mêmes values (fonctionnalités au sens zWave) que les deux autres.

J’ai donc été obligé de passer par du spécifique car finalement, les devices ne réagissent pas de la même manière. Ca reste très étonnant car je ne vois pas de facteur différenciant dans les numéros de version… peut-être une histoire de config’.

Bref ! J’ai poussé une nouvelle version où je fais du spécifique si on tombe sur le Fibaro Eye. Cela devrait nettoyer un peu des choses, mais du coup je doute qu’on gère toutes les fonctionnalités.

Allons-y morceau par morceau. Si déjà ça c’est ok, c’est une bonne chose, on avise ensuite.

@mutmut @pierre-gilles

Cool @Sescandell !

Toujours sur sescandell/gladys-test:zjs-battery ?

Preneur de retours de ta part @mutmut une fois que le build est passé (en général les builds durent 50 minutes environ)

Oui toujours sur le même tag

merci @Sescandell pour l’update, par contre j’ai un soucis de mise à jour du docker, rien de nouveau ne m’est proposé (je suis sur Synology pour ce test donc pas trop de fonctionnalité au niveau terminal, juste via interface graphique).

EDIT : j’ai un portainer qui tourne sur le syno et je vois que j’ai téléchargé les 2 images mais je bloque sur comment remplacer l’ancienne par la nouvelle :frowning:

EDIT 2 : via portainer, j’ai recréée le container avec cette option et ça fonctionne avec la dernière version de l’image, je teste

EDIT 3 : bon, je crois qu’il faut que j’efface toutes les data et que je recommence de zéro car j’ai l’impression que rien n’a changé en faisant juste un chgt d’image.

@Sescandell @pierre-gilles Voici mes retours :

Y a-t-il quelque chose de spécial à faire ?

c’est bien possible qu’un des 3 n’ait pas les mêmes settings (threashold pour luminance, temp et fin de présence) mais ils doivent être identiques normalement.

Il est étonnant que tu ne récupères pas, ne serait-ce que, les valeurs de batterie.
Pour le coup ça je le teste sur un vrai device de mon côté et ça fonctionne…

Je regarde si je passe à côté de quelque chose.

Merci

Effectivement, 1 des FGMS001 a une différence, c’est le nodeID 4, je viens de regarder sur zwaveJS :



@mutmut

J’avais effectivement oublié de traiter la mise à jour du General Purpose. Mais le Any et le reste devraient se mettre à jour. Je viens de pousser une mise à jour de l’image Docker.

Peut-on également vérifier que ta config’ est OK ?

Tu devrais voir les logs MQTT ici :

Es-tu bien dans ce mode là côte zWaveJs UI:

Si ta config est OK, aurais-tu des logs Gladys à me fournir pour savoir ce qui bloque ? Être sûr que tu reçoives bien les données. Des logs Gladys devraient me mettre sur la piste de où je me rate (ça doit être un détail…)

Merci

Je remets à jour et je reviens.
Dans l’intervalle, la config MQTT de zwaveJSui est bonne mais pas celle de Gateway, je change tout ça.


et voici ma config zwaveJS :

zwave-js-ui: 9.20.0.bf3bdc3
zwave-js: 13.3.1

EDIT : et un exemple de node_value_updated après modif de Gateway

{"data":[{"id":41,"inited":true,"name":"41 - Fibargroup Motion Sensor FGMS001","location":"Salon","status":1,"isControllerNode":false,"interviewStage":5,"deviceClass":{"basic":"Routing End Node","generic":"Binary Sensor","specific":"Routing Binary Sensor"},"ready":true,"isListening":false,"isFrequentListening":false,"canSleep":true,"isRouting":true,"supportedDataRates":[40000],"maxDataRate":40000,"supportsSecurity":false,"isSecure":false,"supportsBeaming":true,"protocolVersion":3,"firmwareVersion":"2.7","manufacturerId":271,"manufacturer":"Fibargroup","productId":4097,"productDescription":"Motion Sensor","productType":2048,"productLabel":"FGMS001","deviceDatabaseUrl":"https://devices.zwave-js.io/?jumpTo=0x010f:0x0800:0x1001:2.7","keepAwake":false,"protocol":0},{"commandClassName":"Basic","commandClass":32,"property":"currentValue","endpoint":0,"newValue":255,"prevValue":255,"propertyName":"currentValue"}]}

bon, aucun changement avec la nouvelle image et un gladys vierge :frowning:

Pour les logs il va falloir me guider sachant que je n’ai pas d’accès à un terminal sur cette image de test, seulement l’UI de synology docker et portainer (ci-dessous) :

Question peut-être bête mais est-ce mon zwaveJS a le bon chemin dans MQTT explorer (le tien est différent du mien qui vient de jeedom) ?

Le code écoute explicitement sur ce topic :

Cela se configure ici dans zWave :

(mais je me dis que tu ne recevrais même pas les device si c’était pas ok… dans le doute, essayons toujours, ils ne sont pas vraiment au même endroits : _CLIENT vs _EVENTS…)

merci @Sescandell pour cette info, je viens de modifier zwave-js-ui dans MQTT Name car j’avais jeedom et je commence à avoir quelques remontées :


Je vais laisser tout ça travailler un peu pour voir si les 3 modules remontent bien toutes les infos.
J’ai aussi fait du ménage avec MQTT Explorer pour supprimer les topics issus de jeedom et voir comment ça se comporte.

Pour répondre à ton interrogation, effectivement j’avais récupéré tous mes modules avec la première configuration (donc avec une mauvaise config).
Et ce qui était effectivement bizarre c’est que j’arrivais à contrôler (mais pas à récupérer) la valeur d’un module fil pilote Qubino ZMNHJD sur mon Gladys de prod.

Un point que je relève est que jeedom utilise les ValueID topics et gladys utilise les Named topics dans zwaveJS.


Et si je suis en ValueID, je peux piloter via jeedom mais pas gladys, et inversement pour les Named. (pas complètement, cf. EDIT 2)
Par contre je récupère bien les infos sur les 2 systèmes quelque soit le type de topic.

Bref, ça ne va pas être simple mon histoire car j’ai du monde en zwave, la bascule va être longue et pénible je sens :frowning:

EDIT : tu sais sur quel type de topic se base HA ?
EDIT 2 : Autre point, en Named topics, je n’arrive plus à piloter mes ZMNHJD :frowning:
Après tests je n’arrive plus du tout à piloter mes modules fil pilote ni en Named ni en ValueID :weary:
EDIT 3 : je continue les tests et je viens de repasser en ValueID topics dans zwaveJS et mes FGMS001 me remontent bien les infos dans gladys de test … Là je suis paumé dans les configs et je n’y comprends plus rien … Comme il semble que je ne pilote plus rien depuis gladys, je vais laisser en ValueID et je pourrais piloter depuis jeedom pour l’instant.

Hello,

tu sais sur quel type de topic se base HA ?

Je ne suis pas 100% sûr mais je crois qu’ils ne passent pas par la partie MQTT de base… direct en Websocket.

Autre point, en Named topics , je n’arrive plus à piloter mes ZMNHJD :frowning:
Après tests je n’arrive plus du tout à piloter mes modules fil pilote ni en Named ni en ValueID :weary:

Je ne crois pas que ce device soit géré côté Gladys. Fait voir le Debug Info du device, je verrai ce qu’il manque (pour une prochaine PR).

Le choix de Named Topics versus ValueID est un parti qui a été pris au début de l’intégration de zWaveJs. Effectivement, si Jeedom s’appuie sur du ValueID : les deux sont incompatibles. Autant on peut envisager un développement pour rendre le nom du topique dynamique (la partie zwave-js-ui). Autant le format c’est structurant. Cela peut s’envisager, mais on est sur une autre réflexion presque stratégique.

Bref, ça ne va pas être simple mon histoire car j’ai du monde en zwave, la bascule va être longue et pénible je sens :frowning:

Ca c’est certain. La bonne nouvelle tout de même dans tout ça c’est que c’est qu’une question de « reconfiguration » dans Gladys. Ce que je veux dire c’est que tu ne dois pas tout ré-associer etc. C’est ZwaveJs qui gère ça. Par contre effectivement, tu as certainement des devices non gérés dans Gladys… et là il va falloir qu’on bosse ensemble pour que tu me donnes les debug info des devices non gérés, les cas d’utilisation et ce que ça donne par exemple dans Jeedom aujourd’hui.

Dans ta capture, tu as une belle liste de device c’est plutôt cool du coup. Je suis curieux de voir ce qu’il manque. La bonne nouvelle c’est que pour des capteurs : c’est assez rapide à intégrer. Là où c’est plus long, c’est dès que l’on peut faire des actions. Mais en vrai ça se fait bien.

Réglons le FGMS, et après on s’intéresse au ZMNHJD si tu veux :wink:

Après 24h tranquille, voici les remontées des FGMS001 dans Gladys :


Par contre je ne sais pas pourquoi 4 et 50 n’ont pas remonté les infos de batteries.