# Nouvelle table pour stocker les "supported\_options" d'une feature

**URL:** <https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291>\
**Category:** Développement\
**Created:** [Juin 19, 2026, 5:15 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291 "2026-06-19T17:15:40Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Juin 19, 2026, 5:15 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/1 "2026-06-19T17:15:40Z")

</div>

Salut les [@contributors](https://community.gladysassistant.com/groups/contributors) 👋

Je suis en train d’ajouter une nouvelle table au data model et j’aimerais avoir votre avis pour être sûr que ça colle bien aux besoins avant d’aller plus loin.

### **💡 Contexte**

Dans certaines intégrations, on a besoin de stocker les **valeurs supportées par une feature donnée**.

Exemple simple : une climatisation avec un “mode de fonctionnement”.

- Certains modèles supportent : **Chaud / Froid / Auto**
- D’autres : uniquement **Froid**

Aujourd’hui, on ne modélise pas vraiment cette notion de “capacité par device”, ce qui commence à poser problème.

On le voit déjà côté scènes / Zigbee2MQTT : pour les boutons, on affiche une liste d’actions possible assez large (plusieurs dizaines), alors qu’un device donné n’en supporte qu’une petite partie. Résultat : UX moins claire et risque d’erreurs côté utilisateur.

### **🧱 Proposition**

Je propose d’ajouter une table :

`t_device_feature_supported_option` :

```auto
- `id` UUID PK
- `device_feature_id` UUID FK → `t_device_feature`
- `value` INTEGER NOT NULL 
- `label` STRING NOT NULL
- `sort_order` INTEGER NOT NULL DEFAULT 0

```

Elle permettrait de stocker, pour une feature d’un device donné, la liste des options réellement supportées.

Le label sera une valeur en anglais qui ensuite sera traduite dans les traductions.

Si le label n’existe pas, le fallback sera d’afficher le label en anglais.

Côté API, ça donnerait quelque chose de ce genre :

 ![Capture d’écran 2026-06-19 à 18.59.43](https://gladys-assistant-community.b-cdn.net/uploads/default/original/3X/b/4/b40b576b69add4c9b8965dab653c0d89fd89c9b3.png)

### **❓ Pourquoi maintenant ?**

Je vois ce besoin revenir de plus en plus souvent, notamment :

- avec **Matter** , où certains appareils (aspirateurs robots, climatisations) exposent des clusters avec une liste dynamique d’options possibles
- avec **Zigbee2MQTT** , où certaines features (notamment les boutons / actions) explosent en nombre d’options possibles

On va clairement vers un modèle où on ne peut plus se contenter d’une liste globale d’options par feature.

* * *

Vous en pensez quoi ? Est-ce que vous voyez des cas où ce modèle ne fonctionnerait pas ?

Merci pour votre retour 🙂

---

<div class="post-metadata">

**Author:** ![Will\_71](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/will_71/32/9582_2.png) [@Will\_71](https://community.gladysassistant.com/u/Will_71)\
**Post date:** [Juin 19, 2026, 5:25 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/2 "2026-06-19T17:25:51Z")

</div>

Totalement d’accord, j’ai pas encore vu l’impact a mon niveau côté matter mais c’est clair que la liste d’actions pour les boutons devient énorme.  
Faire des scènes avec c’est totalement perturbant pour ceux qui ne savent pas comment récupérer les valeurs

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Juin 19, 2026, 5:41 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/3 "2026-06-19T17:41:08Z")

</div>

La PR :

> <https://github.com/GladysAssistant/Gladys/pull/2567>
>
> \### Pull Request check-list
> 
> To ensure your Pull Request can be accepted as fa…st as possible, make sure to review and check all of these items:
> 
> \- \[x\] If your changes affect the code, did you write the tests?
> \- \[x\] Are tests passing? (\`npm test\` on both front/server)
> \- \[x\] Is the linter passing? (\`npm run eslint\` on both front/server)
> \- \[x\] Did you run prettier? (\`npm run prettier\` on both front/server)
> \- \[x\] If you are adding a new feature/service, did you run the integration comparator? (\`npm run compare-translations\` on front)
> \- \[\] Did you test this pull request in real life? With real devices? If this development is a big feature or a new service, we recommend that you provide a Docker image to the community (\[forum\](https://community.gladysassistant.com/)) for testing before merging.
> \- \[\] If your changes modify the API (REST or Node.js), did you modify the API documentation? (Documentation is based on comments in code)
> \- \[\] If you are adding a new features/services which needs explanation, did you modify the user documentation? See \[the GitHub repo\](https://github.com/GladysAssistant/v4-website) and the \[website\](https://gladysassistant.com).
> \- \[\] Did you add fake requests data for the demo mode (\`front/src/config/demo.js\`) so that the demo website is working without a backend? (if needed) See \[https://demo.gladysassistant.com\](https://demo.gladysassistant.com).
> 
> NOTE: these things are not required to open a PR and can be done afterwards / while the PR is open.
> 
> \### Description of change
> 
> \`\`\`
> const created = await device.create({
> service\_id: 'a810b8db-6d04-4697-bed3-c4b72c996279',
> name: 'Preserve options device',
> external\_id: 'preserve-supported-options',
> features: \[
> {
> name: 'Run mode',
> external\_id: 'preserve:run-mode',
> category: 'vacuum-cleaner',
> type: 'mode',
> read\_only: false,
> keep\_history: true,
> has\_feedback: true,
> min: 0,
> max: 5,
> supported\_options: \[{ value: 0, label: 'Idle', sort\_order: 0 }\],
> },
> \],
> params: \[\],
> });
> \`\`\`
> 
> 
> 
> \## Summary by CodeRabbit
> 
> \## Release Notes
> 
> \* \*\*New Features\*\*
> \* Device features now support configurable supported options with labels and custom sort ordering
> \* Supported options automatically sync during device creation and updates
> \* Invalid supported options are rejected with validation errors
> 
> \* \*\*Bug Fixes\*\*
> \* Fixed preservation of existing supported options when updating device features without specifying new options

---

<div class="post-metadata">

**Author:** ![cicoub13](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/cicoub13/32/4482_2.png) [@cicoub13](https://community.gladysassistant.com/u/cicoub13)\
**Post date:** [Juin 21, 2026, 3:11 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/4 "2026-06-21T15:11:39Z")

</div>

Ça me paraît ok.

- Il faut toujours que toutes les valeurs soient mappées quelque part dans Gladys (comme aujourd’hui) ?
- Comment ça va se passer pour les devices existants ?

---

<div class="post-metadata">

**Author:** ![cicoub13](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/cicoub13/32/4482_2.png) [@cicoub13](https://community.gladysassistant.com/u/cicoub13)\
**Post date:** [Juin 21, 2026, 5:00 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/5 "2026-06-21T17:00:09Z")

</div>

- Et comment les `supported_options` d’une feature sont remplies ?

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Juin 22, 2026, 5:53 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/6 "2026-06-22T05:53:57Z")

</div>

> [@cicoub13](#):
>
> Il faut toujours que toutes les valeurs soient mappées quelque part dans Gladys (comme aujourd’hui) ?

Oui ! Rien ne change là dessus.

> [@cicoub13](#):
>
> Comment ça va se passer pour les devices existants ?

On pourra rajouter une mise à jour des appareils, comme on fait quand une fonctionnalité évolue 🙂

> [@cicoub13](#):
>
> Et comment les `supported_options` d’une feature sont remplies ?

C’est l’intégration qui le rempli si c’est disponible/possible !

Dans Matter par exemple, il y a un tableau fourni par le protocole avec toutes les valeurs que l’appareil supporte.

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Juillet 3, 2026, 7:38 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/7 "2026-07-03T07:38:10Z")

</div>

Salut @pierre-gilles,

Où en es-tu sur la réflexion sur ce sujet ? C’est quelque chose de proche à paraitre ?  
J’ai le «&nbsp;soucis&nbsp;» sur l’intégration des fil pilote thermostat et climatisations dans Tuya que je prépare, du coup j’ai codé une guard pour ne pas envoyer les modes qui ne sont pas pris en charges par les appareils en question, mais avec ce développement, on en aura plus besoin 😉

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Juillet 3, 2026, 11:26 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/8 "2026-07-03T11:26:02Z")

</div>

> [@Terdious](#):
>
> Où en es-tu sur la réflexion sur ce sujet ? C’est quelque chose de proche à paraitre ?

Oui c’est terminé même 😃

> <https://github.com/GladysAssistant/Gladys/pull/2567>
>
> \### Pull Request check-list
> 
> To ensure your Pull Request can be accepted as fa…st as possible, make sure to review and check all of these items:
> 
> \- \[x\] If your changes affect the code, did you write the tests?
> \- \[x\] Are tests passing? (\`npm test\` on both front/server)
> \- \[x\] Is the linter passing? (\`npm run eslint\` on both front/server)
> \- \[x\] Did you run prettier? (\`npm run prettier\` on both front/server)
> \- \[x\] If you are adding a new feature/service, did you run the integration comparator? (\`npm run compare-translations\` on front)
> \- \[\] Did you test this pull request in real life? With real devices? If this development is a big feature or a new service, we recommend that you provide a Docker image to the community (\[forum\](https://community.gladysassistant.com/)) for testing before merging.
> \- \[\] If your changes modify the API (REST or Node.js), did you modify the API documentation? (Documentation is based on comments in code)
> \- \[\] If you are adding a new features/services which needs explanation, did you modify the user documentation? See \[the GitHub repo\](https://github.com/GladysAssistant/v4-website) and the \[website\](https://gladysassistant.com).
> \- \[\] Did you add fake requests data for the demo mode (\`front/src/config/demo.js\`) so that the demo website is working without a backend? (if needed) See \[https://demo.gladysassistant.com\](https://demo.gladysassistant.com).
> 
> NOTE: these things are not required to open a PR and can be done afterwards / while the PR is open.
> 
> \### Description of change
> 
> \`\`\`
> const created = await device.create({
> service\_id: 'a810b8db-6d04-4697-bed3-c4b72c996279',
> name: 'Preserve options device',
> external\_id: 'preserve-supported-options',
> features: \[
> {
> name: 'Run mode',
> external\_id: 'preserve:run-mode',
> category: 'vacuum-cleaner',
> type: 'mode',
> read\_only: false,
> keep\_history: true,
> has\_feedback: true,
> min: 0,
> max: 5,
> supported\_options: \[{ value: 0, label: 'Idle', sort\_order: 0 }\],
> },
> \],
> params: \[\],
> });
> \`\`\`
> 
> 
> 
> \## Summary by CodeRabbit
> 
> \## Release Notes
> 
> \* \*\*New Features\*\*
> \* Device features now support configurable supported options with labels and custom sort ordering
> \* Supported options automatically sync during device creation and updates
> \* Invalid supported options are rejected with validation errors
> 
> \* \*\*Bug Fixes\*\*
> \* Fixed preservation of existing supported options when updating device features without specifying new options

Je viens de merger ! Tu peux l’utiliser dans ta PR 🙂

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Juillet 3, 2026, 11:57 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/9 "2026-07-03T11:57:26Z")

</div>

Aaaaah trop bien !! Je te remercie ^^ 😂 🥰

---

<div class="post-metadata">

**Author:** ![Terdious](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/terdious/32/6316_2.png) [@Terdious](https://community.gladysassistant.com/u/Terdious)\
**Post date:** [Juillet 3, 2026, 4:34 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/10 "2026-07-03T16:34:07Z")

</div>

Ca fonctionne nickel ! En espérant qu’ «&nbsp;on&nbsp;» a bien implémenté, j’ai été obligé de le reprendre, il était barré dans un truc ultra complexe avec répétition.  
Appareil avec 4 modes :

 ![image](https://gladys-assistant-community.b-cdn.net/uploads/default/original/3X/8/b/8b67142050f0fc36dbfc0ac9c127de7ade3fc530.png)

Appareil avec tous les modes :

 ![image](https://gladys-assistant-community.b-cdn.net/uploads/default/original/3X/7/3/739c5fb282efed95606c4469c06330be89cb293f.png)

---

<div class="post-metadata">

**Author:** ![pierre-gilles](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/pierre-gilles/32/5886_2.png) [@pierre-gilles](https://community.gladysassistant.com/u/pierre-gilles)\
**Post date:** [Juillet 3, 2026, 4:41 UTC](https://community.gladysassistant.com/t/nouvelle-table-pour-stocker-les-supported-options-dune-feature/10291/11 "2026-07-03T16:41:24Z")

</div>

Excellent !!
