# Requête HTTP : calcul de la valeur envoyée

**URL:** <https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672>\
**Category:** Scènes\
**Created:** [Août 13, 2025, 8:15 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672 "2025-08-13T20:15:17Z")\
**Posts on this page:** 11\
**Page:** 1

<div class="post-metadata">

**Author:** ![jean\_bruder](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/jean_bruder/32/13_2.png) [@jean\_bruder](https://community.gladysassistant.com/u/jean_bruder)\
**Post date:** [Août 13, 2025, 8:15 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/1 "2025-08-13T20:15:17Z")

</div>

Bonsoir,

Je ne sais pas comment «&nbsp;caster&nbsp;» le résultat qui semble être envoyé sous forme de chaine, alors qu’est attendue une valeur numérique dans le cas suivant :

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

Votre aide serait appréciée, merci par avance,  
Belle soirée,  
Jean

---

<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:** [Août 14, 2025, 6:53 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/2 "2025-08-14T06:53:20Z")

</div>

Salut @jean_bruder 🙂

Effectivement, il n’est pas possible de faire ce que tu fais; il faut que tu décomposes le calcul et l’envoi du JSON.

1. Tu peux modifier l’état d’un capteur avec une valeur «&nbsp;calculée&nbsp;» dans «&nbsp;Contrôler un appareil&nbsp;».
2. Ensuite, tu peux injecter cette valeur calculée dans un JSON comme tu fais ici.

---

<div class="post-metadata">

**Author:** ![jean\_bruder](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/jean_bruder/32/13_2.png) [@jean\_bruder](https://community.gladysassistant.com/u/jean_bruder)\
**Post date:** [Août 14, 2025, 8:03 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/3 "2025-08-14T08:03:19Z")

</div>

Bonjour @pierre-gilles

Je ne sais pas comment appliquer ta réponse à ma scène : la valeur calculée à renvoyer via HTTP/POST est issue d’une opération sur une valeur réceptionnée par HTTP/GET à quoi on ajoute/retire une valeur, et doit être au format numérique. Comment utiliser la valeur calculée d’un appareil ?

Merci à toi,  
Jean

---

<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:** [Août 15, 2025, 1:53 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/4 "2025-08-15T13:53:55Z")

</div>

Tu peux utiliser un appareil virtuel (intégration MQTT) qui fait office de «&nbsp;tampon&nbsp;» pour la valeur finale que tu envoies ensuite en HTTP.

---

<div class="post-metadata">

**Author:** ![jean\_bruder](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/jean_bruder/32/13_2.png) [@jean\_bruder](https://community.gladysassistant.com/u/jean_bruder)\
**Post date:** [Août 11, 2026, 4:49 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/5 "2026-08-11T16:49:04Z")

</div>

Bonsoir @pierre-gilles 🙂

Je profite de la bonne humeur actuelle du forum et de l’ensemble des développeurs qui n’arrêtent pas d’innover pour déterrer d’anciennes demandes que je n’avais pas menée à son but … 😛

Penses-tu qu’il est toujours impossible d’appliquer un calcul à une valeur envoyée, car ça pourrait franchement simplifier plein d’usages : on pourrait effectuer une requête GET, puis une POST en réaction interactive 🙂

A te relire,

Belle soirée,

Jean

---

<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:** [Août 14, 2026, 8:26 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/6 "2026-08-14T08:26:52Z")

</div>

Salut @jean_bruder 🙂

Alors, je vais te répondre différemment de ce que tu attends : je ne pense pas qu’il faille ajouter le calcul dans le bloc « Requête HTTP », parce que tout ce que tu décris est déjà possible aujourd’hui 🙂

Sur le « pourquoi pas » d’abord : le body d’une requête HTTP, c’est du texte libre. Ça peut être du JSON, du XML, du form-urlencoded, n’importe quoi. Si on se mettait à évaluer des calculs dedans, il faudrait que Gladys devine quelle partie du texte est une formule et quelle partie est du contenu à envoyer tel quel, avec le risque de casser des body parfaitement valides au passage. Ça voudrait dire inventer une syntaxe spéciale, la documenter, la maintenir… alors que séparer « je calcule » et « j’envoie » reste plus clair, et te permet en prime de réutiliser la valeur calculée ailleurs dans la scène.

Et surtout : le GET puis calcul puis POST, tu peux déjà le faire, sans nouvelle fonctionnalité.

Ce qui manquait dans ta scène l’an dernier, c’est simplement que la réponse d’une requête HTTP est exposée comme variable de scène. Tu fais ton GET, tu cliques une fois sur « Essayer » pour que Gladys découvre les clés de la réponse, et tu peux ensuite les réinjecter avec `{{` dans tous les blocs suivants, y compris dans un second appel HTTP. Concrètement :

1. **Requête HTTP** (GET) : tu récupères ta valeur, ex. `data.temperature`
2. **Contrôler un appareil** : ton appareil virtuel (intégration MQTT), onglet « Calculée » : `{{ data.temperature }} + 2`
3. **Récupérer le dernier état** de ce même appareil : tu obtiens une variable numérique propre
4. **Requête HTTP** (POST) : tu injectes cette variable dans ton JSON avec `{{`

Ça marche, et ça a même un effet de bord agréable : ta valeur calculée devient un vrai capteur, avec historique et graphiques.

Mais je te comprends, l’appareil tampon est un peu lourd quand la valeur n’a pas vocation à être historisée.

Du coup, bonne nouvelle : une nouvelle action « Définir une variable » arrive 🙂

> <https://github.com/GladysAssistant/Gladys/pull/2863>
>
> \### Description
> 
> Adds a new scene action \*\*"Set a variable"\*\* (\`variable.set\`) w…hich lets a scene define a value once — either a simple text or a computed formula — and re-use it in every following action.
> 
> Until now, the only way to compute a value once and use it in several actions was to create a permanent MQTT variable device, write to it with "Control a device", then read it back with "Get device value". As described on the forum, that workaround is tedious and leaks state between scenes.
> 
> \*\*How it works\*\*
> 
> The action stores its result in the scene scope under its own action path, exactly like the actions that already expose variables. It is therefore available in the next actions as \`{{1.0.value}}\` — the coordinates of the action, followed by \`.value\` — and shows up automatically in the \`{{\` variable picker of every action that accepts variables.
> 
> Two value types are supported, following the same \*Simple / Computed\* tab pattern as the "Wait" action:
> 
> \- \*\*Text\*\* — a Handlebars template rendered against the scene scope, so it can itself contain other variables.
> \- \*\*Computed\*\* — a formula rendered against the scene scope, then evaluated by the restricted mathjs instance used by the other scene formulas.
> 
> Both modes fail closed: the scene aborts with \`VARIABLE\_VALUE\_NOT\_A\_NUMBER\` if the formula cannot be evaluated or does not return a finite number, with \`VARIABLE\_TEXT\_NOT\_VALID\` if the text template cannot be compiled, and with \`VARIABLE\_VALUE\_AMBIGUOUS\` if an action carries both a \`text\` and an \`evaluate\_value\`.
> 
> An optional \*\*variable name\*\* can be given; it is only a display label, shown in the variable picker of the following actions (\`3.1. Waiting time\` instead of a bare path).
> 
> \*\*Verified in the UI\*\*
> 
> Checked locally in demo mode: the new card shows the description, the "Variable name" field, the Text/Computed tabs and the value input; after setting a variable named "Waiting time" in group 3, typing \`{{\` in a following "Send Message" action offers \`3.1. Waiting time\` in the picker. Switching between the Text and Computed tabs clears the value of the other tab, in the stored action and in the displayed field.
> 
> \*\*Changes\*\*
> 
> Server:
> \- new \`ACTIONS.VARIABLE.SET\` constant and its implementation in \`scene.actions.js\`
> \- \`name\` allowed in the scene action Joi schema (display name of the variable, only used by the scene editor)
> \- the action is exposed in the MCP \`scene.create\` Zod schema, so the AI can use it too, with a \`refine()\` enforcing that \`text\` and \`evaluate\_value\` are mutually exclusive
> \- new tests in \`server/test/lib/scene/actions/scene.action.setVariable.test.js\` covering text, empty text, nested variables, computed values, re-use in a later action, and every abort path
> 
> Front:
> \- new \`SetVariable\` scene action card
> \- registered in the action list, the action icons map and the variable-renaming logic (\`VARIABLES\_ATTRIBUTES\_IN\_ACTION\`), so \`text\` / \`evaluate\_value\` references are rewritten when actions are moved
> \- \`time.delay\` added to that same map: the "Wait" action stores its computed duration in \`evaluate\_value\` but had no entry, so reordering action groups left a wait formula pointing at the old coordinates. Pre-existing, but on the main path of this feature (compute a duration into a variable, then use it in "Wait")
> \- the editor hints which claimed "Get device value" was the only way to define a variable now mention this action as well, in English, French and German
> \- English, French and German translations
> 
> \*\*Known design choice:\*\* the selected tab is derived from which field is set, not persisted — same as the existing "Wait" and "Set device value" actions (\`computed: props.action.evaluate\_value !== undefined\`). So selecting "Computed", typing nothing and saving stores neither field and shows the "Text" tab on reload. It only affects an action the user never filled in; persisting an explicit mode would add a field to the action schema and diverge from those two actions. Happy to add a \`value\_type\` field instead if you'd prefer it explicit.
> 
> \## Forum
> 
> Forum: https://community.gladysassistant.com/t/scenes-pouvoir-creer-une-variable-ponctuelle/9505
> 
> \### Checklist
> 
> \- \[x\] Tests pass: \`cd server && npm run coverage\` (Codecov requires 100% coverage on changed lines) and Cypress (\`npm run cypress:run\`) if the UI changed
> \- \[x\] Linter and prettier pass on both front and server (\`npm run eslint\`, \`npm run prettier\`)
> \- \[x\] No undocumented breaking change
> 
> \`npm run coverage\` passes on the full server suite; Codecov reports 100% patch coverage. \`npm run compare-translations\`, \`npm run eslint\`, \`npm run prettier-check\` and \`npm run build\` pass on the front. Cypress was not run locally (its binary is not installable in this environment) but passes in CI; the two existing scene specs select action types by label text, which this change does not alter.
> 
> 
> \## Summary by CodeRabbit
> 
> \* \*\*New Features\*\*
> \* Added a scene action for defining reusable variables.
> \* Supports text values, variable interpolation, and computed numeric expressions.
> \* Variables can be reused in later scene actions.
> \* Added localized interface text in English, French, and German.
> \* \*\*Bug Fixes\*\*
> \* Invalid, ambiguous, or non-numeric variable values now stop scene processing with clear errors.
> \* \*\*Tests\*\*
> \* Added coverage for text, interpolation, calculations, reuse, validation, and invalid values.

Elle te permettra de poser une valeur une fois, soit du texte, soit un calcul (onglet « Calculée », ex. `{{ data.temperature }} + 2`), de lui donner un nom, et de la réutiliser dans toutes les actions suivantes de la scène. Plus besoin de créer un appareil MQTT permanent, plus besoin du bloc « Récupérer le dernier état ». Ta scène deviendra :

1. **Requête HTTP** (GET)
2. **Définir une variable** « Valeur à envoyer », onglet « Calculée » : `{{ data.temperature }} + 2`
3. **Requête HTTP** (POST) avec `{{` pour injecter ta variable dans le body

Trois blocs, chacun avec un rôle clair, et le calcul reste dans le bloc prévu pour ça. C’est exactement ton cas d’usage 🙂

---

<div class="post-metadata">

**Author:** ![jean\_bruder](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/jean_bruder/32/13_2.png) [@jean\_bruder](https://community.gladysassistant.com/u/jean_bruder)\
**Post date:** [Août 14, 2026, 11:44 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/7 "2026-08-14T11:44:53Z")

</div>

@pierre-gilles Merci, merci, merci, merci ❤

---

<div class="post-metadata">

**Author:** ![jean\_bruder](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/jean_bruder/32/13_2.png) [@jean\_bruder](https://community.gladysassistant.com/u/jean_bruder)\
**Post date:** [Août 14, 2026, 5:01 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/8 "2026-08-14T17:01:15Z")

</div>

Bonsoir @pierre-gilles,

Aucune urgence de réponse 🙂

Je me permets une question concernant le calcul et ce qu’il renvoi : est-ce bien une valeur entière numérique qui est le résultat de ce calcul :

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

Car, dans le log, j’ai cette erreur :

> Gladys | 2026-08-14T18:55:03+0200 scene.executeActions.js:42 (executeAction) Error: Parse error on line 1:  
> Gladys | …{{1.0.else.0.0.value}}}  
> Gladys | -----------------------^  
> Gladys | Expecting ‹&nbsp;CLOSE&nbsp;›, ‹&nbsp;OPEN\_SEXPR&nbsp;›, ‹&nbsp;ID&nbsp;›, ‹&nbsp;STRING&nbsp;›, ‹&nbsp;NUMBER&nbsp;›, ‹&nbsp;BOOLEAN&nbsp;›, ‹&nbsp;UNDEFINED&nbsp;›, ‹&nbsp;NULL&nbsp;›, ‹&nbsp;DATA&nbsp;›, got ‹&nbsp;CLOSE\_UNESCAPED&nbsp;›  
> Gladys | at Parser.parseError (/src/server/node\_modules/handlebars/lib/handlebars/compiler/parser.js:199:11)  
> Gladys | at Parser.parse (/src/server/node\_modules/handlebars/lib/handlebars/compiler/parser.js:251:22)  
> Gladys | at parseWithoutProcessing (/src/server/node\_modules/handlebars/lib/handlebars/compiler/base.js:28:20)  
> Gladys | at HandlebarsEnvironment.parse (/src/server/node\_modules/handlebars/lib/handlebars/compiler/base.js:34:13)  
> Gladys | at compileInput (/src/server/node\_modules/handlebars/lib/handlebars/compiler/compiler.js:532:19)  
> Gladys | at ret (/src/server/node\_modules/handlebars/lib/handlebars/compiler/compiler.js:546:18)  
> Gladys | at Object.http.request (/src/server/lib/scene/scene.actions.js:572:11)  
> Gladys | at executeAction (/src/server/lib/scene/scene.executeActions.js:34:37)  
> Gladys | at /src/server/lib/scene/scene.executeActions.js:75:15  
> Gladys | at tryCatcher (/src/server/node\_modules/bluebird/js/release/util.js:16:23)  
> Gladys | at MappingPromiseArray.\_promiseFulfilled (/src/server/node\_modules/bluebird/js/release/map.js:68:38)  
> Gladys | at MappingPromiseArray.PromiseArray.\_iterate (/src/server/node\_modules/bluebird/js/release/promise\_array.js:115:31)  
> Gladys | at MappingPromiseArray.init (/src/server/node\_modules/bluebird/js/release/promise\_array.js:79:10)  
> Gladys | at MappingPromiseArray.\_asyncInit (/src/server/node\_modules/bluebird/js/release/map.js:37:10)  
> Gladys | at \_drainQueueStep (/src/server/node\_modules/bluebird/js/release/async.js:97:12)  
> Gladys | at \_drainQueue (/src/server/node\_modules/bluebird/js/release/async.js:86:9)  
> Gladys | at Async.\_drainQueues (/src/server/node\_modules/bluebird/js/release/async.js:102:5)  
> Gladys | at Immediate.Async.drainQueues (/src/server/node\_modules/bluebird/js/release/async.js:15:14)  
> Gladys | at processImmediate (node:internal/timers:534:21)

De plus, lors de mon appel HTTP, j’ai dû louper une de tes indications, car le format ne semble pas convenir : il doit être numérique.

Merci pour ton retour sur le sujet,

Belle soirée,

Jean

---

<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:** [Août 20, 2026, 6:18 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/9 "2026-08-20T18:18:47Z")

</div>

Salut @jean_bruder 😊

Bonne nouvelle : ton calcul n’a rien à voir avec l’erreur 😄

**1. L’erreur du log vient du body de ta requête HTTP, pas du calcul.**

Regarde bien la fin de la ligne : `{{1.0.else.0.0.value}}}` — il y a trois `}` à la suite. Ce sont les deux accolades qui ferment ta variable, collées à l’accolade qui ferme ton JSON. Handlebars, lui, lit ces trois accolades comme la fermeture d’une « triple accolade » `{{{ }}}`, et se plaint (`got 'CLOSE_UNESCAPED'`).

Il suffit de ne pas les coller. Plutôt que :

```auto
{"puissance": {{1.0.else.0.0.value}}}

```

écris :

```auto
{
  "puissance": {{1.0.else.0.0.value}}
}

```

(une simple espace avant l’accolade finale suffit aussi : `{"puissance": {{1.0.else.0.0.value}} }`). Attention, mettre l’espace _à l’intérieur_ de la variable ne change rien : `{{ 1.0.else.0.0.value }}}` plante pareil, c’est bien juste après les `}}` qu’il faut de l’air.

**2. Pour le format numérique : surtout pas de guillemets autour de la variable.**

Gladys parse le body en JSON avant de l’envoyer, donc :

- `"puissance": "{{ma_variable}}"` → envoie `"22.5"`, une chaîne ❌
- `"puissance": {{ma_variable}}` → envoie `22.5`, un vrai nombre ✅

**3. Et oui, le calcul renvoie bien un nombre** , mais pas forcément un entier : si ta valeur d’origine est `20.5`, `{{ma_variable}} + 2` te donne `22.5`. Si ton API attend un entier, tu peux arrondir directement dans l’onglet « Calculée » :

- `round({{ma_variable}} + 2)` → `23`
- `round({{ma_variable}} + 2, 2)` → deux décimales

---

<div class="post-metadata">

**Author:** ![jean\_bruder](https://gladys-assistant-community.b-cdn.net/user_avatar/community.gladysassistant.com/jean_bruder/32/13_2.png) [@jean\_bruder](https://community.gladysassistant.com/u/jean_bruder)\
**Post date:** [Août 23, 2026, 7:21 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/10 "2026-08-23T19:21:22Z")

</div>

Bonsoir @pierre-gilles,

Sujet à présent clos, et bouton multimédia à présent pleinement fonctionnel pour la radio et la musique, merci pour ta patience et ton écoute 🙏

---

<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:** [Août 28, 2026, 2:32 UTC](https://community.gladysassistant.com/t/requete-http-calcul-de-valeur-envoyee/9672/11 "2026-08-28T14:32:21Z")

</div>


